diff --git a/Not working Asset code/assetdetails.php b/Not working Asset code/assetdetails.php deleted file mode 100644 index 167fb61f..00000000 --- a/Not working Asset code/assetdetails.php +++ /dev/null @@ -1,240 +0,0 @@ -load->model('assetdetails_model'); - $this->isLoggedIn(); - } - /** - * This function used to load the first screen of the user - */ - public function index() - { - $this->global['pageTitle'] = 'Siddharth : Asset Details'; - - $this->loadViews("assetlisting", $this->global, NULL , NULL); - } - - /** - * This function is used to load the Supplier list - */ - function assetListing() - { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { - $this->load->model('assetdetails_model'); - - $searchText = $this->input->post('searchText'); - $data['searchText'] = $searchText; - - $this->load->library('pagination'); - - $count = $this->assetdetails_model->assetListingCount($searchText); - - $returns = $this->paginationCompress ( "assetListing/", $count, 5 ); - - $data['userRecords'] = $this->assetdetails_model->assetListing($searchText, $returns["page"], $returns["segment"]); - - $this->global['pageTitle'] = 'Siddharth : Cost Listing'; - - $this->loadViews("costListing", $this->global, $data, NULL); - } - } - /** - * This function is used to load the add new supplier */ - function addasset() - { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { - $this->load->model('supplier_model'); - //$data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); - //$data['users'] = $this->purchaseorder_model->getusers(); - - $this->global['pageTitle'] = 'siddharth : AddNew Asset'; - - $this->loadViews("addasset", $this->global, NULL); - } - } - - /** - * This function is used to add new user to the system - */ - function addNewasset() - { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { - $this->load->library('form_validation'); - - //$PO = $this->input->post('SupplierID'); - - //$this->form_validation->set_rules('CostCenterID','Supplier Name','trim'); - $this->form_validation->set_rules('CostName','Address','trim|required|'); - $this->form_validation->set_rules('Description','Contact Number','trim'); - - - - if($this->form_validation->run() == FALSE) - { - $this->addsupplier(); - } - else - { - $CostName = ucwords(strtolower($this->input->post('CostName'))); - $Description = $this->input->post('Description'); - - - - - $Cost = array('CostName'=>$CostName, 'Description'=>$Description,'createdDate'=>date('Y-m-d H:i:sa')); - - $this->load->model('assetdetails_model'); - $result = $this->assetdetails_model->addNewasset($asset); - - if($result > 0) - { - $this->session->set_flashdata('success', 'New PO created successfully'); - } - else - { - $this->session->set_flashdata('error', 'PO Not Create'); - } - - redirect('codeListing'); - } - } - } - /** - * This function is used load user edit information - * @param number $userId : Optional : This is user id - */ - function editOldcost($CostCenterID = NULL) - { - if($this->isAdmin() == TRUE || $CostCenterID == 1) - { - $this->loadThis(); - } - else - { - if($CostCenterID == null) - { - redirect('costListing'); - } - - //$data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); - //$data['users'] = $this->purchaseorder_model->getusers(); - - $this->global['pageTitle'] = 'Siddharth : Edit User'; - - $this->loadViews("editOldcost", $this->global, NULL); - } - } - - /** - * This function is used to edit the user information - */ - function editcost() - { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { - $this->load->library('form_validation'); - - //$PO = $this->input->post('PO'); - - $this->form_validation->set_rules('CostName','Cost Name','trim|required|'); - $this->form_validation->set_rules('Description','Description','trim|required|'); - - - if($this->form_validation->run() == FALSE) - { - $this->editPO(); - } - else - { - $CostName = ucwords(strtolower($this->input->post('CostName'))); - $Description = $this->input->post('Description'); - - $Cost = array('CostName'=>$CostName, 'Description'=>$Description,'createdDtm'=>date('Y-m-d H:i:sa')); - - - - $Cost = array(); - - $result = $this->costcenter_model->editcost($Cost, $CostCentreID); - - if($result == true) - { - $this->session->set_flashdata('success', 'PO updated successfully'); - } - else - { - $this->session->set_flashdata('error', 'PO updation failed'); - } - - redirect('costListing'); - } - } - } - - /** - * This function is used to delete the user using userId - * @return boolean $result : TRUE / FALSE - */ - function deleteUser() - { - if($this->isAdmin() == TRUE) - { - echo(json_encode(array('status'=>'access'))); - } - else - { - $userId = $this->input->post('userId'); - $userInfo = array('isDeleted'=>1,'updatedBy'=>$this->vendorId, 'updatedDtm'=>date('Y-m-d H:i:sa')); - - $result = $this->user_model->deleteUser($userId, $userInfo); - - if ($result > 0) { echo(json_encode(array('status'=>TRUE))); } - else { echo(json_encode(array('status'=>FALSE))); } - } - } - - - function pageNotFound() - { - $this->global['pageTitle'] = 'CodeInsect : 404 - Page Not Found'; - - $this->loadViews("404", $this->global, NULL, NULL); - } -} - -?> \ No newline at end of file diff --git a/app/CREDITS.md b/app/CREDITS.md deleted file mode 100644 index b6c4dc3f..00000000 --- a/app/CREDITS.md +++ /dev/null @@ -1,49 +0,0 @@ -# Credits - -The following products were used in the creation of Appunto-Auth. Trademarks and copyrights are property of their respective owners. - -## CodeIgniter -http://codeigniter.com/ - -CodeIgniter is a powerful PHP framework with a very small footprint, built for PHP coders who need a simple and elegant toolkit to -create full-featured web applications.

- -For licensing information, please visit http://codeigniter.com/user_guide/license.html - -## Sencha Ext JS -http://www.sencha.com/products/extjs/ - -Ext JS is a JavaScript framework for building rich internet applications that work in any web browser. -Appunto-Auth uses the GPL version of Ext JS. - -For licensing information, please visit http://www.sencha.com/products/extjs/licensing/ - -## Silk Icons -http://www.famfamfam.com/lab/icons/silk/ - -Silk is a smooth, free icon set, containing over 700 16-by-16 pixel icons in strokably-soft PNG format. - -Silk is licensed under a Creative Commons Attribution 2.5 License. - -## Fugue Icons -http://p.yusukekamiyamane.com/ - -Icon set by Yusuke Kamiyamane. - -Fugue Icons are licensed under a Creative Commons Attribution 3.0 License. - -## Silk companion icon set -http://www.damieng.com/icons/silkcompanion - -Icon set by Damien Guard. - -Silk companion icon set is licensed under a Creative Commons Attribution 2.5 License. - -## Translations - -__portuguese-br__ - -CodeIgniter translation: https://github.com/CIBr/CodeIgniter-Portuguese-BR - -Appunto-Auth translation: Loanda Drew and Ricardo Silva - diff --git a/app/LICENSE.md b/app/LICENSE.md deleted file mode 100644 index 2a071986..00000000 --- a/app/LICENSE.md +++ /dev/null @@ -1,32 +0,0 @@ -# Appunto-Auth license - -####License for all files except for third party files, the app.js and theme.css files - -Appunto Auth is licensed under a version of the MIT license. -Please do not remove the copyright and permission notice contained in this file. - -Copyright (c) 2012-2014 Bill Clinton (bclinton@appunto.net) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, -sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or -substantial portions of the Software in the application/libraries/appunto-auth folder - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#### License for all third party files - -The license of all third party files are governed by the terms of their licenses. Please see -the CREDITS.MD file for a list of all third party files. - -#### License for app.js and theme.css files - -Per Sencha requirements, the app.js and theme.css files are governed by the terms of the GPLv3 license. diff --git a/app/README.md b/app/README.md deleted file mode 100644 index f1c6213a..00000000 --- a/app/README.md +++ /dev/null @@ -1,284 +0,0 @@ -# Appunto-Auth - -An authentication library for CodeIgniter with a Sencha Ext JS interface and a simple ACL. - -current release 0.1.3 - -The goal of Appunto-Auth is to provide the CodeIgniter developer with an authentication and user management -system that takes authentication code out of an application's individual controller classes and functions. - -For more information go to http://www.appunto.net/appunto-auth - - - -- [Features](#features) -- [Installing](#installing) - - [CodeIgniter Setup](#codeigniter-setup) - - [Download Appunto-Auth](#download-appunto-auth) - - [Update Codeigniter configuration files](#update-codeigniter-configuration-files) -- [Support for multiple languages](#support-for-multiple-languages) - - [Translating Appunto-Auth](#translating-appunto-auth) -- [Helpers](#helpers) -- [Public Library Functions](#public-library-functions) -- [Additional Notes](#additional-notes) - - [A note on removing index.php](#a-note-on-removing-indexphp) - - [A note on _remap (Remapping Function Calls)](#a-note-on-_remap-remapping-function-calls) - - [Limitations](#limitations) - - - -## Features - - Administrative interface using ExtJS - - Authentication performed in a hook rather than controller code - - Simple ACL with roles and permissions - - Restrict/Allow access using controller/function paths - - Hashes passwords in database using phpass library - - Multiple language support - -## Installing - -### CodeIgniter Setup - -Enable CodeIgniter to use the database to store sessions by following the instructions -in the _Saving Session Data to a Database_ section of the _Session Class_ page in the CodeIgniter -User Guide located at http://codeigniter.com/user_guide/libraries/sessions.html - - - set an __encryption_key__ in CodeIgniter's config/config.php - - create the ci_sessions database table - - enable the database option in your config.php by setting __sess_use_database__ to TRUE in CodeIgniter's config.php - -video walkthrough of this step here: https://www.youtube.com/watch?v=GlQSNBO2Eg4 - - -### Download Appunto-Auth - -The latest version of Appunto-Auth is available at http://www.appunto.net/appunto-auth/download - -You can download the most recent working build at https://github.com/BillClinton/Appunto-Auth - -The Appunto-Auth download contains 4 folders: -``` - . - |-application - |-resources - |-db - |-src -``` - -#### Copy the application and resources folders to your application folder - -The application folder contains controllers, models, views, helpers, libraries, and config folders. -While it is always a good idea to back up your application, the files contained in these folders are in -appunto-auth subfolders and should not overwrite anything in your existing CodeIgniter folder structure. - -The files in the language folder are not in an appunto-auth subfolder, but unless you already have a file -named appunto_auth_lang.php in one of your language folders (unlikely), you don't have to worry about any -language file overwriting - -The files in the resources folder contain javascript, css and images needed by the Appunto-Auth admin interface. - -Copy the downloaded __applications__ and __resources__ folders into your main Codeigniter folder (the folder that -contains the system and application folder) - -Your CodeIgniter folder should now look like this: -``` - . - |-application - |-resources - |-system - |-user_guide (if you haven't deleted it yet) -``` - -### Update Codeigniter configuration files - -#### Load the Appunto_auth.php library file in autoload.php -Include a reference to the Appunto_auth library in CodeIgniter's config/autoload.php file. CodeIgniter will be calling a method in this library in a post_controller_constructor hook, so it will be needed in every controller. Therefore there is no reason to load it in your individual controllers rather than in the autoload file. Example: - -``` -$autoload['libraries'] = array('appunto-auth/appunto_auth'); -``` - -#### Import the Appunto-Auth tables -Use the table creation script in the __db__ folder to create the Appunto-Auth tables. You can use the command line: - -``` -mysql -u [db username] -p [db name] < db/create_auth_db.sql -``` -Or just paste the contents of this file into PhpMyAdmin. - -Your database should already contain the ci_session table. - -#### Include Reference to Hook in hooks.php -Appunto-Auth authenticates the user in a post_controller_constructor hook. The hook function resides in the Appunto_auth.php -library file. A reference to this hook must be included in CodeIgniter's config/hooks.php file using the following format: - -``` -$hook['post_controller_constructor'] = array( - 'class' => 'Appunto_auth', - 'function' => 'require_authentication_hook', - 'filename' => 'appunto-auth/Appunto_auth.php', - 'filepath' => 'libraries', - 'params' => array() -); -``` -#### Enable CodeIgniter hooks -Enable CodeIgniter hooks by setting __enable_hooks__ to TRUE in your application's config.php - -## Support for multiple languages - -The current release of Appunto-Auth includes one additional language: Brazilian Portuguese. If you translate Appunto-Auth -to your native language, I would love to include it in future releases. Please send me the files at code@appunto.net -or fork the project and add them yourself using these instructions: http://kbroman.org/github_tutorial/pages/fork.html - -To try the Portuguese translation, change the value of the $config['language'] setting in the CodeIgniter config/config.php -file from __english__ to __portuguese-br__ - -### Translating Appunto-Auth - -#### Codeigniter language files - -The first step in translating Appunto-Auth is to create or find a translation of the CodeIgniter language files. -When you change the language via the $config['language'] setting in the CodeIgniter config/config.php, CodeIgniter -libraries will expect these files to be there and you will most likely experience PHP errors if they are not there. - -There are many translations out there for CodeIgniter's language files and you should be able to find one for your language. -If not, copy the English files from system/language/english into application/language/your-language to prevent PHP errors. You -can then change the text in these files where necessary. If you complete a full translation, please post it and share it with -other CodeIgniter developers. - -#### Appunto-Auth Codeigniter language file - -Appunto-Auth's CodeIgniter language files are included in the application/language/[language-name] folders. To add your own -translation, create a folder with the name of your language in the application/language/ folder. Copy the -appunto_auth_lang.php into your new folder from one of the other language folders and use it as a template. - - __The name of this folder must match the name of the value of the $config['language'] setting in the CodeIgniter config/config.php__ - - -#### Appunto-Auth admin interface language file - -The language files used to translate many of the elements of the admin interface are javascript files located -at resources/appunto-auth/lang/ . To translate this into your own language, start with the english.js file and rename it to -your-language.js. - - __The name of this file must match the name of the CodeIgniter language folder and the value of the $config['language'] -setting in the CodeIgniter config/config.php__ - -Change the text values from English to your native language, but be very careful about quotes and commas. Javascript can -be very finicky and a missed comma or misplaced quote can cause a javascript error that will prevent the application from -opening at all. If your admin interface does not load, check your syntax. Please convert all accented and special characters -to HTML safe entities using a converter like this: http://www.kidquick.com/JoomlaTools/frenchAccents.htm - -## Helpers - -__appunto_login_box()__ - -creates a login dialog - -__anchor_if_permitted($permission,$uri,$title,$attributes)__ - -Creates an anchor based on the local URL if user has the appropriate permission. The permission parameter is case -sensitive and must match the internal name of a permission you have created in the admin interface for this -function to return a link - -This helper uses the anchor() helper function from CodeIgniter's URL Helper so use the guidelines for that function for -the 2nd, 3rd and 4th parameters. - -__appunto_username()__ - -Returns the user's username, if logged in. - -__appunto_logout_link($show_if_logged_out,$attributes)__ - -Creates a logout link based on the logout path defined in the appunto_auth.php config file, using the logout text specified -in the appunto_auth_lang.php file. - -If the first parameter is true, a logout link will be returned even if the user is not logged in. Defaults to false. - -The second parameter can contain a list of attributes you would like added to the link. The attributes can be a simple -string or an associative array, as defined by the anchor() helper function from CodeIgniter's URL Helper. - -__is_logged_in()__ - -Returns true if the user is logged in, false if the user is not logged in. - -## Public Library Functions - -While one of the goals of Appunto-Auth is to take authentication code out of the application's controllers, -occasionally situations require some user control within the controller classes, for example if you want your -default controller to redirect to another controller depending on the user's permissions. - -These functions can be called using the following syntax: -``` -$this->appunto_auth->function_name() -``` - -__logged_in()__ - -Returns true if the user is logged in, false if the user is not logged in. - -__get_username()__ - -Returns the user's username if the user is logged in, false if the user is not logged in. - -__get_user_id()__ - -Returns the user's id if the user is logged in, false if the user is not logged in. - -__userHasPermission($permission)__ - -The $permission parameter is case sensitive and must match the internal name of a permission you have created in the admin interface. - -Returns true if the user has the specified permission, false if the user is not logged in or does not -have the specified permission. - - -## Additional Notes - -### A note on removing index.php - -You may remove the index.php from your URLs as described in the CodeIgniter user guide, but make sure you alter the rewrite rule to exclude the resources folder so the css and javascript files are not served by the index.php. If you are using the example .htaccess from the user guide: -``` -RewriteEngine on -RewriteCond $1 !^(index\.php|images|robots\.txt) -RewriteRule ^(.*)$ /index.php/$1 [L] -``` -add resources to the RewriteCond line like this: -``` -RewriteEngine on -RewriteCond $1 !^(index\.php|images|robots\.txt|resources) -RewriteRule ^(.*)$ /index.php/$1 [L] -``` -If your application is not being served from the root of your domain, be sure to alter the third line with the correct path: -``` -RewriteRule ^(.*)$ /myapplication/index.php/$1 [L] -``` - -### A note on _remap (Remapping Function Calls) - -CodeIgniter allows the developer to remap function calls as detailed here: https://ellislab.com/codeigniter/user-guide/general/controllers.html#remapping - -If a controller does contain a _remap function, AppuntoAuth's verification procedure will verify the user if the user has -necessary permissions to access a function in that controller that matches the user's request path (the normal procedure), -or if the user has the necessary permissions to access the _remap function. - -As noted in the CodeIgniter user guide: "If your controller contains a function named _remap(), it will always get called -regardless of what your URI contains. It overrides the normal behavior in which the URI determines which function is called, -allowing you to define your own function routing rules." Therefore AppuntoAuth assumes any call to a controller with a _remap -function could be a call to the _remap function and verifies the user's permissions for the _remap function. - -If additional access levels are desired in a controller with a _remap function, the developer must add them to the controller code. - -### Limitations - -#### MySQL only - -The current release has only been tested on MySQL. I hope to add support for other databases in future releases. - -#### Controllers with the same name - -CodeIgniter allows you to have controllers with the same name as long as they are located in different folders. This is not -currently supported by Appunto-Auth and all controller classes in your application must have unique names. - - - diff --git a/app/application/config/appunto-auth/appunto_auth.php b/app/application/config/appunto-auth/appunto_auth.php deleted file mode 100644 index 945e8b01..00000000 --- a/app/application/config/appunto-auth/appunto_auth.php +++ /dev/null @@ -1,87 +0,0 @@ - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - \ No newline at end of file diff --git a/app/application/controllers/appunto-auth/ui.php b/app/application/controllers/appunto-auth/ui.php deleted file mode 100644 index df9912ab..00000000 --- a/app/application/controllers/appunto-auth/ui.php +++ /dev/null @@ -1,706 +0,0 @@ -load->library('appunto-auth/appunto_auth'); - $this->load->library('form_validation'); - $this->load->database(); - } - - public function _remap($method,$params = array()) - { - $result = array(); - - $func = 'index'; - if (array_key_exists(0,$params)) $func = $params[0]; - - $invalid_function = array ( 'success' => false, 'msg' => 'Invalid action.'); - - switch ($method) - { - case 'admin': - // $this->load->helper('appunto-auth_helper'); // helper is being loaded in library - switch ($func) - { - case 'index': - echo appunto_auth_admin(); // helper function - break; - default: $this->appunto_auth->sendResponse($invalid_function); - } - break; - - case 'user': - - // $this->load->model('usermodel'); // usermodel is being loaded in library - switch ($func) - { - case 'read': - $this->appunto_auth->controller_read($this->usermodel); - break; - case 'create': - $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean'); - $this->form_validation->set_rules('name', 'Name', 'trim|xss_clean'); - $this->form_validation->set_rules('surname', 'Last name', 'trim|xss_clean'); - $this->form_validation->set_rules('email', 'Email address', 'trim|required|valid_email|xss_clean'); - $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback__password_strength|callback__hash'); - - $this->appunto_auth->controller_create($this->usermodel); - break; - case 'update': - $this->form_validation->set_rules('id', 'ID', 'trim|required|xss_clean'); - $this->form_validation->set_rules('username', 'Username', 'trim|xss_clean'); - $this->form_validation->set_rules('name', 'Name', 'trim|xss_clean'); - $this->form_validation->set_rules('surname', 'Last name', 'trim|xss_clean'); - $this->form_validation->set_rules('email', 'Email address', 'trim|valid_email|xss_clean'); - - $this->appunto_auth->controller_update($this->usermodel); - break; - case 'update_pass': - $this->form_validation->set_rules('id', 'ID', 'trim|required|xss_clean'); - $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback__password_strength|callback__hash'); - - $this->appunto_auth->controller_update($this->usermodel); - break; - case 'destroy': - $this->form_validation->set_rules('id', 'Record ID', 'trim|required|numeric|xss_clean'); - - $this->appunto_auth->controller_destroy($this->usermodel); - break; - case 'roles': - $this->form_validation->set_rules('id', 'Record ID', 'trim|required|numeric|xss_clean'); - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - $sort = $this->input->get_post('sort', TRUE); - - $id = $this->input->get_post('id', TRUE); - - $property = null; - $direction = null; - $active_filter = false; - - // get sort params - $sort_array = json_decode($sort); - if (count($sort_array) > 0) - { - $property = $sort_array[0]->property; - $direction = $sort_array[0]->direction; - } - - $result = $this->usermodel->get_user_roles($id,$property,$direction); - } - $this->appunto_auth->sendResponse($result); - break; - case 'permissions': - $this->form_validation->set_rules('id', 'Record ID', 'trim|required|numeric|xss_clean'); - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - $sort = $this->input->get_post('sort', TRUE); - - $id = $this->input->get_post('id', TRUE); - - $property = null; - $direction = null; - $active_filter = false; - - // get sort params - $sort_array = json_decode($sort); - if (count($sort_array) > 0) - { - $property = $sort_array[0]->property; - $direction = $sort_array[0]->direction; - } - - $result = $this->usermodel->get_user_permissions($id,$property,$direction); - - } - $this->appunto_auth->sendResponse($result); - break; - case 'add_role': - $this->form_validation->set_rules('id', 'Role ID', 'trim|required|numeric|xss_clean'); - $this->form_validation->set_rules('user_id', 'User ID', 'trim|required|numeric|xss_clean'); - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - $role_id = $this->input->get_post('id', TRUE); - $user_id = $this->input->get_post('user_id', TRUE); - - $result = $this->usermodel->add_role($role_id,$user_id); - } - $this->appunto_auth->sendResponse($result); - break; - case 'remove_role': - $this->form_validation->set_rules('id', 'Role ID', 'trim|required|numeric|xss_clean'); - $this->form_validation->set_rules('user_id', 'User ID', 'trim|required|numeric|xss_clean'); - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - $role_id = $this->input->get_post('id', TRUE); - $user_id = $this->input->get_post('user_id', TRUE); - - $result = $this->usermodel->remove_role($role_id,$user_id); - } - $this->appunto_auth->sendResponse($result); - break; - case 'add_permission': - $this->form_validation->set_rules('id', 'Permission ID', 'trim|required|numeric|xss_clean'); - $this->form_validation->set_rules('user_id', 'User ID', 'trim|required|numeric|xss_clean'); - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - $permission_id = $this->input->get_post('id', TRUE); - $user_id = $this->input->get_post('user_id', TRUE); - - $result = $this->usermodel->add_permission($permission_id,$user_id); - } - $this->appunto_auth->sendResponse($result); - break; - case 'remove_permission': - $this->form_validation->set_rules('id', 'Permission ID', 'trim|required|numeric|xss_clean'); - $this->form_validation->set_rules('user_id', 'User ID', 'trim|required|numeric|xss_clean'); - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - $permission_id = $this->input->get_post('id', TRUE); - $user_id = $this->input->get_post('user_id', TRUE); - - $result = $this->usermodel->remove_permission($permission_id,$user_id); - } - $this->appunto_auth->sendResponse($result); - break; - default: $this->appunto_auth->sendResponse($invalid_function); - } - break; - - case 'role': - $this->load->model('appunto-auth/rolemodel'); - switch ($func) - { - case 'read': - $this->appunto_auth->controller_read($this->rolemodel); - break; - case 'create': - $this->form_validation->set_rules('name', 'Name', 'trim|required|min_length[3]|max_length[32]|xss_clean'); - $this->form_validation->set_rules('description', 'Description', 'trim|max_length[64]|xss_clean'); - - $this->appunto_auth->controller_create($this->rolemodel); - break; - case 'update': - $this->form_validation->set_rules('id', 'ID', 'trim|required|numeric|xss_clean'); - $this->form_validation->set_rules('name', 'Name', 'trim|min_length[3]|max_length[32]|xss_clean'); - $this->form_validation->set_rules('description', 'Description', 'trim|max_length[64]|xss_clean'); - - $this->appunto_auth->controller_update($this->rolemodel); - break; - case 'destroy': - $rules = 'trim|required|numeric|xss_clean'; - $rules .= '|callback__validate_role_in_use_by_user'; - $rules .= '|callback__validate_role_in_use_by_permission'; - - $this->form_validation->set_rules('id', 'Record ID', $rules); - - $this->appunto_auth->controller_destroy($this->rolemodel); - break; - case 'permissions': - $this->form_validation->set_rules('id', 'Record ID', 'trim|required|numeric|xss_clean'); - - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - $sort = $this->input->get_post('sort', TRUE); - - $id = $this->input->get_post('id', TRUE); - - $property = null; - $direction = null; - $active_filter = false; - - // get sort params - $sort_array = json_decode($sort); - if (count($sort_array) > 0) - { - $property = $sort_array[0]->property; - $direction = $sort_array[0]->direction; - } - - $result = $this->rolemodel->get_role_permissions($id,$property,$direction); - } - $this->appunto_auth->sendResponse($result); - break; - case 'add_permission': - $this->form_validation->set_rules('id', 'Permission ID', 'trim|required|numeric|xss_clean'); - $this->form_validation->set_rules('role_id', 'Role ID', 'trim|required|numeric|xss_clean'); - - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - $permission_id = $this->input->get_post('id', TRUE); - $role_id = $this->input->get_post('role_id', TRUE); - - $result = $this->rolemodel->add_permission($permission_id,$role_id); - } - - $this->appunto_auth->sendResponse($result); - break; - case 'remove_permission': - $this->form_validation->set_rules('id', 'Permission ID', 'trim|required|numeric|xss_clean'); - $this->form_validation->set_rules('role_id', 'Role ID', 'trim|required|numeric|xss_clean'); - - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - $permission_id = $this->input->get_post('id', TRUE); - $role_id = $this->input->get_post('role_id', TRUE); - - $result = $this->rolemodel->remove_permission($permission_id,$role_id); - } - - $this->appunto_auth->sendResponse($result); - break; - default: $this->appunto_auth->sendResponse($invalid_function); - } - break; - - case 'permission': - $this->load->model('appunto-auth/permissionmodel'); - switch ($func) - { - case 'read': - $this->appunto_auth->controller_read($this->permissionmodel); - break; - case 'create': - $this->form_validation->set_rules('name', 'Name', 'trim|required|min_length[3]|max_length[32]|xss_clean'); - $this->form_validation->set_rules('description', 'Description', 'trim|max_length[64]|xss_clean'); - - $this->appunto_auth->controller_create($this->permissionmodel); - break; - case 'update': - $this->form_validation->set_rules('id', 'ID', 'trim|required|numeric|xss_clean'); - $this->form_validation->set_rules('name', 'Name', 'trim|min_length[3]|max_length[32]|xss_clean'); - $this->form_validation->set_rules('description', 'Description', 'trim|max_length[64]|xss_clean'); - - $this->appunto_auth->controller_update($this->permissionmodel); - break; - case 'destroy': - $rules = 'trim|required|numeric|xss_clean'; - $rules .= '|callback__validate_permission_in_use_by_user'; - $rules .= '|callback__validate_permission_in_use_by_role'; - $rules .= '|callback__validate_permission_in_use_by_path'; - - $this->form_validation->set_rules('id', 'Record ID', $rules); - - $this->appunto_auth->controller_destroy($this->permissionmodel); - break; - default: $this->appunto_auth->sendResponse($invalid_function); - } - break; - - case 'path': - $this->load->model('appunto-auth/pathmodel'); // pathmodel is being loaded in the library - switch ($func) - { - case 'read': - $this->appunto_auth->controller_read($this->pathmodel); - break; - - case 'verify_paths': - // start off by marking all paths unfound. - $this->pathmodel->mark_all_unfound(); - - $data = array(); - $controllers = array(); - - $dir = APPPATH.'controllers/'; - $files = scandir($dir); - - $controller_dirs = array_filter($files, function($filename) { - $dir = APPPATH.'controllers/'; // not worth making it a global and "use" is only php 5.3+ - return (is_dir($dir.$filename) && $filename != '..'); - }); - - $new_cnt = 0; - $newPaths = array(); - $failed = array(); - - foreach ($controller_dirs as $controller_dir) - { - // get files in this directory - $files = scandir($dir.$controller_dir); - $controller_files = array_filter($files, function($filename) { - return (substr(strrchr($filename, '.'), 1)=='php') ? true : false; - }); - foreach ($controller_files as $filename) - { - $this_dir = ($controller_dir == '.') ? $dir : $dir.$controller_dir.'/'; - - $classname = ucfirst(substr($filename, 0, strrpos($filename, '.'))); - - if (!class_exists($classname)||($classname == 'Ui')) - { - - if ($filename != 'ui.php') require_once($this_dir.$filename); - - $classname = ucfirst(substr($filename, 0, strrpos($filename, '.'))); - $controller = new $classname(); - $methods = get_class_methods($controller); - - foreach ($methods as $method) - { - - $full_path = ($controller_dir=='.') ? $filename : $controller_dir.'/'.$filename; - - if ($this->pathmodel->path_exists($controller_dir,$classname,$method)) - { - $this->pathmodel->mark_found($controller_dir,$classname,$method); - } - else - { - if ((substr($method,0,1)!='_' && $method!='get_instance') || $method=='_remap') { - $this->pathmodel->create_record($controller_dir,$filename,$full_path,$classname,$method,1); - $newPaths[$new_cnt] = $full_path; - $new_cnt++; - } - } - } - } - else - { - array_push($failed, $classname); - } - } - } - - - if (count($failed)>0) - { - $msg = 'You have '.count($failed).' controller'.((count($failed)>1) ? 's':'').' with a duplicate name: '; - $msg .= "
"; - $msg .= ''.implode(",", $failed).''; - $msg .= "
"; - $msg .= $this->lang->line('appunto_no_homonymous_controllers'); - $result = array ( - 'success' => false, - 'msg' => $msg - ); - } - else - { - $msg = 'No new paths found.'; - if ($new_cnt > 0) - { - $msg = $new_cnt.' new path'.($new_cnt > 1 ? "s":"").' found.'; - $msg .= ''; - } - $result = array ( - 'success' => true, - 'msg' => $msg, - 'total' => $new_cnt - ); - } - $this->appunto_auth->sendResponse($result); - break; - - case 'update': - $this->form_validation->set_rules('id', 'ID', 'trim|required|numeric|xss_clean'); - $this->form_validation->set_rules('public_flag', 'Visibility (public/private) ', 'trim|numeric|xss_clean'); - $this->form_validation->set_rules('permission_id', 'Permission ID', 'trim|numeric|xss_clean'); - - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - // return all POST items with XSS filter - $data = $this->input->post(NULL, TRUE); - - // disregard this field which may be sent with permission_id change - if (isset($data['permission_name'])) unset($data['permission_name']); - - // clear any permissions if we are making this a public path - if (isset($data['public_flag']) && $data['public_flag']==1) - { - $ignore = $this->pathmodel->clear_permissions($data); - } - - if (count($data)>1) - { - $result = $this->pathmodel->update_record($data); - } - else if (!isset($result)) - { - $result = array ( - 'success' => false, - 'msg' => 'No updates attempted.' - ); - } - } - $this->appunto_auth->sendResponse($result); - break; - - case 'destroy': - $this->form_validation->set_rules('id', 'ID', 'trim|required|numeric|xss_clean'); - - // create array from post data - $data = $this->input->post(NULL, TRUE); - - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - $this->appunto_auth->sendResponse($result); - } - else if ($this->pathmodel->is_marked_found($data)) - { - $result = array ( - 'success' => false, - 'msg' => $this->lang->line('appunto_path_found_in_filesystem') - ); - $this->appunto_auth->sendResponse($result); - } - else - { - $this->appunto_auth->controller_destroy($this->pathmodel); - } - break; - - case 'delete_not_found': - $result = $this->pathmodel->delete_not_found(); - $this->appunto_auth->sendResponse($result); - break; - - case 'remove_permission': - $this->form_validation->set_rules('id', 'ID', 'trim|required|numeric|xss_clean'); - - if ($this->form_validation->run()==FALSE) - { - $result = $this->_validation_error(); - } - else - { - $data = $this->input->post(NULL, TRUE); - $result = $this->pathmodel->clear_permissions($data); - } - $this->appunto_auth->sendResponse($result); - break; - - default: $this->appunto_auth->sendResponse($invalid_function); - } - break; - - case 'session': - $this->load->model('appunto-auth/sessionmodel'); - switch ($func) - { - case 'read': - $this->appunto_auth->controller_read($this->sessionmodel); - break; - case 'destroy': - $this->form_validation->set_rules('id', 'Record ID', 'trim|required|xss_clean'); - $this->appunto_auth->controller_destroy($this->sessionmodel); - break; - default: $this->appunto_auth->sendResponse($invalid_function); - } - break; - - case 'statusinfo': - $info_array = array(); - - array_push($info_array, array ( - 'info_item' => 'Codeigniter version', - 'info_val' => CI_VERSION - )); - array_push($info_array, array ( - 'info_item' => 'Appunto-Auth version', - 'info_val' => $this->config->item('appunto_auth_version', 'appunto-auth/appunto_auth') - )); - - $hooks_enabled = $this->config->item('enable_hooks'); - array_push($info_array, array ( - 'info_item' => 'Hooks enabled', - 'info_val' => $hooks_enabled, - 'info_note' => (!$hooks_enabled ? $this->lang->line('appunto_no_hook') : '') - )); - - $csrf_protection = $this->config->item('csrf_protection'); - array_push($info_array, array ( - 'info_item' => $this->lang->line('appunto_csrf_protection'), - 'info_val' => $csrf_protection, - 'info_note' => (!$csrf_protection ? $this->lang->line('appunto_set_true') : '') - )); - - - $sessions_using_database = $this->config->item('sess_use_database'); - array_push($info_array, array ( - 'info_item' => $this->lang->line('appunto_db_sessions'), - 'info_val' => $sessions_using_database, - 'info_note' => (!$sessions_using_database? $this->lang->line('appunto_set_true') : '') - )); - - $sessions_encrypted = $this->config->item('sess_encrypt_cookie'); - array_push($info_array, array ( - 'info_item' => $this->lang->line('appunto_encrypted_cookies'), - 'info_val' => $sessions_encrypted, - 'info_note' => (!$sessions_encrypted ? $this->lang->line('appunto_set_true') : '') - )); - - $allow_private_without_permission = $this->config->item('allow_private_without_permission', 'appunto-auth/appunto_auth'); - array_push($info_array, array ( - 'info_item' => $this->lang->line('appunto_private_sans_perm'), - 'info_val' => $allow_private_without_permission, - 'info_note' => ($allow_private_without_permission? $this->lang->line('appunto_private_sans_perm_warn') : '') - )); - - $result = array ( - 'success' => true, - 'rows' => $info_array - ); - $this->appunto_auth->sendResponse($result); - - break; - - case 'keep-alive': - $result = array ( - 'success' => true - ); - $this->appunto_auth->sendResponse($result); - break; - - default: - $result = array ( - 'success' => false, - 'msg' => 'Invalid method.' - ); - $this->appunto_auth->sendResponse($result); - } - } - - function _validation_error() - { - return array ( - 'success' => false, - 'msg' => $this->lang->line('appunto_errors_encountered'), - 'errors' => validation_errors() - ); - } - - function _password_strength($pass) - { - $pass_regex = $this->config->item('password_regex_php', 'appunto-auth/appunto_auth'); - - if (preg_match($pass_regex,$pass)!==1) - { - $this->form_validation->set_message( '_password_strength', $this->lang->line('appunto_password_strength_fail')); - return false; - } - - return true; - } - - function _validate_permission_in_use_by_user($id) - { - if ($this->permissionmodel->in_use_by_user($id)) - { - $this->form_validation->set_message( - '_validate_permission_in_use_by_user', - $this->lang->line('appunto_permission_in_use_by_user') - ); - return false; - } - return true; - } - - function _validate_permission_in_use_by_role($id) - { - if ($this->permissionmodel->in_use_by_role($id)) - { - $this->form_validation->set_message( - '_validate_permission_in_use_by_role', - $this->lang->line('appunto_permission_in_use_by_role') - ); - return false; - } - return true; - } - - function _validate_permission_in_use_by_path($id) - { - if ($this->permissionmodel->in_use_by_path($id)) - { - $this->form_validation->set_message( - '_validate_permission_in_use_by_path', - $this->lang->line('appunto_permission_in_use_by_path') - ); - return false; - } - return true; - } - - function _validate_role_in_use_by_user($id) - { - if ($this->rolemodel->in_use_by_user($id)) - { - $this->form_validation->set_message( - '_validate_role_in_use_by_user', - $this->lang->line('appunto_role_in_use_by_user') - ); - return false; - } - return true; - } - - function _validate_role_in_use_by_permission($id) - { - if ($this->rolemodel->in_use_by_permission($id)) - { - $this->form_validation->set_message( - '_validate_role_in_use_by_permission', - $this->lang->line('appunto_role_in_use_by_permission') - ); - return false; - } - return true; - } - - function _hash($str) - { - return $this->appunto_auth->hashPassword($str); - } -}; - diff --git a/app/application/controllers/appunto-auth/user.php b/app/application/controllers/appunto-auth/user.php deleted file mode 100644 index 90c5d591..00000000 --- a/app/application/controllers/appunto-auth/user.php +++ /dev/null @@ -1,157 +0,0 @@ -load->library('appunto-auth/appunto_auth'); - - $this->load->library('form_validation'); - } - - public function login() - { - if (isset($_SERVER['HTTP_REFERER'])) - { - $this->session->set_userdata('prev_url', $_SERVER['HTTP_REFERER']); - } - else - { - $this->session->set_userdata('prev_url', base_url()); - } - - - $this->load->helper('appunto-auth/appunto-auth'); - - if ($this->appunto_auth->logged_in()) redirect($this->router->default_controller); - - $data = array(); - $data['auth_message'] = $this->session->flashdata('auth_message'); - $data['site_name'] = $this->config->item('site_name', 'appunto-auth/appunto_auth'); - - if ($_SERVER['REQUEST_METHOD'] == 'GET') - { - $this->load->view('appunto-auth/login',$data); - } - else if ($_SERVER['REQUEST_METHOD'] == 'POST') - { - - $this->form_validation->set_rules('username', 'lang:appunto_form_username', 'trim|required|xss_clean'); - $this->form_validation->set_rules('password', 'lang:appunto_form_password', 'trim|required|xss_clean'); - - $username = $this->input->post('username', TRUE); - $ip_address = $this->input->ip_address(); - $user_agent = $this->input->user_agent(); - - if (!$this->form_validation->run()) - { - $this->usermodel->record_login_attempt($username, $ip_address, 0, $user_agent, 'form validation: '.validation_errors('[',']')); - //$uri = $this->input->post('url', TRUE); - $this->load->view('appunto-auth/login',$data); - } - else - { - $user = $this->usermodel->getLoginInfo( $this->input->post('username', TRUE) ); - $pass = $this->input->post('password', TRUE); - - if (($user != false) && $this->appunto_auth->checkPassword($pass,$user->password)) - { - $this->usermodel->record_login_attempt($username, $ip_address, 1, $user_agent, 'successful login'); - $this->usermodel->update_last_login($username,$ip_address); - - $this->session->set_userdata(array( - 'user_id' => $user->id, - 'username' => $user->username, - 'email' => $user->email, - 'logged_in' => true - )); - redirect($this->router->default_controller); - } - else - { - $this->form_validation->set_rules('password', 'lang:appunto_form_password', 'callback__invalid_password'); - $this->form_validation->run(); - $this->usermodel->record_login_attempt($username, $ip_address, 0, $user_agent, 'password check: '.validation_errors('[',']')); - $this->load->view('appunto-auth/login',$data); - } - } - } - else die('invalid request method:'.$_SERVER['REQUEST_METHOD']); - } - - public function error() - { - $data = array(); - $data['site_name'] = $this->config->item('site_name', 'appunto-auth/appunto_auth'); - $data['auth_message'] = lang('appunto_message_default_error'); - - $auth_message = $this->session->flashdata('auth_message'); - if (isset($auth_message) && strlen($auth_message)>3) - { - $data['auth_message'] = $auth_message; - } - - $this->load->view('error',$data); - } - - /* - * callback function for form validation - */ - public function _invalid_password($str) - { - $this->form_validation->set_message('_invalid_password', lang('appunto_form_invalid_login')); - return false; - } - - public function logout() - { - $this->session->set_userdata(array( - 'user_id' => '', - 'username' => '', - 'email' => '', - 'logged_in' => false - )); - $_SESSION = array(); - $this->session->set_flashdata('auth_message', lang('appunto_message_logout')); - redirect(rtrim(site_url(), "/").'/'.$this->config->item('login_url','appunto-auth/appunto_auth')); - } - - // Not yet implemented... will work on this for a future version - public function _forgotpassword() - { - //if ($this->appunto_auth->logged_in()) redirect($this->router->default_controller); - - if ($_SERVER['REQUEST_METHOD'] == 'GET') - { - $data = array(); - $data['site_name'] = $this->config->item('site_name', 'appunto-auth/appunto_auth'); - - $auth_message = $this->session->flashdata('auth_message'); - if (isset($auth_message) && strlen($auth_message)>3) - { - $data['auth_message'] = $auth_message; - } - - $this->load->view('forgotpass',$data); - } - else if ($_SERVER['REQUEST_METHOD'] == 'POST') - { - - $this->form_validation->set_rules('username', 'lang:appunto_form_forgot_pw_username', 'trim|required|xss_clean'); - - if (!$this->form_validation->run()) - { - $this->load->view('forgotpass'); - } - else - { - } - } - else die('invalid request method'); - } - -} -/* End of file application.php */ -/* Location: ./application/controllers/application.php */ diff --git a/app/application/helpers/appunto-auth/appunto-auth_helper.php b/app/application/helpers/appunto-auth/appunto-auth_helper.php deleted file mode 100644 index 88b15230..00000000 --- a/app/application/helpers/appunto-auth/appunto-auth_helper.php +++ /dev/null @@ -1,274 +0,0 @@ -appunto_auth)) $CI->load->library('appunto_auth'); - - $js_config = $CI->appunto_auth->jsConfigItems(); - - $base_url = base_url(); - $site_url = site_url(); - $site_name = $CI->config->item('site_name', 'appunto-auth/appunto_auth'); - $theme_dir = $CI->config->item('appunto_auth_theme', 'appunto-auth/appunto_auth'); - $lang = config_item('language'); - - - $html = << - - - - - - {$site_name} - - - - - - - - - - {$js_config} - - - - - - - - - - -APP; - return $html; - } -} - -if ( ! function_exists('appunto_login_box')) -{ - function appunto_login_box($auth_message = false, $css = 'login-form-box') - { - $CI =& get_instance(); - - if (!isset($CI->appunto_auth)) $CI->load->library('appunto-auth/appunto_auth'); - if (!isset($CI->form_validation)) $CI->load->library('form_validation'); - - $CI->load->config('appunto-auth/appunto_auth',true,false); // true to avoid naming collisions, false to not suppress errors - $site_name = "
".$CI->config->item('site_name', 'appunto-auth/appunto_auth')."
"; - - $base_url = base_url(); - $site_url = site_url(); - - $label_username = lang('appunto_form_username'); - $label_password = lang('appunto_form_password'); - $label_login_button = lang('appunto_form_login_button'); - $label_logout_button = lang('appunto_form_logout_button'); - - $login = array( - 'name' => 'username', - 'id' => 'username', - 'value' => set_value('username'), - 'maxlength' => 80 - ); - $password = array( - 'name' => 'password', - 'id' => 'password' - ); - - $message_div = ''; - if ($auth_message != false) { - $message_div = "
$auth_message
"; - } - else if ($CI->appunto_auth->logged_in()) { - $message_div = "
You are already logged in.
"; - } - - $validation_errors = validation_errors(); - - $field_username = form_input($login); - $field_password = form_password($password); - $field_uri = form_hidden('uri',set_value('uri',$CI->uri->uri_string())); - $login_button = form_submit(array('name'=>'login','value'=>$label_login_button,'id'=>'login-button')); - $logout_button = form_submit(array('name'=>'logout','value'=>$label_logout_button,'id'=>'logout-button')); - - $login_form_open = form_open($CI->config->item('login_url', 'appunto-auth/appunto_auth')); - $logout_form_open = form_open($CI->config->item('logout_url', 'appunto-auth/appunto_auth')); - $form_close = form_close(); - - if ($CI->appunto_auth->logged_in()) { - - $html = << - $site_name - $logout_form_open - $message_div - $logout_button - $form_close - -LOGINBOX; - - } else { - - $html = << - $site_name - $login_form_open - $message_div - - $field_uri - - - $login_button - $form_close - -LOGINBOX; - - } - - return $html; - } -} - - -/** - * Anchor Link (if permitted) - * - * Creates an anchor based on the local URL if user has the appropriate permission. - * - * @access public - * @param string the permission's internal name - * @param string the URL - * @param string the link title - * @param mixed any attributes - * @return string - */ -if ( ! function_exists('anchor_if_permitted')) -{ - function anchor_if_permitted($permission,$uri = '', $title = '', $attributes = '') - { - $CI =& get_instance(); - $CI->load->helper('url'); - - if (!isset($CI->appunto_auth)) $CI->load->library('appunto_auth'); - - if ($CI->appunto_auth->userHasPermission($permission)) - { - return anchor($uri,$title,$attributes); - } - else - { - return ''; - } - } -} - -/** - * Username (if logged in) - * - * @access public - * @return string - */ -if ( ! function_exists('appunto_username')) -{ - function appunto_username() - { - $CI =& get_instance(); - - if (!isset($CI->appunto_auth)) $CI->load->library('appunto_auth'); - - $username = $CI->appunto_auth->get_username(); - - if ($username != false) - { - return $username; - } - else - { - return ''; - } - } -} - -/** - * appunto_logout_link - * - * @access public - * @param boolean show even if user is logged out - * @param mixed any attributes for anchor helper - * @return string - */ -if ( ! function_exists('appunto_logout_link')) -{ - function appunto_logout_link($show_if_logged_out = false, $attributes = '') - { - $CI =& get_instance(); - $CI->load->helper('url'); - - if (!isset($CI->appunto_auth)) $CI->load->library('appunto_auth'); - - if ($show_if_logged_out == true || $CI->appunto_auth->logged_in() == true) - { - return anchor($CI->config->item('logout_url', 'appunto-auth/appunto_auth'), lang('appunto_form_logout_button'), $attributes); - } - else - { - return ''; - } - } -} - -/** - * is_logged_in - * - * @access public - * @return boolean - */ -if ( ! function_exists('is_logged_in')) -{ - function is_logged_in() - { - $CI =& get_instance(); - - if (!isset($CI->appunto_auth)) $CI->load->library('appunto_auth'); - - return ($CI->appunto_auth->logged_in() == true); - } -} - -/** - * has_permission - * - * @access public - * @param string the permission's internal name - * @return string - */ -if ( ! function_exists('has_permission')) -{ - function has_permission($permission) - { - $CI =& get_instance(); - - if (!isset($CI->appunto_auth)) $CI->load->library('appunto_auth'); - - return ($CI->appunto_auth->userHasPermission($permission) == true); - } -} - -?> diff --git a/app/application/helpers/appunto-auth/index.html b/app/application/helpers/appunto-auth/index.html deleted file mode 100644 index c942a79c..00000000 --- a/app/application/helpers/appunto-auth/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - \ No newline at end of file diff --git a/app/application/language/english/appunto_auth_lang.php b/app/application/language/english/appunto_auth_lang.php deleted file mode 100644 index b5099e84..00000000 --- a/app/application/language/english/appunto_auth_lang.php +++ /dev/null @@ -1,50 +0,0 @@ -
Please refresh paths if you believe you have received this message in error.'; -$lang['appunto_no_hook'] = 'No authentication is being performed!'; -$lang['appunto_set_true'] = 'Consider setting this value to true'; -$lang['appunto_db_sessions'] = 'Sessions using database'; -$lang['appunto_csrf_protection'] = 'CSRF protection enabled'; -$lang['appunto_encrypted_cookies'] = 'Sessions using encrypted cookies'; -$lang['appunto_private_sans_perm'] = 'Private paths without permissions viewable'; -$lang['appunto_private_sans_perm_warn'] = 'Private paths without defined permissions viewable to any logged in user'; -$lang['appunto_no_homonymous_controllers'] = 'AppuntoAuth does not support controller classes with the same name in different directories.'; diff --git a/app/application/language/english/index.html b/app/application/language/english/index.html deleted file mode 100644 index c942a79c..00000000 --- a/app/application/language/english/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - \ No newline at end of file diff --git a/app/application/language/index.html b/app/application/language/index.html deleted file mode 100644 index c942a79c..00000000 --- a/app/application/language/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - \ No newline at end of file diff --git a/app/application/language/portuguese-br/appunto_auth_lang.php b/app/application/language/portuguese-br/appunto_auth_lang.php deleted file mode 100644 index c6f58255..00000000 --- a/app/application/language/portuguese-br/appunto_auth_lang.php +++ /dev/null @@ -1,50 +0,0 @@ -
Atualize caminhos, se você achar que recebeu esta mensagem por engano.'; -$lang['appunto_no_hook'] = 'Nenhuma autenticação está sendo realizada!'; -$lang['appunto_set_true'] = 'Defina este valor para "verdadeiro"'; -$lang['appunto_db_sessions'] = 'Sessões usando banco de dados'; -$lang['appunto_csrf_protection'] = 'CSRF protection enabled'; -$lang['appunto_encrypted_cookies'] = 'Sessões usando cookies criptografados'; -$lang['appunto_private_sans_perm'] = 'Caminhos privados sem permissões visíveis'; -$lang['appunto_private_sans_perm_warn'] = 'caminhos privados sem permissões definidas visíveis para qualquer usuário conectado'; -$lang['appunto_no_homonymous_controllers'] = 'AppuntoAuth não suporta classes do controlador com o mesmo nome em diferentes diretórios.'; diff --git a/app/application/language/portuguese-br/calendar_lang.php b/app/application/language/portuguese-br/calendar_lang.php deleted file mode 100644 index b91ce001..00000000 --- a/app/application/language/portuguese-br/calendar_lang.php +++ /dev/null @@ -1,51 +0,0 @@ - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - \ No newline at end of file diff --git a/app/application/language/portuguese-br/migration_lang.php b/app/application/language/portuguese-br/migration_lang.php deleted file mode 100644 index 4db5074b..00000000 --- a/app/application/language/portuguese-br/migration_lang.php +++ /dev/null @@ -1,13 +0,0 @@ -CI =& get_instance(); - - $this->CI->load->config('appunto-auth/appunto_auth',true,false); // true to avoid naming collisions, false to not suppress errors - $this->CI->lang->load('appunto_auth'); - - $this->CI->load->database(); - $this->CI->load->library('session'); - $this->CI->load->helper('url'); - $this->CI->load->helper('language'); - $this->CI->load->helper('appunto-auth/appunto-auth_helper'); - - $this->CI->load->model('appunto-auth/pathmodel'); - $this->CI->load->model('appunto-auth/usermodel'); - } - - /** - * Check if user is logged in - * - * @return void - */ - public function logged_in() - { - return ($this->CI->session->userdata('logged_in') == true); - } - - /** - * Get username if user is logged in - * - * @return void - */ - public function get_username() - { - if ($this->CI->session->userdata('logged_in') == true) - { - return ($this->CI->session->userdata('username')); - } - return false; - } - - /** - * Get user id if user is logged in - * - * @return void - */ - public function get_user_id() - { - if ($this->CI->session->userdata('logged_in') == true) - { - return ($this->CI->session->userdata('user_id')); - } - return false; - } - - /** - * Hook to be executed before controller - * This hook must be included in CodeIgniter's config/hooks.php file using - * the following format: - * - * $hook['post_controller_constructor'] = array( - * 'class' => 'Appunto_auth', - * 'function' => 'require_authentication_hook', - * 'filename' => 'Appunto_auth.php', - * 'filepath' => 'libraries', - * 'params' => array() - * ); - * - * @return void - */ - public function require_authentication_hook() - { - $paths = $this->_getPaths(); - $ci_dir = $this->CI->router->fetch_directory(); - $ci_class = $this->CI->router->fetch_class(); - $ci_method = $this->CI->router->fetch_method(); - - $requested_path = $ci_dir.$ci_class.'/'.$ci_method; - //log_message('error','path: '.$requested_path); - - $this->CI->session->set_userdata('last_page',$ci_dir.$ci_class.'/'.$ci_method); - - // Test validity of path - if (array_key_exists($ci_class,$paths) && - (array_key_exists($ci_method,$paths[$ci_class]) || - array_key_exists('_remap',$paths[$ci_class]))) - { - // if method does not exist, but _remap does, we must authenticate against _remap - if (!array_key_exists($ci_method,$paths[$ci_class]) && array_key_exists('_remap',$paths[$ci_class])) - { - $ci_method = '_remap'; - } - - // Valid path - store it in a variable for brevity - $path = $paths[$ci_class][$ci_method]; - - // Test if path is public - if ($path['public_flag'] == 1) - { - // Valid, public path - return - return; - } - else - { - // Valid, private path - make sure user is logged in - if ($this->logged_in()) - { - // User is logged in, check if path has required permission - if (is_numeric($path['perm']) && $path['perm'] > 0) - { - // Path has a required permission - check if user has this permission - //$user_permissions = $this->_getPermissions(); - //if (in_array($path['perm'],$user_permissions,true)) - if ($this->_userHasPermissionId($path['perm'])) - { - // User has Permission - return - return; - } - else - { - // User does not have required permission - $this->_sendError($this->CI->lang->line('appunto_not_authorized')); - die; - } - } - else - { - // Path has no required permission - check if config allows private without permission - if ($this->CI->config->item('allow_private_without_permission','appunto-auth/appunto_auth')) - { - // Paths without permissions are viewable by logged-in users - return; - } - else - { - // User does not have required permission - $this->_sendError($this->CI->lang->line('appunto_not_authorized')); - die; - } - } - } - else - { - // User is not logged in - if ($requested_path == 'appunto-auth/user/login') - { - // If you are receiving this error, you have the login path set as private - // This must be set as public or users cannot log in - $msg = 'Logins are disabled. Contact an Administrator'; - } - else - { - $msg = $this->CI->lang->line('appunto_login_required'); - } - $this->_sendError($msg,true); - die; - } - } - } - else - { - // Path is not in database - $this->_sendError($this->CI->lang->line('appunto_invalid_path')); - die; - } - die; //shouldn't arrive here - } - - /** - * send auth error - * - * @param string - * @return void - */ - public function _sendError($msg, $login=false) - { - $ajax = $this->_isAjaxRequest(); - - if ($ajax) - { - $result = array ( - 'success' => false, - 'err' => 'LOGIN', - 'msg' => $msg - ); - $this->sendResponse($result); - } - else - { - $view = $login ? 'appunto-auth/login' : 'appunto-auth/error'; - $data['site_name'] = $this->CI->config->item('site_name', 'appunto-auth/appunto_auth'); - $data['auth_message'] = $msg; - - echo($this->CI->load->view($view,$data,true)); - } - } - - - /** - * Return an array of paths. - * - * @return array - */ - public function _getPaths() - { - $path_array = array(); - $result = $this->CI->pathmodel->getAll(); - - if (isset($result['rows']) && is_array($result['rows'])) - { - $rows = $result['rows']; - foreach ($rows as $row) - { - $perm_id = intval($row->permission_id); //tighten this up ******************************************************* - $path_array[strtolower($row->ci_controller)][strtolower($row->ci_method)] = array( - 'public_flag' => $row->public_flag, - 'perm' => $perm_id, - 'perm_string' => $row->internal_name - ); - } - } - return $path_array; - } - - /** - * check if user has role. - * - * @return boolean - */ - /* - public function userHasRole($role_id) - { - $user_id = $this->CI->session->userdata('user_id'); - - return ($this->CI->usermodel->verifyRoleById($user_id,$role_id) > 0); - } - **/ - - /** - * check if user has permission. - * - * @return boolean - */ - public function userHasPermission($permission) - { - if (!$this->logged_in()) return false; // user can't have the permission if not logged in - - $user_id = $this->CI->session->userdata('user_id'); - - return $this->CI->usermodel->verifyPermissionByInternalName($user_id,$permission); - return false; - } - - /** - * check if user has permission. - * - * @return boolean - */ - private function _userHasPermissionId($permission) - { - $user_id = $this->CI->session->userdata('user_id'); - - return $this->CI->usermodel->verifyPermissionById($user_id,$permission); - return false; - } - /** - * Return an array of user permissions. - * - * @return array - */ - private function _getPermissions() - { - $user_id = $this->CI->session->userdata('user_id'); - if (isset($user_id) && is_numeric($user_id) && $user_id > 0) - { - return $this->CI->usermodel->get_user_permission_array($user_id); - } - return array(); - } - - /** - * Return a Javascript snippet with items from the appunto_auth.php config file. - * - * @return string - */ - public function jsConfigItems() - { - $js = ''; - - return $js; - } - - /** - * Test to determine if request was submitted via Ajax - * - * This is a convenience method to identify Ajax requests so responses can be - * structured appropriately. It is not intended to provide any additional security. - * - * Specifically, authentication failures for normal controllers/views will - * redirect to the login page or show an error message while authentication - * failures for JSON requests will offer an ExtJS login dialog or return an - * error message in JSON format; - * - * This cannot be depended on to return an accurate result since headers can - * be faked and some servers may not provide the HTTP_X_REQUESTED_WITH variable. - * - * For servers that don't provide the HTTP_X_REQUESTED_WITH variable, I suggest - * including a flag with AJAX requests and rewritting this function to check for - * the flag. - * - * @return boolean - */ - private function _isAjaxRequest() - { - return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && - (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')); - } - - /** - * Create an array of URLs for use in helper. - * - * @return array - */ -/* - public function include_urls() - { - - $urls = array(); - - $urls['base'] = base_url(); - $urls['extjs'] = $this->CI->config->item('extjs_url', 'appunto_auth'); - - if (true === $this->CI->config->item('appunto_dev_mode', 'appunto_auth')) - { - $urls['extjs_lib'] = $urls['extjs'].'ext-dev.js'; - $urls['app'] = $urls['base'].'app.js'; - } - else - { - $urls['extjs_lib'] = $urls['extjs'].'ext.js'; - $urls['app'] = $urls['base'].'resources/appunto-auth/app-all.js'; - } - return $urls; - } -*/ - - /** - * return a hash of the user password. - * - * @param string - * @return string - */ - public function hashPassword($password) - { - $hasher = new PasswordHash( - $this->CI->config->item('hash_logarithm', 'appunto-auth/appunto_auth'), - $this->CI->config->item('hash_use_portable', 'appunto-auth/appunto_auth') - ); - return $hasher->HashPassword($password); - } - - /** - * compare a password to a hashed password. - * - * @param string - * @param string - * @return boolean - */ - public function checkPassword($password,$hash) - { - $hasher = new PasswordHash( - $this->CI->config->item('hash_logarithm', 'appunto-auth/appunto_auth'), - $this->CI->config->item('hash_use_portable', 'appunto-auth/appunto_auth') - ); - return $hasher->checkPassword($password,$hash); - } - - /** - * Check query validity and format result array for queries - * - * @param array results - * @param array callback - * @return string JSON encoded response - */ - function sendResponse($results, $cb = null) - { - // if callback was sent use it, otherwise check GET - $callback = $cb==null ? $this->CI->input->get('callback', TRUE) : $cb; - - if ($callback) - { - // wrap json encoded response in callback - // header('Content-Type: application/x-javascript; charset=utf-8'); - $result = $callback . '(' . json_encode($results) . ');'; - } else { - // send json encoded response - header('Content-Type: application/x-json; charset=utf-8'); - $result = json_encode($results); - } - echo $result; - } - - /** - * Check query validity and format result array for queries - * - * @param query - * @return array - */ - function formatQueryResult($query,$total) - { - if ($query) - { - $query_result = $query->result(); - $total = $total; - $result = array ( - 'success' => true, - 'total' => $total, - 'rows' => $query_result - ); - } - else - { - $result = array ( - 'success' => false, - 'msg' => 'Database Error: '.$this->db->_error_message(), - 'num' => $this->db->_error_number() - ); - } - return $result; - } - - /** - * Check query validity and format result array for operations - * - * @param query - * @return array - */ - function formatOperationResult($query, $record = array()) - { - //$this->chromephp->log($extra_params); - if ($query) - { - // query successful - $result = array( - 'success' => true, - 'msg' => 'Operation successful' - ); - - if (count($record)>0) - { - $rows = array( - 'rows' => $record - ); - $result = array_merge($result,$rows); - } - } - else - { - // database error - $result = array ( - 'success' => false, - 'msg' => 'Database Error: '.$this->db->_error_message(), - 'num' => $this->db->_error_number() - ); - } - return $result; - } - -/* - * ***** CONTROLLER CODE ****** O__o - * Putting code that would normally be controller functions in the library to keep the Paths/permissions - * manageable and to make it easier to distribute as a spark. - */ - function controller_read($model) - { - $start = $this->CI->input->get_post('start', TRUE); - $limit = $this->CI->input->get_post('limit', TRUE); - $sort = $this->CI->input->get_post('sort', TRUE); - $filter = $this->CI->input->get_post('filter', TRUE); - $search = $this->CI->input->get_post('search', TRUE); - - $property = null; - $direction = null; - $active_filter = false; - - // get sort params - $sort_array = json_decode($sort); - if (count($sort_array) > 0) - { - $property = $sort_array[0]->property; - $direction = $sort_array[0]->direction; - } - - $filters = json_decode($filter); - - $result = $model->enumerate($start,$limit,$property,$direction,$filters,$search); - - $this->sendResponse($result); - } - - function controller_create($model) - { - if ($this->CI->form_validation->run()==FALSE) - { - $result = array ( - 'success' => false, - 'msg' => $this->CI->lang->line('appunto_errors_encountered'), - 'errors' => validation_errors() - ); - } - else - { - // return all POST items with XSS filter - $data = $this->CI->input->post(NULL, TRUE); - - // get result - $result = $model->create_record($data); - } - $this->sendResponse($result); - } - - function controller_update($model) - { - if ($this->CI->form_validation->run()==FALSE) - { - $result = array ( - 'success' => false, - 'msg' => $this->CI->lang->line('appunto_errors_encountered'), - 'errors' => validation_errors(), - ); - } - else - { - // return all POST items with XSS filter - $data = $this->CI->input->post(NULL, TRUE); - - if (count($data)>1) - { - $result = $model->update_record($data); - } - else - { - $result = array ( - 'success' => false, - 'msg' => 'No updates attempted.' - ); - } - } - $this->sendResponse($result); - } - - function controller_destroy($model) - { - // create array from post data - $data = $this->CI->input->post(NULL, TRUE); - - if (!$this->CI->form_validation->run()) - { - $result = array ( - 'success' => false, - 'msg' => $this->CI->lang->line('appunto_errors_encountered'), - 'errors' => validation_errors() - ); - } - else - { - $result = $model->delete_record($data); - } - $this->sendResponse($result); - } -}; - diff --git a/app/application/libraries/appunto-auth/LICENSE.md b/app/application/libraries/appunto-auth/LICENSE.md deleted file mode 100644 index 2a071986..00000000 --- a/app/application/libraries/appunto-auth/LICENSE.md +++ /dev/null @@ -1,32 +0,0 @@ -# Appunto-Auth license - -####License for all files except for third party files, the app.js and theme.css files - -Appunto Auth is licensed under a version of the MIT license. -Please do not remove the copyright and permission notice contained in this file. - -Copyright (c) 2012-2014 Bill Clinton (bclinton@appunto.net) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, -sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or -substantial portions of the Software in the application/libraries/appunto-auth folder - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#### License for all third party files - -The license of all third party files are governed by the terms of their licenses. Please see -the CREDITS.MD file for a list of all third party files. - -#### License for app.js and theme.css files - -Per Sencha requirements, the app.js and theme.css files are governed by the terms of the GPLv3 license. diff --git a/app/application/libraries/appunto-auth/index.html b/app/application/libraries/appunto-auth/index.html deleted file mode 100644 index c942a79c..00000000 --- a/app/application/libraries/appunto-auth/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - \ No newline at end of file diff --git a/app/application/libraries/appunto-auth/phpass-0.3/PasswordHash.php b/app/application/libraries/appunto-auth/phpass-0.3/PasswordHash.php deleted file mode 100644 index 12958c7f..00000000 --- a/app/application/libraries/appunto-auth/phpass-0.3/PasswordHash.php +++ /dev/null @@ -1,253 +0,0 @@ - in 2004-2006 and placed in -# the public domain. Revised in subsequent years, still public domain. -# -# There's absolutely no warranty. -# -# The homepage URL for this framework is: -# -# http://www.openwall.com/phpass/ -# -# Please be sure to update the Version line if you edit this file in any way. -# It is suggested that you leave the main version number intact, but indicate -# your project name (after the slash) and add your own revision information. -# -# Please do not change the "private" password hashing method implemented in -# here, thereby making your hashes incompatible. However, if you must, please -# change the hash type identifier (the "$P$") to something different. -# -# Obviously, since this code is in the public domain, the above are not -# requirements (there can be none), but merely suggestions. -# -class PasswordHash { - var $itoa64; - var $iteration_count_log2; - var $portable_hashes; - var $random_state; - - function PasswordHash($iteration_count_log2, $portable_hashes) - { - $this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; - - if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31) - $iteration_count_log2 = 8; - $this->iteration_count_log2 = $iteration_count_log2; - - $this->portable_hashes = $portable_hashes; - - $this->random_state = microtime(); - if (function_exists('getmypid')) - $this->random_state .= getmypid(); - } - - function get_random_bytes($count) - { - $output = ''; - if (is_readable('/dev/urandom') && - ($fh = @fopen('/dev/urandom', 'rb'))) { - $output = fread($fh, $count); - fclose($fh); - } - - if (strlen($output) < $count) { - $output = ''; - for ($i = 0; $i < $count; $i += 16) { - $this->random_state = - md5(microtime() . $this->random_state); - $output .= - pack('H*', md5($this->random_state)); - } - $output = substr($output, 0, $count); - } - - return $output; - } - - function encode64($input, $count) - { - $output = ''; - $i = 0; - do { - $value = ord($input[$i++]); - $output .= $this->itoa64[$value & 0x3f]; - if ($i < $count) - $value |= ord($input[$i]) << 8; - $output .= $this->itoa64[($value >> 6) & 0x3f]; - if ($i++ >= $count) - break; - if ($i < $count) - $value |= ord($input[$i]) << 16; - $output .= $this->itoa64[($value >> 12) & 0x3f]; - if ($i++ >= $count) - break; - $output .= $this->itoa64[($value >> 18) & 0x3f]; - } while ($i < $count); - - return $output; - } - - function gensalt_private($input) - { - $output = '$P$'; - $output .= $this->itoa64[min($this->iteration_count_log2 + - ((PHP_VERSION >= '5') ? 5 : 3), 30)]; - $output .= $this->encode64($input, 6); - - return $output; - } - - function crypt_private($password, $setting) - { - $output = '*0'; - if (substr($setting, 0, 2) == $output) - $output = '*1'; - - $id = substr($setting, 0, 3); - # We use "$P$", phpBB3 uses "$H$" for the same thing - if ($id != '$P$' && $id != '$H$') - return $output; - - $count_log2 = strpos($this->itoa64, $setting[3]); - if ($count_log2 < 7 || $count_log2 > 30) - return $output; - - $count = 1 << $count_log2; - - $salt = substr($setting, 4, 8); - if (strlen($salt) != 8) - return $output; - - # We're kind of forced to use MD5 here since it's the only - # cryptographic primitive available in all versions of PHP - # currently in use. To implement our own low-level crypto - # in PHP would result in much worse performance and - # consequently in lower iteration counts and hashes that are - # quicker to crack (by non-PHP code). - if (PHP_VERSION >= '5') { - $hash = md5($salt . $password, TRUE); - do { - $hash = md5($hash . $password, TRUE); - } while (--$count); - } else { - $hash = pack('H*', md5($salt . $password)); - do { - $hash = pack('H*', md5($hash . $password)); - } while (--$count); - } - - $output = substr($setting, 0, 12); - $output .= $this->encode64($hash, 16); - - return $output; - } - - function gensalt_extended($input) - { - $count_log2 = min($this->iteration_count_log2 + 8, 24); - # This should be odd to not reveal weak DES keys, and the - # maximum valid value is (2**24 - 1) which is odd anyway. - $count = (1 << $count_log2) - 1; - - $output = '_'; - $output .= $this->itoa64[$count & 0x3f]; - $output .= $this->itoa64[($count >> 6) & 0x3f]; - $output .= $this->itoa64[($count >> 12) & 0x3f]; - $output .= $this->itoa64[($count >> 18) & 0x3f]; - - $output .= $this->encode64($input, 3); - - return $output; - } - - function gensalt_blowfish($input) - { - # This one needs to use a different order of characters and a - # different encoding scheme from the one in encode64() above. - # We care because the last character in our encoded string will - # only represent 2 bits. While two known implementations of - # bcrypt will happily accept and correct a salt string which - # has the 4 unused bits set to non-zero, we do not want to take - # chances and we also do not want to waste an additional byte - # of entropy. - $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - - $output = '$2a$'; - $output .= chr(ord('0') + $this->iteration_count_log2 / 10); - $output .= chr(ord('0') + $this->iteration_count_log2 % 10); - $output .= '$'; - - $i = 0; - do { - $c1 = ord($input[$i++]); - $output .= $itoa64[$c1 >> 2]; - $c1 = ($c1 & 0x03) << 4; - if ($i >= 16) { - $output .= $itoa64[$c1]; - break; - } - - $c2 = ord($input[$i++]); - $c1 |= $c2 >> 4; - $output .= $itoa64[$c1]; - $c1 = ($c2 & 0x0f) << 2; - - $c2 = ord($input[$i++]); - $c1 |= $c2 >> 6; - $output .= $itoa64[$c1]; - $output .= $itoa64[$c2 & 0x3f]; - } while (1); - - return $output; - } - - function HashPassword($password) - { - $random = ''; - - if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) { - $random = $this->get_random_bytes(16); - $hash = - crypt($password, $this->gensalt_blowfish($random)); - if (strlen($hash) == 60) - return $hash; - } - - if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) { - if (strlen($random) < 3) - $random = $this->get_random_bytes(3); - $hash = - crypt($password, $this->gensalt_extended($random)); - if (strlen($hash) == 20) - return $hash; - } - - if (strlen($random) < 6) - $random = $this->get_random_bytes(6); - $hash = - $this->crypt_private($password, - $this->gensalt_private($random)); - if (strlen($hash) == 34) - return $hash; - - # Returning '*' on error is safe here, but would _not_ be safe - # in a crypt(3)-like function used _both_ for generating new - # hashes and for validating passwords against existing hashes. - return '*'; - } - - function CheckPassword($password, $stored_hash) - { - $hash = $this->crypt_private($password, $stored_hash); - if ($hash[0] == '*') - $hash = crypt($password, $stored_hash); - - return $hash == $stored_hash; - } -} - -?> diff --git a/app/application/libraries/appunto-auth/phpass-0.3/c/Makefile b/app/application/libraries/appunto-auth/phpass-0.3/c/Makefile deleted file mode 100644 index fe48917f..00000000 --- a/app/application/libraries/appunto-auth/phpass-0.3/c/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# -# Written by Solar Designer and placed in the public domain. -# See crypt_private.c for more information. -# -CC = gcc -LD = $(CC) -RM = rm -f -CFLAGS = -Wall -O2 -fomit-frame-pointer -funroll-loops -LDFLAGS = -s -LIBS = -lcrypto - -all: crypt_private-test - -crypt_private-test: crypt_private-test.o - $(LD) $(LDFLAGS) $(LIBS) crypt_private-test.o -o $@ - -crypt_private-test.o: crypt_private.c - $(CC) -c $(CFLAGS) crypt_private.c -DTEST -o $@ - -clean: - $(RM) crypt_private-test* diff --git a/app/application/libraries/appunto-auth/phpass-0.3/c/crypt_private.c b/app/application/libraries/appunto-auth/phpass-0.3/c/crypt_private.c deleted file mode 100644 index 6abc05bc..00000000 --- a/app/application/libraries/appunto-auth/phpass-0.3/c/crypt_private.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * This code exists for the sole purpose to serve as another implementation - * of the "private" password hashing method implemened in PasswordHash.php - * and thus to confirm that these password hashes are indeed calculated as - * intended. - * - * Other uses of this code are discouraged. There are much better password - * hashing algorithms available to C programmers; one of those is bcrypt: - * - * http://www.openwall.com/crypt/ - * - * Written by Solar Designer in 2005 and placed in - * the public domain. - * - * There's absolutely no warranty. - */ - -#include -#include - -#ifdef TEST -#include -#endif - -static char *itoa64 = - "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - -static void encode64(char *dst, char *src, int count) -{ - int i, value; - - i = 0; - do { - value = (unsigned char)src[i++]; - *dst++ = itoa64[value & 0x3f]; - if (i < count) - value |= (unsigned char)src[i] << 8; - *dst++ = itoa64[(value >> 6) & 0x3f]; - if (i++ >= count) - break; - if (i < count) - value |= (unsigned char)src[i] << 16; - *dst++ = itoa64[(value >> 12) & 0x3f]; - if (i++ >= count) - break; - *dst++ = itoa64[(value >> 18) & 0x3f]; - } while (i < count); -} - -char *crypt_private(char *password, char *setting) -{ - static char output[35]; - MD5_CTX ctx; - char hash[MD5_DIGEST_LENGTH]; - char *p, *salt; - int count_log2, length, count; - - strcpy(output, "*0"); - if (!strncmp(setting, output, 2)) - output[1] = '1'; - - if (strncmp(setting, "$P$", 3)) - return output; - - p = strchr(itoa64, setting[3]); - if (!p) - return output; - count_log2 = p - itoa64; - if (count_log2 < 7 || count_log2 > 30) - return output; - - salt = setting + 4; - if (strlen(salt) < 8) - return output; - - length = strlen(password); - - MD5_Init(&ctx); - MD5_Update(&ctx, salt, 8); - MD5_Update(&ctx, password, length); - MD5_Final(hash, &ctx); - - count = 1 << count_log2; - do { - MD5_Init(&ctx); - MD5_Update(&ctx, hash, MD5_DIGEST_LENGTH); - MD5_Update(&ctx, password, length); - MD5_Final(hash, &ctx); - } while (--count); - - memcpy(output, setting, 12); - encode64(&output[12], hash, MD5_DIGEST_LENGTH); - - return output; -} - -#ifdef TEST -int main(int argc, char **argv) -{ - if (argc != 3) return 1; - - puts(crypt_private(argv[1], argv[2])); - - return 0; -} -#endif diff --git a/app/application/libraries/appunto-auth/phpass-0.3/index.html b/app/application/libraries/appunto-auth/phpass-0.3/index.html deleted file mode 100644 index c942a79c..00000000 --- a/app/application/libraries/appunto-auth/phpass-0.3/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - \ No newline at end of file diff --git a/app/application/models/appunto-auth/groupmodel.php b/app/application/models/appunto-auth/groupmodel.php deleted file mode 100644 index a0d78a55..00000000 --- a/app/application/models/appunto-auth/groupmodel.php +++ /dev/null @@ -1,199 +0,0 @@ -load->library('appunto-auth/Appunto_auth'); - $this->load->database(); - - $prefix = $this->config->item('db_table_prefix','appunto-auth/appunto_auth'); - - $this->table = $prefix.'appa_group'; - $this->user_table = $prefix.'appa_user'; - $this->group_user_table = $prefix.'appa_user_group'; - } - - - /** - * Get groups - * - * @return object - */ - function enumerate($offset,$rows,$sort,$dir,$filters) - { - // define table here for count all results - $this->db->from($this->table); - $total = $this->db->count_all_results(); - - $this->db->select('group.id, group.name,group.description'); - - if (!empty($sort) && !empty($dir)) - { - $this->db->order_by('UPPER('.$sort.')',$dir); - } - else - { - $this->db->order_by('group.name','ASC'); - } - - // execute query - $query = $this->db->get($this->table. ' `group`'); - - // format and return result to controller - return $this->appunto_auth->formatQueryResult($query,$total); - } - - /** - * Get group - * - * @return group - */ - function get($id) - { - // define query - $this->db->select('group.id, group.name,group.description'); - - $this->db->where('group.id',$id); - - // execute query - $query = $this->db->get($this->table.' `group`'); - - // format and return result to controller - return $query->result(); - - } - - /** - * Get group users - * - * @return object - */ - function get_group_users($id,$sort,$dir) - { - $this->db->select('if(isnull(ug.group_id),0,1) as inGroup',false); - $this->db->select('u.id, u.username, u.email'); - - $this->db->join($this->user_table.' u','u.id = ug.user_id and ug.group_id ='.$id,'right'); - - // execute query - $query = $this->db->get($this->group_user_table.' ug'); - - return $this->appunto_auth->formatQueryResult($query,$query->num_rows()); - } - - /** - * Get user groups - * - * @return object - */ - function get_group_user($user_id,$group_id) - { - $this->db->select('if(isnull(ug.group_id),0,1) as inGroup',false); - $this->db->select('u.id, u.username, u.email'); - - $this->db->join($this->group_user_table.' ug','u.id = ug.user_id and ug.group_id ='.$group_id,'left'); - - $this->db->where('u.id',$user_id); - - // execute query - $query = $this->db->get($this->user_table.' u'); - - return $query->row() ; - } - - /** - * Create record - * - * @param array - * @return object - */ - function create_record($data) - { - // execute query - $query = $this->db->insert($this->table, $data); - - // get the id to select a full record to return to UI - $id = $this->db->insert_id(); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get($id)); - } - - /** - * Update record - * - * @param array - * @return object - */ - function update_record($data) - { - // get/set the id and remove it from the data array - $id = $data['id']; - $this->db->where('id', $id); - unset($data['id']); - - // execute query - $query = $this->db->update($this->table, $data); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get($id)); - } - - /** - * Delete record - * - * @param array - * @return object - */ - function delete_record($data) - { - // get/set the id - $this->db->where('id', $data['id']); - - // execute query - $query = $this->db->delete($this->table); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query); - } - - /** - * Add a user to a group - * - * @param array - * @return object - */ - function add_user($user_id,$group_id) - { - // execute query - $query = $this->db->insert($this->group_user_table, array( - 'user_id' => $user_id, - 'group_id' => $group_id - )); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get_group_user($user_id,$group_id)); - } - - /** - * Remove a user from a group - * - * @param array - * @return object - */ - function remove_user($user_id,$group_id) - { - // execute query - $query = $this->db->delete($this->group_user_table, array( - 'user_id' => $user_id, - 'group_id' => $group_id - )); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get_group_user($user_id,$group_id)); - } -}; diff --git a/app/application/models/appunto-auth/index.html b/app/application/models/appunto-auth/index.html deleted file mode 100644 index c942a79c..00000000 --- a/app/application/models/appunto-auth/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - \ No newline at end of file diff --git a/app/application/models/appunto-auth/pathmodel.php b/app/application/models/appunto-auth/pathmodel.php deleted file mode 100644 index 1b40c553..00000000 --- a/app/application/models/appunto-auth/pathmodel.php +++ /dev/null @@ -1,264 +0,0 @@ -load->library('appunto-auth/Appunto_auth'); - - $this->load->database(); - - $prefix = $this->config->item('db_table_prefix','appunto-auth/appunto_auth'); - - $this->table = $prefix.'appa_path'; - $this->permission_table = $prefix.'appa_permission'; - } - - /** - * Get paths for library auhentication verification - * - * @return object - */ - function getAll() - { - $this->db->select('path.ci_controller as ci_controller, path.ci_method as ci_method, path.public_flag as public_flag'); - $this->db->select('perm.id as permission_id, perm.internal_name as internal_name'); - - $this->db->join($this->permission_table.' perm','perm.id = path.permission_id','left'); - - // execute query - $query = $this->db->get($this->table.' path'); - - // return result - return $this->appunto_auth->formatQueryResult($query,$query->num_rows()); - } - - /** - * Get paths - * - * @return object - */ - function enumerate($offset,$rows,$sort,$dir,$filters) - { - $this->db->select('path.id, path.dir, path.full_path, path.ci_controller, path.ci_method, path.found, path.public_flag, path.note'); - $this->db->select('perm.id as permission_id, perm.name as permission_name, perm.internal_name as internal_name'); - - $this->db->join($this->permission_table.' perm','perm.id = path.permission_id','left'); - - // execute query - $query = $this->db->get($this->table.' path'); - - // add column for grouping by controller directory - if ($rows = $query->result()) - { - foreach ($rows as $row) - { - // directory name or controller name if in main controller dir - $row->dir_group = ($row->dir == '.') ? $row->ci_controller : $row->dir; - } - } - - // format and return result to controller - return $this->appunto_auth->formatQueryResult($query,$query->num_rows()); - } - - /** - * Get path - * - * @return path - */ - function get($id) - { - // define query - $this->db->select('path.id, path.dir, path.ci_controller, path.ci_method, path.found, path.public_flag, path.note'); - $this->db->select('perm.id as permission_id, perm.name as permission_name'); - - $this->db->join($this->permission_table.' perm','perm.id = path.permission_id','left'); - - $this->db->where('path.id',$id); - - // execute query - $query = $this->db->get($this->table.' path'); - - // format and return result to controller - return $query->result(); - } - - /** - * Create record - * - * @param int ci_controller - * @param int ci_method - * @return object - */ - function create_record($dir, $filename, $full_path, $ci_controller, $ci_method, $found = 0) - { - $this->db->set('dir', $dir); - $this->db->set('filename', $filename); - $this->db->set('full_path', $full_path); - $this->db->set('ci_controller', $ci_controller); - $this->db->set('ci_method', $ci_method); - $this->db->set('found', $found); - - // execute query - $query = $this->db->insert($this->table); - } - - /** - * Test to see if this path has already been recorded in db - * - * @param int ci_controller - * @param int ci_method - * @return boolean - */ - function path_exists($dir, $ci_controller, $ci_method) - { - // shouldn't have to reload the database library here but during the - // upgrade to 2.2.0 I started getting an error here if it was not present - // investigate further later - $this->load->database(); - - $this->db->where('dir', $dir); - $this->db->where('ci_controller', $ci_controller); - $this->db->where('ci_method', $ci_method); - $this->db->from($this->table); - - if ($this->db->count_all_results() > 0) - { - return true; - } - return false; - } - - /** - * Mark Found - * - * @param int ci_controller - * @param int ci_method - * @return void - */ - function mark_found($dir, $ci_controller, $ci_method) - { - $this->db->where('dir', $dir); - $this->db->where('ci_controller', $ci_controller); - $this->db->where('ci_method', $ci_method); - - // execute query - $query = $this->db->update($this->table, array('found'=>1)); - } - - /** - * Mark All Unfound - * - * @return void - */ - function mark_all_unfound() - { - // execute query - $query = $this->db->update($this->table, array('found'=>0)); - } - - /** - * Update record - * - * @param array - * @return object - */ - function update_record($data) - { - // get/set the id and remove it from the data array - $id = $data['id']; - $this->db->where('id', $id); - unset($data['id']); - - // execute query - $query = $this->db->update($this->table, $data); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get($id)); - } - - /** - * Delete record - * - * @param array - * @return object - */ - function delete_record($data) - { - // get/set the id - $this->db->where('id', $data['id']); - - // execute query - $query = $this->db->delete($this->table); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query); - } - - /** - * Delete all paths that are not found - * - * @return object - */ - function delete_not_found() - { - // get/set the id - $this->db->where('found', 0); - - // execute query - $query = $this->db->delete($this->table); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query); - } - - /** - * Is Path marked Found - * - * @param array - * @return boolean - */ - function is_marked_found($data) - { - $this->db->select('found'); - - // get/set the id - $id = $data['id']; - $this->db->where('id', $id); - - // execute query - $query = $this->db->get($this->table); - - if ($query->num_rows() > 0) - { - $row = $query->row(); - if ($row->found == 0) return false; - } - return true; - } - - /** - * Clear permissions - * - * @param array - * @return void - */ - function clear_permissions($data) - { - // get/set the id and remove it from the data array - $id = $data['id']; - $this->db->where('id', $id); - unset($data['id']); - - // execute query - $query = $this->db->update($this->table, array('permission_id' => NULL)); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get($id)); - } - -}; diff --git a/app/application/models/appunto-auth/permissionmodel.php b/app/application/models/appunto-auth/permissionmodel.php deleted file mode 100644 index b1ef00e7..00000000 --- a/app/application/models/appunto-auth/permissionmodel.php +++ /dev/null @@ -1,174 +0,0 @@ -load->library('appunto-auth/Appunto_auth'); - $this->load->database(); - - $prefix = $this->config->item('db_table_prefix','appunto-auth/appunto_auth'); - - $this->table = $prefix.'appa_permission'; - $this->path_table = $prefix.'appa_path'; - $this->user_permission_table = $prefix.'appa_user_permission'; - $this->role_permission_table = $prefix.'appa_role_permission'; - } - - - /** - * Get permissions - * - * @return object - */ - function enumerate($offset,$rows,$sort,$dir,$filters) - { - // define table here for count all results - $this->db->from($this->table); - $total = $this->db->count_all_results(); - - $this->db->select('p.id, p.name, p.internal_name, p.description'); - - if (!empty($sort) && !empty($dir)) - { - $this->db->order_by('UPPER('.$sort.')',$dir); - } - else - { - $this->db->order_by('p.name','ASC'); - } - - // execute query - $query = $this->db->get($this->table.' p'); - - // format and return result to controller - return $this->appunto_auth->formatQueryResult($query,$total); - } - - /** - * Get permission - * - * @return permission - */ - function get($id) - { - // define query - $this->db->select('p.id, p.name, p.internal_name, p.description'); - - $this->db->where('p.id',$id); - - // execute query - $query = $this->db->get($this->table.' p'); - - // format and return result to controller - return $query->result(); - - } - - /** - * Create record - * - * @param array - * @return object - */ - function create_record($data) - { - $data['internal_name'] = strtoupper(str_replace(' ','_',$data['name'])); - - // execute query - $query = $this->db->insert($this->table, $data); - - // get the id to select a full record to return to UI - $id = $this->db->insert_id(); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get($id)); - } - - /** - * Update record - * - * @param array - * @return object - */ - function update_record($data) - { - // get/set the id and remove it from the data array - $id = $data['id']; - $this->db->where('id', $id); - unset($data['id']); - - // execute query - $query = $this->db->update($this->table, $data); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get($id)); - } - - /** - * Delete record - * - * @param array - * @return object - */ - function delete_record($data) - { - // get/set the id - $this->db->where('id', $data['id']); - - // execute query - $query = $this->db->delete($this->table); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query); - } - - function in_use_by_user($id) - { - $this->db->select('permission_id'); - $this->db->where('permission_id', $id); - - // execute query - $query = $this->db->get($this->user_permission_table); - - if ($query->num_rows() > 0) - { - return true; - } - return false; - } - - function in_use_by_role($id) - { - $this->db->select('permission_id'); - $this->db->where('permission_id', $id); - - // execute query - $query = $this->db->get($this->role_permission_table); - - if ($query->num_rows() > 0) - { - return true; - } - return false; - } - - function in_use_by_path($id) - { - $this->db->select('path.id'); - $this->db->where('permission_id', $id); - - // execute query - $query = $this->db->get($this->path_table.' path'); - - if ($query->num_rows() > 0) - { - return true; - } - return false; - } - -}; diff --git a/app/application/models/appunto-auth/rolemodel.php b/app/application/models/appunto-auth/rolemodel.php deleted file mode 100644 index 6c304222..00000000 --- a/app/application/models/appunto-auth/rolemodel.php +++ /dev/null @@ -1,230 +0,0 @@ -load->library('appunto-auth/Appunto_auth'); - $this->load->database(); - - $prefix = $this->config->item('db_table_prefix','appunto-auth/appunto_auth'); - - $this->table = $prefix.'appa_role'; - $this->permission_table = $prefix.'appa_permission'; - $this->user_role_table = $prefix.'appa_user_role'; - $this->role_permission_table = $prefix.'appa_role_permission'; - } - - - /** - * Get roles - * - * @return object - */ - function enumerate($offset,$rows,$sort,$dir,$filters) - { - // define table here for count all results - $this->db->from($this->table); - $total = $this->db->count_all_results(); - - $this->db->select('role.id, role.name,role.description'); - - if (!empty($sort) && !empty($dir)) - { - $this->db->order_by('UPPER('.$sort.')',$dir); - } - else - { - $this->db->order_by('role.name','ASC'); - } - - // execute query - $query = $this->db->get($this->table. ' role'); - - // format and return result to controller - return $this->appunto_auth->formatQueryResult($query,$total); - } - - /** - * Get role - * - * @return role - */ - function get($id) - { - // define query - $this->db->select('role.id, role.name, role.description'); - - $this->db->where('role.id',$id); - - // execute query - $query = $this->db->get($this->table.' role'); - - // format and return result to controller - return $query->result(); - - } - - /** - * Get role permissions - * - * @return object - */ - function get_role_permissions($id,$sort,$dir) - { - $this->db->select('if(isnull(rp.role_id),0,1) as inRole',false); - $this->db->select('p.id, p.name, p.description'); - - $this->db->join($this->permission_table.' p','p.id = rp.permission_id and rp.role_id ='.$id,'right'); - - // execute query - $query = $this->db->get($this->role_permission_table.' rp'); - - return $this->appunto_auth->formatQueryResult($query,$query->num_rows()); - } - - /** - * Get user roles - * - * @return object - */ - function get_role_permission($permission_id,$role_id) - { - $this->db->select('if(isnull(rp.role_id),0,1) as inRole',false); - $this->db->select('p.id, p.name, p.description'); - - $this->db->join($this->role_permission_table.' rp','p.id = rp.permission_id and rp.role_id ='.$role_id,'left'); - - $this->db->where('p.id',$permission_id); - - // execute query - $query = $this->db->get($this->permission_table.' p'); - - return $query->row() ; - } - - /** - * Create record - * - * @param array - * @return object - */ - function create_record($data) - { - // execute query - $query = $this->db->insert($this->table, $data); - - // get the id to select a full record to return to UI - $id = $this->db->insert_id(); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get($id)); - } - - /** - * Update record - * - * @param array - * @return object - */ - function update_record($data) - { - // get/set the id and remove it from the data array - $id = $data['id']; - $this->db->where('id', $id); - unset($data['id']); - - // execute query - $query = $this->db->update($this->table, $data); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get($id)); - } - - /** - * Delete record - * - * @param array - * @return object - */ - function delete_record($data) - { - // get/set the id - $this->db->where('id', $data['id']); - - // execute query - $query = $this->db->delete($this->table); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query); - } - - /** - * Add a permission to a role - * - * @param array - * @return object - */ - function add_permission($permission_id,$role_id) - { - // execute query - $query = $this->db->insert($this->role_permission_table, array( - 'permission_id' => $permission_id, - 'role_id' => $role_id - )); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get_role_permission($permission_id,$role_id)); - } - - /** - * Remove a permission from a role - * - * @param array - * @return object - */ - function remove_permission($permission_id,$role_id) - { - // execute query - $query = $this->db->delete($this->role_permission_table, array( - 'permission_id' => $permission_id, - 'role_id' => $role_id - )); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get_role_permission($permission_id,$role_id)); - } - - function in_use_by_user($id) - { - $this->db->select('role_id'); - $this->db->where('role_id', $id); - - // execute query - $query = $this->db->get($this->user_role_table); - - if ($query->num_rows() > 0) - { - return true; - } - return false; - } - - function in_use_by_permission($id) - { - $this->db->select('role_id'); - $this->db->where('role_id', $id); - - // execute query - $query = $this->db->get($this->role_permission_table); - - if ($query->num_rows() > 0) - { - return true; - } - return false; - } -}; diff --git a/app/application/models/appunto-auth/sessionmodel.php b/app/application/models/appunto-auth/sessionmodel.php deleted file mode 100644 index d027fa33..00000000 --- a/app/application/models/appunto-auth/sessionmodel.php +++ /dev/null @@ -1,110 +0,0 @@ -load->library('appunto-auth/Appunto_auth'); - $this->load->database(); - - $prefix = $this->config->item('db_table_prefix','appunto-auth/appunto_auth'); - - $this->table = $prefix.'ci_sessions'; - } - - /** - * Get sessions - * - * @return object - */ - function enumerate($offset,$rows=0,$sort,$dir,$filters) - { - // define table here for count all results - $this->db->from($this->table); - $total = 0; - - $this->db->select('session_id as id,ip_address,user_agent'); - $this->db->select("CONCAT( DATE( FROM_UNIXTIME( `last_activity` ) ),' ',TIME( FROM_UNIXTIME( `last_activity` ) ) ) AS last_activity",false); - $this->db->select('user_agent,user_data'); - - $show_all = 1; - if (count($filters)>0) - { - foreach($filters as $filter) - { - $property = $filter->property; - if ($property == 'show_all') $show_all = $filter->value; - } - } - - // add limit and get results - if ($rows>0) $this->db->limit($rows,$offset); - - $query = $this->db->get(); - - $result_array = array(); - - if ($rows = $query->result()) - { - foreach ($rows as $row) - { - $total++; - - $user_data = unserialize($row->user_data); - $user_name = isset($user_data['username']) ? $user_data['username'] : ''; - $last_page = isset($user_data['last_page']) ? $user_data['last_page'] : ''; - - if ( $show_all == 1 || is_array($user_data)) - { - $this_row = array ( - 'id' => $row->id, - 'username' => $user_name, - 'last_page' => $last_page, - 'last_activity' => $row->last_activity, - 'ip_address' => $row->ip_address, - 'user_agent' => $row->user_agent - ); - $result_array[] = $this_row; - } - } - - $result = array ( - 'success' => true, - 'total' => $total, - 'rows' => $result_array - ); - - } else { - - $result = array ( - 'success' => false, - 'msg' => 'Database Error: '.$this->db->_error_message(), - 'num' => $this->db->_error_number() - ); - - } - return $result; - } - - /** - * Delete record - * - * @param array - * @return object - */ - function delete_record($data) - { - // get/set the id - $this->db->where('session_id', $data['id']); - - // execute query - $query = $this->db->delete($this->table); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query); - } - -}; diff --git a/app/application/models/appunto-auth/usermodel.php b/app/application/models/appunto-auth/usermodel.php deleted file mode 100644 index cda4a44d..00000000 --- a/app/application/models/appunto-auth/usermodel.php +++ /dev/null @@ -1,557 +0,0 @@ -load->library('appunto-auth/Appunto_auth'); - $this->load->database(); - - $prefix = $this->config->item('db_table_prefix','appunto-auth/appunto_auth'); - - $this->table = $prefix.'appa_user'; - $this->role_table = $prefix.'appa_role'; - $this->user_role_table = $prefix.'appa_user_role'; - $this->permission_table = $prefix.'appa_permission'; - $this->user_permission_table = $prefix.'appa_user_permission'; - $this->role_permission_table = $prefix.'appa_role_permission'; - $this->user_login_attempt = $prefix.'appa_user_login_attempt'; - } - - - /** - * Get users - * - * @return object - */ - function enumerate($offset,$rows,$sort,$dir,$filters,$search) - { - - $this->_build_enumerate($offset,$rows,$sort,$dir,$filters,$search); - $this->db->from($this->table. ' user'); - $total = $this->db->count_all_results(); - $this->db->flush_cache(); - - - $this->_build_enumerate($offset,$rows,$sort,$dir,$filters,$search); - $this->db->limit($rows,$offset); - $query = $this->db->get($this->table. ' user'); - $this->db->flush_cache(); - - return $this->appunto_auth->formatQueryResult($query,$total); - } - - function _build_enumerate($offset,$rows,$sort,$dir,$filters,$search) - { - $this->db->start_cache(); - - $this->db->select('user.id, user.username, user.email, user.active'); - $this->db->select('user.last_ip, user.last_login, user.created, user.modified'); - $this->db->select('user.name, user.surname'); - - if (!empty($search)) - { - $this->db->like('UPPER(user.username)', strtoupper($search)); - $this->db->or_like('UPPER(user.name)', strtoupper($search)); - $this->db->or_like('UPPER(user.surname)', strtoupper($search)); - $this->db->or_like('UPPER(user.email)', strtoupper($search)); - } - - if (!empty($sort) && !empty($dir)) - { - $this->db->order_by('UPPER('.$sort.')',$dir); - } - else - { - $this->db->order_by('username','ASC'); - } - - $this->db->stop_cache(); - - } - - /** - * Get user - * - * @return user - */ - function get($id) - { - // define query - $this->db->select('user.id, user.username, user.email, user.active'); - $this->db->select('user.last_ip, user.last_login, user.created, user.modified'); - $this->db->select('user.name, user.surname'); - - $this->db->where('user.id',$id); - - // execute query - $query = $this->db->get($this->table.' user'); - - // format and return result to controller - return $query->result(); - - } - - /** - * Get user roles - * - * @return object - */ - function get_user_roles($id,$sort,$dir) - { - $this->db->select('if(isnull(ur.user_id),0,1) as hasRole',false); - $this->db->select('r.id, r.name, r.description'); - - $this->db->join($this->role_table.' r','r.id = ur.role_id and ur.user_id ='.$id,'right'); - - - if (!empty($sort) && !empty($dir)) - { - $this->db->order_by('UPPER('.$sort.')',$dir); - } - else - { - $this->db->order_by('hasRole','DESC'); - $this->db->order_by('role_id','ASC'); - } - - // execute query - $query = $this->db->get($this->user_role_table.' ur'); - - return $this->appunto_auth->formatQueryResult($query,$query->num_rows()); - } - - /** - * Get user roles - * - * @return object - */ - function get_user_role($role_id,$user_id) - { - $this->db->select('if(isnull(ur.user_id),0,1) as hasRole',false); - $this->db->select('r.id, r.name, r.description'); - - $this->db->join($this->user_role_table.' ur','r.id = ur.role_id and ur.user_id ='.$user_id,'left'); - - $this->db->where('r.id',$role_id); - - // execute query - $query = $this->db->get($this->role_table.' r'); - - return $query->row() ; - } - - /** - * Get user permissions - * - * @return object - */ - function get_user_permissions($id,$sort,$dir) - { - $this->db->select('p.id, p.name, p.description'); - $this->db->select('if(!isnull(up.user_id) || !isnull(rp.role_id),1,0) as hasPermission',false); - $this->db->select('if(isnull(up.user_id),0,1) as userHasPermission',false); - $this->db->select('if(isnull(rp.role_id),0,1) as userRoleHasPermission',false); - - $subquery = '(select ur.role_id from '.$this->user_role_table.' ur where ur.user_id ='.$id.')'; - - $this->db->join($this->user_permission_table.' up','p.id = up.permission_id and up.user_id ='.$id,'left'); - $this->db->join($this->role_permission_table.' rp','p.id = rp.permission_id and rp.role_id IN '.$subquery,'left'); - - if (!empty($sort) && !empty($dir)) - { - $this->db->order_by('UPPER('.$sort.')',$dir); - } - else - { - $this->db->order_by('userHasPermission','DESC'); - $this->db->order_by('p.id','ASC'); - } - - // execute query - $query = $this->db->get($this->permission_table.' p'); - - return $this->appunto_auth->formatQueryResult($query,$query->num_rows()); - } - - /** - * Get user permission array - * - * @return object - */ - function get_user_permission_array($id) - { - $this->db->select('p.id'); - - $subquery = '(select ur.role_id from '.$this->user_role_table. ' ur where ur.user_id ='.$id.')'; - - $this->db->join($this->user_permission_table.' up','p.id = up.permission_id and up.user_id ='.$id,'left'); - $this->db->join($this->role_permission_table.' rp','p.id = rp.permission_id and rp.role_id IN '.$subquery,'left'); - - $this->db->where('((up.user_id IS NOT NULL) || (rp.role_id IS NOT NULL))'); - - // execute query - $query = $this->db->get($this->permission_table.' p'); - - $permissions = array(); - foreach ($query->result() as $row) - { - array_push($permissions,$row->id); - } - return $permissions; - } - - /** - * Get user permission array - * - * @return object - */ - function get_user_permission_internal_name_array($id) - { - $this->db->select('p.internal_name'); - - $subquery = '(select ur.role_id from '.$this->user_role_table. ' ur where ur.user_id ='.$id.')'; - - $this->db->join($this->user_permission_table.' up','p.id = up.permission_id and up.user_id ='.$id,'left'); - $this->db->join($this->role_permission_table.' rp','p.id = rp.permission_id and rp.role_id IN '.$subquery,'left'); - - $this->db->where('((up.user_id IS NOT NULL) || (rp.role_id IS NOT NULL))'); - - // execute query - $query = $this->db->get($this->permission_table.' p'); - - $permissions = array(); - foreach ($query->result() as $row) - { - array_push($permissions,$row->internal_name); - } - return $permissions; - } - - /** - * - */ - function verifyPermissionById($u_id,$p_id) - { - $this->db->select('p.id, p.name'); - - $subquery = '(select ur.role_id from '.$this->user_role_table. ' ur where ur.user_id ='.$u_id.')'; - - $this->db->join($this->user_permission_table.' up','p.id = up.permission_id and up.user_id ='.$u_id,'left'); - $this->db->join($this->role_permission_table.' rp','p.id = rp.permission_id and rp.role_id IN '.$subquery,'left'); - - $this->db->where('((up.user_id IS NOT NULL) || (rp.role_id IS NOT NULL))'); - - $this->db->where('p.id',$p_id); - - // execute query - $query = $this->db->get($this->permission_table.' p'); - - return ($query->num_rows() > 0); - } - - /** - * - */ - function verifyPermissionByInternalName($u_id,$p_name) - { - $this->db->select('p.id, p.name'); - - $subquery = '(select ur.role_id from '.$this->user_role_table. ' ur where ur.user_id ='.$u_id.')'; - - $this->db->join($this->user_permission_table.' up','p.id = up.permission_id and up.user_id ='.$u_id,'left'); - $this->db->join($this->role_permission_table.' rp','p.id = rp.permission_id and rp.role_id IN '.$subquery,'left'); - - $this->db->where('((up.user_id IS NOT NULL) || (rp.role_id IS NOT NULL))'); - - // Let's make this case sensitive - //$this->db->where('UPPER(p.internal_name) = UPPER("'.$p_name.'")'); - $this->db->where('p.internal_name = "'.$p_name.'"'); - - // execute query - $query = $this->db->get($this->permission_table.' p'); - - return ($query->num_rows() > 0); - } - - /** - * Get user permission - * - * @return object - */ - function get_user_permission($permission_id,$id) - { - $this->db->select('p.id, p.name, p.description'); - $this->db->select('if(!isnull(up.user_id) || !isnull(rp.role_id),1,0) as hasPermission',false); - $this->db->select('if(isnull(up.user_id),0,1) as userHasPermission',false); - $this->db->select('if(isnull(rp.role_id),0,1) as userRoleHasPermission',false); - - $subquery = '(select ur.role_id from '.$this->user_role_table.' ur where ur.user_id ='.$id.')'; - - $this->db->join($this->user_permission_table.' up','p.id = up.permission_id and up.user_id ='.$id,'left'); - $this->db->join($this->role_permission_table.' rp','p.id = rp.permission_id and rp.role_id IN '.$subquery,'left'); - - $this->db->where('p.id',$permission_id); - - // execute query - $query = $this->db->get($this->permission_table.' p'); - - return $query->row() ; - } - - /** - * Get user with password for login verification - * - * @return user - */ - function getLoginInfo($login) - { - // define query - $this->db->select('user.id, user.username, user.email, user.password'); - - $this->db->where('user.username',$login); - - // execute query - $query = $this->db->get($this->table.' user'); - - // format and return result to controller - if ($query->num_rows() > 0) - { - return $query->row(); - } - return false; - } - /** - * Create record - * - * @param array - * @return object - */ - function create_record($data) - { - /** - * MySQL doesn't allow more than one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause - * (Error Code : 1293) in versions before 5.6. We can get around this by making the default of the created - * column "0000-00-00 00:00:00" and inserting null into this column. - * - * CodeIgniter Active Record doesn't like "nulls" when inserting an array of values, so we have to switch to - * the $this->db->set syntax - */ - $this->db->set('username',$data['username']); - $this->db->set('password',$data['password']); - $this->db->set('email',$data['email']); - $this->db->set('active',$data['active']); - $this->db->set('created', null); - - // optional fields - if (isset($data['name'])) $this->db->set('name',$data['name']); - if (isset($data['surname']))$this->db->set('surname',$data['surname']); - - // execute query - $query = $this->db->insert($this->table); - - // get newly created record - $record = $this->get($this->db->insert_id()); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,array($record[0])); - } - - /** - * Update record - * - * @param array - * @return object - */ - function update_record($data) - { - // get/set the id and remove it from the data array - $id = $data['id']; - $this->db->where('id', $id); - unset($data['id']); - - // remove password confirmation field - if (isset($data['password2'])) unset($data['password2']); - - // execute query - $query = $this->db->update($this->table, $data); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get($id)); - } - - /** - * Delete record - * - * @param array - * @return object - */ - function delete_record($data) - { - // get/set the id - $this->db->where('id', $data['id']); - - // execute query - $query = $this->db->delete($this->table); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query); - } - - /** - * Add a role to a user - * - * @param array - * @return object - */ - function add_role($role_id,$user_id) - { - // execute query - $query = $this->db->insert($this->user_role_table, array( - 'role_id' => $role_id, - 'user_id' => $user_id - )); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get_user_role($role_id,$user_id)); - } - - /** - * Remove a role from a user - * - * @param array - * @return object - */ - function remove_role($role_id,$user_id) - { - // execute query - $query = $this->db->delete($this->user_role_table, array( - 'role_id' => $role_id, - 'user_id' => $user_id - )); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get_user_role($role_id,$user_id)); - } - - /** - * Add a permission to a user - * - * @param array - * @return object - */ - function add_permission($permission_id,$user_id) - { - // execute query - $query = $this->db->insert($this->user_permission_table, array( - 'permission_id' => $permission_id, - 'user_id' => $user_id - )); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get_user_permission($permission_id,$user_id)); - } - - /** - * Remove a permission from a user - * - * @param array - * @return object - */ - function remove_permission($permission_id,$user_id) - { - // execute query - $query = $this->db->delete($this->user_permission_table, array( - 'permission_id' => $permission_id, - 'user_id' => $user_id - )); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query,$this->get_user_permission($permission_id,$user_id)); - } - - /** - * Add a permission to a user - * - * @param array - * @return object - */ - function record_login_attempt($username, $ip_address, $success, $user_agent, $note) - { - // execute query - $query = $this->db->insert($this->user_login_attempt, array( - 'username' => $username, - 'ip_address' => $ip_address, - 'success' => $success, - 'user_agent' => $user_agent, - 'note' => $note - )); - - // return formatted result - return $this->appunto_auth->formatOperationResult($query); - } - - /** - * Add a permission to a user - * - * @param array - * @return object - */ - function update_last_login($username,$ip_address) - { - $this->load->helper('date'); - - $this->db->set('last_ip',$ip_address); - $this->db->set('last_login',date('Y-m-d H:i:s',now())); - - $this->db->where('username',$username); - - $query = $this->db->update($this->table); - } - /** - * Get login attempts - * - * @return object - */ - function login_attempts($offset,$rows,$sort,$dir,$filters) - { - - $this->db->select('username, ip_address, success, user_agent, note, attempt_time'); - - if (count($filters)>0) - { - foreach($filters as $filter) - { - $property = $filter->property; - if ($property == 'active') $active = $filter->value; - } - } - - /* cache where clause to get around CI's active record _reset_select() - * see http://codeigniter.com/forums/viewthread/212111/#999732 - */ - $this->db->start_cache(); - - $total = $this->db->count_all_results($this->user_login_attempt); - - if (!empty($sort) && !empty($dir)) - { - $this->db->order_by('UPPER('.$sort.')',$dir); - } - else - { - $this->db->order_by('attempt_time','DESC'); - } - - // execute query - $query = $this->db->get($this->user_login_attempt,$rows,$offset); - - $this->db->flush_cache(); - - // format and return result to controller - return $this->appunto_auth->formatQueryResult($query,$total); - } -}; diff --git a/app/application/views/appunto-auth/error.php b/app/application/views/appunto-auth/error.php deleted file mode 100644 index 6fdb42f6..00000000 --- a/app/application/views/appunto-auth/error.php +++ /dev/null @@ -1,16 +0,0 @@ - - - - <?php if (isset($site_name)) echo $site_name ?><?php if (isset($auth_message)) echo ' - '.$auth_message ?> - - - - - - - - diff --git a/app/application/views/appunto-auth/login.php b/app/application/views/appunto-auth/login.php deleted file mode 100644 index f6fff6a6..00000000 --- a/app/application/views/appunto-auth/login.php +++ /dev/null @@ -1,10 +0,0 @@ - - - - <?php if (isset($site_name)) echo $site_name ?> - - - - - - diff --git a/app/db/create_auth_db.sql b/app/db/create_auth_db.sql deleted file mode 100644 index 83a089d7..00000000 --- a/app/db/create_auth_db.sql +++ /dev/null @@ -1,173 +0,0 @@ --- --- Tables for Appunto Auth --- - --- -------------------------------------------------------- - -SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -SET time_zone = "+00:00"; --- -------------------------------------------------------- - --- --- Table structure for table `appa_path` --- - -CREATE TABLE IF NOT EXISTS `appa_path` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `dir` varchar(256) NOT NULL, - `filename` varchar(120) NOT NULL, - `full_path` varchar(256) NOT NULL, - `ci_controller` varchar(256) NOT NULL, - `ci_method` varchar(256) NOT NULL, - `found` tinyint(1) NOT NULL, - `public_flag` tinyint(1) NOT NULL, - `permission_id` int(11) DEFAULT NULL, - `note` varchar(60) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `permission_id` (`permission_id`), - KEY `dir` (`dir`(255)), - KEY `ci_controller` (`ci_controller`(255)), - KEY `ci_method` (`ci_method`(255)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- --- Table structure for table `appa_permission` --- - -CREATE TABLE IF NOT EXISTS `appa_permission` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(32) COLLATE utf8_bin NOT NULL, - `internal_name` varchar(60) COLLATE utf8_bin NOT NULL, - `description` varchar(64) COLLATE utf8_bin DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `internal_name` (`internal_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- --- Table structure for table `appa_role` --- - -CREATE TABLE IF NOT EXISTS `appa_role` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(32) NOT NULL, - `description` varchar(64) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- --- Table structure for table `appa_role_permission` --- - -CREATE TABLE IF NOT EXISTS `appa_role_permission` ( - `role_id` int(11) NOT NULL, - `permission_id` int(11) NOT NULL, - KEY `role_id` (`role_id`), - KEY `permission_id` (`permission_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- -------------------------------------------------------- - --- --- Table structure for table `appa_user` --- - -CREATE TABLE IF NOT EXISTS `appa_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `username` varchar(60) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `password` varchar(60) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `email` varchar(120) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `active` tinyint(1) NOT NULL DEFAULT '1', - `name` varchar(60) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `surname` varchar(60) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `last_ip` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `last_login` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `username` (`username`), - KEY `email` (`email`), - KEY `name` (`name`), - KEY `surname` (`surname`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- --- Table structure for table `appa_user_login_attempt` --- - -CREATE TABLE IF NOT EXISTS `appa_user_login_attempt` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `attempt_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `username` varchar(120) DEFAULT NULL, - `ip_address` varchar(120) NOT NULL, - `success` tinyint(1) NOT NULL, - `user_agent` varchar(180) DEFAULT NULL, - `note` varchar(80) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `attempt_time` (`attempt_time`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- --- Table structure for table `appa_user_permission` --- - -CREATE TABLE IF NOT EXISTS `appa_user_permission` ( - `user_id` int(11) NOT NULL, - `permission_id` int(11) NOT NULL, - KEY `user_id` (`user_id`), - KEY `permission_id` (`permission_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- -------------------------------------------------------- - --- --- Table structure for table `appa_user_role` --- - -CREATE TABLE IF NOT EXISTS `appa_user_role` ( - `user_id` int(11) NOT NULL, - `role_id` int(11) NOT NULL, - KEY `user_id` (`user_id`), - KEY `role_id` (`role_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- --- Constraints for dumped tables --- - --- --- Constraints for table `appa_path` --- -ALTER TABLE `appa_path` - ADD CONSTRAINT `appa_path_ibfk_1` FOREIGN KEY (`permission_id`) REFERENCES `appa_permission` (`id`) ON UPDATE CASCADE; - --- --- Constraints for table `appa_role_permission` --- -ALTER TABLE `appa_role_permission` - ADD CONSTRAINT `appa_role_permission_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `appa_role` (`id`), - ADD CONSTRAINT `appa_role_permission_ibfk_2` FOREIGN KEY (`permission_id`) REFERENCES `appa_permission` (`id`); - --- --- Constraints for table `appa_user_permission` --- -ALTER TABLE `appa_user_permission` - ADD CONSTRAINT `appa_user_permission_ibfk_1` FOREIGN KEY (`permission_id`) REFERENCES `appa_permission` (`id`), - ADD CONSTRAINT `appa_user_permission_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `appa_user` (`id`) ON DELETE CASCADE; - --- --- Constraints for table `appa_user_role` --- -ALTER TABLE `appa_user_role` - ADD CONSTRAINT `appa_user_role_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `appa_role` (`id`), - ADD CONSTRAINT `appa_user_role_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `appa_user` (`id`) ON DELETE CASCADE; - diff --git a/app/resources/Readme.md b/app/resources/Readme.md deleted file mode 100644 index bdacce48..00000000 --- a/app/resources/Readme.md +++ /dev/null @@ -1,4 +0,0 @@ -# AppuntoAuth/resources - -This folder contains resources (such as images) needed by the application. This file can -be removed if not needed. diff --git a/app/resources/appunto-auth/css/app.css b/app/resources/appunto-auth/css/app.css deleted file mode 100644 index 8e61dcaf..00000000 --- a/app/resources/appunto-auth/css/app.css +++ /dev/null @@ -1,144 +0,0 @@ -.app-header { - background:#4F0101 url(logo/appunto_auth_logo_app_header.gif) 22px 6px no-repeat !important; -} -.controller-frame { - border-right: 1px solid #ccc; -} -.admin-logout-button { - color : #fff; - font-size: 15px; - margin : 12px 24px; -} -/* Status View Classes */ -.status-info { - margin: 30px 0 0 30px; - font-size: 15px; -} -.status-info td { - padding: 4px 12px; -} -.info-note { - background:url(icons/error.png) 3px 2px no-repeat !important; - padding-left: 24px !important; -} -/* User View Classes */ -.user-inactive div.x-grid-cell-inner { - background:url(icons/delete.png) 22px 3px no-repeat !important; - color: #777; -} -.user-active div.x-grid-cell-inner { - background:url(icons/accept.png) 22px 3px no-repeat !important; - color: #777; -} -.user-has-role div.x-grid-cell-inner { - background:url(icons/accept.png) 3px 3px no-repeat !important; -} -.has-permission div.x-grid-cell-inner { - background:url(icons/accept.png) 3px 3px no-repeat !important; -} -.user-has-permission div.x-grid-cell-inner { - background:url(icons/user.png) 22px 3px no-repeat !important; -} -.user-role-has-permission div.x-grid-cell-inner { - background:url(icons/shield.png) 22px 3px no-repeat !important; -} -.appunto-list .empty { - font-family: tahoma, arial, verdana, sans-serif; - font-size: 11px; - text-align: center; - padding-top: 20px; -} -/* Controller View Classes */ -.controller-view .ci-controller { - border: 1px solid #ccc; - width: 94%; - float: left; - font-family: arial, helvetica, sans-serif; - font-size: 13px; - margin: 8px 12px; - padding: 1px; - background: #e2e2e2; /* Old browsers */ - /* IE9 SVG, needs conditional override of 'filter' to 'none' */ - background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2UyZTJlMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); - background: -moz-linear-gradient(top, #e2e2e2 0%, #ffffff 100%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#e2e2e2), color-stop(100%,#ffffff)); /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #e2e2e2 0%,#ffffff 100%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #e2e2e2 0%,#ffffff 100%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #e2e2e2 0%,#ffffff 100%); /* IE10+ */ - background: linear-gradient(to bottom, #e2e2e2 0%,#ffffff 100%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e2e2e2', endColorstr='#ffffff',GradientType=0 ); /* IE6-8 */ -} -.controller-selected{ -} -.controller-view .ci-controller div.selection{ - background: url(images/ci_unselected.gif) no-repeat; - margin-right:6px; - width: 54px; - height: 72px; - display: inline; - float: left; -} -.controller-view .controller-selected div.selection { - background: url(images/ci_selected.gif); - width: 54px; - height: 72px; - display: inline; - float: left; -} -.controller-view .ci-controller .controller-info { - display: inline; - overflow: hidden; - vertical-align: top; -} -.controller-view .ci-controller .method-info { - padding: 6px 0 10px 10px; - display: inline; -} -.controller-view .ci-controller .method-info { - float: right; - width: 108px; - border-left: 1px dotted #ccc; -} -.controller-view .ci-controller .method-info table td { - padding-right: 4px; -} -.controller-rollover{ - border: 1px solid #aaa !important; - padding: 1px !important; -} -.controller-view .ci-controller .controller-name, -.controller-view .ci-controller .controller-dir { - display: block; -} -.controller-view .ci-controller .controller-name { - font-weight: bold; - margin-top: 6px; -} -/* Path View Classes */ -.path-not-found div.x-grid-cell-inner { - background:url(icons/error.png) 3px 2px no-repeat !important; -} -.path-public div.x-grid-cell-inner { - background: url(icons/world_link.png) 2px 1px no-repeat !important; - padding-left: 24px; -} -.path-private div.x-grid-cell-inner { - background: url(icons/page_delete.png) 2px 1px no-repeat !important; - padding-left: 24px; -} -.menu-title { - display: block; - padding: 4px; - width: 100%; - color: #fff; - background-color: #4F0101; -} -/* Role View Classes */ -.permission-in-role div.x-grid-cell-inner { - background:url(icons/accept.png) 3px 2px no-repeat !important; -} -/* toolbar drop-down button */ -.view-selection-button span { - font-size: 11px !important; - font-weight: normal !important; -} diff --git a/app/resources/appunto-auth/css/appunto-auth/css/app.css b/app/resources/appunto-auth/css/appunto-auth/css/app.css deleted file mode 100644 index da65b090..00000000 --- a/app/resources/appunto-auth/css/appunto-auth/css/app.css +++ /dev/null @@ -1,125 +0,0 @@ -.appunto-auth-viewport { - background-color: #4F4F4F; -} -.app-header { - background:#4F0101 url(images/appunto_auth_logo_app_header.gif) 22px 6px no-repeat !important; -} -.controller-frame { - border-right: 1px solid #ccc; -} -/* User View Classes */ -.user-inactive div.x-grid-cell-inner { - background:url(icons/delete.png) 22px 3px no-repeat !important; - color: #777; -} -.user-active div.x-grid-cell-inner { - background:url(icons/accept.png) 22px 3px no-repeat !important; - color: #777; -} -.user-has-role div.x-grid-cell-inner { - background:url(icons/accept.png) 3px 3px no-repeat !important; -} -.has-permission div.x-grid-cell-inner { - background:url(icons/accept.png) 3px 3px no-repeat !important; -} -.user-has-permission div.x-grid-cell-inner { - background:url(icons/user.png) 22px 3px no-repeat !important; -} -.user-role-has-permission div.x-grid-cell-inner { - background:url(icons/shield.png) 22px 3px no-repeat !important; -} -.appunto-list .empty { - font-family: tahoma, arial, verdana, sans-serif; - font-size: 11px; - text-align: center; - padding-top: 20px; -} -/* Controller View Classes */ -.controller-view .ci-controller { - border: 1px solid #ccc; - width: 94%; - float: left; - font-family: arial, helvetica, sans-serif; - font-size: 13px; - margin: 8px 12px; - padding: 1px; - background: #e2e2e2; /* Old browsers */ - /* IE9 SVG, needs conditional override of 'filter' to 'none' */ - background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2UyZTJlMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); - background: -moz-linear-gradient(top, #e2e2e2 0%, #ffffff 100%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#e2e2e2), color-stop(100%,#ffffff)); /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #e2e2e2 0%,#ffffff 100%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #e2e2e2 0%,#ffffff 100%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #e2e2e2 0%,#ffffff 100%); /* IE10+ */ - background: linear-gradient(to bottom, #e2e2e2 0%,#ffffff 100%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e2e2e2', endColorstr='#ffffff',GradientType=0 ); /* IE6-8 */ -} -.controller-selected{ -} -.controller-view .ci-controller div.selection{ - background: url(images/ci_unselected.gif) no-repeat; - margin-right:6px; - width: 54px; - height: 72px; - display: inline; - float: left; -} -.controller-view .controller-selected div.selection { - background: url(images/ci_selected.gif); - width: 54px; - height: 72px; - display: inline; - float: left; -} -.controller-view .ci-controller .controller-info { - display: inline; - overflow: hidden; - vertical-align: top; -} -.controller-view .ci-controller .method-info { - padding: 6px 0 10px 10px; - display: inline; -} -.controller-view .ci-controller .method-info { - float: right; - width: 108px; - border-left: 1px dotted #ccc; -} -.controller-view .ci-controller .method-info table td { - padding-right: 4px; -} -.controller-rollover{ - border: 1px solid #aaa !important; - padding: 1px !important; -} -.controller-view .ci-controller .controller-name, -.controller-view .ci-controller .controller-dir { - display: block; -} -.controller-view .ci-controller .controller-name { - font-weight: bold; - margin-top: 6px; -} -/* Path View Classes */ -.path-not-found div.x-grid-cell-inner { - background:url(icons/error.png) 3px 2px no-repeat !important; -} -.path-public div.x-grid-cell-inner { - background: url(icons/world_link.png) 2px 1px no-repeat !important; - padding-left: 24px; -} -.path-private div.x-grid-cell-inner { - background: url(icons/page_delete.png) 2px 1px no-repeat !important; - padding-left: 24px; -} -.menu-title { - display: block; - padding: 4px; - width: 100%; - color: #fff; - background-color: #4F0101; -} -/* Role View Classes */ -.permission-in-role div.x-grid-cell-inner { - background:url(icons/accept.png) 3px 2px no-repeat !important; -} diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons.css b/app/resources/appunto-auth/css/appunto-auth/css/icons.css deleted file mode 100644 index 527bbac4..00000000 --- a/app/resources/appunto-auth/css/appunto-auth/css/icons.css +++ /dev/null @@ -1,72 +0,0 @@ -/* Tab icons */ -.transmit { - background-image:url(icons/transmit.png) !important; -} -.user { - background-image:url(icons/user.png) !important; -} -.shield { - background-image:url(icons/shield.png) !important; -} -.lock { - background-image:url(icons/lock.png) !important; -} -.map { - background-image:url(icons/map.png) !important; -} -.monitor { - background-image:url(icons/monitor.png) !important; -} -/* Users */ -.user-add { - background-image:url(icons/user_add.png) !important; -} -.user-edit { - background-image:url(icons/user_edit.png) !important; -} -.user-delete { - background-image:url(icons/user_delete.png) !important; -} -.key { - background-image:url(icons/key.png) !important; -} -/* Roles */ -.shield-add { - background-image:url(icons/shield_add.png) !important; -} -.shield-go { - background-image:url(icons/shield_go.png) !important; -} -.shield-delete { - background-image:url(icons/shield_delete.png) !important; -} -/* Permissions */ -.lock-add { - background-image:url(icons/lock_add.png) !important; -} -.lock-edit { - background-image:url(icons/lock_edit.png) !important; -} -.lock-delete { - background-image:url(icons/lock_delete.png) !important; -} -/* Sessions */ -.monitor-delete { - background-image:url(icons/monitor_delete.png) !important; -} -/* Misc */ -.exclamation { - background-image:url(icons/exclamation.png) !important; -} -.delete { - background-image:url(icons/delete.png) !important; -} -.accept { - background-image:url(icons/accept.png) !important; -} -.world-link { - background-image:url(icons/world_link.png) !important; -} -.page-delete { - background-image:url(icons/page_delete.png) !important; -} diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/accept.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/accept.png deleted file mode 100644 index 89c8129a..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/accept.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/delete.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/delete.png deleted file mode 100644 index 08f24936..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/error.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/error.png deleted file mode 100644 index 628cf2da..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/error.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/exclamation.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/exclamation.png deleted file mode 100644 index c37bd062..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/exclamation.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/key.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/key.png deleted file mode 100644 index 4ec1a928..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/key.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/lock.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/lock.png deleted file mode 100644 index 2ebc4f6f..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/lock.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/lock_add.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/lock_add.png deleted file mode 100644 index a7b566b1..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/lock_add.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/lock_delete.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/lock_delete.png deleted file mode 100644 index ecb50a93..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/lock_delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/lock_edit.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/lock_edit.png deleted file mode 100644 index 116aa5b7..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/lock_edit.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/map.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/map.png deleted file mode 100644 index f90ef25e..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/map.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/monitor.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/monitor.png deleted file mode 100644 index d040bd02..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/monitor.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/monitor_delete.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/monitor_delete.png deleted file mode 100644 index 37332563..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/monitor_delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/page_delete.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/page_delete.png deleted file mode 100644 index 3141467c..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/page_delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/shield.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/shield.png deleted file mode 100644 index 3cb4e257..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/shield.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/shield_add.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/shield_add.png deleted file mode 100644 index e20a1b4a..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/shield_add.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/shield_delete.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/shield_delete.png deleted file mode 100644 index 22823a70..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/shield_delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/shield_go.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/shield_go.png deleted file mode 100644 index e9bd8522..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/shield_go.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/transmit.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/transmit.png deleted file mode 100644 index f54bf736..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/transmit.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/user.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/user.png deleted file mode 100644 index 79f35ccb..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/user.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/user_add.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/user_add.png deleted file mode 100644 index deae99bc..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/user_add.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/user_delete.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/user_delete.png deleted file mode 100644 index acbb5630..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/user_delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/user_edit.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/user_edit.png deleted file mode 100644 index c1974cda..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/user_edit.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/icons/world_link.png b/app/resources/appunto-auth/css/appunto-auth/css/icons/world_link.png deleted file mode 100644 index b8edc126..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/icons/world_link.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/images/appunto_auth_logo_app_header.gif b/app/resources/appunto-auth/css/appunto-auth/css/images/appunto_auth_logo_app_header.gif deleted file mode 100644 index 065fe56c..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/images/appunto_auth_logo_app_header.gif and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/images/ci_selected.gif b/app/resources/appunto-auth/css/appunto-auth/css/images/ci_selected.gif deleted file mode 100644 index 71816c54..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/images/ci_selected.gif and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/css/images/ci_unselected.gif b/app/resources/appunto-auth/css/appunto-auth/css/images/ci_unselected.gif deleted file mode 100644 index 404db2db..00000000 Binary files a/app/resources/appunto-auth/css/appunto-auth/css/images/ci_unselected.gif and /dev/null differ diff --git a/app/resources/appunto-auth/css/appunto-auth/lang/en.js b/app/resources/appunto-auth/css/appunto-auth/lang/en.js deleted file mode 100644 index 5fada793..00000000 --- a/app/resources/appunto-auth/css/appunto-auth/lang/en.js +++ /dev/null @@ -1,127 +0,0 @@ -var Language = -{ - override: - { - // Global - name : 'Name', //used in headers for various entities - description : 'Description', //used in headers for various entities - refresh : 'Refresh', // reload the data - result : 'Result', - save : 'Save', - cancel : 'Cancel', - yes : 'Yes', - no : 'No', - field_required : 'This field is required', - - // Application tabs - tab_status : 'Status', - tab_users : 'Users', - tab_user_roles : 'User Roles', - tab_permissions : 'Permissions yo', - tab_paths : 'Paths', - tab_sessions : 'Sessions', - - // User list - username : 'Username', - name : 'Name', - surname : 'Last name', - email : 'Email', - password : 'Password', - password_confirm : 'Confirm password', - password_change : 'Change password', - password_match : 'Passwords do not match', - user_set_active : 'Set user as active', - active : 'Active', // Whether or not this user has been activated or deactivated - user_add : 'Add user', - user_edit : 'Edit user', - user_delete : 'Delete user', - user_delete_confirm : 'Are you sure you want to delete this user?', - user_activate : 'Activate user', - user_deactivate : 'Deactivate user', - last_ip : 'Last IP', - last_login : 'Last Login', - created : 'Created', - modified : 'Modified', - never : 'Never', - user_select : 'Select a user', - user_select_or : 'Select a User or select Show All above.', - user_no_roles : 'No roles are assigned to this user. Select Show All for a list of available roles', - user_no_perm : 'No permissions are assigned to this user. Select Show All for a list of available permissions', - user_role_list : 'User roles', - user_role_list_for : 'User roles for', //will be followed by username - user_role_add : 'Add user to role', - user_role_remove : 'Remove user from role', - user_perm_list : 'Application permissions', - user_perm_list_for : 'Application permissions for', //wilbe followed by username - user_perm_add : 'Grant user permission', - user_perm_remove : 'Revoke user permission', - user_role_view_all : 'Show all roles', - user_role_view_selected : 'Show only roles for the selected user', - user_perm_view_all : 'Show all permissions', - user_perm_view_selected : 'Show only permissions for the selected user', - granted_to : 'Granted to', // permission is granted to user or to the user's role - grant_role : 'Role', - grant_user : 'User', - user_perm_granted_role : 'permission granted through role', - user_perm_granted_user : 'permission granted to user', - - - // Role list - role_add : 'Add role', - role_edit : 'Edit role', - role_delete : 'Delete role', - role_delete_confirm : 'Are you sure you want to delete this role?', - role_perm_view_all : 'Show all permissions', - role_perm_view_selected : 'Show only permissions for the selected role', - role_perm_for : 'Permissions for', - role_select : 'Select a Role or select Show All above.', - role_perm_add : 'Add permission to role', - role_perm_remove : 'Remove permission from role', - - // Permission list - perm_internal_name : 'Internal Name', - perm_add : 'Add permission', - perm_edit : 'Edit permission', - perm_delete : 'Delete permission', - perm_delete_confirm : 'Are you sure you want to delete this permission?', - - - // Path list - path_tab_controllers : 'Controllers', - path_tab_paths : 'Paths', - controller_methods : 'methods', - controller_public : 'public', - controller_private : 'private', - path_verify : 'Verifing application paths', - path_refreshing : 'Refreshing paths', - path_public : 'Public', - path_private : 'Private', - path_method : 'Method', // A Codeigniter function inside a controller - path_path : 'Path', - path_access : 'Access', // Header for public/private column - path_permission : 'Permission', - path_permissions : 'Permissions', - path_set_public : 'Make path public', - path_set_private : 'Make path private', - path_set_permission : 'Set Permission', - path_remove_permission : 'Remove Permission', - path_delete : 'Delete Path', - path_not_found_1 : 'This method was not found in the Controller but a record of it exists in the database.', - path_not_found_2 : 'You may delete the record of this path.', - - // Session List - session_username : 'Username', - session_last_activity : 'Last Activity', - session_ip_address : 'IP Address', - session_user_agent : 'User Agent', // User-Agent string returned by user's browser - session_view_all : 'Show all sessions', - session_view_logged_in : 'Show only logged in sessions', - session_delete : 'Delete Session', - session_delete_confirm : 'Are you sure you want to delete this session?', - session_delete_user : 'user', // used in delete confirmation window title eg: "user: Bob Jones" - - - // dummy val so I don't forget to remove trailing comma - dummy : '' - } -}; diff --git a/app/resources/appunto-auth/css/appunto-auth/lang/pt.js b/app/resources/appunto-auth/css/appunto-auth/lang/pt.js deleted file mode 100644 index f73412f3..00000000 --- a/app/resources/appunto-auth/css/appunto-auth/lang/pt.js +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Translation by Loanda Drew and Ricardo Silva - */ -var Language = -{ - override: - { - // Global - name : 'Nome', //used in headers for various entities - description : 'Descrição', //used in headers for various entities - refresh : 'Atualizar', // reload the data - result : 'Resultado', - save : 'Salvar', - cancel : 'Cancelar', - yes : 'Sim', - no : 'Não', - field_required : 'Este campo é obrigatório', - - // Application tabs - tab_status : 'Status', - tab_users : 'Usuários', - tab_user_roles : 'Funções do usuário', - tab_permissions : 'Permissões', - tab_paths : 'Caminhos', - tab_sessions : 'Sessões', - - // usuário list - username : 'Usuário', - name : 'Nome', - surname : 'Sobrenome', - email : 'Email', - password : 'Senha', - password_confirm : 'Confirmar senha', - password_change : 'Alterar senha', - password_match : 'Senhas não combinam', - user_set_active : 'Configurar usuário como ativo', - active : 'Ativo', // Whether or not this User has been activated or deactivated - user_add : 'Adicionar usuário', - user_edit : 'Editar usuário', - user_delete : 'Apagar usuário', - user_delete_confirm : 'Tem certeza que deseja apagar este usuário?', - user_activate : 'Ativar usuário', - user_deactivate : 'Desativar usuário', - last_ip : 'Último IP', - last_login : 'Último Login', - created : 'Criado', - modified : 'Modificado', - never : 'Nunca', - user_select : 'Selecione um usuário', - user_select_or : 'Selecione um usuário ou Mostre Todos acima.', - user_no_roles : 'Nenhuma função está associada a este usuário. Selecione Mostrar Todos para ver as funções disponíveis.', - user_no_perm : 'Nenhuma permissão está associada a este usuário. Selecione Mostrar Todos para ver as permissões disponíveis.', - user_role_list : 'funções de usuário', - user_role_list_for : 'funções de usuário para', //will be followed by username - user_role_add : 'Adicionar usuário a função', - user_role_remove : 'Remover usuário da função', - user_perm_list : 'Permissões do aplicativo', - user_perm_list_for : 'Permissões do aplicativo para', //will be followed by username - user_perm_add : 'Conceder permissão ao usuário', - user_perm_remove : 'Remover permissão do usuário', - user_role_view_all : 'Mostrar todas as funções', - user_role_view_selected : 'Mostrar apenas as funções do usuário selecionado', - user_perm_view_all : 'Mostrar todas as permissões', - user_perm_view_selected : 'Mostrar apenas as permissões do usuário selecionado', - granted_to : 'Concedido a', // permission is granted to user or to the user's role - grant_role : 'Função', - grant_user : 'Usuário', - user_perm_granted_role : 'permissão concedida via função', - user_perm_granted_user : 'permissão concedida ao usuário', - - - // Role list - role_add : 'Adicionar função', - role_edit : 'Editar função', - role_delete : 'Apagar função', - role_delete_confirm : 'Tem certeza que deseja apagar esta função?', - role_perm_view_all : 'Mostrar todas as permissões', - role_perm_view_selected : 'Mostrar apenas as permisões da função selecionada', - role_perm_for : 'Permissões para', - role_select : 'Selecionar uma Função ou Mostrar Todas acima.', - role_perm_add : 'Adicionar permissão à função', - role_perm_remove : 'Remover perissão da função', - - // Permission list - perm_internal_name : 'Nome Interno', - perm_add : 'Adicionar permissão', - perm_edit : 'Editar permissão', - perm_delete : 'Apagar permissão', - perm_delete_confirm : 'Tem certeza que deseja apagar esta permissão?', - - // Path list - path_tab_controllers : 'Controladores', - path_tab_paths : 'Caminhos', - controller_methods : 'métodos', - controller_public : 'público', - controller_private : 'privado', - path_verify : 'Verificando caminhos do aplicativo', - path_refreshing : 'Atualizando caminhos', - path_public : 'Público', - path_private : 'Privado', - path_method : 'Método', // A Codeigniter function inside a controller - path_path : 'Caminho', - path_access : 'Acesso', // Header for public/private column - path_permission : 'Permissão', - path_permissions : 'Permissões', - path_set_public : 'Tornar caminho público', - path_set_private : 'Tornar caminho privado', - path_set_permission : 'Configurar permissão', - path_remove_permission : 'Remover Permissão', - path_delete : 'Apagar caminho', - path_not_found_1 : 'Este método não foi encontrado no controlador, mas existe um registro dele no banco de dados.', - path_not_found_2 : 'Você pode apagar o registro deste caminho.', - - // Session List - session_username : 'usuário', - session_last_activity : 'Última Atividade', - session_ip_address : 'Endereço de IP', - session_user_agent : 'User Agent', // User Agent string returned by usuário's browser - session_view_all : 'Mostrar todas as sessões', - session_view_logged_in : 'Mostrar apenas as sessões ativas', - session_delete : 'Apagar sessão', - session_delete_confirm : 'Tem certeza que deseja apagar esta sessão?', - session_delete_user : 'usuário', // used in delete confirmation window title eg: "user: Bob Jones" - - - // dummy val so I don't forget to remove trailing comma - dummy : '' - } -}; diff --git a/app/resources/appunto-auth/css/icons.css b/app/resources/appunto-auth/css/icons.css deleted file mode 100644 index 527bbac4..00000000 --- a/app/resources/appunto-auth/css/icons.css +++ /dev/null @@ -1,72 +0,0 @@ -/* Tab icons */ -.transmit { - background-image:url(icons/transmit.png) !important; -} -.user { - background-image:url(icons/user.png) !important; -} -.shield { - background-image:url(icons/shield.png) !important; -} -.lock { - background-image:url(icons/lock.png) !important; -} -.map { - background-image:url(icons/map.png) !important; -} -.monitor { - background-image:url(icons/monitor.png) !important; -} -/* Users */ -.user-add { - background-image:url(icons/user_add.png) !important; -} -.user-edit { - background-image:url(icons/user_edit.png) !important; -} -.user-delete { - background-image:url(icons/user_delete.png) !important; -} -.key { - background-image:url(icons/key.png) !important; -} -/* Roles */ -.shield-add { - background-image:url(icons/shield_add.png) !important; -} -.shield-go { - background-image:url(icons/shield_go.png) !important; -} -.shield-delete { - background-image:url(icons/shield_delete.png) !important; -} -/* Permissions */ -.lock-add { - background-image:url(icons/lock_add.png) !important; -} -.lock-edit { - background-image:url(icons/lock_edit.png) !important; -} -.lock-delete { - background-image:url(icons/lock_delete.png) !important; -} -/* Sessions */ -.monitor-delete { - background-image:url(icons/monitor_delete.png) !important; -} -/* Misc */ -.exclamation { - background-image:url(icons/exclamation.png) !important; -} -.delete { - background-image:url(icons/delete.png) !important; -} -.accept { - background-image:url(icons/accept.png) !important; -} -.world-link { - background-image:url(icons/world_link.png) !important; -} -.page-delete { - background-image:url(icons/page_delete.png) !important; -} diff --git a/app/resources/appunto-auth/css/icons/accept.png b/app/resources/appunto-auth/css/icons/accept.png deleted file mode 100644 index 89c8129a..00000000 Binary files a/app/resources/appunto-auth/css/icons/accept.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/delete.png b/app/resources/appunto-auth/css/icons/delete.png deleted file mode 100644 index 08f24936..00000000 Binary files a/app/resources/appunto-auth/css/icons/delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/error.png b/app/resources/appunto-auth/css/icons/error.png deleted file mode 100644 index 628cf2da..00000000 Binary files a/app/resources/appunto-auth/css/icons/error.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/exclamation.png b/app/resources/appunto-auth/css/icons/exclamation.png deleted file mode 100644 index c37bd062..00000000 Binary files a/app/resources/appunto-auth/css/icons/exclamation.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/key.png b/app/resources/appunto-auth/css/icons/key.png deleted file mode 100644 index 4ec1a928..00000000 Binary files a/app/resources/appunto-auth/css/icons/key.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/lock.png b/app/resources/appunto-auth/css/icons/lock.png deleted file mode 100644 index 2ebc4f6f..00000000 Binary files a/app/resources/appunto-auth/css/icons/lock.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/lock_add.png b/app/resources/appunto-auth/css/icons/lock_add.png deleted file mode 100644 index a7b566b1..00000000 Binary files a/app/resources/appunto-auth/css/icons/lock_add.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/lock_delete.png b/app/resources/appunto-auth/css/icons/lock_delete.png deleted file mode 100644 index ecb50a93..00000000 Binary files a/app/resources/appunto-auth/css/icons/lock_delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/lock_edit.png b/app/resources/appunto-auth/css/icons/lock_edit.png deleted file mode 100644 index 116aa5b7..00000000 Binary files a/app/resources/appunto-auth/css/icons/lock_edit.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/map.png b/app/resources/appunto-auth/css/icons/map.png deleted file mode 100644 index f90ef25e..00000000 Binary files a/app/resources/appunto-auth/css/icons/map.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/monitor.png b/app/resources/appunto-auth/css/icons/monitor.png deleted file mode 100644 index d040bd02..00000000 Binary files a/app/resources/appunto-auth/css/icons/monitor.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/monitor_delete.png b/app/resources/appunto-auth/css/icons/monitor_delete.png deleted file mode 100644 index 37332563..00000000 Binary files a/app/resources/appunto-auth/css/icons/monitor_delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/page_delete.png b/app/resources/appunto-auth/css/icons/page_delete.png deleted file mode 100644 index 3141467c..00000000 Binary files a/app/resources/appunto-auth/css/icons/page_delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/shield.png b/app/resources/appunto-auth/css/icons/shield.png deleted file mode 100644 index 3cb4e257..00000000 Binary files a/app/resources/appunto-auth/css/icons/shield.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/shield_add.png b/app/resources/appunto-auth/css/icons/shield_add.png deleted file mode 100644 index e20a1b4a..00000000 Binary files a/app/resources/appunto-auth/css/icons/shield_add.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/shield_delete.png b/app/resources/appunto-auth/css/icons/shield_delete.png deleted file mode 100644 index 22823a70..00000000 Binary files a/app/resources/appunto-auth/css/icons/shield_delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/shield_go.png b/app/resources/appunto-auth/css/icons/shield_go.png deleted file mode 100644 index e9bd8522..00000000 Binary files a/app/resources/appunto-auth/css/icons/shield_go.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/transmit.png b/app/resources/appunto-auth/css/icons/transmit.png deleted file mode 100644 index f54bf736..00000000 Binary files a/app/resources/appunto-auth/css/icons/transmit.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/user.png b/app/resources/appunto-auth/css/icons/user.png deleted file mode 100644 index 79f35ccb..00000000 Binary files a/app/resources/appunto-auth/css/icons/user.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/user_add.png b/app/resources/appunto-auth/css/icons/user_add.png deleted file mode 100644 index deae99bc..00000000 Binary files a/app/resources/appunto-auth/css/icons/user_add.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/user_delete.png b/app/resources/appunto-auth/css/icons/user_delete.png deleted file mode 100644 index acbb5630..00000000 Binary files a/app/resources/appunto-auth/css/icons/user_delete.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/user_edit.png b/app/resources/appunto-auth/css/icons/user_edit.png deleted file mode 100644 index c1974cda..00000000 Binary files a/app/resources/appunto-auth/css/icons/user_edit.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/icons/world_link.png b/app/resources/appunto-auth/css/icons/world_link.png deleted file mode 100644 index b8edc126..00000000 Binary files a/app/resources/appunto-auth/css/icons/world_link.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/images/appunto_auth_logo_app_header.gif b/app/resources/appunto-auth/css/images/appunto_auth_logo_app_header.gif deleted file mode 100644 index 065fe56c..00000000 Binary files a/app/resources/appunto-auth/css/images/appunto_auth_logo_app_header.gif and /dev/null differ diff --git a/app/resources/appunto-auth/css/images/ci_selected.gif b/app/resources/appunto-auth/css/images/ci_selected.gif deleted file mode 100644 index 71816c54..00000000 Binary files a/app/resources/appunto-auth/css/images/ci_selected.gif and /dev/null differ diff --git a/app/resources/appunto-auth/css/images/ci_unselected.gif b/app/resources/appunto-auth/css/images/ci_unselected.gif deleted file mode 100644 index 404db2db..00000000 Binary files a/app/resources/appunto-auth/css/images/ci_unselected.gif and /dev/null differ diff --git a/app/resources/appunto-auth/css/images/magnify.png b/app/resources/appunto-auth/css/images/magnify.png deleted file mode 100644 index b807c42a..00000000 Binary files a/app/resources/appunto-auth/css/images/magnify.png and /dev/null differ diff --git a/app/resources/appunto-auth/css/login.css b/app/resources/appunto-auth/css/login.css deleted file mode 100644 index cc4754d4..00000000 --- a/app/resources/appunto-auth/css/login.css +++ /dev/null @@ -1,92 +0,0 @@ - -/* Login Box */ -.login-form-box { - background: #4F0101 url(logo/appunto_auth_logo_small.png) 24px 18px no-repeat; - -moz-border-radius: 16px; - -webkit-border-radius: 16px; - border-radius: 16px; - padding: 48px 0 16px; - margin: 0 auto; - margin-top: 100px; - width: 360px; - font-size: 16px; - font-family: helvetica, tahoma, arial, verdana, sans-serif; - color: #fff; -} -.login-form-box label { - display: inline-block; - margin: 6px 28px; - width: 300px; -} -.login-form-box form #username, -.login-form-box form #password { - float: right; - width: 200px; - padding: 2px 6px; - margin: 1px 0 -1px -1px; - border-color: #99BCE8; - border-width: 1px; - -moz-border-radius: 8px; - -webkit-border-radius: 8px; - border-radius: 8px; -} -.login-form-box .login-form-errors { - padding-bottom: 12px; -} -.login-form-box .login-form-errors p { - font-size: 12px; - text-align: left; - background: url(icons/error.png) 2px 2px no-repeat; - color: #fff; - padding-top: 3px; - padding-left: 24px; - margin: 10px 0 10px 48px; -} -.login-form-box .login-form-auth-message { - font-size: 13px; - width: 280px; - margin: 6px 32px 12px; - text-align: left; - clear: both; -} -.login-form-box form #login-button{ - margin: 6px 0 20px 262px; -} -.login-form-box form #logout-button{ - margin: 6px 0 20px 140px; -} -.login-form-box .site_name { - visibility: hidden; -} -/* Login Buttons */ -.login-form-box form #login-button, -.login-form-box form #logout-button { - margin-top: 12px; - -moz-box-shadow:inset 0px 1px 0px 0px #cccccc; - -webkit-box-shadow:inset 0px 1px 0px 0px #ffffff; - box-shadow:inset 0px 1px 0px 0px #ffffff; - background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #cccccc), color-stop(1, #dfdfdf) ); - background:-moz-linear-gradient( center top, #cccccc 5%, #dfdfdf 100% ); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#dfdfdf'); - background-color:#ededed; - -moz-border-radius:16px; - -webkit-border-radius:16px; - border-radius:16px; - border:1px solid #cccccc; - display:inline-block; - color:#333333; - font-weight:normal; - padding:2px 12px; - text-decoration:none; - text-shadow:1px 1px 0px #ffffff; -} -.login-form-box form #login-button:hover { - background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #ededed), color-stop(1, #dfdfdf) ); - background:-moz-linear-gradient( center top, #ededed 5%, #dfdfdf 100% ); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#dfdfdf'); - background-color:#ededed; -} -.login-form-box form #login-button:active { - position:relative; - top:1px; -} diff --git a/app/resources/appunto-auth/css/logo/appunto_auth_logo_app_header.gif b/app/resources/appunto-auth/css/logo/appunto_auth_logo_app_header.gif deleted file mode 100644 index 065fe56c..00000000 Binary files a/app/resources/appunto-auth/css/logo/appunto_auth_logo_app_header.gif and /dev/null differ diff --git a/app/resources/appunto-auth/css/logo/appunto_auth_logo_small.png b/app/resources/appunto-auth/css/logo/appunto_auth_logo_small.png deleted file mode 100644 index dbe6203f..00000000 Binary files a/app/resources/appunto-auth/css/logo/appunto_auth_logo_small.png and /dev/null differ diff --git a/app/resources/appunto-auth/favicon.ico b/app/resources/appunto-auth/favicon.ico deleted file mode 100644 index 7f705164..00000000 Binary files a/app/resources/appunto-auth/favicon.ico and /dev/null differ diff --git a/app/resources/appunto-auth/js/app.js b/app/resources/appunto-auth/js/app.js deleted file mode 100644 index 2656c36e..00000000 --- a/app/resources/appunto-auth/js/app.js +++ /dev/null @@ -1 +0,0 @@ -var AppuntoAuth=AppuntoAuth||{};if(!AppuntoAuth.controller){AppuntoAuth.controller={}}if(!AppuntoAuth.lib){AppuntoAuth.lib={}}if(!AppuntoAuth.lib.lang){AppuntoAuth.lib.lang={}}if(!AppuntoAuth.lib.proxy){AppuntoAuth.lib.proxy={}}if(!AppuntoAuth.lib.util){AppuntoAuth.lib.util={}}if(!AppuntoAuth.model){AppuntoAuth.model={}}if(!AppuntoAuth.store){AppuntoAuth.store={}}if(!AppuntoAuth.view){AppuntoAuth.view={}}if(!AppuntoAuth.view.main){AppuntoAuth.view.main={}}if(!AppuntoAuth.view.path){AppuntoAuth.view.path={}}if(!AppuntoAuth.view.permission){AppuntoAuth.view.permission={}}if(!AppuntoAuth.view.role){AppuntoAuth.view.role={}}if(!AppuntoAuth.view.session){AppuntoAuth.view.session={}}if(!AppuntoAuth.view.status){AppuntoAuth.view.status={}}if(!AppuntoAuth.view.user){AppuntoAuth.view.user={}}var Ext=Ext||{};if(!Ext.Toolbar){Ext.Toolbar={}}if(!Ext.app){Ext.app={}}if(!Ext.app.bind){Ext.app.bind={}}if(!Ext.app.domain){Ext.app.domain={}}if(!Ext.app.route){Ext.app.route={}}if(!Ext.button){Ext.button={}}if(!Ext.container){Ext.container={}}if(!Ext.core){Ext.core={}}if(!Ext.data){Ext.data={}}if(!Ext.data.field){Ext.data.field={}}if(!Ext.data.flash){Ext.data.flash={}}if(!Ext.data.identifier){Ext.data.identifier={}}if(!Ext.data.matrix){Ext.data.matrix={}}if(!Ext.data.operation){Ext.data.operation={}}if(!Ext.data.proxy){Ext.data.proxy={}}if(!Ext.data.reader){Ext.data.reader={}}if(!Ext.data.schema){Ext.data.schema={}}if(!Ext.data.session){Ext.data.session={}}if(!Ext.data.validator){Ext.data.validator={}}if(!Ext.data.writer){Ext.data.writer={}}if(!Ext.dd){Ext.dd={}}if(!Ext.dom){Ext.dom={}}if(!Ext.dom.Element){Ext.dom.Element={}}if(!Ext.event){Ext.event={}}if(!Ext.event.gesture){Ext.event.gesture={}}if(!Ext.event.publisher){Ext.event.publisher={}}if(!Ext.form){Ext.form={}}if(!Ext.form.Action){Ext.form.Action={}}if(!Ext.form.action){Ext.form.action={}}if(!Ext.form.field){Ext.form.field={}}if(!Ext.form.trigger){Ext.form.trigger={}}if(!Ext.fx){Ext.fx={}}if(!Ext.fx.easing){Ext.fx.easing={}}if(!Ext.fx.target){Ext.fx.target={}}if(!Ext.grid){Ext.grid={}}if(!Ext.grid.column){Ext.grid.column={}}if(!Ext.grid.header){Ext.grid.header={}}if(!Ext.grid.locking){Ext.grid.locking={}}if(!Ext.grid.plugin){Ext.grid.plugin={}}if(!Ext.layout){Ext.layout={}}if(!Ext.layout.boxOverflow){Ext.layout.boxOverflow={}}if(!Ext.layout.component){Ext.layout.component={}}if(!Ext.layout.container){Ext.layout.container={}}if(!Ext.layout.container.border){Ext.layout.container.border={}}if(!Ext.layout.container.boxOverflow){Ext.layout.container.boxOverflow={}}if(!Ext.list){Ext.list={}}if(!Ext.menu){Ext.menu={}}if(!Ext.mixin){Ext.mixin={}}if(!Ext.overrides){Ext.overrides={}}if(!Ext.overrides.app){Ext.overrides.app={}}if(!Ext.overrides.dom){Ext.overrides.dom={}}if(!Ext.overrides.event){Ext.overrides.event={}}if(!Ext.overrides.event.publisher){Ext.overrides.event.publisher={}}if(!Ext.overrides.util){Ext.overrides.util={}}if(!Ext.panel){Ext.panel={}}if(!Ext.perf){Ext.perf={}}if(!Ext.plugin){Ext.plugin={}}if(!Ext.resizer){Ext.resizer={}}if(!Ext.scroll){Ext.scroll={}}if(!Ext.selection){Ext.selection={}}if(!Ext.state){Ext.state={}}if(!Ext.tab){Ext.tab={}}if(!Ext.tip){Ext.tip={}}if(!Ext.toolbar){Ext.toolbar={}}if(!Ext.util){Ext.util={}}if(!Ext.util.translatable){Ext.util.translatable={}}if(!Ext.view){Ext.view={}}if(!Ext.window){Ext.window={}}var ExtThemeNeptune=ExtThemeNeptune||{};if(!ExtThemeNeptune.layout){ExtThemeNeptune.layout={}}if(!ExtThemeNeptune.layout.component){ExtThemeNeptune.layout.component={}}if(!ExtThemeNeptune.menu){ExtThemeNeptune.menu={}}if(!ExtThemeNeptune.panel){ExtThemeNeptune.panel={}}if(!ExtThemeNeptune.resizer){ExtThemeNeptune.resizer={}}if(!ExtThemeNeptune.toolbar){ExtThemeNeptune.toolbar={}}var Lang=Lang||{};(function(z){var x,v=["constructor","toString","valueOf","toLocaleString"],y={},r={},F=0,A,E,s,B,w,t,G=function(){var a,b;E=Ext.Base;s=Ext.ClassManager;for(a=v.length;a-->0;){b=(1<0;){d=x[c];e[d]=E[d]}return e},D=function(ac,p,d,am,Y,Z,aa,g,ag,o,ak){var aj=function al(){return this.constructor.apply(this,arguments)||null},e=aj,ai={enumerableMembers:am&F,onCreated:ak,onBeforeCreated:C,aliases:g},ae=d.alternateClassName||[],j=Ext.global,n,k,h,af,l,a,b,ad,m,an,f,q,ah,c,ab=s.alternateToName||s.maps.alternateToName,ao=s.nameToAlternates||s.maps.nameToAlternates;if(t===undefined){t=!!(s&&s.addAlias)}for(h=x.length;h-->0;){b=x[h];aj[b]=E[b]}if(d.$isFunction){d=d(aj)}ai.data=d;an=d.statics;delete d.statics;d.$className=ac;if("$className" in d){aj.$className=d.$className}aj.extend(p);m=aj.prototype;aj.xtype=d.xtype=Y[0];if(Y){m.xtypes=Y}m.xtypesChain=Z;m.xtypesMap=aa;d.alias=g;e.triggerExtended(aj,d,ai);if(d.onClassExtended){aj.onExtended(d.onClassExtended,aj);delete d.onClassExtended}if(an){if(t){aj.addStatics(an)}else{for(f in an){if(an.hasOwnProperty(f)){c=an[f];if(c&&c.$isFunction&&!c.$isClass&&c!==Ext.emptyFn&&c!==Ext.identityFn){aj[f]=ah=c;ah.$owner=aj;ah.$name=f}aj[f]=c}}}}if(d.inheritableStatics){aj.addInheritableStatics(d.inheritableStatics);delete d.inheritableStatics}if(m.onClassExtended){e.onExtended(m.onClassExtended,e);delete m.onClassExtended}if(d.config){B.call(Ext.Class,aj,d)}if(d.cachedConfig&&w){w.call(Ext.Class,aj,d)}ai.onBeforeCreated(aj,ai.data,ai);for(h=0,l=ag&&ag.length;h0){b--;d[b]="var Ext=window."+Ext.name+";"+d[b]}}f=d.join("");c=e[f];if(!c){c=Function.prototype.constructor.apply(Function.prototype,d);e[f]=c}return c},functionFactory:function(){var b=Array.prototype.slice.call(arguments),a;if(Ext.isSandboxed){a=b.length;if(a>0){a--;b[a]="var Ext=window."+Ext.name+";"+b[a]}}return Function.prototype.constructor.apply(Function.prototype,b)},Logger:{verbose:p,log:p,info:p,warn:p,error:function(a){throw new Error(a)},deprecate:p},getElementById:function(a){return document.getElementById(a)},splitAndUnescape:(function(){var a={};return function(e,f){if(!e){return[]}else{if(!f){return[e]}}var c=a[f]||(a[f]=new RegExp("\\\\"+f,"g")),g=[],b,d;b=e.split(f);while((d=b.shift())!==undefined){while(d.charAt(d.length-1)==="\\"&&b.length>0){d=d+f+b.shift()}d=d.replace(c,f);g.push(d)}return g}})()});Ext.returnTrue.$nullFn=Ext.returnId.$nullFn=true}());(function(){function b(){var h=this,a=h.sourceClass,f=h.sourceMethod,g=h.msg;if(f){if(g){f+="(): ";f+=g}else{f+="()"}}if(a){f=f?(a+"."+f):a}return f||g||""}Ext.Error=function(d){if(Ext.isString(d)){d={msg:d}}var a=new Error();Ext.apply(a,d);a.message=a.message||a.msg;a.toString=b;return a};Ext.apply(Ext.Error,{ignore:false,raise:function(j){j=j||{};if(Ext.isString(j)){j={msg:j}}var k=this,g=k.raise.caller,h,a;if(g){if(!j.sourceMethod&&(a=g.$name)){j.sourceMethod=a}if(!j.sourceClass&&(a=g.$owner)&&(a=a.$className)){j.sourceClass=a}}if(k.handle(j)!==true){h=b.call(j);throw new Ext.Error(j)}},handle:function(){return this.ignore}})})();Ext.deprecated=function(b){return Ext.emptyFn};Ext.Array=new (function(){var I=Array.prototype,B=I.slice,z=(function(){var a=[],c,b=20;if(!a.splice){return false}while(b--){a.push("A")}a.splice(15,0,"F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F");c=a.length;a.splice(13,0,"XXX");if(c+1!==a.length){return false}return true}()),A="indexOf" in I,F=true;function C(g,c){var d=g.length,a=new Array(d),f=new Array(d),b;for(b=0;ba){for(h=f;h--;){c[l+h]=c[a+h]}}}if(n&&b===j){c.length=j;c.push.apply(c,o)}else{c.length=j+n;for(h=0;h>1;j=h(a,b[f]);if(j>=0){d=f+1}else{if(j<0){g=f-1}}}return d},defaultCompare:function(b,a){return(ba)?1:0)},lexicalCompare:function(b,a){b=String(b);a=String(a);return(ba)?1:0)},each:function(g,b,c,f){g=K.from(g);var d,a=g.length;if(f!==true){for(d=0;d-1;d--){if(b.call(c||g[d],g[d],d,g)===false){return d}}}return true},forEach:("forEach" in I)?function(a,b,c){return a.forEach(b,c)}:function(a,c,d){for(var f=0,b=a.length;ff){f=c}}}return f},mean:function(a){return a.length>0?K.sum(a)/a.length:undefined},sum:function(a){var d=0,f,b,c;for(f=0,b=a.length;f=d){c=0}else{c=d-c}}if(c===0){b=a+b}else{if(c>=b.length){b+=a}else{b=b.substr(0,c)+a+b.substr(c)}}return b},startsWith:function(b,a,c){var d=A(b,a);if(d){if(c){b=b.toLowerCase();a=a.toLowerCase()}d=b.lastIndexOf(a,0)===0}return d},endsWith:function(a,c,b){var d=A(a,c);if(d){if(b){a=a.toLowerCase();c=c.toLowerCase()}d=a.indexOf(c,a.length-c.length)!==-1}return d},createVarName:function(a){return a.replace(s,"")},htmlEncode:function(a){return(!a)?a:String(a).replace(w,x)},htmlDecode:function(a){return(!a)?a:String(a).replace(z,t)},hasHtmlCharacters:function(a){return w.test(a)},addCharacterEntities:function(d){var e=[],a=[],c,b;for(c in d){b=d[c];C[c]=b;y[b]=c;e.push(b);a.push(c)}w=new RegExp("("+e.join("|")+")","g");z=new RegExp("("+a.join("|")+"|&#[0-9]{1,5};)","g")},resetCharacterEntities:function(){y={};C={};this.addCharacterEntities({"&":"&",">":">","<":"<",""":'"',"'":"'"})},urlAppend:function(a,b){if(!Ext.isEmpty(b)){return a+(a.indexOf("?")===-1?"?":"&")+b}return a},trim:function(a){if(a){a=a.replace(v,"")}return a||""},capitalize:function(a){if(a){a=a.charAt(0).toUpperCase()+a.substr(1)}return a||""},uncapitalize:function(a){if(a){a=a.charAt(0).toLowerCase()+a.substr(1)}return a||""},ellipsis:function(c,d,b){if(c&&c.length>d){if(b){var a=c.substr(0,d-2),e=Math.max(a.lastIndexOf(" "),a.lastIndexOf("."),a.lastIndexOf("!"),a.lastIndexOf("?"));if(e!==-1&&e>=(d-15)){return a.substr(0,e)+"..."}}return c.substr(0,d-3)+"..."}return c},escapeRegex:function(a){return a.replace(B,"\\$1")},createRegex:function(a,b,d,e){var c=a;if(a!=null&&!a.exec){c=q.escapeRegex(String(a));if(b!==false){c="^"+c}if(d!==false){c+="$"}c=new RegExp(c,(e!==false)?"i":"")}return c},escape:function(a){return a.replace(r,"\\$1")},toggle:function(b,a,c){return b===a?c:a},leftPad:function(c,b,a){var d=String(c);a=a||" ";while(d.length daysInMonth) {","d = daysInMonth;","}","}","h = from(h, from(def.h, dt.getHours()));","i = from(i, from(def.i, dt.getMinutes()));","s = from(s, from(def.s, dt.getSeconds()));","ms = from(ms, from(def.ms, dt.getMilliseconds()));","if(z >= 0 && y >= 0){","v = me.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), me.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (me.isLeapYear(v) && z <= 365))? me.add(v, me.DAY, z) : null);","}else if(strict === true && !me.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","if (W) {","year = y || (new Date()).getFullYear();","jan4 = new Date(year, 0, 4, 0, 0, 0);","d = jan4.getDay();","week1monday = new Date(jan4.getTime() - ((d === 0 ? 6 : d - 1) * 86400000));","v = Ext.Date.clearTime(new Date(week1monday.getTime() + ((W - 1) * 604800000 + 43200000)));","} else {","v = me.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), me.YEAR, y < 100 ? y - 100 : 0);","}","}","}","}","if(v){","if(zz != null){","v = me.add(v, me.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = me.add(v, me.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join("\n");function m(a){var b=Array.prototype.slice.call(arguments,1);return a.replace(q,function(d,c){return b[c]})}return p={now:Date.now,toString:function(b){if(!b){b=new Date()}var a=Ext.String.leftPad;return b.getFullYear()+"-"+a(b.getMonth()+1,2,"0")+"-"+a(b.getDate(),2,"0")+"T"+a(b.getHours(),2,"0")+":"+a(b.getMinutes(),2,"0")+":"+a(b.getSeconds(),2,"0")},getElapsed:function(a,b){return Math.abs(a-(b||p.now()))},useStrict:false,formatCodeToRegex:function(b,c){var a=p.parseCodes[b];if(a){a=typeof a=="function"?a():a;p.parseCodes[b]=a}return a?Ext.applyIf({c:a.c?m(a.c,c||"{0}"):a.c},a):{g:0,c:null,s:Ext.String.escapeRegex(b)}},parseFunctions:{MS:function(b,c){var a=(b||"").match(n);return a?new Date(((a[1]||"")+a[2])*1):null},time:function(b,c){var a=parseInt(b,10);if(a||a===0){return new Date(a)}return null},timestamp:function(b,c){var a=parseInt(b,10);if(a||a===0){return new Date(a*1000)}return null}},parseRegexes:[],formatFunctions:{MS:function(){return"\\/Date("+this.getTime()+")\\/"},time:function(){return this.getTime().toString()},timestamp:function(){return p.format(this,"U")}},y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",defaults:{},dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{January:0,Jan:0,February:1,Feb:1,March:2,Mar:2,April:3,Apr:3,May:4,June:5,Jun:5,July:6,Jul:6,August:7,Aug:7,September:8,Sep:8,October:9,Oct:9,November:10,Nov:10,December:11,Dec:11},defaultFormat:"m/d/Y",getShortMonthName:function(a){return Ext.Date.monthNames[a].substring(0,3)},getShortDayName:function(a){return Ext.Date.dayNames[a].substring(0,3)},getMonthNumber:function(a){return Ext.Date.monthNumbers[a.substring(0,1).toUpperCase()+a.substring(1,3).toLowerCase()]},formatContainsHourInfo:function(a){return s.test(a.replace(k,""))},formatContainsDateInfo:function(a){return o.test(a.replace(k,""))},unescapeFormat:function(a){return a.replace(l,"")},formatCodes:{d:"Ext.String.leftPad(this.getDate(), 2, '0')",D:"Ext.Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Ext.Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"Ext.Date.getSuffix(this)",w:"this.getDay()",z:"Ext.Date.getDayOfYear(this)",W:"Ext.String.leftPad(Ext.Date.getWeekOfYear(this), 2, '0')",F:"Ext.Date.monthNames[this.getMonth()]",m:"Ext.String.leftPad(this.getMonth() + 1, 2, '0')",M:"Ext.Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"Ext.Date.getDaysInMonth(this)",L:"(Ext.Date.isLeapYear(this) ? 1 : 0)",o:"(this.getFullYear() + (Ext.Date.getWeekOfYear(this) == 1 && this.getMonth() > 0 ? +1 : (Ext.Date.getWeekOfYear(this) >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"Ext.String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"Ext.String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"Ext.String.leftPad(this.getHours(), 2, '0')",i:"Ext.String.leftPad(this.getMinutes(), 2, '0')",s:"Ext.String.leftPad(this.getSeconds(), 2, '0')",u:"Ext.String.leftPad(this.getMilliseconds(), 3, '0')",O:"Ext.Date.getGMTOffset(this)",P:"Ext.Date.getGMTOffset(this, true)",T:"Ext.Date.getTimezone(this)",Z:"(this.getTimezoneOffset() * -60)",c:function(){var c,e,a,b,d;for(c="Y-m-dTH:i:sP",e=[],a=0,b=c.length;a me.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(am|pm|AM|PM)",calcAtEnd:true},A:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)",calcAtEnd:true},g:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(1[0-2]|[0-9])"},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(2[0-3]|1[0-9]|[0-9])"},h:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(1[0-2]|0[1-9])"},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(2[0-3]|[0-1][0-9])"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"([0-5][0-9])"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"([0-5][0-9])"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,5}"},Z:{g:1,c:"zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var d=[],b=[p.formatCodeToRegex("Y",1),p.formatCodeToRegex("m",2),p.formatCodeToRegex("d",3),p.formatCodeToRegex("H",4),p.formatCodeToRegex("i",5),p.formatCodeToRegex("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",p.formatCodeToRegex("P",8).c,"}else{",p.formatCodeToRegex("O",8).c,"}","}"].join("\n")}],c,a;for(c=0,a=b.length;c0?"-":"+")+Ext.String.leftPad(Math.floor(Math.abs(a)/60),2,"0")+(b?":":"")+Ext.String.leftPad(Math.abs(a%60),2,"0")},getDayOfYear:function(e){var a=0,c=Ext.Date.clone(e),b=e.getMonth(),d;for(d=0,c.setDate(1),c.setMonth(0);d28){b=Math.min(b,Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(h),Ext.Date.MONTH,e)).getDate())}d.setDate(b);d.setMonth(h.getMonth()+e);break;case Ext.Date.YEAR:b=h.getDate();if(b>28){b=Math.min(b,Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(h),Ext.Date.YEAR,e)).getDate())}d.setDate(b);d.setFullYear(h.getFullYear()+e);break}}if(f){switch(a.toLowerCase()){case Ext.Date.MILLI:g=1;break;case Ext.Date.SECOND:g=1000;break;case Ext.Date.MINUTE:g=1000*60;break;case Ext.Date.HOUR:g=1000*60*60;break;case Ext.Date.DAY:g=1000*60*60*24;break;case Ext.Date.MONTH:b=p.getDaysInMonth(d);g=1000*60*60*24*b;break;case Ext.Date.YEAR:b=(p.isLeapYear(d)?366:365);g=1000*60*60*24*b;break}if(g){d.setTime(d.getTime()+g*f)}}return d},subtract:function(b,c,a){return p.add(b,c,-a)},between:function(b,d,c){var a=b.getTime();return d.getTime()<=a&&a<=c.getTime()},compat:function(){var f=window.Date,g,a=["useStrict","formatCodeToRegex","parseFunctions","parseRegexes","formatFunctions","y2kYear","MILLI","SECOND","MINUTE","HOUR","DAY","MONTH","YEAR","defaults","dayNames","monthNames","monthNumbers","getShortMonthName","getShortDayName","getMonthNumber","formatCodes","isValid","parseDate","getFormatCode","createFormat","createParser","parseCodes"],c=["dateFormat","format","getTimezone","getGMTOffset","getDayOfYear","getWeekOfYear","isLeapYear","getFirstDayOfMonth","getLastDayOfMonth","getDaysInMonth","getSuffix","clone","isDST","clearTime","add","between"],b=a.length,e=c.length,d,j,h;for(h=0;hc){return f-1}else{return f}case b.YEAR:f=c.getFullYear()-a.getFullYear();if(Ext.Date.add(a,e,f)>c){return f-1}else{return f}}},align:function(b,d,a){var c=new Date(+b);switch(d.toLowerCase()){case Ext.Date.MILLI:return c;break;case Ext.Date.SECOND:c.setUTCSeconds(c.getUTCSeconds()-c.getUTCSeconds()%a);c.setUTCMilliseconds(0);return c;break;case Ext.Date.MINUTE:c.setUTCMinutes(c.getUTCMinutes()-c.getUTCMinutes()%a);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.HOUR:c.setUTCHours(c.getUTCHours()-c.getUTCHours()%a);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.DAY:if(a==7||a==14){c.setUTCDate(c.getUTCDate()-c.getUTCDay()+1)}c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.MONTH:c.setUTCMonth(c.getUTCMonth()-(c.getUTCMonth()-1)%a,1);c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.YEAR:c.setUTCFullYear(c.getUTCFullYear()-c.getUTCFullYear()%a,1,1);c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return b;break}}}}());Ext.Function=(function(){var v=0,n,t=[],m=[],r=0,q={},s=window,o=s.requestAnimationFrame||s.webkitRequestAnimationFrame||s.mozRequestAnimationFrame||s.oRequestAnimationFrame||function(b){var a=Ext.now(),d=Math.max(0,16-(a-v)),c=s.setTimeout(function(){b(a+d)},d);v=a+d;return c},u=function(){var a=t.length,b,d,c;n=null;for(d=0;d0){return setTimeout(function(){if(Ext.elevateFunction){Ext.elevateFunction(b)}else{b()}},d)}b();return 0},interval:function(b,d,c,e,a){b=Ext.Function.bind(b,c,e,a);return setInterval(function(){if(Ext.elevateFunction){Ext.elevateFunction(b)}else{b()}},d)},createSequence:function(c,b,a){if(!b){return c}else{return function(){var d=c.apply(this,arguments);b.apply(a||this,arguments);return d}}},createBuffered:function(b,e,c,d){var a;return function(){var f=d||Array.prototype.slice.call(arguments,0),g=c||this;if(a){clearTimeout(a)}a=setTimeout(function(){if(Ext.elevateFunction){Ext.elevateFunction(b,g,f)}else{b.apply(g,f)}},e)}},createAnimationFrame:function(c,d,e,b){var a;b=b||3;return function(){var f=e||Array.prototype.slice.call(arguments,0);d=d||this;if(b===3&&a){p.cancelAnimationFrame(a)}if((b&1)||!a){a=p.requestAnimationFrame(function(){a=null;c.apply(d,f)})}}},requestAnimationFrame:function(c,d,a){var b=++r,e=Array.prototype.slice.call(arguments,0);e[3]=b;q[b]=1;t.push(e);if(!n){n=o(Ext.elevateFunction?w:u)}return b},cancelAnimationFrame:function(a){delete q[a]},createThrottled:function(e,h,f){var d=0,a,g,b,c=function(){if(Ext.elevateFunction){Ext.elevateFunction(e,f,g)}else{e.apply(f,g)}d=Ext.now();b=null};return function(){if(!f){f=this}a=Ext.now()-d;g=arguments;if(a>=h){clearTimeout(b);c()}else{if(!b){b=Ext.defer(c,h-a)}}}},createBarrier:function(b,c,a){return function(){if(!--b){c.apply(a,arguments)}}},interceptBefore:function(e,a,c,d){var b=e[a]||Ext.emptyFn;return(e[a]=function(){var f=c.apply(d||this,arguments);b.apply(this,arguments);return f})},interceptAfter:function(e,a,c,d){var b=e[a]||Ext.emptyFn;return(e[a]=function(){b.apply(this,arguments);return c.apply(d||this,arguments)})},makeCallback:function(b,a){return function(){return a[b].apply(a,arguments)}}};Ext.defer=p.defer;Ext.interval=p.interval;Ext.pass=p.pass;Ext.bind=p.bind;Ext.deferCallback=p.requestAnimationFrame;return p})();Ext.Number=new function(){var g=this,h=(0.9).toFixed()!=="1",e=Math,f={count:false,inclusive:false,wrap:true};Ext.apply(g,{Clip:{DEFAULT:f,COUNT:Ext.applyIf({count:true},f),INCLUSIVE:Ext.applyIf({inclusive:true},f),NOWRAP:Ext.applyIf({wrap:false},f)},clipIndices:function(b,a,o){o=o||f;var p=0,c=o.wrap,d,q,n;a=a||[];for(n=0;n<2;++n){d=q;q=a[n];if(q==null){q=p}else{if(n&&o.count){q+=d;q=(q>b)?b:q}else{if(c){q=(q<0)?(b+q):q}if(n&&o.inclusive){++q}q=(q<0)?0:((q>b)?b:q)}}p=b}a[0]=d;a[1]=(qc)?c:d)},snap:function(b,d,c,a){var k;if(b===undefined||b=d){b+=d}else{if(k*2<-d){b-=d}}}}return g.constrain(b,c,a)},snapInRange:function(b,k,c,a){var d;c=(c||0);if(b===undefined||b=k){b+=k}}if(a!==undefined){if(b>(a=g.snapInRange(a,k,c))){b=a}}return b},toFixed:h?function(a,c){c=c||0;var b=e.pow(10,c);return(e.round(a*b)/b).toFixed(c)}:function(a,b){return a.toFixed(b)},from:function(a,b){if(isFinite(a)){a=parseFloat(a)}return !isNaN(a)?a:b},randomInt:function(a,b){return e.floor(e.random()*(b-a+1)+a)},correctFloat:function(a){return parseFloat(a.toPrecision(14))}});Ext.num=function(){return g.from.apply(this,arguments)}}();(function(){var d=function(){},c=Ext.Object={chain:Object.create||function(a){d.prototype=a;var b=new d();d.prototype=null;return b},clear:function(b){for(var a in b){delete b[a]}return b},freeze:Object.freeze?function(a,f){if(a&&typeof a==="object"&&!Object.isFrozen(a)){Object.freeze(a);if(f){for(var b in a){c.freeze(a[b],f)}}}return a}:Ext.identityFn,toQueryObjects:function(m,a,n){var o=c.toQueryObjects,b=[],l,k;if(Ext.isArray(a)){for(l=0,k=a.length;l0){F=B.split("=");a=decodeURIComponent(F[0]);C=(F[1]!==undefined)?decodeURIComponent(F[1]):"";if(!y){if(j.hasOwnProperty(a)){if(!Ext.isArray(j[a])){j[a]=[j[a]]}j[a].push(C)}else{j[a]=C}}else{G=a.match(/(\[):?([^\]]*)\]/g);w=a.match(/^([^\[]+)/);a=w[0];E=[];if(G===null){j[a]=C;continue}for(A=0,K=G.length;Aa){return 1}}v=z.releaseValue;a=g.releaseValue;if(va){return 1}return 0},toString:function(){return this.version},valueOf:function(){return this.version},getMajor:function(){return this.major},getMinor:function(){return this.minor},getPatch:function(){return this.patch},getBuild:function(){return this.build},getRelease:function(){return this.release},getReleaseValue:function(){return this.releaseValue},isGreaterThan:function(a){return this.compareTo(a)>0},isGreaterThanOrEqual:function(a){return this.compareTo(a)>=0},isLessThan:function(a){return this.compareTo(a)<0},isLessThanOrEqual:function(a){return this.compareTo(a)<=0},equals:function(a){return this.compareTo(a)===0},match:function(a){a=String(a);return this.version.substr(0,a.length)===a},toArray:function(){var a=this;return[a.getMajor(),a.getMinor(),a.getPatch(),a.getBuild(),a.getRelease()]},getShortVersion:function(){return this.shortVersion},gt:function(a){return this.compareTo(a)>0},lt:function(a){return this.compareTo(a)<0},gtEq:function(a){return this.compareTo(a)>=0},ltEq:function(a){return this.compareTo(a)<=0}};Ext.apply(m,{aliases:{from:{extjs:"ext",core:"sencha-core"},to:{ext:["extjs"],"sencha-core":["core"]}},releaseValueMap:{dev:-6,alpha:-5,a:-5,beta:-4,b:-4,rc:-3,"#":-2,p:-1,pl:-1},getComponentValue:function(a){return !a?0:(isNaN(a)?this.releaseValueMap[a]||a:parseInt(a,10))},compare:function(a,b){var c=a.isVersion?a:new m(a);return c.compareTo(b)},set:function(f,b,c){var d=m.aliases.to[b],e=c.isVersion?c:new m(c),a;f[b]=e;if(d){for(a=d.length;a-->0;){f[d[a]]=e}}return e}});Ext.apply(Ext,{compatVersions:{},versions:{},lastRegisteredVersion:null,getCompatVersion:function(b){var c=Ext.compatVersions,a;if(!b){a=c.ext||c.touch||c.core}else{a=c[m.aliases.from[b]||b]}return a||Ext.getVersion(b)},setCompatVersion:function(a,b){m.set(Ext.compatVersions,a,b)},setVersion:function(a,b){Ext.lastRegisteredVersion=m.set(Ext.versions,a,b);return this},getVersion:function(a){var b=Ext.versions;if(!a){return b.ext||b.touch||b.core}return b[m.aliases.from[a]||a]},checkVersion:function(d,E){var I=Ext.isArray(d),z=m.aliases.from,D=I?d:n,A=D.length,g=Ext.versions,F=g.ext||g.touch,c,G,a,f,e,B,C,b,H;if(!I){n[0]=d}for(c=0;c=0){C=C.replace(l,"")}G=C.indexOf("@");if(G<0){b=C;H=F}else{B=C.substring(0,G);if(!(H=g[z[B]||B])){if(E){return false}continue}b=C.substring(G+1)}G=b.indexOf("-");if(G<0){if(b.charAt(G=b.length-1)==="+"){f=b.substring(0,G);e=null}else{f=e=b}}else{if(G>0){f=b.substring(0,G);e=b.substring(G+1)}else{f=null;e=b.substring(G+1)}}a=true;if(f){f=new m(f,"~");a=f.ltEq(H)}if(a&&e){e=new m(e,"~");a=e.gtEq(H)}}if(a){if(!E){return true}}else{if(E){return false}}}return !!E},deprecate:function(d,b,a,c){if(m.compare(Ext.getVersion(d),b)<1){a.call(c)}}})}());(function(j){var h=(j&&j.packages)||{},k=j&&j.compatibility,f,g;for(f in h){g=h[f];Ext.setVersion(f,g.version)}if(k){if(Ext.isString(k)){Ext.setCompatVersion("core",k)}else{for(f in k){Ext.setCompatVersion(f,k[f])}}}if(!h.ext&&!h.touch){Ext.setVersion("ext","5")}})(Ext.manifest);Ext.Config=function(d){var f=this,e=d.charAt(0).toUpperCase()+d.substr(1);f.name=d;f.names={internal:"_"+d,initializing:"is"+e+"Initializing",apply:"apply"+e,update:"update"+e,get:"get"+e,set:"set"+e,initGet:"initGet"+e,doSet:"doSet"+e,changeEvent:d.toLowerCase()+"change"};f.root=f};Ext.Config.map={};Ext.Config.get=function(d){var f=Ext.Config.map,e=f[d]||(f[d]=new Ext.Config(d));return e};Ext.Config.prototype={self:Ext.Config,isConfig:true,getGetter:function(){return this.getter||(this.root.getter=this.makeGetter())},getInitGetter:function(){return this.initGetter||(this.root.initGetter=this.makeInitGetter())},getSetter:function(){return this.setter||(this.root.setter=this.makeSetter())},getInternalName:function(b){return b.$configPrefixed?this.names.internal:this.name},mergeNew:function(j,g,k,l){var h,m;if(!g){h=j}else{if(!j){h=g}else{h=Ext.Object.chain(g);for(m in j){if(!l||!(m in h)){h[m]=j[m]}}}}return h},mergeSets:function(k,m,h){var g=m?Ext.Object.chain(m):{},l,j;if(k instanceof Array){for(l=k.length;l--;){j=k[l];if(!h||!(j in g)){g[j]=true}}}else{if(k){if(k.constructor===Object){for(l in k){j=k[l];if(!h||!(l in g)){g[l]=j}}}else{if(!h||!(k in g)){g[k]=true}}}}return g},makeGetter:function(){var d=this.name,c=this.names.internal;return function(){var a=this.$configPrefixed?c:d;return this[a]}},makeInitGetter:function(){var g=this.name,h=this.names,j=h.set,f=h.get,k=h.initializing;return function(){var a=this;a[k]=true;delete a[f];a[j](a.config[g]);delete a[k];return a[f].apply(a,arguments)}},makeSetter:function(){var j=this.name,m=this.names,o=m.internal,n=m.get,h=m.apply,k=m.update,l;l=function(a){var b=this,c=b.$configPrefixed?o:j,d=b[c];delete b[n];if(!b[h]||(a=b[h](a,d))!==undefined){if(a!==(d=b[c])){b[c]=a;if(b[k]){b[k](a,d)}}}return b};l.$isDefault=true;return l}};(function(){var d=Ext.Config,f=d.map,e=Ext.Object;Ext.Configurator=function(h){var b=this,c=h.prototype,a=h.superclass?h.superclass.self.$config:null;b.cls=h;if(a){b.configs=e.chain(a.configs);b.cachedConfigs=e.chain(a.cachedConfigs);b.initMap=e.chain(a.initMap);b.values=e.chain(a.values)}else{b.configs={};b.cachedConfigs={};b.initMap={};b.values={}}c.config=c.defaultConfig=b.values;h.$config=b};Ext.Configurator.prototype={self:Ext.Configurator,initList:null,add:function(z,O){var s=this,K=s.cls,H=s.configs,c=s.cachedConfigs,F=s.initMap,C=K.prototype,b=O&&O.$config.configs,N=s.values,I,G,A,M,L,J,a,D,E,B;for(a in z){B=z[a];I=B&&B.constructor===Object;G=I&&"$value" in B?B:null;if(G){A=!!G.cached;B=G.$value}M=G&&G.merge;L=H[a];if(L){if(O){M=L.merge;if(!M){continue}G=null}else{M=M||L.merge}J=N[a];if(M){B=M.call(L,B,J,K,O)}else{if(I){if(J&&J.constructor===Object){B=e.merge({},J,B)}}}}else{if(b){L=b[a];G=null}else{L=d.get(a)}H[a]=L;if(L.cached||A){c[a]=true}D=L.names;if(!C[E=D.get]){C[E]=L.getGetter()}if(!C[E=D.set]){C[E]=L.getSetter()}}if(G){if(L.owner!==K){H[a]=L=Ext.Object.chain(L);L.owner=K}Ext.apply(L,G);delete L.$value}if(B!==null){F[a]=true}else{if(C.$configPrefixed){C[H[a].names.internal]=null}else{C[H[a].name]=null}if(a in F){F[a]=false}}N[a]=B}},configure:function(b,R){var M=this,S=M.configs,Q=M.initMap,O=M.initListMap,D=M.initList,N=M.cls.prototype,Y=e.fork(M.values),E=!b.$configStrict,L=0,H=!D,X,V,U,J,F,G,T,P,K,I,a,W,c;if(H){M.initList=D=[];M.initListMap=O={};b.isFirstInstance=true;for(K in Q){J=Q[K];V=S[K];a=V.cached;if(J){P=V.names;I=Y[K];if(!N[P.set].$isDefault||N[P.apply]||N[P.update]||typeof I==="object"){if(a){(X||(X=[])).push(V)}else{D.push(V);O[K]=true}b[P.get]=V.initGetter||V.getInitGetter()}else{N[V.getInternalName(N)]=I}}else{if(a){N[V.getInternalName(N)]=undefined}}}}T=X&&X.length;if(T){for(F=0;F0){for(d=0;d0){G=J.test(A[D])}A=L[n];if(A&&!G){D=A.length;while(!G&&D-->0){G=J.test(A[D])}}}if(G){x[n]=1;F.push(n)}}}}}return F},getPath:function(f){var k=this,h=k.paths,g="",j;if(f in h){g=h[f]}else{j=k.getPrefix(f);if(j){f=f.substring(j.length+1);g=h[j];if(g){g+="/"}}g+=f.replace(k.dotRe,"/")+".js"}return g},getPrefix:function(f){if(f in this.paths){return f}var h=this.getPrefixes(),g=h.length,k,j;while(g-->0){k=(j=h[g]).length;if(k=D){Ext[F+"p"]=true}}}if(x.is.Opera&&parseInt(N,10)<=12){Ext.isOpera12m=true}Ext.chromeVersion=Ext.isChrome?N:0;Ext.firefoxVersion=Ext.isFirefox?N:0;Ext.ieVersion=Ext.isIE?N:0;Ext.operaVersion=Ext.isOpera?N:0;Ext.safariVersion=Ext.isSafari?N:0;Ext.webKitVersion=Ext.isWebKit?N:0;this.setFlag(C+N,true,E);this.setFlag(C+G.getShortVersion())}for(D in O){if(O.hasOwnProperty(D)){w=O[D];this.setFlag(w,C===w)}}this.setFlag(w);if(L){this.setFlag(z+(L.getMajor()||""));this.setFlag(z+L.getShortVersion())}for(D in I){if(I.hasOwnProperty(D)){w=I[D];this.setFlag(w,z===w,E)}}this.setFlag("Standalone",!!navigator.standalone);this.setFlag("Ripple",!!document.getElementById("tinyhippos-injected")&&!Ext.isEmpty(window.top.ripple));this.setFlag("WebWorks",!!window.blackberry);if(typeof window.PhoneGap!="undefined"||typeof window.Cordova!="undefined"||typeof window.cordova!="undefined"){J=true;this.setFlag("PhoneGap");this.setFlag("Cordova")}else{if(!!window.isNK){J=true;this.setFlag("Sencha")}}if(/(Glass)/i.test(y)){this.setFlag("GoogleGlass")}if(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)(?!.*FBAN)/i.test(y)){J=true}this.setFlag("WebView",J);this.isStrict=Ext.isStrict=document.compatMode=="CSS1Compat";this.isSecure=/^https/i.test(window.location.protocol);this.identity=C+N+(this.isStrict?"Strict":"Quirks")};Ext.env.Browser.prototype={constructor:Ext.env.Browser,browserNames:{ie:"IE",firefox:"Firefox",safari:"Safari",chrome:"Chrome",opera:"Opera",dolfin:"Dolfin",webosbrowser:"webOSBrowser",chromeMobile:"ChromeMobile",chromeiOS:"ChromeiOS",silk:"Silk",other:"Other"},engineNames:{webkit:"WebKit",gecko:"Gecko",presto:"Presto",trident:"Trident",other:"Other"},enginePrefixes:{webkit:"AppleWebKit/",gecko:"Gecko/",presto:"Presto/",trident:"Trident/"},browserPrefixes:{ie:"MSIE ",firefox:"Firefox/",chrome:"Chrome/",safari:"Version/",opera:"OPR/",dolfin:"Dolfin/",webosbrowser:"wOSBrowser/",chromeMobile:"CrMo/",chromeiOS:"CriOS/",silk:"Silk/"},styleDashPrefixes:{WebKit:"-webkit-",Gecko:"-moz-",Trident:"-ms-",Presto:"-o-",Other:""},stylePrefixes:{WebKit:"Webkit",Gecko:"Moz",Trident:"ms",Presto:"O",Other:""},propertyPrefixes:{WebKit:"webkit",Gecko:"moz",Trident:"ms",Presto:"o",Other:""},is:function(b){return !!this.is[b]},name:null,version:null,engineName:null,engineVersion:null,setFlag:function(e,f,d){if(typeof f=="undefined"){f=true}this.is[e]=f;this.is[e.toLowerCase()]=f;if(d){Ext["is"+e]=f}return this},getStyleDashPrefix:function(){return this.styleDashPrefixes[this.engineName]},getStylePrefix:function(){return this.stylePrefixes[this.engineName]},getVendorProperyName:function(d){var c=this.propertyPrefixes[this.engineName];if(c.length>0){return c+Ext.String.capitalize(d)}return d},getPreferredTranslationMethod:function(b){if(typeof b=="object"&&"translationMethod" in b&&b.translationMethod!=="auto"){return b.translationMethod}else{if(this.is.AndroidStock2||this.is.IE){return"scrollposition"}else{return"csstransform"}}}};(function(b){Ext.browser=new Ext.env.Browser(b,true);Ext.userAgent=b.toLowerCase()}(Ext.global.navigator.userAgent));Ext.env.OS=function(p,B,s){var t=this,u=t.names,z=t.prefixes,C,v="",x=t.is,A,w,y,q,r;s=s||Ext.browser;for(A in z){if(z.hasOwnProperty(A)){w=z[A];y=p.match(new RegExp("(?:"+w+")([^\\s;]+)"));if(y){C=u[A];r=y[1];if(r&&r=="HTC_"){v=new Ext.Version("2.3")}else{if(r&&r=="Silk/"){v=new Ext.Version("2.3")}else{v=new Ext.Version(y[y.length-1])}}break}}}if(!C){C=u[(p.toLowerCase().match(/mac|win|linux/)||["other"])[0]];v=new Ext.Version("")}this.name=C;this.version=v;if(B){this.setFlag(B.replace(/ simulator$/i,""))}this.setFlag(C);if(v){this.setFlag(C+(v.getMajor()||""));this.setFlag(C+v.getShortVersion())}for(A in u){if(u.hasOwnProperty(A)){q=u[A];if(!x.hasOwnProperty(C)){this.setFlag(q,(C===q))}}}if(this.name=="iOS"&&window.screen.height==568){this.setFlag("iPhone5")}if(s.is.Safari||s.is.Silk){if(this.is.Android2||this.is.Android3||s.version.shortVersion==501){s.setFlag("AndroidStock");s.setFlag("AndroidStock2")}if(this.is.Android4){s.setFlag("AndroidStock");s.setFlag("AndroidStock4")}}};Ext.env.OS.prototype={constructor:Ext.env.OS,names:{ios:"iOS",android:"Android",windowsPhone:"WindowsPhone",webos:"webOS",blackberry:"BlackBerry",rimTablet:"RIMTablet",mac:"MacOS",win:"Windows",tizen:"Tizen",linux:"Linux",bada:"Bada",chrome:"ChromeOS",other:"Other"},prefixes:{tizen:"(Tizen )",ios:"i(?:Pad|Phone|Pod)(?:.*)CPU(?: iPhone)? OS ",android:"(Android |HTC_|Silk/)",windowsPhone:"Windows Phone ",blackberry:"(?:BlackBerry|BB)(?:.*)Version/",rimTablet:"RIM Tablet OS ",webos:"(?:webOS|hpwOS)/",bada:"Bada/",chrome:"CrOS "},is:function(b){return !!this[b]},name:null,version:null,setFlag:function(d,c){if(typeof c=="undefined"){c=true}if(this.flags){this.flags[d]=c}this.is[d]=c;this.is[d.toLowerCase()]=c;return this}};(function(){var s=Ext.global.navigator,m=s.userAgent,n=Ext.env.OS,o=(Ext.is||(Ext.is={})),l,p,r;n.prototype.flags=o;Ext.os=l=new n(m,s.platform);p=l.name;Ext["is"+p]=true;Ext.isMac=o.Mac=o.MacOS;var k=window.location.search.match(/deviceType=(Tablet|Phone)/),q=window.deviceType;if(k&&k[1]){r=k[1]}else{if(q==="iPhone"){r="Phone"}else{if(q==="iPad"){r="Tablet"}else{if(!l.is.Android&&!l.is.iOS&&!l.is.WindowsPhone&&/Windows|Linux|MacOS/.test(p)){r="Desktop";Ext.browser.is.WebView=!!Ext.browser.is.Ripple}else{if(l.is.iPad||l.is.RIMTablet||l.is.Android3||Ext.browser.is.Silk||(l.is.Android4&&m.search(/mobile/i)==-1)){r="Tablet"}else{r="Phone"}}}}}l.setFlag(r,true);l.deviceType=r;delete n.prototype.flags}());Ext.feature={has:function(b){return !!this.has[b]},testElements:{},getTestElement:function(d,c){if(d===undefined){d="div"}else{if(typeof d!=="string"){return d}}if(c){return document.createElement(d)}if(!this.testElements[d]){this.testElements[d]=document.createElement(d)}return this.testElements[d]},isStyleSupported:function(h,e){var g=this.getTestElement(e).style,f=Ext.String.capitalize(h);if(typeof g[h]!=="undefined"||typeof g[Ext.browser.getStylePrefix(h)+f]!=="undefined"){return true}return false},isStyleSupportedWithoutPrefix:function(d,e){var f=this.getTestElement(e).style;if(typeof f[d]!=="undefined"){return true}return false},isEventSupported:function(k,g){if(g===undefined){g=window}var h=this.getTestElement(g),f="on"+k.toLowerCase(),j=(f in h);if(!j){if(h.setAttribute&&h.removeAttribute){h.setAttribute(f,"");j=typeof h[f]==="function";if(typeof h[f]!=="undefined"){h[f]=undefined}h.removeAttribute(f)}}return j},getStyle:function(h,e){var f=h.ownerDocument.defaultView,g=(f?f.getComputedStyle(h,null):h.currentStyle)||h.style;return g[e]},getSupportedPropertyName:function(d,e){var f=Ext.browser.getVendorProperyName(e);if(f in d){return f}else{if(e in d){return e}}return null},detect:function(t){var s=this,q=document,v=s.toRun||s.tests,w=v.length,z=q.createElement("div"),y=[],n=Ext.supports,p=s.has,A,u,x,r;if(!Ext.theme){Ext.theme={name:"Default"}}Ext.theme.is={};Ext.theme.is[Ext.theme.name]=true;z.innerHTML='
';if(t){q.body.appendChild(z)}x=s.preDetected[Ext.browser.identity]||[];while(w--){u=v[w];r=x[w];A=u.name;if(r===undefined){if(!t&&u.ready){y.push(u);continue}r=u.fn.call(s,q,z)}n[A]=p[A]=r}if(t){q.body.removeChild(z)}s.toRun=y},report:function(){var d=[],e=this.tests.length,f;for(f=0;f
";d=(c.childNodes.length===1);c.innerHTML="";return d}},{name:"TouchEvents",fn:function(){return this.isEventSupported("touchend")}},{name:"Touch",fn:function(){var b=navigator.msMaxTouchPoints||navigator.maxTouchPoints;return(this.isEventSupported("touchend")&&b!==1)||b>1}},{name:"PointerEvents",fn:function(){return navigator.pointerEnabled}},{name:"MSPointerEvents",fn:function(){return navigator.msPointerEnabled}},{name:"Orientation",fn:function(){return("orientation" in window)&&this.isEventSupported("orientationchange")}},{name:"OrientationChange",fn:function(){return this.isEventSupported("orientationchange")}},{name:"DeviceMotion",fn:function(){return this.isEventSupported("devicemotion")}},{names:["Geolocation","GeoLocation"],fn:function(){return"geolocation" in window.navigator}},{name:"SqlDatabase",fn:function(){return"openDatabase" in window}},{name:"WebSockets",fn:function(){return"WebSocket" in window}},{name:"Range",fn:function(){return !!document.createRange}},{name:"CreateContextualFragment",fn:function(){var b=!!document.createRange?document.createRange():false;return b&&!!b.createContextualFragment}},{name:"History",fn:function(){return("history" in window&&"pushState" in window.history)}},{name:"CssTransforms",fn:function(){return this.isStyleSupported("transform")}},{name:"CssTransformNoPrefix",fn:function(){return this.isStyleSupportedWithoutPrefix("transform")}},{name:"Css3dTransforms",fn:function(){return this.has("CssTransforms")&&this.isStyleSupported("perspective")&&!Ext.browser.is.AndroidStock2}},{name:"CssAnimations",fn:function(){return this.isStyleSupported("animationName")}},{names:["CssTransitions","Transitions"],fn:function(){return this.isStyleSupported("transitionProperty")}},{names:["Audio","AudioTag"],fn:function(){return !!this.getTestElement("audio").canPlayType}},{name:"Video",fn:function(){return !!this.getTestElement("video").canPlayType}},{name:"LocalStorage",fn:function(){try{if("localStorage" in window&&window.localStorage!==null){localStorage.setItem("sencha-localstorage-test","test success");localStorage.removeItem("sencha-localstorage-test");return true}}catch(b){}return false}},{name:"XHR2",fn:function(){return window.ProgressEvent&&window.FormData&&window.XMLHttpRequest&&("withCredentials" in new XMLHttpRequest())}},{name:"XHRUploadProgress",fn:function(){if(window.XMLHttpRequest&&!Ext.browser.is.AndroidStock){var b=new XMLHttpRequest();return b&&("upload" in b)&&("onprogress" in b.upload)}return false}},{name:"NumericInputPlaceHolder",fn:function(){return !(Ext.browser.is.AndroidStock4&&Ext.os.version.getMinor()<2)}},{name:"ProperHBoxStretching",ready:true,fn:function(){var e=document.createElement("div"),h=e.appendChild(document.createElement("div")),g=h.appendChild(document.createElement("div")),f;e.setAttribute("style","width: 100px; height: 100px; position: relative;");h.setAttribute("style","position: absolute; display: -ms-flexbox; display: -webkit-flex; display: -moz-flexbox; display: flex; -ms-flex-direction: row; -webkit-flex-direction: row; -moz-flex-direction: row; flex-direction: row; min-width: 100%;");g.setAttribute("style","width: 200px; height: 50px;");document.body.appendChild(e);f=h.offsetWidth;document.body.removeChild(e);return(f>100)}},{name:"matchesSelector",fn:function(){var f=document.documentElement,h="matches",j="webkitMatchesSelector",g="msMatchesSelector",k="mozMatchesSelector";return f[h]?h:f[j]?j:f[g]?g:f[k]?k:null}},{name:"RightMargin",ready:true,fn:function(d,f){var e=d.defaultView;return !(e&&e.getComputedStyle(f.firstChild.firstChild,null).marginRight!="0px")}},{name:"DisplayChangeInputSelectionBug",fn:function(){var b=Ext.webKitVersion;return 0','
',""].join("");g.body.appendChild(e);if(e.firstChild.offsetHeight===50){f=true}g.body.removeChild(e)}return f}},{name:"xOriginBug",ready:true,fn:function(j,h){h.innerHTML='
';var k=document.getElementById("b1").getBoundingClientRect(),f=document.getElementById("b2").getBoundingClientRect(),g=document.getElementById("b3").getBoundingClientRect();return(f.left!==k.left&&g.right!==k.right)}},{name:"ScrollWidthInlinePaddingBug",ready:true,fn:function(g){var f=false,h,e;e=g.createElement("div");h=e.style;h.height="50px";h.width="50px";h.padding="10px";h.overflow="hidden";h.position="absolute";e.innerHTML='';g.body.appendChild(e);if(e.scrollWidth===70){f=true}g.body.removeChild(e);return f}},{name:"rtlVertScrollbarOnRight",ready:true,fn:function(h,g){g.innerHTML='
';var e=g.firstChild,f=e.firstChild;return(f.offsetLeft+f.offsetWidth!==e.offsetLeft+e.offsetWidth)}},{name:"rtlVertScrollbarOverflowBug",ready:true,fn:function(d,f){f.innerHTML='
';var e=f.firstChild;return e.clientHeight===e.offsetHeight}},{identity:"defineProperty",fn:function(){if(Ext.isIE8m){Ext.Object.defineProperty=Ext.emptyFn;return false}return true}},{identify:"nativeXhr",fn:function(){if(typeof XMLHttpRequest!=="undefined"){return true}XMLHttpRequest=function(){try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return null}};return false}},{name:"SpecialKeyDownRepeat",fn:function(){return Ext.isWebKit?parseInt(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1],10)>=525:!((Ext.isGecko&&!Ext.isWindows)||(Ext.isOpera&&Ext.operaVersion<12))}},{name:"EmulatedMouseOver",fn:function(){return Ext.os.is.iOS}},{name:"Hashchange",fn:function(){var b=document.documentMode;return"onhashchange" in window&&(b===undefined||b>7)}},{name:"FixedTableWidthBug",ready:true,fn:function(){if(Ext.isIE8){return false}var d=document.createElement("div"),e=document.createElement("div"),f;d.setAttribute("style","display:table;table-layout:fixed;");e.setAttribute("style","display:table-cell;min-width:50px;");d.appendChild(e);document.body.appendChild(d);d.offsetWidth;d.style.width="25px";f=d.offsetWidth;document.body.removeChild(d);return f===50}},{name:"FocusinFocusoutEvents",fn:function(){return !Ext.isGecko}}]};Ext.supports={};Ext.feature.detect();Ext.env.Ready={blocks:(location.search||"").indexOf("ext-pauseReadyFire")>0?1:0,bound:0,delay:1,firing:false,generation:0,listeners:[],nextId:0,sortGeneration:0,state:0,timer:null,bind:function(){var d=Ext.env.Ready,c=document;if(!d.bound){if(c.readyState=="complete"){d.onReadyEvent({type:c.readyState||"body"})}else{d.bound=1;if(Ext.browser.is.PhoneGap&&!Ext.os.is.Desktop){d.bound=2;c.addEventListener("deviceready",d.onReadyEvent,false)}c.addEventListener("DOMContentLoaded",d.onReadyEvent,false);window.addEventListener("load",d.onReadyEvent,false)}}},block:function(){++this.blocks;Ext.isReady=false},fireReady:function(){var b=Ext.env.Ready;if(!b.state){Ext._readyTime=Ext.now();Ext.isDomReady=true;b.state=1;Ext.feature.detect(true);if(!b.delay){b.handleReady()}else{if(navigator.standalone){b.timer=Ext.defer(function(){b.timer=null;b.handleReadySoon()},1)}else{b.handleReadySoon()}}}},handleReady:function(){var b=this;if(b.state===1){b.state=2;Ext._beforeReadyTime=Ext.now();b.invokeAll();Ext._afterReadytime=Ext.now()}},handleReadySoon:function(d){var c=this;if(!c.timer){c.timer=Ext.defer(function(){c.timer=null;c.handleReady()},d||c.delay)}},invoke:function(c){var d=c.delay;if(d){Ext.defer(function(){c.fn.call(c.scope)},d)}else{c.fn.call(c.scope)}},invokeAll:function(){var d=this,e=d.listeners,f;if(!d.blocks){Ext.isReady=true}d.firing=true;while(e.length){if(d.sortGeneration!==d.generation){d.sortGeneration=d.generation;e.sort(d.sortFn)}f=e.pop();if(d.blocks&&!f.dom){e.push(f);break}d.invoke(f)}d.firing=false},makeListener:function(g,h,e){var f={fn:g,id:++this.nextId,scope:h,dom:false,priority:0};if(e){Ext.apply(f,e)}f.phase=f.dom?0:1;return f},on:function(k,f,g){var j=Ext.env.Ready,h=j.makeListener(k,f,g);if(j.state===2&&!j.firing&&(h.dom||!j.blocks)){j.invoke(h)}else{j.listeners.push(h);++j.generation;if(!j.bound){j.bind()}}},onReadyEvent:function(c){var d=Ext.env.Ready;if(Ext.elevateFunction){Ext.elevateFunction(d.doReadyEvent,d,arguments)}else{d.doReadyEvent(c)}},doReadyEvent:function(c){var d=this;if(d.bound>0){d.unbind();d.bound=-1}if(!d.state){d.fireReady()}},sortFn:function(a,b){return -((a.phase-b.phase)||(b.priority-a.priority)||(a.id-b.id))},unblock:function(){var b=this;if(b.blocks){if(!--b.blocks){if(b.state===2&&!b.firing){b.invokeAll()}}}},unbind:function(){var d=this,c=document;if(d.bound>1){c.removeEventListener("deviceready",d.onReadyEvent,false)}c.removeEventListener("DOMContentLoaded",d.onReadyEvent,false);window.removeEventListener("load",d.onReadyEvent,false)}};(function(){var b=Ext.env.Ready;if(Ext.isIE9m){Ext.apply(b,{scrollTimer:null,readyStatesRe:/complete/i,pollScroll:function(){var a=true;try{document.documentElement.doScroll("left")}catch(d){a=false}if(a&&document.body){b.onReadyEvent({type:"doScroll"})}else{b.scrollTimer=Ext.defer(b.pollScroll,20)}return a},bind:function(){if(b.bound){return}var e=document,a;try{a=window.frameElement===undefined}catch(f){}if(!a||!e.documentElement.doScroll){b.pollScroll=Ext.emptyFn}else{if(b.pollScroll()){return}}if(e.readyState=="complete"){b.onReadyEvent({type:"already "+(e.readyState||"body")})}else{e.attachEvent("onreadystatechange",b.onReadyStateChange);window.attachEvent("onload",b.onReadyEvent);b.bound=1}},unbind:function(){document.detachEvent("onreadystatechange",b.onReadyStateChange);window.detachEvent("onload",b.onReadyEvent);if(Ext.isNumber(b.scrollTimer)){clearTimeout(b.scrollTimer);b.scrollTimer=null}},onReadyStateChange:function(){var a=document.readyState;if(b.readyStatesRe.test(a)){b.onReadyEvent({type:a})}}})}Ext.onDocumentReady=function(f,g,a){var h={dom:true};if(a){Ext.apply(h,a)}b.on(f,g,h)};Ext.onReady=function(e,f,a){b.on(e,f,a)};b.bind()}());Ext.Loader=new function(){var C=this,E=Ext.ClassManager,y=Ext.Boot,B=Ext.Class,w=Ext.env.Ready,x=Ext.Function.alias,z=["extend","mixins","requires"],s={},v=[],D=[],A=[],r={},t={},u={enabled:true,scriptChainDelay:false,disableCaching:true,disableCachingParam:"_dc",paths:E.paths,preserveScripts:true,scriptCharset:undefined},q={disableCaching:true,disableCachingParam:true,preserveScripts:true,scriptChainDelay:"loadDelay"};Ext.apply(C,{isInHistory:s,isLoading:false,history:v,config:u,readyListeners:D,optionalRequires:A,requiresMap:r,hasFileLoadError:false,scriptsLoading:0,syncModeEnabled:false,missingQueue:t,init:function(){var h=document.getElementsByTagName("script"),b=h[h.length-1].src,c=b.substring(0,b.lastIndexOf("/")+1),e=Ext._classPathMetadata,d=Ext.Microloader,l=Ext.manifest,k,g,f,j,a;if(!E.getPath("Ext")){E.setPath("Ext",c+"src")}if(e){Ext._classPathMetadata=null;C.addClassPathMappings(e)}if(l){k=l.loadOrder;g=Ext.Boot.baseUrl;if(k&&l.bootRelative){for(f=k.length,j=0;j1)?"es":"")+": "+j.join(", "))}if(e.length){C.loadScripts({url:e,_classNames:j})}else{C.checkReady()}}else{if(d){d.call(c)}C.checkReady()}if(C.syncModeEnabled){if(k===1){return E.get(b[0])}}return C},makeLoadCallback:function(b,a){return function(){var c=[],d=b.length;while(d-->0){c[d]=E.get(b[d])}return a.apply(this,c)}},onLoadFailure:function(){var b=this,a=b.onError;C.hasFileLoadError=true;--C.scriptsLoading;if(a){a.call(b.userScope,b)}C.checkReady()},onLoadSuccess:function(){var b=this,a=b.onLoad;--C.scriptsLoading;if(a){a.call(b.userScope,b)}C.checkReady()},onReady:function(c,d,a,e){if(a){w.on(c,d,e)}else{var b=w.makeListener(c,d,e);if(C.isLoading){D.push(b)}else{w.invoke(b)}}},addUsedClasses:function(b){var d,c,a;if(b){b=(typeof b==="string")?[b]:b;for(c=0,a=b.length;c0){C.loadScripts({url:k,sequential:true})}}}if(h.uses){k=h.uses;C.addUsedClasses(k)}});E.onCreated(C.historyPush);C.init()}();Ext._endTime=new Date().getTime();if(Ext._beforereadyhandler){Ext._beforereadyhandler()}(Ext.cmd.derive("Ext.event.ListenerStack",Ext.Base,{currentOrder:"current",length:0,constructor:function(){this.listeners={before:[],current:[],after:[]};this.lateBindingMap={};return this},add:function(q,p,o,v,y){var z=this.lateBindingMap,r=this.getAll(v),u=r.length,t=typeof q==="string",A,w,x,s;if(t&&p&&p.isIdentifiable){x=p.getId();A=z[x];if(A){if(A[q]){return false}else{A[q]=true}}else{z[x]=A={};A[q]=true}}else{if(u>0){while(u--){w=r[u];if(w.fn===q&&w.scope===p){w.options=o;return false}}}}if(!t){s=Ext._namedScopes[p];if(s&&s.isController){Ext.Error.raise("Cannot resolve scope 'controller' for '"+o.type+"' listener declared on Observable: '"+y.id+"'")}p=(p&&!s)?p:y}w=this.create(q,p,o,v,y);if(t&&(!p||p in Ext._namedScopes)){w.boundFn=this.bindDynamicScope(y,q,p);w.isLateBinding=false}if(o&&o.prepend){delete o.prepend;r.unshift(w)}else{r.push(w)}this.length++;return true},bindDynamicScope:function(f,d,e){return function(){var a=f.resolveListenerScope(e);return a[d].apply(a,arguments)}},getAt:function(c,d){return this.getAll(d)[c]},getAll:function(b){return this.listeners[b||this.currentOrder]},count:function(b){return this.getAll(b).length},create:function(j,k,f,g,h){f=f||{};return{stack:this,fn:j,firingFn:false,boundFn:false,isLateBinding:typeof j==="string",scope:k,options:f,order:g,observable:h,type:f.type}},remove:function(l,k,o){var m=this.getAll(o),n=m.length,r=false,s=this.lateBindingMap,p,q;if(n>0){while(n--){p=m[n];if(p.fn===l&&p.scope===k){m.splice(n,1);r=true;this.length--;if(k&&k.isIdentifiable&&typeof l==="string"){q=k.getId();if(s[q]&&s[q][l]){delete s[q][l]}}break}}}return r}},1,0,0,0,0,0,[Ext.event,"ListenerStack"],0));(Ext.cmd.derive("Ext.event.Controller",Ext.Base,{isFiring:false,listenerStack:null,constructor:function(b){this.firingListeners=[];this.firingArguments=[];this.dispatcher=b;return this},setInfo:function(b){this.info=b},getInfo:function(){return this.info},setListenerStacks:function(b){this.listenerStacks=b},fire:function(v,y){var q=this.listenerStacks,r=this.firingListeners,z=this.firingArguments,t=r.push,w=q.length,u,s,A,p,C=false,B=false,x;r.length=0;if(y){if(y.order!=="after"){C=true}else{B=true}}if(w===1){u=q[0].listeners;s=u.before;A=u.current;p=u.after;if(s.length>0){t.apply(r,s)}if(C){t.call(r,y)}if(A.length>0){t.apply(r,A)}if(B){t.call(r,y)}if(p.length>0){t.apply(r,p)}}else{for(x=0;x0){t.apply(r,s)}}if(C){t.call(r,y)}for(x=0;x0){t.apply(r,A)}}if(B){t.call(r,y)}for(x=0;x0){t.apply(r,p)}}}if(r.length===0){return this}if(!v){v=[]}z.length=0;z.push.apply(z,v);z.push(null,this);this.doFire();return this},doFire:function(){var w=this,I=w.firingListeners,A=w.firingArguments,E=A[1],D=A.length-2,F=I[0].observable,x=w.info,C,B,H,L,M,J,z,O,y,Q,P,G,N,K;if(F&&F.isElement){C=A[0];if(C&&!C.isEvent){C=null}}w.isPausing=w.isPaused=w.isStopped=false;w.isFiring=true;for(B=0,H=I.length;B0){this.isPaused=false;this.doFire()}if(b){b.resume()}return this},isInterrupted:function(){return this.isStopped||this.isPaused},stop:function(){var b=this.connectingController;this.isStopped=true;if(b){this.connectingController=null;b.stop()}this.isFiring=false;this.listenerStacks=null;return this},pause:function(){var b=this.connectingController;this.isPausing=true;if(b){b.pause()}return this}},1,0,0,0,0,0,[Ext.event,"Controller"],0));(Ext.cmd.derive("Ext.event.Dispatcher",Ext.Base,{statics:{getInstance:function(){if(!this.instance){this.instance=new this()}return this.instance},setInstance:function(b){this.instance=b;return this}},baseHasListeners:{_decr_:function(b){if(!--this[b]){delete this[b]}},_incr_:function(b){if(this.hasOwnProperty(b)){++this[b]}else{this[b]=1}}},hasListeners:{},config:{publishers:{}},wildcard:"*",constructor:function(b){this.listenerStacks={};this.captureListenerStacks={};this.directListenerStacks={};this.activePublishers={};this.publishersCache={};this.noActivePublishers=[];this.controller=null;this.initConfig(b);return this},getListenerStack:function(h,g,e,f){return this.doGetListenerStack(this.listenerStacks,h,g,e,f)},getCaptureListenerStack:function(h,g,e,f){return this.doGetListenerStack(this.captureListenerStacks,h,g,e,f)},getDirectListenerStack:function(h,g,e,f){return this.doGetListenerStack(this.directListenerStacks,h,g,e,f)},doGetListenerStack:function(n,m,k,o,h){var l=n[m],j;if(!l){if(h){n[m]=l={}}else{return null}}l=l[k];if(!l){if(h){n[m][k]=l={}}else{return null}}j=l[o];if(!j){if(h){l[o]=j=new Ext.event.ListenerStack()}else{return null}}return j},getController:function(m,k,o,h){var n=this,j=n.controller,l={targetType:m,target:k,eventName:o};if(!j){n.controller=j=new Ext.event.Controller(n)}if(j.isFiring){j=new Ext.event.Controller(n)}j.setInfo(l);if(h&&j!==h){j.connect(h)}return j},applyPublishers:function(f){var e,d;this.publishersCache={};for(e in f){if(f.hasOwnProperty(e)){d=f[e];this.registerPublisher(d)}}return f},registerPublisher:function(e){var f=this.activePublishers,h=e.getTargetType(),g=f[h];if(!g){f[h]=g=[]}g.push(e);e.setDispatcher(this);return this},getCachedActivePublishers:function(h,e){var f=this.publishersCache,g;if((g=f[h])&&(g=g[e])){return g}return null},cacheActivePublishers:function(h,e,g){var f=this.publishersCache;if(!f[h]){f[h]={}}f[h][e]=g;return g},getActivePublishers:function(m,j){var l=this.getCachedActivePublishers(m,j),k,n,q,o,p;if(l){return l}k=this.activePublishers[m];if(k){l=[];for(q=0,o=k.length;q0}if(!g&&k==="element"){g=l.count()>0}return g},getHasListeners:function(h,g){var e=this.hasListeners,f=g&&g.hasListeners;if(!f){f=e[h]||(e[h]=Ext.Object.chain(this.baseHasListeners));if(g){g.hasListeners=f=Ext.Object.chain(f)}}return f},addListener:function(x,t,u,r,p,n,w,y){n=n||{};var q=this.getActivePublishers(x,u),s=q.length,v,o;o=this.doAddListener(x,t,u,r,p,n,w,y);if(o){for(v=0;v0){for(g=0;g=8){b=new XDomainRequest()}else{Ext.Error.raise({msg:"Your browser does not support CORS"})}return b},getXhrInstance:(function(){var e=[function(){return new XMLHttpRequest()},function(){return new ActiveXObject("MSXML2.XMLHTTP.3.0")},function(){return new ActiveXObject("MSXML2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")}],k=0,g=e.length,h;for(;k=200&&e<300)||e==304,d=false;if(!f){switch(e){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:d=true;break}}return{success:f,isException:d}},createResponse:function(u){var r=this,p=u.xhr,w=r.getIsXdr(),x={},o=w?[]:p.getAllResponseHeaders().replace(/\r\n/g,"\n").split("\n"),s=o.length,n,t,q,v,y;while(s--){n=o[s];t=n.indexOf(":");if(t>=0){q=n.substr(0,t).toLowerCase();if(n.charAt(t+1)==" "){++t}x[q]=n.substr(t+1)}}u.xhr=null;delete u.xhr;v={request:u,requestId:u.id,status:p.status,statusText:p.statusText,getResponseHeader:function(a){return x[a.toLowerCase()]},getAllResponseHeaders:function(){return x}};if(w){r.processXdrResponse(v,p)}if(u.binary){v.responseBytes=r.getByteArray(p)}else{v.responseText=p.responseText;v.responseXML=p.responseXML}p=null;return v},createException:function(b){return{request:b,requestId:b.id,status:b.aborted?-1:0,statusText:b.aborted?"transaction aborted":"communication failure",aborted:b.aborted,timedout:b.timedout}},getByteArray:function(l){var q=l.response,r=l.responseBody,e=Ext.data.flash&&Ext.data.flash.BinaryXhr,s,m,o,p;if(l instanceof e){s=l.responseBytes}else{if(window.Uint8Array){s=q?new Uint8Array(q):[]}else{if(Ext.isIE9p){try{s=new VBArray(r).toArray()}catch(n){s=[]}}else{if(Ext.isIE){if(!this.self.vbScriptInjected){this.injectVBScript()}getIEByteArray(l.responseBody,s=[])}else{s=[];m=l.responseText;o=m.length;for(p=0;p=500){this.run()}},run:function(){if(!this.isRunning){return}var e=this.runningQueue,d,f;this.lastRunTime=Ext.now();this.frameStartTime=Ext.now();e.push.apply(e,this.queue);for(d=0,f=e.length;d0){c=d.shift();this.invoke(c);this.processIdleQueue()}},processTaskQueue:function(){if(!this.hasOwnProperty("taskQueueTimer")){this.taskQueueTimer=Ext.defer(this.processTaskQueueItem,15,this)}},processTaskQueueItem:function(){delete this.taskQueueTimer;var d=this.taskQueue,c;if(d.length>0){c=d.shift();this.invoke(c);this.processTaskQueue()}},showFps:function(){Ext.onReady(function(){Ext.Viewport.add([{xtype:"component",bottom:50,left:0,width:50,height:20,html:"Average",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__averageFps",xtype:"component",bottom:0,left:0,width:50,height:50,html:"0",style:"background-color: red; color: white; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:50,width:50,height:20,html:"Min (Last 1k)",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__minFps",xtype:"component",bottom:0,left:50,width:50,height:50,html:"0",style:"background-color: orange; color: white; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:100,width:50,height:20,html:"Max (Last 1k)",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__maxFps",xtype:"component",bottom:0,left:100,width:50,height:50,html:"0",style:"background-color: yellow; color: black; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:150,width:50,height:20,html:"Current",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__currentFps",xtype:"component",bottom:0,left:150,width:50,height:50,html:"0",style:"background-color: green; color: white; text-align: center; line-height: 50px;"}]);Ext.AnimationQueue.resetFps()})},resetFps:function(){var q=Ext.getCmp("__currentFps"),j=Ext.getCmp("__averageFps"),l=Ext.getCmp("__minFps"),m=Ext.getCmp("__maxFps"),p=1000,k=0,n=0,o=0;Ext.AnimationQueue.onFpsChanged=function(a){n++;if(!(n%10)){p=1000;k=0}o+=a;p=Math.min(p,a);k=Math.max(k,a);q.setHtml(Math.round(a));j.setHtml(Math.round(o/n));l.setHtml(Math.round(p));m.setHtml(Math.round(k))}}},1,0,0,0,0,0,[Ext,"AnimationQueue"],function(){}));(Ext.cmd.derive("Ext.ComponentManager",Ext.Base,{alternateClassName:"Ext.ComponentMgr",singleton:true,count:0,typeName:"xtype",constructor:function(b){Ext.apply(this,b||{});this.all={};this.references={};this.onAvailableCallbacks={}},create:function(d,c){if(typeof d=="string"){return Ext.widget(d)}if(d.isComponent){return d}if("xclass" in d){return Ext.create(d.xclass,d)}return Ext.widget(d.xtype||c,d)},get:function(b){return this.all[b]},register:function(g){var h=this,j=h.all,k=g.getId(),f=h.onAvailableCallbacks;j[k]=g;if(g.reference){h.references[k]=g}++h.count;f=f&&f[k];if(f&&f.length){h.notifyAvailable(g)}},unregister:function(d){var c=d.getId();if(d.reference){delete this.references[c]}delete this.all[c];this.count--},markReferencesDirty:function(){this.referencesDirty=true},fixReferences:function(){var f=this,d=f.references,e;if(f.referencesDirty){for(e in d){if(d.hasOwnProperty(e)){d[e].fixReference()}}f.referencesDirty=false}},onAvailable:function(k,o,h){var l=this,m=l.onAvailableCallbacks,j=l.all,n;if(k in j){n=j[k];o.call(h||n,n)}else{if(k){if(!Ext.isArray(m[k])){m[k]=[]}m[k].push(function(a){o.call(h||a,a)})}}},notifyAvailable:function(c){var d=this.onAvailableCallbacks[c&&c.getId()]||[];while(d.length){(d.shift())(c)}},each:function(c,d){return Ext.Object.each(this.all,c,d)},getCount:function(){return this.count},getAll:function(){return Ext.Object.getValues(this.all)},deprecated:{5:{methods:{isRegistered:null,registerType:null}}}},1,0,0,0,0,0,[Ext,"ComponentManager",Ext,"ComponentMgr"],function(){Ext.getCmp=function(b){return Ext.ComponentManager.get(b)}}));Ext.ns("Ext.util").Operators={"=":function(a,d){return a==d},"!=":function(a,d){return a!=d},"^=":function(a,d){return a&&a.substr(0,d.length)==d},"$=":function(a,d){return a&&a.substr(a.length-d.length)==d},"*=":function(a,d){return a&&a.indexOf(d)!==-1},"%=":function(a,d){return(a%d)===0},"|=":function(a,d){return a&&(a==d||a.substr(0,d.length+1)==d+"-")},"~=":function(a,d){return a&&(" "+a+" ").indexOf(" "+d+" ")!=-1}};(Ext.cmd.derive("Ext.util.LruCache",Ext.util.HashMap,{config:{maxSize:null},add:function(f,h){var j=this,g=j.findKey(h),k;if(g){j.unlinkEntry(k=j.map[g]);k.prev=j.last;k.next=null}else{k={prev:j.last,next:null,key:f,value:h}}if(j.last){j.last.next=k}else{j.first=k}j.last=k;Ext.util.HashMap.prototype.add.call(this,f,k);j.prune();return h},insertBefore:function(g,j,m){var k=this,h,l;if(m=this.map[this.findKey(m)]){h=k.findKey(j);if(h){k.unlinkEntry(l=k.map[h])}else{l={prev:m.prev,next:m,key:g,value:j}}if(m.prev){l.prev.next=l}else{k.first=l}l.next=m;m.prev=l;k.prune();return j}else{return k.add(g,j)}},get:function(d){var c=this.map[d];if(c){if(c.next){this.moveToEnd(c)}return c.value}},removeAtKey:function(b){this.unlinkEntry(this.map[b]);return Ext.util.HashMap.prototype.removeAtKey.apply(this,arguments)},clear:function(b){this.first=this.last=null;return Ext.util.HashMap.prototype.clear.apply(this,arguments)},unlinkEntry:function(b){if(b){if(b.next){b.next.prev=b.prev}else{this.last=b.prev}if(b.prev){b.prev.next=b.next}else{this.first=b.next}b.prev=b.next=null}},moveToEnd:function(b){this.unlinkEntry(b);if(b.prev=this.last){this.last.next=b}else{this.first=b}this.last=b},getArray:function(f){var e=[],d=this.first;while(d){e.push(f?d.key:d.value);d=d.next}return e},each:function(m,g,h){var j=this,k=h?j.last:j.first,l=j.length;g=g||j;while(k){if(m.call(g,k.key,k.value,l)===false){break}k=h?k.prev:k.next}return j},findKey:function(d){var e,f=this.map;for(e in f){if(f.hasOwnProperty(e)&&f[e].value===d){return e}}return undefined},clone:function(){var e=new this.self(this.initialConfig),f=this.map,d;e.suspendEvents();for(d in f){if(f.hasOwnProperty(d)){e.add(d,f[d].value)}}e.resumeEvents();return e},prune:function(){var d=this,e=d.getMaxSize(),f=e?(d.length-e):0;if(f>0){for(;d.first&&f;f--){d.removeAtKey(d.first.key)}}}},0,0,0,0,0,0,[Ext.util,"LruCache"],0));(Ext.cmd.derive("Ext.ComponentQuery",Ext.Base,{singleton:true},0,0,0,0,0,0,[Ext,"ComponentQuery"],function(){var F=this,t=Ext.util.Operators,B=/(\d*)n\+?(\d*)/,G=/\D/,z=/^(\s)+/,A=/\\(.)/g,y=new Ext.util.LruCache({maxSize:100}),x=["var r = [],","i = 0,","it = items,","l = it.length,","c;","for (; i < l; i++) {","c = it[i];","if (c.{0}) {","r.push(c);","}","}","return r;"].join(""),w=function(a,b){return b.method.apply(this,[a].concat(b.args))},K=function(c,f){var e=[],b=0,g=c.length,a,d=f!==">";for(;b\^])\s?|\s|$)/,v=/^(#)?((?:\\\.|[\w\-])+|\*)(?:\((true|false)\))?/,I=[{re:/^\.((?:\\\.|[\w\-])+)(?:\((true|false)\))?/,method:H,argTransform:function(a){if(a[1]!==undefined){a[1]=a[1].replace(A,"$1")}return a.slice(1)}},{re:/^(?:\[((?:[@?$])?[\w\-]*)\s*(?:([\^$*~%!\/]?=)\s*(['"])?((?:\\\]|.)*?)\3)?(?!\\)\])/,method:J,argTransform:function(a){var e=a[0],g=a[1],c=a[2],d=a[3],b=a[4],f;if(b!==undefined){b=b.replace(A,"$1")}if(c==="/="){f=y.get(b);if(f){b=f}else{b=y.add(b,new RegExp(b))}}return[g,c,b]}},{re:/^#((?:\\\.|[\w\-])+)/,method:D},{re:/^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,method:u,argTransform:function(a){if(a[2]!==undefined){a[2]=a[2].replace(A,"$1")}return a.slice(1)}},{re:/^(?:\{([^\}]+)\})/,method:x}];F.Query=Ext.extend(Object,{constructor:function(a){a=a||{};Ext.apply(this,a)},execute:function(c){var b=this.operations,d=[],f,a,e;for(a=0,e=b.length;a=0;--g){j=l[g];e=j.mode;if(e){if(e==="^"){k=K(k," ")}else{if(e===">"){c=[];for(h=0,d=k.length;h1}});Ext.apply(this,{cache:new Ext.util.LruCache({maxSize:100}),pseudos:{not:function(g,f){var b=Ext.ComponentQuery,a=0,h=g.length,c=[],d=-1,e;for(;a0){b.push(a[0])}return b},last:function(a){var c=a.length,b=[];if(c>0){b.push(a[c-1])}return b},focusable:function(d){var e=d.length,b=[],c=0,a;for(;c=C.left)&&((T=="t"&&N=="b")||(T=="b"&&N=="t"));F=(L=C.top)&&((S=="r"&&K=="l")||(S=="l"&&K=="r"));if(J+P>A.right){if(F){J=C.left-P;F=false}else{J=A.right-P}}if(JA.bottom){if(G){L=C.top-D;G=false}else{L=A.bottom-D}}if(Lm.right){k=true;p[0]=(m.right-s.right)}if(s.left+p[0]m.bottom){k=true;p[1]=(m.bottom-s.bottom)}if(s.top+p[1]aD.innerWidth)?"portrait":"landscape"},getViewportHeight:function(){return aD.innerHeight},getViewportWidth:function(){return aD.innerWidth},getViewSize:function(){return{width:aI.getViewportWidth(),height:aI.getViewportHeight()}},normalize:function(a){return aA[a]||(aA[a]=a.replace(ao,ai))},parseBox:function(b){b=b||0;var d=typeof b,a,c;if(d==="number"){return{top:b,right:b,bottom:b,left:b}}else{if(d!=="string"){return b}}a=b.split(" ");c=a.length;if(c===1){a[1]=a[2]=a[3]=a[0]}else{if(c===2){a[2]=a[0];a[3]=a[1]}else{if(c===3){a[3]=a[1]}}}return{top:parseFloat(a[0])||0,right:parseFloat(a[1])||0,bottom:parseFloat(a[2])||0,left:parseFloat(a[3])||0}},parseStyles:function(b){var c={},a;if(b){X.lastIndex=0;while((a=X.exec(b))){c[a[1]]=a[2]||""}}return c},select:function(c,a,b){return Ext.fly(b||al).select(c,a)},query:function(b,c,a){return Ext.fly(a||al).query(b,c)},unitizeBox:function(a,c){var b=this;a=b.parseBox(a);return b.addUnits(a.top,c)+" "+b.addUnits(a.right,c)+" "+b.addUnits(a.bottom,c)+" "+b.addUnits(a.left,c)},serializeForm:function(b){var a=b.elements||(al.forms[b]||Ext.getDom(b)).elements,g=false,h=encodeURIComponent,n="",o=a.length,m,d,j,e,f,l,p,k,c;for(l=0;l "+d,!!c)},createChild:function(b,c,a){b=b||{tag:"div"};if(c){return Ext.DomHelper.insertBefore(c,b,a!==true)}else{return Ext.DomHelper.append(this.dom,b,a!==true)}},createShim:function(){var b=al.createElement("iframe"),a;b.frameBorder="0";b.className=Ext.baseCSSPrefix+"shim";b.src=Ext.SSL_SECURE_URL;b.setAttribute("role","presentation");b.setAttribute("tabindex",-1);a=Ext.get(this.dom.parentNode.insertBefore(b,this.dom));return a},contains:function(c){if(!c){return false}var b=this,a=Ext.getDom(c);return(a===b.dom)||b.isAncestor(a)},destroy:function(){var b=this,a=b.dom;if(!b.isFly){b.clearListeners();delete Ext.cache[b.id];b.isDestroyed=true}if(a){if(a.parentNode){a.parentNode.removeChild(a)}a._extData=b.dom=null}},detach:function(){var a=this.dom;if(a&&a.parentNode&&a.tagName!=="BODY"){a.parentNode.removeChild(a)}return this},disableTouchContextMenu:function(){this._contextMenuListenerRemover=this.on({MSHoldVisual:function(a){a.preventDefault()},destroyable:true,delegated:false})},disableTouchScroll:function(){this.addCls(af);this.on({touchmove:function(a){a.preventDefault()},translate:false})},doAddListener:function(a,g,f,e){var h=this,d,c,b,j;if(!h.blockedEvents[a]){c=h.mixins.observable.doAddListener;e=e||{};if(h.longpressEvents[a]){h.disableTouchContextMenu()}if(h.normalizeEvent){d=h.normalizeEvent(a);if(d){a=d.eventName;e.beforeFn=d.normalizeFn}}if(aI.useDelegatedEvents===false){e.delegated=e.delegated||false}if(e.translate!==false){b=h.additiveEvents[a];if(b){e.type=a;a=b;c.apply(h,arguments)}j=h.eventMap[a];if(j){e.type=e.type||a;a=j}}c.apply(h,arguments);delete e.type}return h},doRemoveListener:function(a,g,f,e){var h=this,d,c,b,j;if(!h.blockedEvents[a]){c=h.mixins.observable.doRemoveListener;e=e||{};if(h.longpressEvents[a]){j=this._contextMenuListenerRemover;if(j){j.destroy()}}if(h.normalizeEvent){d=h.normalizeEvent(a);if(d){a=d.eventName}}if(aI.useDelegatedEvents===false){e.delegated=e.delegated||false}if(e.translate!==false){b=h.additiveEvents[a];if(b){a=b;c.apply(h,arguments)}a=h.eventMap[a]||a}c.apply(h,arguments)}return h},doReplaceWith:function(b){var a=this.dom;a.parentNode.replaceChild(Ext.getDom(b),a)},down:function(b,a){return this.selectNode(b,!!a)},findParent:function(a,f,g){var e=this,c=e.dom,d=al.documentElement,b=0;f=f||50;if(isNaN(f)){f=Number.MAX_VALUE}while(c&&c.nodeType===1&&b0&&a<0.5){f++}}}if(d){f-=c.getBorderWidth("tb")+c.getPadding("tb")}return(f<0)?0:f},getHtml:function(){return this.dom?this.dom.innerHTML:""},getLeft:function(a){return a?this.getLocalX():this.getX()},getLocalX:function(){var a=this,b,c=a.getStyle("left");if(!c||c==="auto"){c=0}else{if(aG.test(c)){c=parseFloat(c)}else{c=a.getX();b=a.dom.offsetParent;if(b){c-=Ext.fly(b).getX()}}}return c},getLocalXY:function(){var c=this,b,d=c.getStyle(["left","top"]),e=d.left,a=d.top;if(!e||e==="auto"){e=0}else{if(aG.test(e)){e=parseFloat(e)}else{e=c.getX();b=c.dom.offsetParent;if(b){e-=Ext.fly(b).getX()}}}if(!a||a==="auto"){a=0}else{if(aG.test(a)){a=parseFloat(a)}else{a=c.getY();b=c.dom.offsetParent;if(b){a-=Ext.fly(b).getY()}}}return[e,a]},getLocalY:function(){var b=this,c,a=b.getStyle("top");if(!a||a==="auto"){a=0}else{if(aG.test(a)){a=parseFloat(a)}else{a=b.getY();c=b.dom.offsetParent;if(c){a-=Ext.fly(c).getY()}}}return a},getMargin:function(d){var c=this,b={t:"top",l:"left",r:"right",b:"bottom"},e,a,f;if(!d){f=[];for(e in aL){f.push(aL[e])}a=c.getStyle(aL);if(a&&typeof a==="object"){for(e in aL){a[b[e]]=parseFloat(a[aL[e]])||0}}return a}else{return c.addStyles(d,aL)}},getPadding:function(a){return this.addStyles(a,ad)},getParent:function(){return Ext.get(this.dom.parentNode)},getRight:function(a){return(a?this.getLocalX():this.getX())+this.getWidth()},getSize:function(a){return{width:this.getWidth(a),height:this.getHeight(a)}},getStyle:function(h,n){var m=this,a=m.dom,e=typeof h!=="string",g=m.styleHooks,c=h,l=c,o=1,p,f,j,k,b,d,q;if(e){j={};c=l[0];q=0;if(!(o=l.length)){return j}}if(!a||a.documentElement){return j||""}p=a.style;if(n){d=p}else{d=a.ownerDocument.defaultView.getComputedStyle(a,null);if(!d){n=true;d=p}}do{k=g[c];if(!k){g[c]=k={name:aI.normalize(c)}}if(k.get){b=k.get(a,m,n,d)}else{f=k.name;b=d[f]}if(!e){return b}j[c]=b;c=l[++q]}while(q0&&a<0.5){g++}}}if(h){g-=f.getBorderWidth("lr")+f.getPadding("lr")}return(g<0)?0:g},getX:function(){return this.getXY()[0]},getXY:function(){var e=Math.round,b=this.dom,f=0,a=0,d;if(b!==al&&b!==al.body){try{d=b.getBoundingClientRect()}catch(c){d={left:0,top:0}}f=e(d.left);a=e(d.top)}return[f,a]},getY:function(){return this.getXY()[1]},hasCls:function(b){var a=this.getData();if(!a.isSynchronized){this.synchronize()}return a.classMap.hasOwnProperty(b)},hide:function(){this.setVisible(false);return this},insertAfter:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a.nextSibling);return this},insertBefore:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a);return this},insertFirst:function(a,b){a=a||{};if(a.nodeType||a.dom||typeof a==="string"){a=Ext.getDom(a);this.dom.insertBefore(a,this.dom.firstChild);return !b?Ext.get(a):a}else{return this.createChild(a,this.dom.firstChild,b)}},insertHtml:function(c,b,d){var a=Ext.DomHelper.insertHtml(c,this.dom,b);return d?Ext.get(a):a},insertSibling:function(c,k,g){var h=this,f=Ext.DomHelper,e=(k||"before").toLowerCase()==="after",a,d,b,j;if(Ext.isIterable(c)){b=c.length;d=Ext.fly(document.createDocumentFragment());if(Ext.isArray(c)){for(j=0;j0){c=a.className.split(aa);for(j=0,h=c.length;j-1){k=Ext.getDom(k);if(g){h=this.elements[d];h.parentNode.insertBefore(k,h);Ext.removeNode(h)}Ext.Array.splice(this.elements,d,1,k)}return this},clear:function(g){var h=this,e=h.elements,f=e.length-1;if(g){for(;f>=0;f--){Ext.removeNode(e[f])}}this.elements=[]},addElements:function(j,e){if(!j){return this}if(typeof j==="string"){j=Ext.dom.Element.selectorFunction(j,e)}var k=this.elements,g=j.length,h;for(h=0;h=":function(a){var b=this._value;return Ext.coerce(this.getPropertyValue(a),b)>=b},">":function(a){var b=this._value;return Ext.coerce(this.getPropertyValue(a),b)>b},"!=":function(a){var b=this._value;return Ext.coerce(this.getPropertyValue(a),b)!=b},"in":function(a){var b=this._value;return Ext.Array.contains(b,Ext.coerce(this.getPropertyValue(a),b))},like:function(a){var b=this._value;return b&&Ext.coerce(this.getPropertyValue(a),b).toLowerCase().indexOf(b.toLowerCase())>-1}}),j=function(){this._filterFn=null},k=["updateOperator","updateValue"],f;h["=="]=h["="];h.gt=h[">"];h.ge=h[">="];h.lt=h["<"];h.le=h["<="];h.eq=h["="];h.ne=h["!="];for(f=k.length;f-->0;){g[k[f]]=j}}));Ext.util=Ext.util||{};Ext.util.DelayedTask=function(o,p,j,l,m){var n=this,k,q=function(){var a=Ext.GlobalEvents;clearInterval(n.id);n.id=null;o.apply(p,j||[]);if(m!==false&&a.hasListeners.idle){a.fireEvent("idle")}};l=typeof l==="boolean"?l:true;n.id=null;n.delay=function(c,a,b,d){if(l){n.cancel()}if(typeof c==="number"){k=c}o=a||o;p=b||p;j=d||j;if(!n.id){n.id=Ext.interval(q,k)}};n.cancel=function(){if(n.id){clearInterval(n.id);n.id=null}}};(Ext.cmd.derive("Ext.util.Event",Ext.Base,function(){var g=Array.prototype.slice,f=Ext.Array.insert,h=Ext.Array.toArray,e={};return{isEvent:true,suspended:0,noOptions:{},constructor:function(a,b){this.name=b;this.observable=a;this.listeners=[]},addListener:function(c,a,D,z){var u=this,d,y,b,C,E,v,A,w,x,B;if(typeof c!=="string"){a=a||u.observable}if(!u.isListening(c,a)){y=u.createListener(c,a,D,z);if(u.firing){u.listeners=u.listeners.slice(0)}d=u.listeners;w=A=d.length;b=D&&D.priority;E=u._highestNegativePriorityIndex;v=(E!==undefined);if(b){C=(b<0);if(!C||v){for(x=(C?E:0);x0},fire:function(){var c=this,n=c.listeners,d=n.length,a,o,p,b,q;if(!c.suspended&&d>0){c.firing=true;p=arguments.length?g.call(arguments,0):[];q=p.length;for(o=0;o4?a:g;a=g;for(g in a){if(a.hasOwnProperty(g)){t=a[g];if(!f.eventOptionsRe.test(g)){f.addManagedListener(c,g,t.fn||t,t.scope||a.scope||b,t.fn?t:u,true)}}}if(a&&a.destroyable){return new h(f,c,a)}}else{if(e!==n){d.push({item:c,ename:g,fn:e,scope:b,options:a});if(c.isUtilObservable){c.on(g,e,b,a,f)}else{c.on(g,e,b,a)}if(!s&&a&&a.destroyable){return new h(f,c,g,e,b)}}}},removeManagedListener:function(c,s,e,b){var f=this,a,t,d,u,g;if(typeof s!=="string"){a=s;for(s in a){if(a.hasOwnProperty(s)){t=a[s];if(!f.eventOptionsRe.test(s)){f.removeManagedListener(c,s,t.fn||t,t.scope||a.scope||b)}}}}else{d=f.managedListeners?f.managedListeners.slice():[];for(g=0,u=d.length;g0,c=this.events;if(!b&&a&&c){a=c[a];if(a&&a.isEvent){return a.isSuspended()}}return b},suspendEvents:function(a){++this.eventsSuspended;if(a&&!this.eventQueue){this.eventQueue=[]}},suspendEvent:function(){var f=this,b=f.events||(f.events={}),e=arguments.length,c,a,d;for(c=0;c-1){h=m[l];delete m[l];delete o[l];m[k]=h;o[k]=j;n.keys[j]=k;n.indexGeneration=++n.generation}},addAll:function(f){var d=this,e;if(arguments.length>1||Ext.isArray(f)){d.insert(d.length,arguments.length>1?arguments:f)}else{for(e in f){if(f.hasOwnProperty(e)){if(d.allowFunctions||typeof f[e]!="function"){d.add(e,f[e])}}}}},each:function(k,l){var g=Ext.Array.push([],this.items),m=0,h=g.length,j;for(;m2){f=this.doInsert(e,[h],[g])}else{f=this.doInsert(e,[h])}f=f[0]}return f},doInsert:function(x,s,t){var v=this,D,C,z,w=s.length,E=w,A=v.hasListeners.add,B,y={},u,q,r;if(t!=null){v.useLinearSearch=true}else{t=s;s=new Array(w);for(z=0;z=0;--d){f.remove(e[d])}}else{while(f.length){f.removeAt(0)}}}else{f.length=f.items.length=f.keys.length=0;f.map={};f.indexMap={};f.generation++;f.indexGeneration=f.generation}},removeAt:function(f){var h=this,g,e;if(f=0){h.length--;g=h.items[f];Ext.Array.erase(h.items,f,1);e=h.keys[f];if(typeof e!="undefined"){delete h.map[e]}Ext.Array.erase(h.keys,f,1);if(h.hasListeners.remove){h.fireEvent("remove",g,e)}h.generation++;return g}return false},removeRange:function(m,s){var l=this,r,k,n,o,q,p;if(m=0){if(!s){s=1}o=Math.min(m+s,l.length);s=o-m;p=o===l.length;q=p&&l.indexGeneration===l.generation;for(n=m;n=0;f--){if(h[f]==null){g.removeAt(f)}}}else{return g.removeAt(g.indexOfKey(e))}},getCount:function(){return this.length},indexOf:function(f){var d=this,e;if(f!=null){if(!d.useLinearSearch&&(e=d.getKey(f))){return this.indexOfKey(e)}return Ext.Array.indexOf(d.items,f)}return -1},indexOfKey:function(b){if(!this.map.hasOwnProperty(b)){return -1}if(this.indexGeneration!==this.generation){this.rebuildIndexMap()}return this.indexMap[b]},rebuildIndexMap:function(){var h=this,j=h.indexMap={},k=h.keys,g=k.length,f;for(f=0;fj){o=true;n=l;l=j;j=n}if(l<0){l=0}if(j==null||j>=k){j=k-1}q=p.slice(l,j+1);if(o&&q.length){q.reverse()}return q},filter:function(j,k,h,g){var f=[];if(Ext.isString(j)){f.push(new Ext.util.Filter({property:j,value:k,anyMatch:h,caseSensitive:g}))}else{if(Ext.isArray(j)||j instanceof Ext.util.Filter){f=f.concat(j)}}return this.filterBy(Ext.util.Filter.createFilterFn(f))},filterBy:function(o,p){var l=this,k=new l.self(l.initialConfig),m=l.keys,j=l.items,n=j.length,q;k.getKey=l.getKey;for(q=0;ql)?1:(k0){q.removeRange(j.multiSortLimit,p)}break;case"prepend":q.insert(0,m);break;case"append":q.addAll(m);break;case undefined:case null:case"replace":q.clear();q.addAll(m);break;default:}}if(o!==false){j.fireEvent("beforesort",j,m);j.onBeforeSort(m);if(j.getSorterCount()){j.doSort(j.generateComparator())}}return m},getSorterCount:function(){return this.getSorters().items.length},generateComparator:function(){var b=this.getSorters().getRange();return b.length?this.createComparator(b):this.emptyComparator},emptyComparator:function(){return 0},onBeforeSort:Ext.emptyFn,decodeSorters:function(l){if(!Ext.isArray(l)){if(l===undefined){l=[]}else{l=[l]}}var n=l.length,k=Ext.util.Sorter,h=this.getModel?this.getModel():this.model,m,j,o;for(o=0;o>1;m=p(o,j[q]);if(m>=0){l=q+1}else{if(m<0){k=q-1}}}return l},reorder:function(p){var m=this,j=m.items,q=0,n=j.length,k=[],o=[],l;m.suspendEvents();for(l in p){k[p[l]]=j[l]}for(q=0;qb?1:(aC){s=C}}}if(r){t.tasks=r}t.firing=false;if(t.tasks.length){t.startTimer(s-E,Ext.Date.now())}if(q!==false&&B.hasListeners.idle){B.fireEvent("idle")}},startTimer:function(h,k){var j=this,f=k+h,g=j.timerId;if(g&&j.nextExpires-f>j.interval){clearTimeout(g);g=null}if(!g){if(h=o.duration),n,l;if(k){j=o.duration;q=true}n=this.collectTargetData(o,j,m,q);if(m){o.target.setAttr(n.anims[o.id].attributes,true);p.collectTargetData(o,o.duration,m,q);o.paused=true;n=o.target.target;if(o.target.isComposite){n=o.target.target.last()}l={};l[Ext.supports.CSS3TransitionEnd]=o.lastFrame;l.scope=o;l.single=true;n.on(l)}return n},jumpToEnd:function(d){var c=this.runAnim(d,true);this.applyAnimAttrs(c,c.anims[d.id])},collectTargetData:function(m,h,k,j){var g=m.target.getId(),l=this.targetArr[g];if(!l){l=this.targetArr[g]={id:g,el:m.target,anims:{}}}l.anims[m.id]={id:m.id,anim:m,elapsed:h,isLastFrame:j,attributes:[{duration:m.duration,easing:(k&&m.reverse)?m.easingFn.reverse().toCSS3():m.easing,attrs:m.runAnim(h)}]};return l},applyAnimAttrs:function(f,e){var d=e.anim;if(e.attributes&&d.isRunning()){f.el.setAttr(e.attributes,false,e.isLastFrame);if(e.isLastFrame){d.lastFrame()}}},applyPendingAttrs:function(){var k=this.targetArr,j,m,g,l,h;for(m in k){if(k.hasOwnProperty(m)){j=k[m];for(h in j.anims){if(j.anims.hasOwnProperty(h)){g=j.anims[h];l=g.anim;if(g.attributes&&l.isRunning()){j.el.setAttr(g.attributes,false,g.isLastFrame);if(g.isLastFrame){l.lastFrame()}}}}}}}},1,0,0,0,0,[["queue",Ext.fx.Queue]],[Ext.fx,"Manager"],0));(Ext.cmd.derive("Ext.fx.Animator",Ext.Base,{isAnimator:true,duration:250,delay:0,delayStart:0,dynamic:false,easing:"ease",running:false,paused:false,damper:1,iterations:1,currentIteration:0,keyframeStep:0,animKeyFramesRE:/^(from|to|\d+%?)$/,constructor:function(d){var c=this;d=Ext.apply(c,d||{});c.config=d;c.id=Ext.id(null,"ext-animator-");c.mixins.observable.constructor.call(c,d);c.timeline=[];c.createTimeline(c.keyframes);if(c.target){c.applyAnimator(c.target);Ext.fx.Manager.addAnim(c)}},sorter:function(a,b){return a.pct-b.pct},createTimeline:function(t){var q=this,n=[],p=q.to||{},v=q.duration,m,w,u,r,o,s;for(o in t){if(t.hasOwnProperty(o)&&q.animKeyFramesRE.test(o)){s={attrs:Ext.apply(t[o],p)};if(o=="from"){o=0}else{if(o=="to"){o=100}}s.pct=parseInt(o,10);n.push(s)}}Ext.Array.sort(n,q.sorter);r=n.length;for(u=0;u0},isRunning:function(){return false}},1,0,0,0,0,[["observable",Ext.util.Observable]],[Ext.fx,"Animator"],0));(Ext.cmd.derive("Ext.fx.CubicBezier",Ext.Base,{singleton:true,cubicBezierAtTime:function(r,B,D,s,t,x){var w=3*B,u=3*(s-B)-w,E=1-w-u,y=3*D,v=3*(t-D)-y,q=1-y-v;function z(a){return((E*a+u)*a+w)*a}function C(c,a){var b=A(c,a);return((q*b+v)*b+y)*b}function A(g,h){var a,b,d,f,c,e;for(d=g,e=0;e<8;e++){f=z(d)-g;if(Math.abs(f)b){return b}while(af){a=d}else{b=d}d=(b-a)/2+a}return d}return C(r,1/(200*x))},cubicBezier:function(f,h,g,k){var j=function(a){return Ext.fx.CubicBezier.cubicBezierAtTime(a,f,h,g,k,1)};j.toCSS3=function(){return"cubic-bezier("+[f,h,g,k].join(",")+")"};j.reverse=function(){return Ext.fx.CubicBezier.cubicBezier(1-g,1-k,1-f,1-h)};return j}},0,0,0,0,0,0,[Ext.fx,"CubicBezier"],0));Ext.require("Ext.fx.CubicBezier",function(){var m=Math,k=m.PI,n=m.pow,h=m.sin,l=m.sqrt,j=m.abs,o=1.70158;Ext.define("Ext.fx.Easing",{singleton:true,linear:Ext.identityFn,ease:function(e){var q=0.07813-e/2,d=-0.25,c=l(0.0066+q*q),a=c-q,f=n(j(a),1/3)*(a<0?-1:1),b=-c-q,g=n(j(b),1/3)*(b<0?-1:1),t=f+g+0.25;return n(1-t,2)*3*t*0.1+(1-t)*3*t*t+t*t*t},easeIn:function(a){return n(a,1.7)},easeOut:function(a){return n(a,0.48)},easeInOut:function(f){var b=0.48-f/1.04,c=l(0.1734+b*b),e=c-b,g=n(j(e),1/3)*(e<0?-1:1),q=-c-b,a=n(j(q),1/3)*(q<0?-1:1),d=g+a+0.5;return(1-d)*3*d*d+d*d*d},backIn:function(a){return a*a*((o+1)*a-o)},backOut:function(a){a=a-1;return a*a*((o+1)*a+o)+1},elasticIn:function(a){if(a===0||a===1){return a}var b=0.3,c=b/4;return n(2,-10*a)*h((a-c)*(2*k)/b)+1},elasticOut:function(a){return 1-Ext.fx.Easing.elasticIn(1-a)},bounceIn:function(a){return 1-Ext.fx.Easing.bounceOut(1-a)},bounceOut:function(a){var c=7.5625,b=2.75,d;if(a<(1/b)){d=c*a*a}else{if(a<(2/b)){a-=(1.5/b);d=c*a*a+0.75}else{if(a<(2.5/b)){a-=(2.25/b);d=c*a*a+0.9375}else{a-=(2.625/b);d=c*a*a+0.984375}}}return d}},function(){var a=Ext.fx.Easing.self,b=a.prototype;a.addMembers({"back-in":b.backIn,"back-out":b.backOut,"ease-in":b.easeIn,"ease-out":b.easeOut,"elastic-in":b.elasticIn,"elastic-out":b.elasticOut,"bounce-in":b.bounceIn,"bounce-out":b.bounceOut,"ease-in-out":b.easeInOut})})});(Ext.cmd.derive("Ext.fx.DrawPath",Ext.Base,{singleton:true,pathToStringRE:/,?([achlmqrstvxz]),?/gi,pathCommandRE:/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,pathValuesRE:/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,stopsRE:/^(\d+%?)$/,radian:Math.PI/180,is:function(c,d){d=String(d).toLowerCase();return(d=="object"&&c===Object(c))||(d=="undefined"&&typeof c==d)||(d=="null"&&c===null)||(d=="array"&&Array.isArray&&Array.isArray(c))||(Object.prototype.toString.call(c).toLowerCase().slice(8,-1))==d},path2string:function(){return this.join(",").replace(Ext.fx.DrawPath.pathToStringRE,"$1")},pathToString:function(b){return b.join(",").replace(Ext.fx.DrawPath.pathToStringRE,"$1")},parsePathString:function(f){if(!f){return null}var g={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},h=[],e=this;if(e.is(f,"array")&&e.is(f[0],"array")){h=e.pathClone(f)}if(!h.length){String(f).replace(e.pathCommandRE,function(d,k,a){var b=[],c=k.toLowerCase();a.replace(e.pathValuesRE,function(j,m){m&&b.push(+m)});if(c=="m"&&b.length>2){h.push([k].concat(Ext.Array.splice(b,0,2)));c="l";k=(k=="m")?"l":"L"}while(b.length>=g[c]){h.push([k].concat(Ext.Array.splice(b,0,g[c])));if(!g[c]){break}}})}h.toString=e.path2string;return h},pathClone:function(j){var m=[],h,k,g,l;if(!this.is(j,"array")||!this.is(j&&j[0],"array")){j=this.parsePathString(j)}for(g=0,l=j.length;g7){c[b].shift();var a=c[b];while(a.length){Ext.Array.splice(c,b++,0,["C"].concat(Ext.Array.splice(a,0,6)))}Ext.Array.erase(c,b,1);s=Math.max(B.length,u.length||0)}},C=function(a,b,d,e,c){if(a&&b&&a[c][0]=="M"&&b[c][0]!="M"){Ext.Array.splice(b,c,0,["M",e.x,e.y]);d.bx=0;d.by=0;d.x=a[c][1];d.y=a[c][2];s=Math.max(B.length,u.length||0)}},y,s,z,r,A,w;for(y=0,s=Math.max(B.length,u.length||0);y1){h=af(h);au=h*au;aw=h*aw}aX=au*au;aj=aw*aw;ag=(aQ==aU?-1:1)*af(aK((aX*aj-aX*an*an-aj*am*am)/(aX*an*an+aj*am*am)));aC=ag*au*an/aw+(aL+aM)/2;aE=ag*-aw*am/au+(ax+aA)/2;aR=aP(((ax-aE)/aw).toFixed(7));aS=aP(((aA-aE)/aw).toFixed(7));aR=aLaS){aR=aR-aW*2}if(!aU&&aS>aR){aS=aS-aW*2}}else{aR=aG[0];aS=aG[1];aC=aG[2];aE=aG[3]}aN=aS-aR;if(aK(aN)>ay){az=aS;av=aM;aO=aA;aS=aR+ay*(aU&&aS>aR?1:-1);aM=aC+au*ah(aS);aA=aE+aw*aZ(aS);ao=aJ.arc2curve(aM,aA,au,aw,aH,0,aU,av,aO,[aS,az,aC,aE])}aN=aS-aR;aT=ah(aR);aB=aZ(aR);aV=ah(aS);aD=aZ(aS);al=ar.tan(aN/4);ai=4/3*au*al;ak=4/3*aw*al;aF=[aL,ax];k=[aL+ai*aB,ax-ak*aT];t=[aM+ai*aD,aA-ak*aV];y=[aM,aA];k[0]=2*aF[0]-k[0];k[1]=2*aF[1]-k[1];if(aG){return[k,t,y].concat(ao)}else{ao=[k,t,y].concat(ao).join().split(",");ap=[];aq=ao.length;for(x=0;x=t){m=t;w=true}if(p.reverse){m=t-m}for(s in n){if(n.hasOwnProperty(s)){o=n[s];q=w?1:u(m/t);r[s]=v[s].set(o,q)}}p.frameCount++;return r},lastFrame:function(){var f=this,e=f.iterations,d=f.currentIteration;d++;if(d0},isRunning:function(){return this.paused===false&&this.running===true&&this.isAnimator!==true}},1,0,0,0,0,[["observable",Ext.util.Observable]],[Ext.fx,"Anim"],0));Ext.enableFx=true;(Ext.cmd.derive("Ext.util.Animate",Ext.Base,{mixinId:"animate",isAnimate:true,animate:function(d){var c=this;if(Ext.fx.Manager.hasFxBlock(c.id)){return c}Ext.fx.Manager.queueFx(new Ext.fx.Anim(c.anim(d)));return this},anim:function(d){if(!Ext.isObject(d)){return(d)?{}:false}var c=this;if(d.stopAnimation){c.stopAnimation()}Ext.applyIf(d,Ext.fx.Manager.getFxDefaults(c.id));return Ext.apply({target:c,paused:true},d)},getAnimationProps:function(){var c=this,d=c.layout;return d&&d.animate?d.animate:{}},stopFx:Ext.Function.alias(Ext.util.Animate,"stopAnimation"),stopAnimation:function(){Ext.fx.Manager.stopAnimation(this.id);return this},syncFx:function(){Ext.fx.Manager.setFxDefaults(this.id,{concurrent:true});return this},sequenceFx:function(){Ext.fx.Manager.setFxDefaults(this.id,{concurrent:false});return this},hasActiveFx:Ext.Function.alias(Ext.util.Animate,"getActiveAnimation"),getActiveAnimation:function(){return Ext.fx.Manager.getActiveAnimation(this.id)}},0,0,0,0,0,0,[Ext.util,"Animate"],0));(Ext.cmd.derive("Ext.dom.GarbageCollector",Ext.Base,{singleton:true,interval:30000,constructor:function(){var b=this;b.collect=Ext.Function.bind(b.collect,b);b.resume()},collect:function(){var k=this,g=Ext.cache,h,j,l,m;if(!Ext.enableGarbageCollector){k.pause()}else{for(h in g){if(!g.hasOwnProperty(h)){continue}l=g[h];if(l.skipGarbageCollection){continue}j=l.dom;if(Ext.isGarbage(j)){l.clearListeners();delete g[h]}}if(Ext.isIE9m){m={};for(h in g){if(g.hasOwnProperty(h)){m[h]=g[h]}}g=Ext.cache=m}k.lastTime=Ext.now()}},pause:function(){clearTimeout(this.timerId)},resume:function(){var d=this,c=d.lastTime;if(c&&(Ext.now()-c>d.interval)){d.collect()}d.timerId=Ext.interval(d.collect,d.interval)}},1,0,0,0,0,0,[Ext.dom,"GarbageCollector"],0));Ext.define("Ext.overrides.dom.Element",(function(){var Element,WIN=window,DOC=document,HIDDEN="hidden",ISCLIPPED="isClipped",OVERFLOW="overflow",OVERFLOWX="overflow-x",OVERFLOWY="overflow-y",ORIGINALCLIP="originalClip",HEIGHT="height",WIDTH="width",VISIBILITY="visibility",DISPLAY="display",NONE="none",HIDDEN="hidden",OFFSETS="offsets",ORIGINALDISPLAY="originalDisplay",VISMODE="visibilityMode",ISVISIBLE="isVisible",OFFSETCLASS=Ext.baseCSSPrefix+"hidden-offsets",boxMarkup=['",'",'"].join(""),tabbableSelector="a[href],button,iframe,input,select,textarea,[tabindex]",tabbableRe=/^BUTTON|IFRAME|INPUT|SELECT|TEXTAREA$/,tabbableSavedFlagAttribute="data-tabindexsaved",tabbableSavedAttribute="data-savedtabindex",scriptTagRe=/(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig,replaceScriptTagRe=/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,srcRe=/\ssrc=([\'\"])(.*?)\1/i,focusRe=/^a|button|embed|iframe|input|object|select|textarea$/i,nonSpaceRe=/\S/,typeRe=/\stype=([\'\"])(.*?)\1/i,msRe=/^-ms-/,camelRe=/(-[a-z])/gi,camelReplaceFn=function(m,a){return a.charAt(1).toUpperCase()},XMASKED=Ext.baseCSSPrefix+"masked",XMASKEDRELATIVE=Ext.baseCSSPrefix+"masked-relative",EXTELMASKMSG=Ext.baseCSSPrefix+"mask-msg",mouseEnterLeaveRe=/^(?:mouseenter|mouseleave)$/,bodyRe=/^body/i,scrollFly,propertyCache={},getDisplay=function(el){var data=el.getData(),display=data[ORIGINALDISPLAY];if(display===undefined){data[ORIGINALDISPLAY]=display=""}return display},getVisMode=function(el){var data=el.getData(),visMode=data[VISMODE];if(visMode===undefined){data[VISMODE]=visMode=Element.VISIBILITY}return visMode},garbageBin,emptyRange=DOC.createRange?DOC.createRange():null;return{override:"Ext.dom.Element",mixins:["Ext.util.Animate"],skipGarbageCollection:false,_init:function(E){Element=E},statics:{selectableCls:Ext.baseCSSPrefix+"selectable",unselectableCls:Ext.baseCSSPrefix+"unselectable",normalize:function(prop){if(prop==="float"){prop=Ext.supports.Float?"cssFloat":"styleFloat"}return propertyCache[prop]||(propertyCache[prop]=prop.replace(msRe,"ms-").replace(camelRe,camelReplaceFn))},getViewportHeight:function(){return Ext.isIE9m?DOC.documentElement.clientHeight:WIN.innerHeight},getViewportWidth:function(){return(!Ext.isStrict&&!Ext.isOpera)?document.body.clientWidth:Ext.isIE9m?DOC.documentElement.clientWidth:WIN.innerWidth}},addClsOnClick:function(className,testFn,scope){var me=this,dom=me.dom,hasTest=Ext.isFunction(testFn);me.on("mousedown",function(){if(hasTest&&testFn.call(scope||me,me)===false){return false}Ext.fly(dom).addCls(className);var d=Ext.getDoc(),fn=function(){Ext.fly(dom).removeCls(className);d.removeListener("mouseup",fn)};d.on("mouseup",fn)});return me},addClsOnFocus:function(className,testFn,scope){var me=this,dom=me.dom,hasTest=Ext.isFunction(testFn);me.on("focus",function(){if(hasTest&&testFn.call(scope||me,me)===false){return false}Ext.fly(dom).addCls(className)});me.on("blur",function(){Ext.fly(dom).removeCls(className)});return me},addClsOnOver:function(className,testFn,scope){var me=this,dom=me.dom,hasTest=Ext.isFunction(testFn);me.hover(function(){if(hasTest&&testFn.call(scope||me,me)===false){return}Ext.fly(dom).addCls(className)},function(){Ext.fly(dom).removeCls(className)});return me},addKeyListener:function(key,fn,scope){var config;if(typeof key!=="object"||Ext.isArray(key)){config={target:this,key:key,fn:fn,scope:scope}}else{config={target:this,key:key.key,shift:key.shift,ctrl:key.ctrl,alt:key.alt,fn:fn,scope:scope}}return new Ext.util.KeyMap(config)},addKeyMap:function(config){return new Ext.util.KeyMap(Ext.apply({target:this},config))},anchorAnimX:function(anchor){var xName=(anchor==="l")?"right":"left";this.dom.style[xName]="0px"},anim:function(config){if(!Ext.isObject(config)){return(config)?{}:false}var me=this,duration=config.duration||Ext.fx.Anim.prototype.duration,easing=config.easing||"ease",animConfig;if(config.stopAnimation){me.stopAnimation()}Ext.applyIf(config,Ext.fx.Manager.getFxDefaults(me.id));Ext.fx.Manager.setFxDefaults(me.id,{delay:0});animConfig={target:me.dom,remove:config.remove,alternate:config.alternate||false,duration:duration,easing:easing,callback:config.callback,listeners:config.listeners,iterations:config.iterations||1,scope:config.scope,block:config.block,concurrent:config.concurrent,delay:config.delay||0,paused:true,keyframes:config.keyframes,from:config.from||{},to:Ext.apply({},config)};Ext.apply(animConfig.to,config.to);delete animConfig.to.to;delete animConfig.to.from;delete animConfig.to.remove;delete animConfig.to.alternate;delete animConfig.to.keyframes;delete animConfig.to.iterations;delete animConfig.to.listeners;delete animConfig.to.target;delete animConfig.to.paused;delete animConfig.to.callback;delete animConfig.to.scope;delete animConfig.to.duration;delete animConfig.to.easing;delete animConfig.to.concurrent;delete animConfig.to.block;delete animConfig.to.stopAnimation;delete animConfig.to.delay;return animConfig},animate:function(config){var me=this,animId=me.dom.id||Ext.id(me.dom),listeners,anim,end;if(!Ext.fx.Manager.hasFxBlock(animId)){if(config.listeners){listeners=config.listeners;delete config.listeners}if(config.internalListeners){config.listeners=config.internalListeners;delete config.internalListeners}end=config.autoEnd;delete config.autoEnd;anim=new Ext.fx.Anim(me.anim(config));if(listeners){anim.on(listeners)}Ext.fx.Manager.queueFx(anim);if(end){anim.jumpToEnd()}}return me},boxWrap:function(cls){cls=cls||Ext.baseCSSPrefix+"box";var el=Ext.get(this.insertHtml("beforeBegin",""));el.selectNode("."+cls+"-mc").appendChild(this.dom);return el},cacheScrollValues:function(){var me=this,scrollValues=[],scrolledDescendants=[],descendants,descendant,i,len;scrollFly=scrollFly||new Ext.dom.Fly();descendants=me.query("*");for(i=0,len=descendants.length;i0||descendant.scrollLeft!==0){scrolledDescendants.push(descendant);scrollValues.push(scrollFly.attach(descendant).getScroll())}}return function(){var scroll,i,len;for(i=0,len=scrolledDescendants.length;i5?color.toLowerCase():defaultValue)},getLoader:function(){var me=this,data=me.getData(),loader=data.loader;if(!loader){data.loader=loader=new Ext.ElementLoader({target:me})}return loader},getPositioning:function(autoPx){var styles=this.getStyle(["left","top","position","z-index"]),dom=this.dom;if(autoPx){if(styles.left==="auto"){styles.left=dom.offsetLeft+"px"}if(styles.top==="auto"){styles.top=dom.offsetTop+"px"}}return styles},getScroll:function(){var me=this,dom=me.dom,docElement=DOC.documentElement,left,top,body=document.body;if(dom===DOC||dom===body){left=docElement.scrollLeft||(body?body.scrollLeft:0);top=docElement.scrollTop||(body?body.scrollTop:0)}else{left=dom.scrollLeft;top=dom.scrollTop}return{left:left,top:top}},getScrollIntoViewXY:function(container,scrollX,scrollY){var me=this,dom=me.dom,ct=Ext.getDom(container),offsets=me.getOffsetsTo(ct),width=dom.offsetWidth,height=dom.offsetHeight,left=offsets[0]+scrollX,top=offsets[1]+scrollY,bottom=top+height,right=left+width,ctClientHeight=ct.clientHeight,ctClientWidth=ct.clientWidth,ctBottom=scrollY+ctClientHeight,ctRight=scrollX+ctClientWidth,scrollX,scrollY;if(height>ctClientHeight||topctBottom){scrollY=bottom-ctClientHeight}}if(width>ctClientWidth||leftctRight){scrollX=right-ctClientWidth}}return{x:scrollX,y:scrollY}},getScrollLeft:function(){var dom=this.dom;if(dom===DOC||dom===document.body){return this.getScroll().left}else{return dom.scrollLeft}},getScrollTop:function(){var dom=this.dom;if(dom===DOC||dom===document.body){return this.getScroll().top}else{return dom.scrollTop}},getXY:function(){var xy=arguments.callee.$previous.call(this),scroll=Ext.getDoc().getScroll();xy[0]+=scroll.left;xy[1]+=scroll.top;return xy},ghost:function(anchor,obj){var me=this,dom=me.dom,beforeAnim;anchor=anchor||"b";beforeAnim=function(){var el=Ext.fly(dom,"_anim"),width=el.getWidth(),height=el.getHeight(),xy=el.getXY(),position=el.getPositioning(),to={opacity:0};switch(anchor){case"t":to.y=xy[1]-height;break;case"l":to.x=xy[0]-width;break;case"r":to.x=xy[0]+width;break;case"b":to.y=xy[1]+height;break;case"tl":to.x=xy[0]-width;to.y=xy[1]-height;break;case"bl":to.x=xy[0]-width;to.y=xy[1]+height;break;case"br":to.x=xy[0]+width;to.y=xy[1]+height;break;case"tr":to.x=xy[0]+width;to.y=xy[1]-height;break}this.to=to;this.on("afteranimate",function(){var el=Ext.fly(dom,"_anim");if(el){el.hide();el.clearOpacity();el.setPositioning(position)}})};me.animate(Ext.applyIf(obj||{},{duration:500,easing:"ease-out",listeners:{beforeanimate:beforeAnim}}));return me},hide:function(animate){if(typeof animate==="string"){this.setVisible(false,animate);return this}this.setVisible(false,this.anim(animate));return this},highlight:function(color,o){var me=this,dom=me.dom,from={},restore,to,attr,lns,event,fn;o=o||{};lns=o.listeners||{};attr=o.attr||"backgroundColor";from[attr]=color||"ffff9c";if(!o.to){to={};to[attr]=o.endColor||me.getColor(attr,"ffffff","")}else{to=o.to}o.listeners=Ext.apply(Ext.apply({},lns),{beforeanimate:function(){restore=dom.style[attr];var el=Ext.fly(dom,"_anim");el.clearOpacity();el.show();event=lns.beforeanimate;if(event){fn=event.fn||event;return fn.apply(event.scope||lns.scope||WIN,arguments)}},afteranimate:function(){if(dom){dom.style[attr]=restore}event=lns.afteranimate;if(event){fn=event.fn||event;fn.apply(event.scope||lns.scope||WIN,arguments)}}});me.animate(Ext.apply({},o,{duration:1000,easing:"ease-in",from:from,to:to}));return me},hover:function(overFn,outFn,scope,options){var me=this;me.on("mouseenter",overFn,scope||me.dom,options);me.on("mouseleave",outFn,scope||me.dom,options);return me},initDD:function(group,config,overrides){var dd=new Ext.dd.DD(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDProxy:function(group,config,overrides){var dd=new Ext.dd.DDProxy(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDTarget:function(group,config,overrides){var dd=new Ext.dd.DDTarget(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},isFocusable:function(asFocusEl){var me=this,dom=me.dom,hasTabIndex=dom.hasAttribute("tabindex"),tabIndex=hasTabIndex&&dom.getAttribute("tabindex"),nodeName=dom.nodeName,canFocus=false;if(dom&&!dom.disabled){if(tabIndex=="-1"){canFocus=asFocusEl}else{if(focusRe.test(nodeName)){if((nodeName!=="A")||dom.href){canFocus=true}}else{canFocus=tabIndex!=null&&tabIndex>=0}}canFocus=canFocus&&me.isVisible(true)}return canFocus},isMasked:function(deep){var me=this,data=me.getData(),maskEl=data.maskEl,maskMsg=data.maskMsg,hasMask=false,parent;if(maskEl&&maskEl.isVisible()){if(maskMsg){maskMsg.center(me)}hasMask=true}else{if(deep){parent=me.findParentNode();if(parent){return Ext.fly(parent).isMasked(deep)}}}return hasMask},isScrollable:function(){var dom=this.dom;return dom.scrollHeight>dom.clientHeight||dom.scrollWidth>dom.clientWidth},load:function(options){this.getLoader().load(options);return this},mask:function(msg,msgCls,elHeight){var me=this,dom=me.dom,data=me.getData(),maskEl=data.maskEl,maskMsg=data.maskMsg;if(!(bodyRe.test(dom.tagName)&&me.getStyle("position")=="static")){me.addCls(XMASKEDRELATIVE)}if(maskEl){maskEl.destroy()}if(maskMsg){maskMsg.destroy()}Ext.DomHelper.append(dom,[{role:"presentation",cls:Ext.baseCSSPrefix+"mask",style:"top:0;left:0;"},{role:"presentation",cls:msgCls?EXTELMASKMSG+" "+msgCls:EXTELMASKMSG,cn:{tag:"div",role:"presentation",cls:Ext.baseCSSPrefix+"mask-msg-inner",cn:{tag:"div",role:"presentation",cls:Ext.baseCSSPrefix+"mask-msg-text",html:msg||""}}}]);maskMsg=Ext.get(dom.lastChild);maskEl=Ext.get(maskMsg.dom.previousSibling);data.maskMsg=maskMsg;data.maskEl=maskEl;me.addCls(XMASKED);maskEl.setDisplayed(true);if(typeof msg==="string"){maskMsg.setDisplayed(true);maskMsg.center(me)}else{maskMsg.setDisplayed(false)}if(dom===DOC.body){maskEl.addCls(Ext.baseCSSPrefix+"mask-fixed")}else{me.saveTabbableState()}me.saveChildrenTabbableState();if(Ext.isIE9m&&dom!==DOC.body&&me.isStyle("height","auto")){maskEl.setSize(undefined,elHeight||me.getHeight())}return maskEl},monitorMouseLeave:function(delay,handler,scope){var me=this,timer,listeners={mouseleave:function(e){if(Ext.isIE9m){e.enableIEAsync()}timer=Ext.defer(handler,delay,scope||me,[e])},mouseenter:function(){clearTimeout(timer)}};me.on(listeners);return listeners},needsTabIndex:function(){var me=this;if(me.dom){if((me.dom.nodeName==="A")&&(!me.dom.href)){return true}return !focusRe.test(me.dom.nodeName)}},normalizeEvent:function(eventName){var fn,newName;if(!Ext.supports.MouseEnterLeave&&mouseEnterLeaveRe.test(eventName)){fn=this.normalizeWithin;newName=eventName=="mouseenter"?"mouseover":"mouseout"}else{if(eventName=="mousewheel"&&!Ext.supports.MouseWheel&&!Ext.isOpera){newName="DOMMouseScroll"}}return newName?{eventName:newName,normalizeFn:fn}:null},normalizeWithin:function(event){var parent=event.currentTarget,child=event.getRelatedTarget();if(parent&&parent.firstChild){while(child){if(child===parent){return false}child=child.parentNode;if(child&&(child.nodeType!==1)){child=null}}}return true},puff:function(obj){var me=this,dom=me.dom,beforeAnim,box=me.getBox(),originalStyles=me.getStyle(["width","height","left","right","top","bottom","position","z-index","font-size","opacity"],true);obj=Ext.applyIf(obj||{},{easing:"ease-out",duration:500,useDisplay:false});beforeAnim=function(){var el=Ext.fly(dom,"_anim");el.clearOpacity();el.show();this.to={width:box.width*2,height:box.height*2,x:box.x-(box.width/2),y:box.y-(box.height/2),opacity:0,fontSize:"200%"};this.on("afteranimate",function(){var el=Ext.fly(dom,"_anim");if(el){if(obj.useDisplay){el.setDisplayed(false)}else{el.hide()}el.setStyle(originalStyles);Ext.callback(obj.callback,obj.scope)}})};me.animate({duration:obj.duration,easing:obj.easing,listeners:{beforeanimate:{fn:beforeAnim}}});return me},scroll:function(direction,distance,animate){if(!this.isScrollable()){return false}direction=direction.charAt(0);var me=this,dom=me.dom,side=direction==="r"||direction==="l"?"left":"top",scrolled=false,currentScroll,constrainedScroll;if(direction==="l"||direction==="t"||direction==="u"){distance=-distance}if(side==="left"){currentScroll=dom.scrollLeft;constrainedScroll=me.constrainScrollLeft(currentScroll+distance)}else{currentScroll=dom.scrollTop;constrainedScroll=me.constrainScrollTop(currentScroll+distance)}if(constrainedScroll!==currentScroll){this.scrollTo(side,constrainedScroll,animate);scrolled=true}return scrolled},scrollBy:function(deltaX,deltaY,animate){var me=this,dom=me.dom;if(deltaX.length){animate=deltaY;deltaY=deltaX[1];deltaX=deltaX[0]}else{if(typeof deltaX!="number"){animate=deltaY;deltaY=deltaX.y;deltaX=deltaX.x}}if(deltaX){me.scrollTo("left",me.constrainScrollLeft(dom.scrollLeft+deltaX),animate)}if(deltaY){me.scrollTo("top",me.constrainScrollTop(dom.scrollTop+deltaY),animate)}return me},scrollChildIntoView:function(child,hscroll){Ext.fly(child).scrollIntoView(this,hscroll)},scrollIntoView:function(container,hscroll,animate,highlight){container=Ext.getDom(container)||Ext.getBody().dom;return this.doScrollIntoView(container,hscroll,animate,highlight,"getScrollLeft","scrollTo")},scrollTo:function(side,value,animate){var top=/top/i.test(side),me=this,prop=top?"scrollTop":"scrollLeft",dom=me.dom,animCfg;if(!animate||!me.anim){dom[prop]=value;dom[prop]=value}else{animCfg={to:{}};animCfg.to[prop]=value;if(Ext.isObject(animate)){Ext.applyIf(animCfg,animate)}me.animate(animCfg)}return me},selectable:function(){var me=this;me.dom.unselectable="";me.removeCls(Element.unselectableCls);me.addCls(Element.selectableCls);return me},setCapture:function(){var dom=this.dom;if(Ext.isIE9m&&dom.setCapture){dom.setCapture()}},setDisplayed:function(value){if(typeof value==="boolean"){value=value?getDisplay(this):NONE}this.setStyle(DISPLAY,value);return this},setHeight:function(height,animate){var me=this;if(!animate||!me.anim){arguments.callee.$previous.apply(this,arguments)}else{if(!Ext.isObject(animate)){animate={}}me.animate(Ext.applyIf({to:{height:height}},animate))}return me},setHorizontal:function(){var me=this,cls=me.verticalCls;delete me.vertical;if(cls){delete me.verticalCls;me.removeCls(cls)}delete me.setWidth;delete me.setHeight;if(!Ext.isIE8){delete me.getWidth;delete me.getHeight}delete me.styleHooks},updateText:function(text){var me=this,dom,textNode;if(dom){textNode=dom.firstChild;if(!textNode||(textNode.nodeType!==3||textNode.nextSibling)){textNode=DOC.createTextNode();me.empty();dom.appendChild(textNode)}if(text){textNode.data=text}}},setHtml:function(html,loadScripts,callback){var me=this,id,dom,interval;if(!me.dom){return me}html=html||"";dom=me.dom;if(loadScripts!==true){dom.innerHTML=html;Ext.callback(callback,me);return me}id=Ext.id();html+='';interval=Ext.interval(function(){var hd,match,attrs,srcMatch,typeMatch,el,s;if(!(el=DOC.getElementById(id))){return false}clearInterval(interval);Ext.removeNode(el);hd=Ext.getHead().dom;while((match=scriptTagRe.exec(html))){attrs=match[1];srcMatch=attrs?attrs.match(srcRe):false;if(srcMatch&&srcMatch[2]){s=DOC.createElement("script");s.src=srcMatch[2];typeMatch=attrs.match(typeRe);if(typeMatch&&typeMatch[2]){s.type=typeMatch[2]}hd.appendChild(s)}else{if(match[2]&&match[2].length>0){if(WIN.execScript){WIN.execScript(match[2])}else{WIN.eval(match[2])}}}}Ext.callback(callback,me)},20);dom.innerHTML=html.replace(replaceScriptTagRe,"");return me},setOpacity:function(opacity,animate){var me=this;if(!me.dom){return me}if(!animate||!me.anim){me.setStyle("opacity",opacity)}else{if(typeof animate!="object"){animate={duration:350,easing:"ease-in"}}me.animate(Ext.applyIf({to:{opacity:opacity}},animate))}return me},setPositioning:function(pc){return this.setStyle(pc)},setScrollLeft:function(left){this.dom.scrollLeft=left;return this},setScrollTop:function(top){this.dom.scrollTop=top;return this},setVertical:function(angle,cls){var me=this,proto=Element.prototype;me.vertical=true;if(cls){me.addCls(me.verticalCls=cls)}me.setWidth=proto.setHeight;me.setHeight=proto.setWidth;if(!Ext.isIE8){me.getWidth=proto.getHeight;me.getHeight=proto.getWidth}me.styleHooks=(angle===270)?proto.verticalStyleHooks270:proto.verticalStyleHooks90},setSize:function(width,height,animate){var me=this;if(Ext.isObject(width)){animate=height;height=width.height;width=width.width}if(!animate||!me.anim){me.dom.style.width=Element.addUnits(width);me.dom.style.height=Element.addUnits(height)}else{if(animate===true){animate={}}me.animate(Ext.applyIf({to:{width:width,height:height}},animate))}return me},setVisible:function(visible,animate){var me=this,dom=me.dom,visMode=getVisMode(me);if(typeof animate==="string"){switch(animate){case DISPLAY:visMode=Element.DISPLAY;break;case VISIBILITY:visMode=Element.VISIBILITY;break;case OFFSETS:visMode=Element.OFFSETS;break}me.setVisibilityMode(visMode);animate=false}if(!animate||!me.anim){if(visMode===Element.DISPLAY){return me.setDisplayed(visible)}else{if(visMode===Element.OFFSETS){me[visible?"removeCls":"addCls"](OFFSETCLASS)}else{if(visMode===Element.VISIBILITY){me.fixDisplay();dom.style.visibility=visible?"":HIDDEN}}}}else{if(visible){me.setOpacity(0.01);me.setVisible(true)}if(!Ext.isObject(animate)){animate={duration:350,easing:"ease-in"}}me.animate(Ext.applyIf({callback:function(){if(!visible){Ext.fly(dom).setVisible(false).setOpacity(1)}},to:{opacity:(visible)?1:0}},animate))}me.getData()[ISVISIBLE]=visible;return me},setWidth:function(width,animate){var me=this;if(!animate||!me.anim){arguments.callee.$previous.apply(this,arguments)}else{if(!Ext.isObject(animate)){animate={}}me.animate(Ext.applyIf({to:{width:width}},animate))}return me},setX:function(x,animate){return this.setXY([x,this.getY()],animate)},setXY:function(xy,animate){var me=this;if(!animate||!me.anim){arguments.callee.$previous.call(this,xy)}else{if(!Ext.isObject(animate)){animate={}}me.animate(Ext.applyIf({to:{x:xy[0],y:xy[1]}},animate))}return this},setY:function(y,animate){return this.setXY([this.getX(),y],animate)},show:function(animate){if(typeof animate==="string"){this.setVisible(true,animate);return this}this.setVisible(true,this.anim(animate));return this},slideIn:function(anchor,obj,slideOut){var me=this,dom=me.dom,elStyle=dom.style,beforeAnim,wrapAnim,restoreScroll,wrapDomParentNode;anchor=anchor||"t";obj=obj||{};beforeAnim=function(){var animScope=this,listeners=obj.listeners,el=Ext.fly(dom,"_anim"),box,originalStyles,anim,wrap;if(!slideOut){el.fixDisplay()}box=el.getBox();if((anchor=="t"||anchor=="b")&&box.height===0){box.height=dom.scrollHeight}else{if((anchor=="l"||anchor=="r")&&box.width===0){box.width=dom.scrollWidth}}originalStyles=el.getStyle(["width","height","left","right","top","bottom","position","z-index"],true);el.setSize(box.width,box.height);if(obj.preserveScroll){restoreScroll=el.cacheScrollValues()}wrap=el.wrap({role:"presentation",id:Ext.id()+"-anim-wrap-for-"+el.dom.id,style:{visibility:slideOut?"visible":"hidden"}});wrapDomParentNode=wrap.dom.parentNode;wrap.setPositioning(el.getPositioning(true));if(wrap.isStyle("position","static")){wrap.position("relative")}el.clearPositioning("auto");wrap.clip();if(restoreScroll){restoreScroll()}el.setStyle({visibility:"",position:"absolute"});if(slideOut){wrap.setSize(box.width,box.height)}switch(anchor){case"t":anim={from:{width:box.width+"px",height:"0px"},to:{width:box.width+"px",height:box.height+"px"}};elStyle.bottom="0px";break;case"l":anim={from:{width:"0px",height:box.height+"px"},to:{width:box.width+"px",height:box.height+"px"}};me.anchorAnimX(anchor);break;case"r":anim={from:{x:box.x+box.width,width:"0px",height:box.height+"px"},to:{x:box.x,width:box.width+"px",height:box.height+"px"}};me.anchorAnimX(anchor);break;case"b":anim={from:{y:box.y+box.height,width:box.width+"px",height:"0px"},to:{y:box.y,width:box.width+"px",height:box.height+"px"}};break;case"tl":anim={from:{x:box.x,y:box.y,width:"0px",height:"0px"},to:{width:box.width+"px",height:box.height+"px"}};elStyle.bottom="0px";me.anchorAnimX("l");break;case"bl":anim={from:{y:box.y+box.height,width:"0px",height:"0px"},to:{y:box.y,width:box.width+"px",height:box.height+"px"}};me.anchorAnimX("l");break;case"br":anim={from:{x:box.x+box.width,y:box.y+box.height,width:"0px",height:"0px"},to:{x:box.x,y:box.y,width:box.width+"px",height:box.height+"px"}};me.anchorAnimX("r");break;case"tr":anim={from:{x:box.x+box.width,width:"0px",height:"0px"},to:{x:box.x,width:box.width+"px",height:box.height+"px"}};elStyle.bottom="0px";me.anchorAnimX("r");break}wrap.show();wrapAnim=Ext.apply({},obj);delete wrapAnim.listeners;wrapAnim=new Ext.fx.Anim(Ext.applyIf(wrapAnim,{target:wrap,duration:500,easing:"ease-out",from:slideOut?anim.to:anim.from,to:slideOut?anim.from:anim.to}));wrapAnim.on("afteranimate",function(){var el=Ext.fly(dom,"_anim");el.setStyle(originalStyles);if(slideOut){if(obj.useDisplay){el.setDisplayed(false)}else{el.hide()}}if(wrap.dom){if(wrap.dom.parentNode){wrap.dom.parentNode.insertBefore(el.dom,wrap.dom)}else{wrapDomParentNode.appendChild(el.dom)}wrap.destroy()}if(restoreScroll){restoreScroll()}animScope.end()});if(listeners){wrapAnim.on(listeners)}};me.animate({duration:obj.duration?Math.max(obj.duration,500)*2:1000,listeners:{beforeanimate:beforeAnim}});return me},slideOut:function(anchor,o){return this.slideIn(anchor,o,true)},swallowEvent:function(eventName,preventDefault){var me=this,e,eLen,fn=function(e){e.stopPropagation();if(preventDefault){e.preventDefault()}};if(Ext.isArray(eventName)){eLen=eventName.length;for(e=0;e=0)?true:false}else{return hasIdx&&idx>=0?true:false}}}else{if(editable||tabbableRe.test(tag)||(Ext.isIE8&&tag==="OBJECT")){return hasIdx&&idx<0?false:true}else{if(hasIdx&&idx>=0){return true}}}return false},selectTabbableElements:function(asDom,selector,limit,backward){var selection,nodes,node,el,i,len,to,step;asDom=asDom!=undefined?asDom:true;nodes=this.dom.querySelectorAll(selector||tabbableSelector);len=nodes.length;if(!len){return nodes}if(backward){i=len-1;to=0;step=-1}else{i=0;to=len-1;step=1}selection=[];for(;;i+=step){if((step>0&&i>to)||(step<0&&i=limit){return selection}}return selection},selectFirstTabbableElement:function(asDom,selector){var els=this.selectTabbableElements(asDom,selector,1,false);return els[0]},selectLastTabbableElement:function(asDom,selector){var els=this.selectTabbableElements(asDom,selector,1,true);return els[0]},saveTabbableState:function(attribute){var dom=this.dom;if(dom.hasAttribute(tabbableSavedFlagAttribute)){return}attribute=attribute||tabbableSavedAttribute;if(dom.hasAttribute("tabindex")){dom.setAttribute(attribute,dom.getAttribute("tabindex"))}else{dom.setAttribute(attribute,"none")}dom.setAttribute("tabindex",-1);dom.setAttribute(tabbableSavedFlagAttribute,true);return this},restoreTabbableState:function(attribute){var dom=this.dom,idx;attribute=attribute||tabbableSavedAttribute;if(!dom.hasAttribute(tabbableSavedFlagAttribute)||!dom.hasAttribute(attribute)){return}idx=dom.getAttribute(attribute);if(idx==="none"){dom.removeAttribute("tabindex")}else{dom.setAttribute("tabindex",idx)}dom.removeAttribute(attribute);dom.removeAttribute(tabbableSavedFlagAttribute);return this},saveChildrenTabbableState:function(attribute){var children,child,i,len;if(this.dom){children=this.selectTabbableElements();for(i=0,len=children.length;i=0&&d<1){d*=100;a.filter=c+(c.length?" ":"")+"alpha(opacity="+d+")"}else{a.filter=c}}})}if(!E.matchesSelector){var P=/^([a-z]+|\*)?(?:\.([a-z][a-z\-_0-9]*))?$/i,O=/\-/g,Y,D=function(a,c){var b=new RegExp("(?:^|\\s+)"+c.replace(O,"\\-")+"(?:\\s+|$)");if(a&&a!=="*"){a=a.toUpperCase();return function(d){return d.tagName===a&&b.test(d.className)}}return function(d){return b.test(d.className)}},H=function(a){a=a.toUpperCase();return function(b){return b.tagName===a}},M={};J.matcherCache=M;J.is=function(d){if(!d){return true}var c=this.dom,f,a,g,h,j,b,e;if(c.nodeType!==1){return false}if(!(g=Ext.isFunction(d)?d:M[d])){if(!(a=d.match(P))){h=c.parentNode;if(!h){j=true;h=Y||(Y=X.createDocumentFragment());Y.appendChild(c)}b=Ext.Array.indexOf(Ext.fly(h,"_is").query(d),c)!==-1;if(j){Y.removeChild(c)}return b}e=a[1];f=a[2];M[d]=g=f?D(e,f):H(e)}return g(c)}}if(!N||!N.getComputedStyle){J.getStyle=function(g,n){var m=this,r=m.dom,e=typeof g!=="string",b=g,l=b,o=1,a=n,c=m.styleHooks,f,p,h,j,s,d,q;if(e){h={};b=l[0];q=0;if(!(o=l.length)){return h}}if(!r||r.documentElement){return h||""}p=r.style;if(n){d=p}else{d=r.currentStyle;if(!d){a=true;d=p}}do{j=c[b];if(!j){c[b]=j={name:I.normalize(b)}}if(j.get){s=j.get(r,m,a,d)}else{f=j.name;s=d[f]}if(!e){return s}h[b]=s;b=l[++q]}while(q=9)){J.getAttribute=function(a,c){var b=this.dom,d;if(c){d=typeof b[c+":"+a];if(d!="undefined"&&d!="unknown"){return b[c+":"+a]||null}return null}if(a==="for"){a="htmlFor"}return b[a]||null}}Ext.onReady(function(){var a=/^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,c=[],m=J.setWidth,l=J.setHeight,f=J.setSize,e=/^\d+(?:\.\d*)?px$/i,n,p,d,g;if(E.FixedTableWidthBug){k.width={name:"width",set:function(r,s,u){var v=r.style,w=u._needsTableWidthFix,t=v.display;if(w){v.display="none"}v.width=s;if(w){r.scrollWidth;v.display=t}}};J.setWidth=function(u,w){var s=this,r=s.dom,v=r.style,x=s._needsTableWidthFix,t=v.display;if(x&&!w){v.display="none"}m.call(s,u,w);if(x&&!w){r.scrollWidth;v.display=t}return s};J.setSize=function(u,x,w){var s=this,r=s.dom,v=r.style,y=s._needsTableWidthFix,t=v.display;if(y&&!w){v.display="none"}f.call(s,u,x,w);if(y&&!w){r.scrollWidth;v.display=t}return s}}if(Ext.isIE8){k.height={name:"height",set:function(r,s,u){var v=u.component,t,w;if(v&&v._syncFrameHeight&&this===v.el){w=v.frameBody.dom.style;if(e.test(s)){t=v.getFrameInfo();if(t){w.height=(parseInt(s,10)-t.height)+"px"}}else{if(!s||s==="auto"){w.height=""}}}r.style.height=s}};J.setHeight=function(v,t){var s=this.component,r,u;if(s&&s._syncFrameHeight&&this===s.el){u=s.frameBody.dom.style;if(!v||v==="auto"){u.height=""}else{r=s.getFrameInfo();if(r){u.height=(v-r.height)+"px"}}}return l.call(this,v,t)};J.setSize=function(s,w,u){var t=this.component,r,v;if(t&&t._syncFrameHeight&&this===t.el){v=t.frameBody.dom.style;if(!w||w==="auto"){v.height=""}else{r=t.getFrameInfo();if(r){v.height=(w-r.height)+"px"}}}return f.call(this,s,w,u)}}Ext.getDoc().on("selectstart",function(s,r){var t=I.selectableCls,u=I.unselectableCls,w=r&&r.tagName;w=w&&w.toLowerCase();if(w==="input"||w==="textarea"){return}while(r&&r.nodeType===1&&r!==X.documentElement){var v=Ext.fly(r);if(v.hasCls(t)){return}if(v.hasCls(u)){s.stopEvent();return}r=r.parentNode}});function o(r,u,s,v){var t=v[this.name]||"";return a.test(t)?"transparent":t}function h(s,r,t){return function(){s.selectionStart=r;s.selectionEnd=t}}function j(t){var v=E.DisplayChangeInputSelectionBug,u=E.DisplayChangeTextAreaSelectionBug,s,x,r,w;if(v||u){s=I.getActiveElement();x=s&&s.tagName;if((u&&x==="TEXTAREA")||(v&&x==="INPUT"&&s.type==="text")){if(Ext.fly(t).isAncestor(s)){r=s.selectionStart;w=s.selectionEnd;if(Ext.isNumber(r)&&Ext.isNumber(w)){return h(s,r,w)}}}}return Ext.emptyFn}function q(r,u,s,v){var x=v.marginRight,w,t;if(x!=="0px"){w=r.style;t=w.display;w.display="inline-block";x=(s?v:r.ownerDocument.defaultView.getComputedStyle(r,null)).marginRight;w.display=t}return x}function b(r,u,s,v){var y=v.marginRight,w,x,t;if(y!=="0px"){w=r.style;x=j(r);t=w.display;w.display="inline-block";y=(s?v:r.ownerDocument.defaultView.getComputedStyle(r,"")).marginRight;w.display=t;x()}return y}if(!E.RightMargin){k.marginRight=k["margin-right"]={name:"marginRight",get:(E.DisplayChangeInputSelectionBug||E.DisplayChangeTextAreaSelectionBug)?b:q}}if(!E.TransparentColor){n=["background-color","border-color","color","outline-color"];for(p=n.length;p--;){d=n[p];g=I.normalize(d);k[d]=k[g]={name:g,get:o}}}J.verticalStyleHooks90=T=Ext.Object.chain(k);J.verticalStyleHooks270=L=Ext.Object.chain(k);T.width=k.height||{name:"height"};T.height=k.width||{name:"width"};T["margin-top"]={name:"marginLeft"};T["margin-right"]={name:"marginTop"};T["margin-bottom"]={name:"marginRight"};T["margin-left"]={name:"marginBottom"};T["padding-top"]={name:"paddingLeft"};T["padding-right"]={name:"paddingTop"};T["padding-bottom"]={name:"paddingRight"};T["padding-left"]={name:"paddingBottom"};T["border-top"]={name:"borderLeft"};T["border-right"]={name:"borderTop"};T["border-bottom"]={name:"borderRight"};T["border-left"]={name:"borderBottom"};L.width=k.height||{name:"height"};L.height=k.width||{name:"width"};L["margin-top"]={name:"marginRight"};L["margin-right"]={name:"marginBottom"};L["margin-bottom"]={name:"marginLeft"};L["margin-left"]={name:"marginTop"};L["padding-top"]={name:"paddingRight"};L["padding-right"]={name:"paddingBottom"};L["padding-bottom"]={name:"paddingLeft"};L["padding-left"]={name:"paddingTop"};L["border-top"]={name:"borderRight"};L["border-right"]={name:"borderBottom"};L["border-bottom"]={name:"borderLeft"};L["border-left"]={name:"borderTop"};if(!Ext.scopeCss){c.push(Ext.baseCSSPrefix+"body")}if(E.Touch){c.push(Ext.baseCSSPrefix+"touch")}if(Ext.isIE&&Ext.isIE9m){c.push(Ext.baseCSSPrefix+"ie",Ext.baseCSSPrefix+"ie9m");c.push(Ext.baseCSSPrefix+"ie8p");if(Ext.isIE8){c.push(Ext.baseCSSPrefix+"ie8")}else{c.push(Ext.baseCSSPrefix+"ie9",Ext.baseCSSPrefix+"ie9p")}if(Ext.isIE8m){c.push(Ext.baseCSSPrefix+"ie8m")}}if(Ext.isIE10){c.push(Ext.baseCSSPrefix+"ie10")}if(Ext.isIE11){c.push(Ext.baseCSSPrefix+"ie11")}if(Ext.isGecko){c.push(Ext.baseCSSPrefix+"gecko")}if(Ext.isOpera){c.push(Ext.baseCSSPrefix+"opera")}if(Ext.isOpera12m){c.push(Ext.baseCSSPrefix+"opera12m")}if(Ext.isWebKit){c.push(Ext.baseCSSPrefix+"webkit")}if(Ext.isSafari){c.push(Ext.baseCSSPrefix+"safari")}if(Ext.isChrome){c.push(Ext.baseCSSPrefix+"chrome")}if(Ext.isMac){c.push(Ext.baseCSSPrefix+"mac")}if(Ext.isLinux){c.push(Ext.baseCSSPrefix+"linux")}if(!E.CSS3BorderRadius){c.push(Ext.baseCSSPrefix+"nbr")}if(!E.CSS3LinearGradient){c.push(Ext.baseCSSPrefix+"nlg")}if(E.Touch){c.push(Ext.baseCSSPrefix+"touch")}Ext.getBody().addCls(c)},null,{priority:1500})});Ext.define("Ext.overrides.GlobalEvents",{override:"Ext.GlobalEvents",attachListeners:function(){this.callParent();Ext.getDoc().on("mousedown",this.fireMouseDown,this)},fireMouseDown:function(b){this.fireEvent("mousedown",b)},deprecated:{5:{methods:{addListener:function(m,k,l,g){var h,j;if(m==="ready"){j=k}else{if(typeof m!=="string"){for(h in m){if(h==="ready"){j=m[h]}}}}if(j){Ext.onReady(j)}this.callParent([m,k,l,g])}}}}});Ext.USE_NATIVE_JSON=false;Ext.JSON=(new (function(){var me=this,hasNative=window.JSON&&JSON.toString()=="[object JSON]",useHasOwn=!!{}.hasOwnProperty,pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return eval("("+json+")")},doEncode=function(o,newline){if(o===null||o===undefined){return"null"}else{if(Ext.isDate(o)){return me.encodeDate(o)}else{if(Ext.isString(o)){if(Ext.isMSDate(o)){return me.encodeMSDate(o)}else{return me.encodeString(o)}}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{if(o.toJSON){return o.toJSON()}else{if(Ext.isArray(o)){return encodeArray(o,newline)}else{if(Ext.isObject(o)){return encodeObject(o,newline)}else{if(typeof o==="function"){return"null"}}}}}}}}}return"undefined"},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\","\v":"\\u000b"},charToReplace=/[\\\"\x00-\x1f\x7f-\uffff]/g,encodeString=function(s){return'"'+s.replace(charToReplace,function(a){var c=m[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"'},encodeMSDate=function(o){return'"'+o+'"'},encodeArrayPretty=function(o,newline){var len=o.length,cnewline=newline+" ",sep=","+cnewline,a=["[",cnewline],i;for(i=0;i]+>/gi,stripScriptsRe:/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,nl2brRe:/\r?\n/g,hashRe:/#+$/,allHashes:/^#+$/,formatPattern:/[\d,\.#]+/,formatCleanRe:/[^\d\.#]/g,I18NFormatCleanRe:null,formatFns:{},constructor:function(){b=this},undef:function(a){return a!==undefined?a:""},defaultValue:function(d,a){return d!==undefined&&d!==""?d:a},substr:"ab".substr(-1)!="b"?function(h,f,a){var g=String(h);return(f<0)?g.substr(Math.max(g.length+f,0),a):g.substr(f,a)}:function(f,e,a){return String(f).substr(e,a)},lowercase:function(a){return String(a).toLowerCase()},uppercase:function(a){return String(a).toUpperCase()},usMoney:function(a){return b.currency(a,"$",2)},currency:function(n,l,o,a){var j="",k=",0",m=0;n=n-0;if(n<0){n=-n;j="-"}o=Ext.isDefined(o)?o:b.currencyPrecision;k+=(o>0?".":"");for(;mf){a=a.substring(a.length-f)}}while(a.length2){}else{if(u.length===2){x=u[1].length;q=u[1].match(b.hashRe);if(q){w=q[0].length;A='trailingZeroes=new RegExp(Ext.String.escapeRegex(utilFormat.decimalSeparator) + "*0{0,'+w+'}$")'}}}C=["var utilFormat=Ext.util.Format,extNumber=Ext.Number,neg,absVal,fnum,parts"+(B?",thousandSeparator,thousands=[],j,n,i":"")+(t?',formatString="'+y+'",formatPattern=/[\\d,\\.#]+/':"")+',trailingZeroes;return function(v){if(typeof v!=="number"&&isNaN(v=extNumber.from(v,NaN)))return"";neg=v<0;',"absVal=Math.abs(v);","fnum=Ext.Number.toFixed(absVal, "+x+");",A,";"];if(B){if(x){C[C.length]='parts=fnum.split(".");';C[C.length]="fnum=parts[0];"}C[C.length]="if(absVal>=1000) {";C[C.length]="thousandSeparator=utilFormat.thousandSeparator;thousands.length=0;j=fnum.length;n=fnum.length%3||3;for(i=0;i")},capitalize:Ext.String.capitalize,uncapitalize:Ext.String.uncapitalize,ellipsis:Ext.String.ellipsis,escape:Ext.String.escape,escapeRegex:Ext.String.escapeRegex,htmlDecode:Ext.String.htmlDecode,htmlEncode:Ext.String.htmlEncode,leftPad:Ext.String.leftPad,toggle:Ext.String.toggle,trim:Ext.String.trim,parseBox:function(f){f=f||0;if(typeof f==="number"){return{top:f,right:f,bottom:f,left:f}}var e=f.split(" "),a=e.length;if(a===1){e[1]=e[2]=e[3]=e[0]}else{if(a===2){e[2]=e[0];e[3]=e[1]}else{if(a===3){e[3]=e[1]}}}return{top:parseInt(e[0],10)||0,right:parseInt(e[1],10)||0,bottom:parseInt(e[2],10)||0,left:parseInt(e[3],10)||0}}}},1,0,0,0,0,0,[Ext.util,"Format"],0));(Ext.cmd.derive("Ext.Template",Ext.Base,{inheritableStatics:{from:function(c,d){c=Ext.getDom(c);return new this(c.value||c.innerHTML,d||"")}},useEval:Ext.isGecko,constructor:function(n){var l=this,h=arguments,j=[],o,m=h.length,k;l.initialConfig={};if(m===1&&Ext.isArray(n)){h=n;m=h.length}if(m>1){for(o=0;o','
{parent.baseCls}-{parent.ui}-{.}-tl{frameElCls}" role="presentation">','
{parent.baseCls}-{parent.ui}-{.}-tr{frameElCls}" role="presentation">','
{parent.baseCls}-{parent.ui}-{.}-tc{frameElCls}" role="presentation">
','
','
',"",'
{parent.baseCls}-{parent.ui}-{.}-ml{frameElCls}" role="presentation">','
{parent.baseCls}-{parent.ui}-{.}-mr{frameElCls}" role="presentation">','
{parent.baseCls}-{parent.ui}-{.}-mc{frameElCls}" role="presentation">',"{%this.applyRenderTpl(out, values)%}","
",'
','
','','
{parent.baseCls}-{parent.ui}-{.}-bl{frameElCls}" role="presentation">','
{parent.baseCls}-{parent.ui}-{.}-br{frameElCls}" role="presentation">','
{parent.baseCls}-{parent.ui}-{.}-bc{frameElCls}" role="presentation">
','
','
',"
","{%this.renderDockedItems(out,values,1);%}"],frameTableTpl:["{%this.renderDockedItems(out,values,0);%}",'','','','','','',"","",'','','",'',"",'','','','','',"","","","{%this.renderDockedItems(out,values,1);%}"],_renderState:0,statics:{makeRenderSetter:function(e,f){var d=e.name;return function(c){var h=this,a=(h.renderConfigs||(h.renderConfigs={})),b=a[f];if(h._renderState>=f){(e.setter||e.getSetter()).call(h,c)}else{if(!b){a[f]=b={}}if(!(d in b)){b[d]=h[d]}h[d]=c}return h}},processRenderConfig:function(y,o,w){var s=this.prototype,u=this.getConfigurator(),n=Ext.util.Renderable,p=n.makeRenderSetter,v=y[o],r,q,x,t;for(x in v){q=Ext.Config.get(x);if(!s[t=q.names.set]){r=(q.renderSetter||(q.renderSetter={}));s[t]=r[w]||(r[w]=p(q,w))}}delete y[o];u.add(v)}},onClassMixedIn:function(k){var g=k.override,h=this.processRenderConfig,j=function(a){if(a.beforeRenderConfig){this.processRenderConfig(a,"beforeRenderConfig",1)}if(a.renderConfig){this.processRenderConfig(a,"renderConfig",3)}g.call(this,a)},f=function(a,b){a.override=j;a.processRenderConfig=h;if(b.beforeRenderConfig){a.processRenderConfig(b,"beforeRenderConfig",1)}if(b.renderConfig){a.processRenderConfig(b,"renderConfig",3)}};f(k,k.prototype);k.onExtended(f)},afterRender:function(){var q=this,o={},l=q.protoEl,m=q.el,j,n,p,k;q.finishRenderChildren();q._renderState=4;if(q.contentEl){n=Ext.baseCSSPrefix;p=n+"hidden-";k=Ext.get(q.contentEl);k.component=q;k.removeCls([n+"hidden",p+"display",p+"offsets"]);q.getContentTarget().appendChild(k.dom)}l.writeTo(o);j=o.removed;if(j){m.removeCls(j)}j=o.cls;if(j.length){m.addCls(j)}j=o.style;if(o.style){m.setStyle(j)}q.protoEl=null;if(!q.ownerCt){q.updateLayout()}if(!(q.x&&q.y)&&(q.pageX||q.pageY)){q.setPagePosition(q.pageX,q.pageY)}if(q.disableOnRender){q.onDisable()}else{if(q.enableOnRender){q.onEnable()}}if(Ext.enableAria){q.ariaApplyAfterRenderAttributes()}},afterFirstLayout:function(u,n){var s=this,o=s.x,q=s.y,t,v,p,m,r=s.defaultAlign,w=s.alignOffset;if(!s.ownerLayout){t=o!==undefined;v=q!==undefined}if(s.floating&&(!t||!v)){if(s.floatParent){p=s.floatParent.getTargetEl().getViewRegion();m=s.el.getAlignToXY(s.alignTarget||s.floatParent.getTargetEl(),r,w);p.x=m[0]-p.x;p.y=m[1]-p.y}else{m=s.el.getAlignToXY(s.alignTarget||s.container,r,w);p=s.container.translateXY(m[0],m[1])}o=t?o:p.x;q=v?q:p.y;t=v=true}if(t||v){s.setPosition(o,q)}s.onBoxReady(u,n)},beforeRender:function(){var h=this,g=h.floating,e=h.getComponentLayout(),f;h._renderState=1;h.initBindable();if(h.renderConfigs){h.flushRenderConfigs()}if(h.reference){h.publishState()}if(g){h.addCls(Ext.baseCSSPrefix+"layer");f=g.cls;if(f){h.addCls(f)}}h.frame=h.frame||h.alwaysFramed;if(!e.initialized){e.initLayout()}h.initOverflow();h.setUI(h.ui);if(h.disabled){h.disable(true)}},doApplyRenderTpl:function(h,f){var g=f.$comp,e;if(!g.rendered){e=g.initRenderTpl();e.applyOut(f.renderData,h)}},getElConfig:function(){var l=this,j=l.autoEl,m=l.getFrameInfo(),h={tag:"div",tpl:m?l.initFramingTpl(m.table):l.initRenderTpl()},k=l.protoEl,g;l.initStyles(k);k.writeTo(h);k.flush();if(Ext.isString(j)){h.tag=j}else{Ext.apply(h,j)}if(Ext.enableAria&&l.ariaRenderAttributesToElement){Ext.apply(h,l.ariaGetRenderAttributes())}h.id=l.id;if(h.tpl){if(m){h.tplData=g=l.getFrameRenderData();g.renderData=l.initRenderData()}else{h.tplData=l.initRenderData()}}return h},getInsertPosition:function(b){if(b!==undefined){if(Ext.isNumber(b)){b=this.container.dom.childNodes[b]}else{b=Ext.getDom(b)}}return b},getRenderTree:function(){var c=this,d=null;if(!c.hasListeners.beforerender||c.fireEvent("beforerender",c)!==false){c._renderState=1;c.beforeRender();c.rendering=true;c._renderState=2;d=c.getElConfig();if(c.el){d.id=c.$pid=Ext.id(null,c.el.identifiablePrefix)}}return d},initRenderData:function(){var b=this;return Ext.apply({$comp:b,id:b.id,ui:b.ui,uiCls:b.uiCls,baseCls:b.baseCls,componentCls:b.componentCls,frame:b.frame,renderScroller:b.touchScroll,scrollerCls:b.scrollerCls,role:b.ariaRole,childElCls:""},b.renderData)},onRender:function(p,o){var n=this,l=n.x,m=n.y,q=null,r=n.el,s,k;n.applyRenderSelectors();n.rendering=null;n.rendered=true;n._renderState=3;if(n.renderConfigs){n.flushRenderConfigs()}if(l!=null){q={x:l}}if(m!=null){(q=q||{}).y=m}if(!n.getFrameInfo()){s=n.width;k=n.height;if(typeof s==="number"){q=q||{};q.width=s}if(typeof k==="number"){q=q||{};q.height=k}}if(n.touchScroll===1){n.getOverflowEl().disableTouchScroll()}n.lastBox=r.lastBox=q},render:function(q,j){var o=this,p=o.el,l=o.ownerLayout,m,k,n;if(p&&!p.isElement){o.el=p=o.wrapPrimaryEl(p)}Ext.suspendLayouts();q=o.initContainer(q);n=o.getInsertPosition(j);if(!p){k=o.getRenderTree();if(l&&l.transformItemRenderTree){k=l.transformItemRenderTree(k)}if(k){if(n){p=Ext.DomHelper.insertBefore(n,k)}else{p=Ext.DomHelper.append(q,k)}o.wrapPrimaryEl(p);o.cacheRefEls(p)}}else{if(!o.hasListeners.beforerender||o.fireEvent("beforerender",o)!==false){o.beforeRender();o.needsRenderTpl=o.rendering=true;o._renderState=2;o.initStyles(p);if(o.allowDomMove!==false){if(n){q.dom.insertBefore(p.dom,n)}else{q.dom.appendChild(p.dom)}}}else{m=true}}if(p&&!m){o.finishRender(j)}Ext.resumeLayouts(!o.hidden&&!q.isDetachedBody)},ensureAttachedToBody:function(f){var d=this,e;while(d.ownerCt){d=d.ownerCt}if(d.container.isDetachedBody){d.container=e=Ext.getBody();e.appendChild(d.el.dom);if(f){d.updateLayout()}if(typeof d.x=="number"||typeof d.y=="number"){d.setPosition(d.x,d.y)}}},privates:{applyRenderSelectors:function(){var j=this,f=j.renderSelectors,k=j.el,h,g;j.attachChildEls(k);if(f){for(g in f){h=f[g];if(h){j[g]=k.selectNode(h,false)}}}},cacheRefEls:function(o){o=o||this.el;var q=Ext.cache,m=Ext.dom.Element,l=o.isElement?o.dom:o,j=l.querySelectorAll("[data-ref]"),k=j.length,n,p;for(p=0;p','
',"","{%this.renderContent(out,values)%}",'
'],resizeHandles:"all",shrinkWrap:2,toFrontOnShow:true,synthetic:false,tplWriteMode:"overwrite",ui:"default",uiCls:[],weight:null,allowDomMove:true,autoGenId:false,borderBoxCls:Ext.baseCSSPrefix+"border-box",componentLayoutCounter:0,contentPaddingProperty:"padding",deferLayouts:false,frameSize:null,horizontalPosProp:"left",isComponent:true,_isLayoutRoot:false,layoutSuspendCount:0,liquidLayout:false,maskOnDisable:true,offsetsCls:Ext.baseCSSPrefix+"hidden-offsets",rendered:false,rootCls:Ext.baseCSSPrefix+"body",scrollerCls:Ext.baseCSSPrefix+"touch-scroller",scrollerSelector:"."+Ext.baseCSSPrefix+"touch-scroller",validIdRe:Ext.validIdRe,constructor:function(l){var j=this,k,h,m,g;l=l||{};if(l.initialConfig){if(l.isAction){j.baseAction=l}l=l.initialConfig}else{if(l.tagName||l.dom||Ext.isString(l)){l={applyTo:l,id:l.id||l}}}j.initialConfig=l;j.getId();j.protoEl=new Ext.util.ProtoElement();j.initConfig(l);m=j.xhooks;if(m){delete j.xhooks;Ext.override(j,m)}j.mixins.elementCt.constructor.call(j);j.setupProtoEl();if(j.cls){j.initialCls=j.cls;j.protoEl.addCls(j.cls)}if(j.style){j.initialStyle=j.style;j.protoEl.setStyle(j.style)}j.renderData=j.renderData||{};j.initComponent();if(!j.preventRegister){Ext.ComponentManager.register(j)}j.mixins.state.constructor.call(j);j.addStateEvents("resize");g=j.getController();if(g){g.init(j)}if(j.plugins){for(k=0,h=j.plugins.length;kG){w=C;z=true}if(F&&K>x){A=K;z=true}if(B||F){D=h.el.getStyle("overflow");if(D!=="hidden"){h.el.setStyle("overflow","hidden")}}if(z){J=!Ext.isNumber(h.width);u=!Ext.isNumber(h.height);h.setSize(A,w);h.el.setSize(x,G);if(J){delete h.width}if(u){delete h.height}}if(F){H.width=K}if(B){H.height=C}}E=h.constrain;y=h.constrainHeader;if(E||y){h.constrain=h.constrainHeader=false;v=I.callback;I.callback=function(){h.constrain=E;h.constrainHeader=y;if(v){v.call(I.scope||h,arguments)}if(D!=="hidden"){h.el.setStyle("overflow",D)}}}return h.mixins.animate.animate.apply(h,arguments)},beforeComponentLayout:function(){return true},beforeDestroy:Ext.emptyFn,beforeLayout:function(){if(this.floating){this.onBeforeFloatLayout()}},beforeSetPosition:function(k,m,r){var n=this,l=null,p,q,s,o;if(k){if(Ext.isNumber(p=k[0])){r=m;m=k[1];k=p}else{if((p=k.x)!==undefined){r=m;m=k.y;k=p}}}if(n.constrain||n.constrainHeader){l=n.calculateConstrainedPosition(null,[k,m],true);if(l){k=l[0];m=l[1]}}q=(k!==undefined);s=(m!==undefined);if(q||s){n.x=k;n.y=m;o=n.adjustPosition(k,m);l={x:o.x,y:o.y,anim:r,hasX:q,hasY:s}}return l},beforeShow:Ext.emptyFn,bubble:function(h,e,f){var g=this;while(g){if(h.apply(e||g,f||[g])===false){break}g=g.getBubbleTarget()}return this},cloneConfig:function(h){h=h||{};var g=h.id||Ext.id(),f=Ext.applyIf(h,this.initialConfig),e;f.id=g;e=Ext.getClass(this);return new e(f)},destroy:function(){var l=this,o=l.renderSelectors,h=l.getConfig("viewModel",true),k=l.getConfig("session",true),j,m,n;if(!l.isDestroyed){if(!l.hasListeners.beforedestroy||l.fireEvent("beforedestroy",l)!==false){l.destroying=true;m=l.floatParent||l.ownerCt;if(l.floating){delete l.floatParent;if(l.zIndexManager){l.zIndexManager.unregister(l);l.zIndexManager=null}}l.removeBindings();l.beforeDestroy();if(h&&h.isViewModel){h.destroy();l.viewModel=null}if(k&&k.isSession){if(k.getAutoDestroy()){k.destroy()}l.session=null}if(m&&m.remove){m.remove(l,false)}l.stopAnimation();l.onDestroy();Ext.destroy(l.plugins);l.componentLayout=null;if(l.hasListeners.destroy){l.fireEvent("destroy",l)}if(!l.preventRegister){Ext.ComponentManager.unregister(l)}l.mixins.state.destroy.call(l);l.clearListeners();if(l.rendered){if(!l.preserveElOnDestroy){l.el.destroy()}l.mixins.elementCt.destroy.call(l);if(o){for(j in o){if(o.hasOwnProperty(j)){n=l[j];if(n){delete l[j];n.destroy()}}}}l.data=l.el=l.frameBody=l.rendered=null}l.destroying=false;l.isDestroyed=true}}},disable:function(d){var f=this,e=f.focusableContainer;f.enableOnRender=false;f.addCls(f.disabledCls);if(f.rendered){f.onDisable()}else{f.disableOnRender=true}f.disabled=true;if(d!==true){delete f.resetDisable;f.fireEvent("disable",f)}if(e){e.onFocusableChildDisable(f)}return f},enable:function(d){var f=this,e=f.focusableContainer;f.disableOnRender=false;f.removeCls(f.disabledCls);if(f.rendered){f.onEnable()}else{f.enableOnRender=true}f.disabled=false;delete f.resetDisable;if(d!==true){f.fireEvent("enable",f)}if(e){e.onFocusableChildEnable(f)}return f},findParentBy:function(d){var c;for(c=this.getRefOwner();c&&!d(c,this);c=c.getRefOwner()){}return c||null},findParentByType:function(b){return Ext.isFunction(b)?this.findParentBy(function(a){return a.constructor===b}):this.up(b)},findPlugin:function(g){var e,f=this.plugins,h=f&&f.length;for(e=0;e-1;o--){q=n[o];if(q.query){k=q.query(j);k=k[k.length-1];if(k){return k}}if(q.is(j)){return q}}return m.previousNode(j,true)}return null},previousSibling:function(c){var j=this.ownerCt,k,g,h;if(j){k=j.items;g=k.indexOf(this);if(g!=-1){if(c){for(--g;g>=0;g--){if((h=k.getAt(g)).is(c)){return h}}}else{if(g){return k.getAt(--g)}}}}return null},registerFloatingItem:function(c){var d=this;if(!d.floatingDescendants){d.floatingDescendants=new Ext.ZIndexManager(d)}d.floatingDescendants.register(c)},removeCls:function(e){var f=this,d=f.rendered?f.el:f.protoEl;d.removeCls.apply(d,arguments);return f},removeClsWithUI:function(t,n){var o=this,p=[],r=0,w=Ext.Array,q=w.remove,s=o.uiCls=w.clone(o.uiCls),u=o.activeUI,v,m;if(typeof t==="string"){t=(t.indexOf(" ")<0)?[t]:Ext.String.splitWords(t)}v=t.length;for(r=0;r1){j.overflowY=g||""}}if(j.rendered){j.getOverflowEl().setStyle(j.getOverflowStyle())}(k||j).updateLayout();return j},setPagePosition:function(h,j,g){var m=this,l,k;if(Ext.isArray(h)){j=h[1];h=h[0]}m.pageX=h;m.pageY=j;if(m.floating){if(m.isContainedFloater()){k=m.floatParent.getTargetEl().getViewRegion();if(Ext.isNumber(h)&&Ext.isNumber(k.left)){h-=k.left}if(Ext.isNumber(j)&&Ext.isNumber(k.top)){j-=k.top}}else{l=m.el.translateXY(h,j);h=l.x;j=l.y}m.setPosition(h,j,g)}else{l=m.el.translateXY(h,j);m.setPosition(l.x,l.y,g)}return m},setPosition:function(g,h,f){var k=this,j=k.beforeSetPosition.apply(k,arguments);if(j&&k.rendered){g=j.x;h=j.y;if(f){if(g!==k.getLocalX()||h!==k.getLocalY()){k.stopAnimation();k.animate(Ext.apply({duration:1000,listeners:{afteranimate:Ext.Function.bind(k.afterSetPosition,k,[g,h])},to:{left:g,top:h}},f))}}else{k.setLocalXY(g,h);k.afterSetPosition(g,h)}}return k},setScrollX:function(e){var d=this,f=d.scrollManager;if(f){f.scrollTo(e,f.getPosition().y)}else{d.setScrollLeft(e)}},setScrollY:function(f){var e=this,d=e.scrollManager;if(d){d.scrollTo(d.getPosition().x,f)}else{e.getOverflowEl().setScrollTop(f)}},setSize:function(d,e){var f=this;if(d&&typeof d=="object"){e=d.height;d=d.width}if(typeof d=="number"){f.width=Ext.Number.constrain(d,f.minWidth,f.maxWidth)}else{if(d===null){delete f.width}}if(typeof e=="number"){f.height=Ext.Number.constrain(e,f.minHeight,f.maxHeight)}else{if(e===null){delete f.height}}if(f.rendered&&f.isVisible()){if(f.liquidLayout){f.el.setSize(f.width,f.height)}f.updateLayout(f._notAsLayoutRoot)}return f},setStyle:function(g,h){var e=this,f=e.el||e.protoEl;f.setStyle(g,h);return e},setUI:function(k){var f=this,h=f.uiCls,j=f.activeUI,g;if(k===j){return}if(j){g=f.removeClsWithUI(h,true);if(g.length){f.removeCls(g)}f.removeUIFromElement()}else{f.uiCls=[]}f.ui=k;f.activeUI=k;f.addUIToElement();g=f.addClsWithUI(h,true);if(g.length){f.addCls(g)}if(f.rendered){f.updateLayout()}},setVisible:function(b){return this[b?"show":"hide"]()},setHidden:function(b){return this.setVisible(!b)},setWidth:function(b){return this.setSize(b)},show:function(j,g,f){var k=this,h=k.rendered;if(k.hierarchicallyHidden||(k.floating&&!h&&k.isHierarchicallyHidden())){if(!h){k.initHierarchyEvents()}if(arguments.length>1){arguments[0]=null;k.pendingShow=arguments}else{k.pendingShow=true}}else{if(h&&k.isVisible()){if(k.floating){k.onFloatShow()}}else{if(k.fireEvent("beforeshow",k)!==false){k.hidden=false;delete this.getInherited().hidden;Ext.suspendLayouts();if(!h&&(k.autoRender||k.floating)){k.doAutoRender();h=k.rendered}if(h){k.beforeShow();Ext.resumeLayouts();k.onShow.apply(k,arguments);k.afterShow.apply(k,arguments)}else{Ext.resumeLayouts(true)}}else{k.onShowVeto()}}}return k},showAt:function(f,g,e){var h=this;if(!h.rendered&&(h.autoRender||h.floating)){h.x=f;h.y=g;return h.show()}if(h.floating){h.setPosition(f,g,e)}else{h.setPagePosition(f,g,e)}h.show()},showBy:function(e,g,h){var f=this;if(f.floating&&e){f.alignTarget=e;if(g){f.defaultAlign=g}if(h){f.alignOffset=h}f.show();if(!f.hidden){f.alignTo(e,g||f.defaultAlign,h||f.alignOffset)}}return f},suspendLayouts:function(){var b=this;if(!b.rendered){return}if(++b.layoutSuspendCount===1){b.suspendLayout=true}},unitizeBox:function(b){return Ext.Element.unitizeBox(b)},unmask:function(){(this.getMaskTarget()||this.el).unmask();this.setMasked(false)},unregisterFloatingItem:function(c){var d=this;if(d.floatingDescendants){d.floatingDescendants.unregister(c)}},up:function(n,m){var o=this.getRefOwner(),h=typeof m==="string",k=typeof m==="number",j=m&&m.isComponent,l=0;if(n){for(;o;o=o.getRefOwner()){l++;if(n.isComponent){if(o===n){return o}}else{if(Ext.ComponentQuery.is(o,n)){return o}}if(h&&o.is(m)){return}if(k&&l===m){return}if(j&&o===m){return}}}return o},update:function(s,p,m){var n=this,l=(n.tpl&&!Ext.isString(s)),o=n.scrollManager,t=n.focusableContainer,q,u,r;if(l){n.data=(s&&s.isEntity)?s.getData(true):s}else{n.html=Ext.isObject(s)?Ext.DomHelper.markup(s):s}if(n.rendered){q=n.getSizeModel();u=q.width.shrinkWrap||q.height.shrinkWrap;if(n.isContainer){r=n.layout.getRenderTarget();u=u||n.items.items.length>0}else{r=n.touchScroll?n.getScrollerEl():n.getTargetEl()}if(l){n.tpl[n.tplWriteMode](r,n.data||{})}else{r.setHtml(n.html,p,m)}if(u){n.updateLayout()}if(o){o.refresh()}if(t){t.onFocusableChildUpdate(n)}}},setHtml:function(b){this.update(b)},applyData:function(b){this.update(b)},updateBox:function(b){this.setSize(b.width,b.height);this.setPagePosition(b.x,b.y);return this},_asLayoutRoot:{isRoot:true},_notAsLayoutRoot:{isRoot:false},updateLayout:function(k){var j=this,h,f=j.lastBox,g=k&&k.isRoot;if(f){f.invalid=true}if(!j.rendered||j.layoutSuspendCount||j.suspendLayout){return}if(j.hidden){Ext.Component.cancelLayout(j)}else{if(typeof g!="boolean"){g=j.isLayoutRoot()}}if(g||!j.ownerLayout||!j.ownerLayout.onContentChange(j)){if(!j.isLayoutSuspended()){h=(k&&k.hasOwnProperty("defer"))?k.defer:j.deferLayouts;Ext.Component.updateLayout(j,h)}}},updateMaxHeight:function(c,d){this.changeConstraint(c,d,"min","max-height","height")},updateMaxWidth:function(c,d){this.changeConstraint(c,d,"min","max-width","width")},updateMinHeight:function(c,d){this.changeConstraint(c,d,"max","min-height","height")},updateMinWidth:function(d,c){this.changeConstraint(d,c,"max","min-width","width")},getAnchorToXY:function(g,f,h,e){return g.getAnchorXY(f,h,e)},getBorderPadding:function(){return this.el.getBorderPadding()},getLocalX:function(){return this.el.getLocalX()},getLocalXY:function(){return this.el.getLocalXY()},getLocalY:function(){return this.el.getLocalY()},getX:function(){return this.el.getX()},getXY:function(){return this.el.getXY()},getY:function(){return this.el.getY()},setLocalX:function(b){this.el.setLocalX(b)},setLocalXY:function(d,c){this.el.setLocalXY(d,c)},setLocalY:function(b){this.el.setLocalY(b)},setX:function(d,c){this.el.setX(d,c)},setXY:function(c,d){this.el.setXY(c,d)},setY:function(c,d){this.el.setY(c,d)},privates:{statics:{findComponentByElement:function(h){var f=document.body,g=h,e;while(g&&g.nodeType===1&&g!==f){e=Ext.getCmp(g.id);if(e){return e}g=g.parentNode}return null},getComponentByElement:function(e){var f=Ext.Component.componentIdAttribute,d;e=Ext.fly(e);if(!e){return null}d=e.getAttribute(f);if(d){return Ext.getCmp(d)}else{return Ext.Component.findComponentByElement(e.dom)}},getActiveComponent:function(){var b=Ext.dom.Element.getActiveElement();return Ext.Component.getComponentByElement(b)}},addOverCls:function(){var b=this;if(!b.disabled){b.el.addCls(b.overCls)}},addUIToElement:function(){var l=this,h=l.baseCls+"-"+l.ui,m,j,g,k;l.addCls(h);if(l.rendered&&l.frame&&!Ext.supports.CSS3BorderRadius){h+="-";m=l.getChildEls();for(j in m){k=m[j].frame;if(k&&k!==true){g=l[j];if(g){g.addCls(h+k)}}}}},changeConstraint:function(k,o,j,m,h){var l=this,n=l[h];if(k!=null&&typeof n==="number"){l[h]=Math[j](n,k)}if(l.liquidLayout){if(k!=null){l.setStyle(m,k+"px")}else{if(o){l.setStyle(m,"")}}}if(l.rendered){l.updateLayout()}},constructPlugin:function(c){var d=this;if(typeof c==="string"){c=Ext.PluginManager.create({},c,d)}else{c=Ext.PluginManager.create(c,null,d)}return c},constructPlugins:function(){var h=this,k=h.plugins,f,j,g;if(k){f=[];f.processed=true;if(!Ext.isArray(k)){k=[k]}for(j=0,g=k.length;j=0){p=o[r].splitterDelta;if(t.getAt(u+p)!==A){t.remove(A);u=t.indexOf(s);if(p>0){++u}t.insert(u,A)}}}if(q){if(w){s.expand(false)}z.remove(q);s.placeholder=null;if(w){s.collapse(null,false)}}z.updateLayout();Ext.resumeLayouts(true);s.fireEventArgs("changeregion",[s,x])}else{s.region=r}}return x},setWeight:function(j){var k=this,f=k.getOwningBorderContainer(),h=k.placeholder,g=k.weight;if(j!==g){if(k.fireEventArgs("beforechangeweight",[k,j])!==false){k.weight=j;if(h){h.weight=j}if(f){f.updateLayout()}k.fireEventArgs("changeweight",[k,g])}}return g}},function(d){var c=d.prototype;c.setBorderRegion=c.setRegion;c.setRegionWeight=c.setWeight});Ext.define("Ext.overrides.Widget",{override:"Ext.Widget",$configStrict:false,isComponent:true,liquidLayout:true,rendered:true,rendering:true,cachedConfig:{baseCls:Ext.baseCSSPrefix+"widget"},constructor:function(b){(arguments.callee.$previous||Ext.Evented.prototype.constructor).call(this,b);this.getComponentLayout()},addCls:function(b){this.el.addCls(b)},addClsWithUI:function(b){this.el.addCls(b)},afterComponentLayout:Ext.emptyFn,finishRender:function(){this.rendering=false;this.initBindable()},getComponentLayout:function(){var c=this,d=c.componentLayout;if(!d){d=c.componentLayout=new Ext.layout.component.Auto();d.setOwner(c)}return d},getTdCls:function(){return Ext.baseCSSPrefix+this.getTdType()+"-"+(this.ui||"default")+"-cell"},getTdType:function(){return this.xtype},getItemId:function(){return this.itemId||this.id},getSizeModel:function(){return Ext.Component.prototype.getSizeModel.apply(this,arguments)},onAdded:function(f,h,g){var j=this,k=j.inheritedState;j.ownerCt=f;if(k&&g){j.invalidateInheritedState()}if(j.reference){j.fixReference()}},onRemoved:function(d){var e=this,f;if(e.reference){f=e.lookupReferenceHolder();if(f){f.clearReference(e)}}if(!d){e.removeBindings()}if(e.inheritedState&&!d){e.invalidateInheritedState()}e.ownerCt=e.ownerLayout=null},parseBox:function(b){return Ext.Element.parseBox(b)},render:function(e,f){var h=this.element,g;if(f){nextSibiling=e.childNodes[f];if(g){e.insertBefore(h,g);return}}e.appendChild(h)},setPosition:function(d,c){this.el.setLocalXY(d,c)}},function(){var b;if(Ext.isIE8){b=Ext.Widget.prototype;b.addElementReferenceOnDemand=b.addElementReference}this.borrow(Ext.Component,["up"])});(Ext.cmd.derive("Ext.event.gesture.Recognizer",Ext.Base,{handledEvents:[],config:{onRecognized:Ext.emptyFn,callbackScope:null},constructor:function(b){this.initConfig(b);return this},getHandledEvents:function(){return this.handledEvents},onStart:Ext.emptyFn,onEnd:Ext.emptyFn,onTouchStart:Ext.emptyFn,onTouchMove:Ext.emptyFn,onTouchEnd:Ext.emptyFn,onTouchCancel:Ext.emptyFn,fail:function(){return false},fire:function(){this.getOnRecognized().apply(this.getCallbackScope(),arguments)},debugHooks:{$enabled:false,fail:function(b){Ext.log.info(this.$className+" Gesture Failed: "+b);return false}}},1,0,0,0,0,[[Ext.mixin.Identifiable.prototype.mixinId||Ext.mixin.Identifiable.$className,Ext.mixin.Identifiable]],[Ext.event.gesture,"Recognizer"],0));(Ext.cmd.derive("Ext.event.gesture.SingleTouch",Ext.event.gesture.Recognizer,{inheritableStatics:{NOT_SINGLE_TOUCH:"Not Single Touch",TOUCH_MOVED:"Touch Moved",EVENT_CANCELED:"Event Canceled"},onTouchStart:function(b){if(b.touches.length>1){return this.fail(this.self.NOT_SINGLE_TOUCH)}},onTouchCancel:function(){return false}},0,0,0,0,0,0,[Ext.event.gesture,"SingleTouch"],0));(Ext.cmd.derive("Ext.event.gesture.DoubleTap",Ext.event.gesture.SingleTouch,{inheritableStatics:{DIFFERENT_TARGET:"Different Target"},config:{moveDistance:8,tapDistance:24,maxDuration:300},handledEvents:["singletap","doubletap"],singleTapTimer:null,startTime:0,lastTapTime:0,onTouchStart:function(f){var d=this,e;if(Ext.event.gesture.SingleTouch.prototype.onTouchStart.apply(this,arguments)===false){return false}e=d.lastStartPoint=f.changedTouches[0].point;d.startPoint=d.startPoint||e;d.startTime=f.time;clearTimeout(d.singleTapTimer)},onTouchMove:function(f){var d=this,e=f.changedTouches[0].point;if(Math.abs(e.getDistanceTo(d.lastStartPoint))>=d.getMoveDistance()){d.startPoint=null;return d.fail(d.self.TOUCH_MOVED)}},onTouchEnd:function(o){var m=this,p=m.getMaxDuration(),s=o.time,n=o.target,l=m.lastTapTime,r=m.lastTarget,e=o.changedTouches[0].point,q;m.lastTapTime=s;m.lastTarget=n;if(l){q=s-l;if(q<=p&&Math.abs(e.getDistanceTo(m.startPoint))<=m.getTapDistance()){if(n!==r){return m.fail(m.self.DIFFERENT_TARGET)}m.lastTarget=null;m.lastTapTime=0;m.fire("doubletap",o,{touch:o.changedTouches[0],duration:q});m.startPoint=null;return}}if(s-m.startTime>p){m.fireSingleTap(o)}else{m.setSingleTapTimer(o)}},setSingleTapTimer:function(c){var d=this;d.singleTapTimer=Ext.defer(function(){d.fireSingleTap(c)},d.getMaxDuration())},fireSingleTap:function(d,c){this.fire("singletap",d,{touch:c});this.startPoint=null}},0,0,0,0,0,0,[Ext.event.gesture,"DoubleTap"],0));Ext.define("ExtThemeNeptune.Component",{override:"Ext.Component",initComponent:function(){arguments.callee.$previous.call(this);if(this.dock&&this.border===undefined){this.border=false}},privates:{initStyles:function(){var f=this,d=f.hasOwnProperty("border"),e=f.border;if(f.dock){f.border=null}arguments.callee.$previous.apply(this,arguments);if(d){f.border=e}else{delete f.border}}}});(Ext.cmd.derive("Ext.event.gesture.Drag",Ext.event.gesture.SingleTouch,{isStarted:false,startPoint:null,previousPoint:null,lastPoint:null,handledEvents:["dragstart","drag","dragend","dragcancel"],config:{minDistance:8},constructor:function(){Ext.event.gesture.SingleTouch.prototype.constructor.apply(this,arguments);this.info={touch:null,previous:{x:0,y:0},x:0,y:0,delta:{x:0,y:0},absDelta:{x:0,y:0},flick:{velocity:{x:0,y:0}},direction:{x:0,y:0},time:0,previousTime:{x:0,y:0}}},onTouchStart:function(b){if(Ext.event.gesture.SingleTouch.prototype.onTouchStart.apply(this,arguments)===false){if(this.isStarted&&this.lastMoveEvent!==null){this.lastMoveEvent.isStopped=false;this.onTouchEnd(this.lastMoveEvent)}return false}this.startTime=b.time;this.startPoint=b.changedTouches[0].point},tryDragStart:function(l){var e=this.startPoint,j=l.changedTouches[0],h=j.point,k=this.getMinDistance(),m=this.info;if(Math.abs(h.getDistanceTo(e))>=k){this.isStarted=true;this.previousPoint=this.lastPoint=h;this.resetInfo("x",l,j);this.resetInfo("y",l,j);m.time=l.time;this.fire("dragstart",l,m)}},onTouchMove:function(d){if(!this.isStarted){this.tryDragStart(d)}if(!this.isStarted){return}var f=d.changedTouches[0],e=f.point;if(this.lastPoint){this.previousPoint=this.lastPoint}this.lastPoint=e;this.lastMoveEvent=d;this.updateInfo("x",d,f);this.updateInfo("y",d,f);this.info.time=d.time;this.fire("drag",d,this.info)},onAxisDragEnd:function(e,f){var d=f.time-f.previousTime[e];if(d>0){f.flick.velocity[e]=(f[e]-f.previous[e])/d}},resetInfo:function(q,n,l){var p=this.lastPoint[q],e=this.startPoint[q],m=p-e,k=q.toUpperCase(),o=this.info;o.touch=l;o.delta[q]=m;o.absDelta[q]=Math.abs(m);o.previousTime[q]=this.startTime;o.previous[q]=e;o[q]=p;o.direction[q]=0;o["start"+k]=this.startPoint[q];o["previous"+k]=o.previous[q];o["page"+k]=o[q];o["delta"+k]=o.delta[q];o["absDelta"+k]=o.absDelta[q];o["previousDelta"+k]=0;o.startTime=this.startTime},updateInfo:function(v,r,s){var q=this,o=q.lastPoint[v],u=q.previousPoint[v],y=q.startPoint[v],e=o-y,w=q.info,p=w.direction,t=v.toUpperCase(),x=w.previous[v];w.touch=s;w.delta[v]=e;w.absDelta[v]=Math.abs(e);if(o!==x&&o!==w[v]){w.previous[v]=w[v];w.previousTime[v]=w.time}w[v]=o;if(o>u){p[v]=1}else{if(othis.getMaxDuration()){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(this.isHorizontal&&y>this.getMaxOffset()){this.isHorizontal=false}if(this.isVertical&&x>this.getMaxOffset()){this.isVertical=false}if(!this.isVertical||!this.isHorizontal){if(this.isHorizontal&&xA){this.isVertical=false}if(this.isHorizontal&&D>A){this.isHorizontal=false}if(this.isVertical&&this.isHorizontal){if(D>C){this.isHorizontal=false}else{this.isVertical=false}}if(this.isHorizontal){t=(y<0)?"left":"right";E=y}else{if(this.isVertical){t=(z<0)?"up":"down";E=z}}this.direction=this.direction||t;if(this.direction=="up"){E=z*-1}else{if(this.direction=="left"){E=y*-1}}this.distance=E;if(E==0){return this.fail(this.self.DISTANCE_NOT_ENOUGH)}if(!this.started){if(this.direction=="right"&&this.startX>e){return this.fail(this.self.NOT_NEAR_EDGE)}else{if(this.direction=="down"&&this.startY>e){return this.fail(this.self.NOT_NEAR_EDGE)}else{if(this.direction=="left"&&(s-this.startX)>e){return this.fail(this.self.NOT_NEAR_EDGE)}else{if(this.direction=="up"&&(w-this.startY)>e){return this.fail(this.self.NOT_NEAR_EDGE)}}}}this.started=true;this.startTime=v.time;this.fire("edgeswipestart",v,{touch:x,direction:this.direction,distance:this.distance,duration:B})}else{this.fire("edgeswipe",v,{touch:x,direction:this.direction,distance:this.distance,duration:B})}},onTouchEnd:function(c){var d;if(this.onTouchMove(c)!==false){d=c.time-this.startTime;this.fire("edgeswipeend",c,{touch:c.changedTouches[0],direction:this.direction,distance:this.distance,duration:d})}},onTouchCancel:function(b){this.fire("edgeswipecancel",b,{touch:b.changedTouches[0]});return false}},0,0,0,0,0,0,[Ext.event.gesture,"EdgeSwipe"],0));(Ext.cmd.derive("Ext.event.gesture.LongPress",Ext.event.gesture.SingleTouch,{inheritableStatics:{DURATION_NOT_ENOUGH:"Duration Not Enough"},config:{moveDistance:8,minDuration:1000},handledEvents:["longpress"],fireLongPress:function(b){this.fire("longpress",b,{touch:b.changedTouches[0],duration:this.getMinDuration()});this.isLongPress=true},onTouchStart:function(b){if(Ext.event.gesture.SingleTouch.prototype.onTouchStart.apply(this,arguments)===false){return false}this.startPoint=b.changedTouches[0].point;this.isLongPress=false;this.setLongPressTimer(b)},setLongPressTimer:function(c){var d=this;d.timer=Ext.defer(function(){d.fireLongPress(c)},d.getMinDuration())},onTouchMove:function(c){var d=c.changedTouches[0].point;if(Math.abs(d.getDistanceTo(this.startPoint))>=this.getMoveDistance()){return this.fail(this.self.TOUCH_MOVED)}},onTouchEnd:function(){if(!this.isLongPress){return this.fail(this.self.DURATION_NOT_ENOUGH)}},fail:function(){clearTimeout(this.timer);return Ext.event.gesture.SingleTouch.prototype.fail.apply(this,arguments)}},0,0,0,0,0,0,[Ext.event.gesture,"LongPress"],function(){this.override({handledEvents:["longpress","taphold"],fire:function(d){if(d==="longpress"){var c=Array.prototype.slice.call(arguments);c[0]="taphold";this.fire.apply(this,c)}return this.callOverridden(arguments)}})}));(Ext.cmd.derive("Ext.event.gesture.MultiTouch",Ext.event.gesture.Recognizer,{requiredTouchesCount:2,isTracking:false,isStarted:false,onTouchStart:function(g){var f=this.requiredTouchesCount,h=g.touches,e=h.length;if(e===f){this.start(g)}else{if(e>f){this.end(g)}}},onTouchEnd:function(b){this.end(b)},onTouchCancel:function(b){this.end(b,true);return false},start:function(){if(!this.isTracking){this.isTracking=true;this.isStarted=false}},end:function(c,d){if(this.isTracking){this.isTracking=false;if(this.isStarted){this.isStarted=false;this[d?"fireCancel":"fireEnd"](c)}}}},0,0,0,0,0,0,[Ext.event.gesture,"MultiTouch"],0));(Ext.cmd.derive("Ext.event.gesture.Pinch",Ext.event.gesture.MultiTouch,{handledEvents:["pinchstart","pinch","pinchend","pinchcancel"],startDistance:0,lastTouches:null,onTouchMove:function(k){if(!this.isTracking){return}var e=k.touches,j,g,h;j=e[0].point;g=e[1].point;h=j.getDistanceTo(g);if(h===0){return}if(!this.isStarted){this.isStarted=true;this.startDistance=h;this.fire("pinchstart",k,{touches:e,distance:h,scale:1})}else{this.fire("pinch",k,{touches:e,distance:h,scale:h/this.startDistance})}},fireEnd:function(b){this.fire("pinchend",b)},fireCancel:function(b){this.fire("pinchcancel",b)},fail:function(){return Ext.event.gesture.MultiTouch.prototype.fail.apply(this,arguments)}},0,0,0,0,0,0,[Ext.event.gesture,"Pinch"],0));(Ext.cmd.derive("Ext.event.gesture.Rotate",Ext.event.gesture.MultiTouch,{handledEvents:["rotatestart","rotate","rotateend","rotatecancel"],startAngle:0,lastTouches:null,lastAngle:null,onTouchMove:function(m){if(!this.isTracking){return}var n=m.touches,r=this.lastAngle,p,o,q,s,l,e;p=n[0].point;o=n[1].point;q=p.getAngleTo(o);if(r!==null){e=Math.abs(r-q);s=q+360;l=q-360;if(Math.abs(s-r)=this.getMoveDistance()){this.fire("tapcancel",d,{touch:f});return this.fail(this.self.TOUCH_MOVED)}},onTouchEnd:function(b){this.fire("tap",b,{touch:b.changedTouches[0]})},onTouchCancel:function(b){this.fire("tapcancel",b,{touch:b.changedTouches[0]});return false}},0,0,0,0,0,0,[Ext.event.gesture,"Tap"],0));(Ext.cmd.derive("Ext.event.publisher.Publisher",Ext.Base,{targetType:"",idSelectorRegex:/^#([\w\-]+)$/i,constructor:function(){var f=this.handledEvents||[],g,k,h,j;g=this.handledEventsMap={};for(k=0,h=f.length;k=d.x&&c.right<=d.right&&c.y>=d.y&&c.bottom<=d.bottom)},intersect:function(h){var j=this,l=Math.max(j.y,h.y),k=Math.min(j.right,h.right),b=Math.min(j.bottom,h.bottom),m=Math.max(j.x,h.x);if(b>l&&k>m){return new this.self(l,k,b,m)}else{return false}},union:function(h){var j=this,l=Math.min(j.y,h.y),k=Math.max(j.right,h.right),b=Math.max(j.bottom,h.bottom),m=Math.min(j.x,h.x);return new this.self(l,k,b,m)},constrainTo:function(d){var e=this,f=Ext.Number.constrain;e.top=e.y=f(e.top,d.y,d.bottom);e.bottom=f(e.bottom,d.y,d.bottom);e.left=e.x=f(e.left,d.x,d.right);e.right=f(e.right,d.x,d.right);return e},adjust:function(j,g,b,k){var h=this;h.top=h.y+=j;h.left=h.x+=k;h.right+=g;h.bottom+=b;return h},getOutOfBoundOffset:function(e,d){if(!Ext.isObject(e)){if(e=="x"){return this.getOutOfBoundOffsetX(d)}else{return this.getOutOfBoundOffsetY(d)}}else{d=e;var f=new Ext.util.Offset();f.x=this.getOutOfBoundOffsetX(d.x);f.y=this.getOutOfBoundOffsetY(d.y);return f}},getOutOfBoundOffsetX:function(b){if(b<=this.x){return this.x-b}else{if(b>=this.right){return this.right-b}}return 0},getOutOfBoundOffsetY:function(b){if(b<=this.y){return this.y-b}else{if(b>=this.bottom){return this.bottom-b}}return 0},isOutOfBound:function(d,c){if(!Ext.isObject(d)){if(d=="x"){return this.isOutOfBoundX(c)}else{return this.isOutOfBoundY(c)}}else{c=d;return(this.isOutOfBoundX(c.x)||this.isOutOfBoundY(c.y))}},isOutOfBoundX:function(b){return(bthis.right)},isOutOfBoundY:function(b){return(bthis.bottom)},restrict:function(e,g,f){if(Ext.isObject(e)){var h;f=g;g=e;if(g.copy){h=g.copy()}else{h={x:g.x,y:g.y}}h.x=this.restrictX(g.x,f);h.y=this.restrictY(g.y,f);return h}else{if(e=="x"){return this.restrictX(g,f)}else{return this.restrictY(g,f)}}},restrictX:function(c,d){if(!d){d=1}if(c<=this.x){c-=(c-this.x)*d}else{if(c>=this.right){c-=(c-this.right)*d}}return c},restrictY:function(c,d){if(!d){d=1}if(c<=this.y){c-=(c-this.y)*d}else{if(c>=this.bottom){c-=(c-this.bottom)*d}}return c},getSize:function(){return{width:this.right-this.x,height:this.bottom-this.y}},copy:function(){return new this.self(this.y,this.right,this.bottom,this.x)},copyFrom:function(c){var d=this;d.top=d.y=d[1]=c.y;d.right=c.right;d.bottom=c.bottom;d.left=d.x=d[0]=c.x;return this},toString:function(){return"Region["+this.top+","+this.right+","+this.bottom+","+this.left+"]"},translateBy:function(e,f){if(arguments.length==1){f=e.y;e=e.x}var d=this;d.top=d.y+=f;d.right+=e;d.bottom+=f;d.left=d.x+=e;return d},round:function(){var b=this;b.top=b.y=Math.round(b.y);b.right=Math.round(b.right);b.bottom=Math.round(b.bottom);b.left=b.x=Math.round(b.x);return b},equals:function(b){return(this.top===b.top&&this.right===b.right&&this.bottom===b.bottom&&this.left===b.left)}},3,0,0,0,0,0,[Ext.util,"Region"],0));(Ext.cmd.derive("Ext.util.Point",Ext.util.Region,{radianToDegreeConstant:180/Math.PI,origin:{x:0,y:0},statics:{fromEvent:function(d){var e=d.changedTouches,f=(e&&e.length>0)?e[0]:d;return this.fromTouch(f)},fromTouch:function(b){return new this(b.pageX,b.pageY)},from:function(b){if(!b){return new this(0,0)}if(!(b instanceof this)){return new this(b.x,b.y)}return b}},constructor:function(d,c){if(d==null){d=0}if(c==null){c=0}Ext.util.Region.prototype.constructor.call(this,c,d,c,d)},clone:function(){return new this.self(this.x,this.y)},copy:function(){return this.clone.apply(this,arguments)},copyFrom:function(b){this.x=b.x;this.y=b.y;return this},toString:function(){return"Point["+this.x+","+this.y+"]"},isCloseTo:function(m,g){if(typeof g=="number"){return this.getDistanceTo(m)<=g}var h=m.x,j=m.y,k=g.x,l=g.y;return(this.x<=h+k&&this.x>=h-k&&this.y<=j+l&&this.y>=j-l)},isWithin:function(){return this.isCloseTo.apply(this,arguments)},isContainedBy:function(b){if(!(b instanceof Ext.util.Region)){b=Ext.get(b.el||b).getRegion()}return b.contains(this)},roundedEquals:function(b){if(typeof b!="object"){b=this.origin}return(Math.round(this.x)===Math.round(b.x)&&Math.round(this.y)===Math.round(b.y))},getDistanceTo:function(d){if(typeof d!="object"){d=this.origin}var f=this.x-d.x,e=this.y-d.y;return Math.sqrt(f*f+e*e)},getAngleTo:function(d){if(typeof d!="object"){d=this.origin}var f=this.x-d.x,e=this.y-d.y;return Math.atan2(e,f)*this.radianToDegreeConstant}},3,0,0,0,0,0,[Ext.util,"Point"],function(){this.prototype.translate=this.prototype.translateBy}));(Ext.cmd.derive("Ext.event.Event",Ext.Base,{alternateClassName:"Ext.EventObjectImpl",isStopped:false,isEvent:true,statics:{resolveTextNode:function(b){return(b&&b.nodeType===3)?b.parentNode:b},pointerEvents:{pointerdown:1,pointermove:1,pointerup:1,pointercancel:1,pointerover:1,pointerout:1,pointerenter:1,pointerleave:1,MSPointerDown:1,MSPointerMove:1,MSPointerUp:1,MSPointerOver:1,MSPointerOut:1,MSPointerCancel:1,MSPointerEnter:1,MSPointerLeave:1},mouseEvents:{mousedown:1,mousemove:1,mouseup:1,mouseover:1,mouseout:1,mouseenter:1,mouseleave:1},touchEvents:{touchstart:1,touchmove:1,touchend:1,touchcancel:1},focusEvents:{focus:1,blur:1,focusin:1,focusout:1,focusenter:1,focusleave:1},pointerTypes:{2:"touch",3:"pen",4:"mouse",touch:"touch",pen:"pen",mouse:"mouse"}},constructor:function(r){var n=this,k=n.self,o=n.self.resolveTextNode,l=r.changedTouches,q=l?l[0]:r,m=r.type,s,p;n.pageX=q.pageX;n.pageY=q.pageY;n.target=n.delegatedTarget=o(r.target);p=r.relatedTarget;if(p){n.relatedTarget=o(p)}n.browserEvent=n.event=r;n.type=m;n.button=r.button||0;n.shiftKey=r.shiftKey;n.ctrlKey=r.ctrlKey||r.metaKey||false;n.altKey=r.altKey;n.charCode=r.charCode;n.keyCode=r.keyCode;if(k.forwardTab!==undefined&&k.focusEvents[m]){n.forwardTab=k.forwardTab}if(k.mouseEvents[m]){s="mouse"}else{if(k.pointerEvents[m]){s=k.pointerTypes[r.pointerType]}else{if(k.touchEvents[m]){s="touch"}}}if(s){n.pointerType=s}n.timeStamp=n.time=+(r.timeStamp||new Date())},chain:function(d){var c=Ext.Object.chain(this);c.parentEvent=this;return Ext.apply(c,d)},correctWheelDelta:function(f){var d=this.WHEEL_SCALE,e=Math.round(f/d);if(!e&&f){e=(f<0)?-1:1}return e},getCharCode:function(){return this.charCode||this.keyCode},getKey:function(){return this.keyCode||this.charCode},getPoint:function(){var b=this.getXY();return new Ext.util.Point(b[0],b[1])},getRelatedTarget:function(f,h,g){var k=this.relatedTarget,j=null;if(k){if(f){j=Ext.fly(k).findParent(f,h,g)}else{j=g?Ext.get(k):k}}return j},getTarget:function(d,f,e){return d?Ext.fly(this.target).findParent(d,f,e):(e?Ext.get(this.target):this.target)},getTime:function(){return this.time},getWheelDelta:function(){var b=this.getWheelDeltas();return b.y},getWheelDeltas:function(){var g=this,h=g.browserEvent,e=0,f=0;if(Ext.isDefined(h.wheelDeltaX)){e=h.wheelDeltaX;f=h.wheelDeltaY}else{if(h.wheelDelta){f=h.wheelDelta}else{if(h.detail){f=-h.detail;if(f>100){f=3}else{if(f<-100){f=-3}}if(Ext.isDefined(h.axis)&&h.axis===h.HORIZONTAL_AXIS){e=f;f=0}}}}return{x:g.correctWheelDelta(e),y:g.correctWheelDelta(f)}},getX:function(){return this.getXY()[0]},getXY:function(){var o=this,m=o.xy;if(!m){m=o.xy=[o.pageX,o.pageY];var h=m[0],k,n,l,j;if(!h&&h!==0){k=o.browserEvent;n=document;l=n.documentElement;j=n.body;m[0]=k.clientX+(l&&l.scrollLeft||j&&j.scrollLeft||0)-(l&&l.clientLeft||j&&j.clientLeft||0);m[1]=k.clientY+(l&&l.scrollTop||j&&j.scrollTop||0)-(l&&l.clientTop||j&&j.clientTop||0)}}return m},getY:function(){return this.getXY()[1]},hasModifier:function(){var b=this;return !!(b.ctrlKey||b.altKey||b.shiftKey||b.metaKey)},isNavKeyPress:function(){var c=this,d=c.keyCode;return(d>=33&&d<=40)||d===c.RETURN||d===c.TAB||d===c.ESC},isSpecialKey:function(){var b=this.keyCode;return(this.type==="keypress"&&this.ctrlKey)||this.isNavKeyPress()||(b===this.BACKSPACE)||(b>=16&&b<=20)||(b>=44&&b<=46)},makeUnpreventable:function(){this.browserEvent.preventDefault=Ext.emptyFn},preventDefault:function(){this.browserEvent.preventDefault();return this},setCurrentTarget:function(b){this.currentTarget=this.delegatedTarget=b},stopEvent:function(){return this.preventDefault().stopPropagation()},stopPropagation:function(){var d=this,f=d.browserEvent,e=d.parentEvent;d.isStopped=true;if(e){e.isStopped=true}if(!f.stopPropagation){f.cancelBubble=true;return d}f.stopPropagation();return d},within:function(h,g,f){if(h){var e=g?this.getRelatedTarget():this.getTarget()}return e?Ext.fly(h).contains(e)||!!(f&&e===Ext.getDom(h)):false},deprecated:{"4.0":{methods:{getPageX:"getX",getPageY:"getY"}}}},1,0,0,0,0,0,[Ext.event,"Event",Ext,"EventObjectImpl"],function(e){var d=e.prototype,f={BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,RETURN:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,WHEEL_SCALE:(function(){var a;if(Ext.isGecko){a=3}else{if(Ext.isMac){if(Ext.isSafari&&Ext.webKitVersion>=532){a=120}else{a=12}a*=3}else{a=120}}return a}())};Ext.apply(e,f);Ext.apply(d,f);d.getTrueXY=d.getXY}));(Ext.cmd.derive("Ext.event.publisher.Dom",Ext.event.publisher.Publisher,{reEnterCount:0,targetType:"element",idOrClassSelectorRegex:/^([#|\.])([\w\-]+)$/,classNameSplitRegex:/\s+/,SELECTOR_ALL:"*",captureEvents:{resize:1,focus:1,blur:1,paste:1,input:1,change:1,animationstart:1,animationend:1,scroll:1},directEvents:{mouseenter:1,mouseleave:1,pointerenter:1,pointerleave:1,MSPointerEnter:1,MSPointerLeave:1,load:1,unload:1,beforeunload:1,error:1,DOMContentLoaded:1,DOMFrameContentLoaded:1,hashchange:1},blockedPointerEvents:{pointerover:1,pointerout:1,pointerenter:1,pointerleave:1,MSPointerOver:1,MSPointerOut:1,MSPointerEnter:1,MSPointerLeave:1},blockedCompatibilityMouseEvents:{mouseenter:1,mouseleave:1},constructor:function(){var n=this,m=document,p=m.defaultView,l=n.eventToVendorMap={},q=n.vendorToEventMap={},u=n.handledEvents,r=Ext.browser,s,o,t;n.captureSubscribers={};n.directSubscribers={};n.globalListeners={};if((Ext.os.is.iOS&&Ext.os.version.getMajor()<5)||!(p&&p.addEventListener)){n.target=m;n.isTargetWin=false}else{n.target=p;n.isTargetWin=true}n.initHandlers();if(u){for(s=0,o=u.length;s0)){return}delete E[v];E.$length--}else{if(!D.hasOwnProperty(v)||(!u&&--D[v]>0)){return}delete D[v];D.$length--}}else{if(y===w.SELECTOR_ALL){if(u){I.all=0}else{I.all--}}else{if(!G.hasOwnProperty(y)||(!u&&--G[y]>0)){return}delete G[y];Ext.Array.remove(G,y)}}I.$length--},getPropagatingTargets:function(c){var d=[];if(!c){return d}do{d[d.length]=c;c=c.parentNode}while(c);return d},dispatch:function(f,e,d){d.push(d[0].target);Ext.event.publisher.Publisher.prototype.dispatch.apply(this,arguments)},publish:function(t,r,y){var p=this.getSubscribers(t,true),w=this.getSubscribers(t),x=this.getSubscribers("*",true),n=this.getSubscribers("*"),q=p.$length,u=w.$length,v=x.$length,o=n.$length,s;if(!q&&!u&&!v&&!o){return}if(Ext.isArray(r)){s=r}else{if(this.captureEvents[t]){s=[r]}else{s=this.getPropagatingTargets(r)}}if(!q||!this.doPublish(p,t,s,y,true)){if(v){this.doPublish(x,t,s,y,true)}}if(!y.isStopped&&(!u||!this.doPublish(w,t,s,y))){if(o){this.doPublish(n,t,s,y)}}return this},doPublish:function(Z,V,O,F,I){var J=Z.id,X=Z.className,ad=Z.selector,N=J.$length>0,ae=X.$length>0,T=ad.length>0,P=Z.all>0,M={},aa=[F],L=false,S=this.classNameSplitRegex,W=0,Y=O.length,R=1,E,U,G,ab,K,Q,ac,j,H;if(I){W=Y-1;Y=R=-1}for(E=W;E!==Y;E+=R){K=O[E];F.setCurrentTarget(K);if(N){Q=(K.tagName==="FORM")?K.getAttribute("id"):(K===window)?"ext-window":K.id;if(Q){if(J.hasOwnProperty(Q)){L=true;this.dispatch("#"+Q,V,aa,I)}}}if(ae){ac=K.className;if(ac){j=ac.split(S);for(G=0,ab=j.length;G111&&d.keyCode<124){d.keyCode=-1}}}return c},stopPropagation:function(){var c=this,d=c.browserEvent;if(typeof d.type!=="unknown"){if(c.mousedownEvents[c.type]){Ext.GlobalEvents.fireMouseDown(c)}arguments.callee.$previous.call(this)}return c},deprecated:{"5.0":{methods:{clone:function(){return new this.self(this.browserEvent,this)}}}}},function(){var f=this,g,h=function(a){if(a.keyCode===9){f.forwardTab=!a.shiftKey}},e=function(a){if(a.keyCode===9){delete f.forwardTab}};if(Ext.isIE9m){g={1:0,4:1,2:2};f.override({statics:{enableIEAsync:function(a){var c,b={};for(c in a){b[c]=a[c]}return b}},constructor:function(b,a,d,k){var c=this;c.callParent([b,a,d,k]);c.button=g[b.button];c.toElement=b.toElement;c.fromElement=b.fromElement},mouseLeaveRe:/(mouseout|mouseleave)/,mouseEnterRe:/(mouseover|mouseenter)/,enableIEAsync:function(a){this.browserEvent=this.self.enableIEAsync(a)},getRelatedTarget:function(l,a,m){var c=this,d,b;if(!c.relatedTarget){d=c.type;if(c.mouseLeaveRe.test(d)){b=c.toElement}else{if(c.mouseEnterRe.test(d)){b=c.fromElement}}if(b){c.relatedTarget=c.self.resolveTextNode(b)}}return c.callParent([l,a,m])}});document.attachEvent("onkeydown",h);document.attachEvent("onkeyup",e);window.attachEvent("onunload",function(){document.detachEvent("onkeydown",h);document.detachEvent("onkeyup",e)})}else{if(document.addEventListener){document.addEventListener("keydown",h,true);document.addEventListener("keyup",e,true)}}});Ext.define("Ext.overrides.event.publisher.Dom",{override:"Ext.event.publisher.Dom"},function(){var c=Ext.event.publisher.Dom,d=c.prototype;if(Ext.isIE9m){c.override({initHandlers:function(){var b=this,g=document.body,a,h;b.callParent();a=b.onDelegatedEvent;h=b.onDirectEvent;b.target=document;b.targetIsWin=false;b.onDelegatedEvent=function(e){e.target=e.srcElement||window;if(e.type==="focusin"){e.relatedTarget=e.fromElement===g?null:e.fromElement}else{if(e.type==="focusout"){e.relatedTarget=e.toElement===g?null:e.toElement}}a.call(b,e)};b.onDirectEvent=function(e){e.target=e.srcElement||window;e.currentTarget=this;h.call(b,e)}},addDelegatedListener:function(a){this.target.attachEvent("on"+a,this.onDelegatedEvent)},removeDelegatedListener:function(a){this.target.detachEvent("on"+a,this.onDelegatedEvent)},addDirectListener:function(h,g){var a=this,b=Ext.Function.bind(a.onDirectEvent,g);a.directSubscribers[g.id][h].fn=b;if(g.attachEvent){g.attachEvent("on"+h,b)}else{a.callParent(arguments)}},removeDirectListener:function(b,a){if(a.detachEvent){a.detachEvent("on"+b,this.directSubscribers[a.id][b].fn)}else{this.callParent(arguments)}}});Ext.apply(d.directEvents,d.captureEvents);d.captureEvents={}}});(Ext.cmd.derive("Ext.event.publisher.Gesture",Ext.event.publisher.Dom,{alternateClassName:"Ext.event.publisher.TouchGesture",config:{recognizers:{}},isCancelEvent:{touchcancel:1,pointercancel:1,MSPointerCancel:1},constructor:function(g){var k=this,j=k.onTouchStart,f=k.onTouchMove=Ext.Function.createAnimationFrame(k.onTouchMove,k),h=k.onTouchEnd=Ext.Function.createAnimationFrame(k.onTouchEnd,k,null,1);k.handlers={touchstart:j,touchmove:f,touchend:h,touchcancel:h,pointerdown:j,pointermove:f,pointerup:h,pointercancel:h,MSPointerDown:j,MSPointerMove:f,MSPointerUp:h,MSPointerCancel:h,mousedown:j,mousemove:f,mouseup:h};k.recognizedEvents={};k.activeTouchesMap={};k.activeTouches=[];k.changedTouches=[];if(Ext.supports.TouchEvents){k.onTargetTouchMove=k.onTargetTouchMove.bind(k);k.onTargetTouchEnd=k.onTargetTouchEnd.bind(k)}k.initConfig(g);return Ext.event.publisher.Dom.prototype.constructor.call(this)},applyRecognizers:function(d){var f,e;for(f in d){e=d[f];if(e){this.registerRecognizer(e)}}return d},handles:function(d){var c=this.handledEventsMap;return !!c[d]||!!c["*"]||d==="*"||this.recognizedEvents.hasOwnProperty(d)},registerRecognizer:function(h){var k=this,j=k.recognizedEvents,g=h.getHandledEvents(),m,l;h.setOnRecognized(k.onRecognized);h.setCallbackScope(k);for(m=0,l=g.length;m1){e=[];for(s=0;s0){this.invokeRecognizers("onTouchMove",b)}}},onTouchEnd:function(c){var d=this;if(!d.isStarted){return}d.updateTouches(c,true);d.invokeRecognizers(d.isCancelEvent[c.type]?"onTouchCancel":"onTouchEnd",c);if(!d.activeTouches.length){d.isStarted=false;d.invokeRecognizers("onEnd",c);if(Ext.enableGarbageCollector){Ext.dom.GarbageCollector.resume()}}},onTargetTouchMove:function(b){if(Ext.elevateFunction){Ext.elevateFunction(this.doTargetTouchMove,this,[b])}else{this.doTargetTouchMove(b)}},doTargetTouchMove:function(b){if(!Ext.getBody().contains(b.target)){this.onTouchMove(new Ext.event.Event(b))}},onTargetTouchEnd:function(b){if(Ext.elevateFunction){Ext.elevateFunction(this.doTargetTouchEnd,this,[b])}else{this.doTargetTouchEnd(b)}},doTargetTouchEnd:function(f){var e=this,d=f.target;d.removeEventListener("touchmove",e.onTargetTouchMove);d.removeEventListener("touchend",e.onTargetTouchEnd);d.removeEventListener("touchcancel",e.onTargetTouchEnd);if(!Ext.getBody().contains(d)){e.onTouchEnd(new Ext.event.Event(f))}}},1,0,0,0,0,0,[Ext.event.publisher,"Gesture",Ext.event.publisher,"TouchGesture"],function(){var d=[],e=Ext.supports,f=e.TouchEvents;if(e.PointerEvents){d.push("pointerdown","pointermove","pointerup","pointercancel")}else{if(e.MSPointerEvents){d.push("MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel")}else{if(f){d.push("touchstart","touchmove","touchend","touchcancel")}}}if(!d.length||(f&&Ext.isWebKit&&Ext.os.is.Desktop)){d.push("mousedown","mousemove","mouseup")}this.prototype.handledEvents=d}));Ext.define("Ext.overrides.event.publisher.Gesture",{override:"Ext.event.publisher.Gesture"},function(){if(Ext.isIE9m){this.override({updateTouches:function(h,f){var g=h.browserEvent,e=h.getXY();g.pageX=e[0];g.pageY=e[1];this.callParent([h,f])},initHandlers:function(){var d=this,c;d.callParent();c=d.onDelegatedEvent;d.onDelegatedEvent=function(a){c.call(d,Ext.event.Event.enableIEAsync(a))}}})}});(Ext.cmd.derive("Ext.event.publisher.Focus",Ext.event.publisher.Dom,{handledEvents:["focusin","focusout"],syntheticEvents:{focusenter:true,focusleave:true},eventMap:{focus:"focusenter",focusin:"focusenter",blur:"focusleave",focusout:"focusleave"},handles:function(b){return this.syntheticEvents[b]},doDelegatedEvent:function(f,d){var e=this;f=Ext.event.publisher.Dom.prototype.doDelegatedEvent.call(this,f,false);if(f){e.processSyntheticEvent(e.eventMap[f.type],f);if(d){e.afterEvent(f)}}},createSyntheticEvent:function(e,f,h){var g=new Ext.event.Event(f.browserEvent);g.type=e;if(h){g.relatedTarget=g.target;g.target=h}else{g.target=f.target;g.relatedTarget=f.relatedTarget||null}return g},processSyntheticEvent:function(q,n,e){var m=this,u,t,s,r,o,p;u=m.getSubscribers(q);if(u.$length){t=m.gatherSubscriberNodes(q,u);p=[];for(r=0,o=t.length;r0,q=s.$length>0,u=v.$length>0,m=[],n,o;if(p){for(o in t){if(o==="$length"){continue}n=document.getElementById(o);if(n){m.push(n)}}}if(q){Ext.Error.raise("Class name subscribers in Focus publisher")}if(u){Ext.Error.raise("Selector subscribers in Focus publisher")}return m},isEventTarget:function(h,f,g,e){return f==="focusenter"?this.isFocusEnterTarget(h,g,e):f==="focusleave"?this.isFocusLeaveTarget(h,g,e):null},isFocusEnterTarget:function(o,m,n){var e=m.browserEvent,k=n||e.relatedTarget,l=e.target,j;if(l===window){return false}j=Ext.fly(o);if(!j.isAncestor(l)){return false}if(!k){return true}if(!j.isAncestor(k)){return true}return false},isFocusLeaveTarget:function(o,m,n){var e=m.browserEvent,k=n!==undefined?n:e.target,l=n!==undefined?e.target:e.relatedTarget,j;if(k===window||l===window){return false}j=Ext.fly(o);if(!j.isAncestor(k)){return false}if(!l){return true}if(!j.isAncestor(l)){return true}return false},fireNodeEvent:function(j,e,g,k){var h=this.createSyntheticEvent(e,g,k);h.setCurrentTarget(j);this.dispatch("#"+j.id,e,[h,j])}},0,0,0,0,0,0,[Ext.event.publisher,"Focus"],function(){if(!Ext.supports.FocusinFocusoutEvents){document.addEventListener("blur",function(b){if(b.target===window||b.target===document){delete document.previousActiveElement}else{document.previousActiveElement=b.target}},true);this.override({handledEvents:["focus"],doDelegatedEvent:function(g,h){var e=this,f;g=e.callSuper([g,false]);if(g){f=document.previousActiveElement;if(f!==undefined){e.processSyntheticEvent("focusleave",g,f)}e.processSyntheticEvent(e.eventMap[g.type],g,f||null);if(h){e.afterEvent(g)}}}})}}));Ext.require(["Ext.event.gesture.*","Ext.event.publisher.Dom","Ext.event.publisher.Gesture","Ext.event.publisher.Focus","Ext.event.Dispatcher"]);Ext.onReady(function(){var b=Ext.event.Dispatcher.getInstance();b.setPublishers({dom:new Ext.event.publisher.Dom(),gesture:new Ext.event.publisher.Gesture({recognizers:{drag:new Ext.event.gesture.Drag(),tap:new Ext.event.gesture.Tap(),doubleTap:new Ext.event.gesture.DoubleTap(),longPress:new Ext.event.gesture.LongPress(),swipe:new Ext.event.gesture.Swipe(),pinch:new Ext.event.gesture.Pinch(),rotate:new Ext.event.gesture.Rotate(),edgeSwipe:new Ext.event.gesture.EdgeSwipe()}}),focus:new Ext.event.publisher.Focus()});Ext.get(window).on("unload",b.destroy,b)},null,{priority:2000});Ext.apply(Ext,{SSL_SECURE_URL:Ext.isSecure&&Ext.isIE?"javascript:''":"about:blank",BLANK_IMAGE_URL:"data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="});(Ext.cmd.derive("Ext.util.XTemplateParser",Ext.Base,{constructor:function(b){Ext.apply(this,b)},doTpl:Ext.emptyFn,parse:function(B){var m=this,y=B.length,z={elseif:"elif"},x=m.topRe,K=m.actionsRe,I,J,E,A,G,D,F,s,t,L,H,M,C;m.level=0;m.stack=J=[];for(I=0;I]*)\>)|(?:<\/tpl>)/g,actionsRe:/\s*(elif|elseif|if|for|foreach|exec|switch|case|eval|between)\s*\=\s*(?:(?:"([^"]*)")|(?:'([^']*)'))\s*/g,propRe:/prop=(?:(?:"([^"]*)")|(?:'([^']*)'))/,defaultRe:/^\s*default\s*$/,elseRe:/^\s*else\s*$/},1,0,0,0,0,0,[Ext.util,"XTemplateParser"],0));(Ext.cmd.derive("Ext.util.XTemplateCompiler",Ext.util.XTemplateParser,{useEval:Ext.isGecko,useIndex:Ext.isIE8m,useFormat:true,propNameRe:/^[\w\d\$]*$/,compile:function(e){var f=this,d=f.generate(e);return f.useEval?f.evalTpl(d):(new Function("Ext",d))(Ext)},generate:function(f){var g=this,e="var fm=Ext.util.Format,ts=Object.prototype.toString;",h;g.maxLevel=0;g.body=["var c0=values, a0="+g.createArrayTest(0)+", p0=parent, n0=xcount, i0=xindex, k0, v;\n"];if(g.definitions){if(typeof g.definitions==="string"){g.definitions=[g.definitions,e]}else{g.definitions.push(e)}}else{g.definitions=[e]}g.switches=[];g.parse(f);g.definitions.push((g.useEval?"$=":"return")+" function ("+g.fnArgs+") {",g.body.join(""),"}");h=g.definitions.join("\n");g.definitions.length=g.body.length=g.switches.length=0;delete g.definitions;delete g.body;delete g.switches;return h},doText:function(f){var d=this,e=d.body;f=f.replace(d.aposRe,"\\'").replace(d.newLineRe,"\\n");if(d.useIndex){e.push("out[out.length]='",f,"'\n")}else{e.push("out.push('",f,"')\n")}},doExpr:function(c){var d=this.body;d.push("if ((v="+c+") != null) out");if(this.useIndex){d.push("[out.length]=v+''\n")}else{d.push(".push(v+'')\n")}},doTag:function(d){var c=this.parseTag(d);if(c){this.doExpr(c)}else{this.doText("{"+d+"}")}},doElse:function(){this.body.push("} else {\n")},doEval:function(b){this.body.push(b,"\n")},doIf:function(d,f){var e=this;if(d==="."){e.body.push("if (values) {\n")}else{if(e.propNameRe.test(d)){e.body.push("if (",e.parseTag(d),") {\n")}else{e.body.push("if (",e.addFn(d),e.callFn,") {\n")}}if(f.exec){e.doExec(f.exec)}},doElseIf:function(d,f){var e=this;if(d==="."){e.body.push("else if (values) {\n")}else{if(e.propNameRe.test(d)){e.body.push("} else if (",e.parseTag(d),") {\n")}else{e.body.push("} else if (",e.addFn(d),e.callFn,") {\n")}}if(f.exec){e.doExec(f.exec)}},doSwitch:function(f){var d=this,e;if(f==="."||f==="#"){e=f==="."?"values":"xindex";d.body.push("switch (",e,") {\n")}else{if(d.propNameRe.test(f)){d.body.push("switch (",d.parseTag(f),") {\n")}else{d.body.push("switch (",d.addFn(f),d.callFn,") {\n")}}d.switches.push(0)},doCase:function(k){var l=this,m=Ext.isArray(k)?k:[k],j=l.switches.length-1,h,g;if(l.switches[j]){l.body.push("break;\n")}else{l.switches[j]++}for(g=0,j=m.length;g1){ out.push("',k.between,'"); } \n')}},doForEach:function(m,k){var n=this,o,h=n.level,j=h-1,l;if(m==="."){o="values"}else{if(n.propNameRe.test(m)){o=n.parseTag(m)}else{o=n.addFn(m)+n.callFn}}if(n.maxLevel1){ out.push("',k.between,'"); } \n')}},createArrayTest:("isArray" in Array)?function(b){return"Array.isArray(c"+b+")"}:function(b){return"ts.call(c"+b+')==="[object Array]"'},doExec:function(j,h){var k=this,g="f"+k.definitions.length,f=k.guards[k.strict?0:1];k.definitions.push("function "+g+"("+k.fnArgs+") {",f.doTry," var $v = values; with($v) {"," "+j," }",f.doCatch,"}");k.body.push(g+k.callFn+"\n")},guards:[{doTry:"",doCatch:""},{doTry:"try { ",doCatch:" } catch(e) {\n}"}],addFn:function(f){var g=this,e="f"+g.definitions.length,h=g.guards[g.strict?0:1];if(f==="."){g.definitions.push("function "+e+"("+g.fnArgs+") {"," return values","}")}else{if(f===".."){g.definitions.push("function "+e+"("+g.fnArgs+") {"," return parent","}")}else{g.definitions.push("function "+e+"("+g.fnArgs+") {",h.doTry," var $v = values; with($v) {"," return("+f+")"," }",h.doCatch,"}")}}return e},parseTag:function(j){var m=this,k=m.tagRe.exec(j),o,l,p,n,q;if(!k){return null}o=k[1];l=k[2];p=k[3];n=k[4];if(o=="."){if(!m.validTypes){m.definitions.push("var validTypes={string:1,number:1,boolean:1};");m.validTypes=true}q='validTypes[typeof values] || ts.call(values) === "[object Date]" ? values : ""'}else{if(o=="#"){q="xindex"}else{if(o=="$"){q="xkey"}else{if(o.substr(0,7)=="parent."){q=o}else{if(isNaN(o)&&o.indexOf("-")==-1&&o.indexOf(".")!=-1){q="values."+o}else{q="values['"+o+"']"}}}}}if(n){q="("+q+n+")"}if(l&&m.useFormat){p=p?","+p:"";if(l.substr(0,5)!="this."){l="fm."+l+"("}else{l+="("}}else{return q}return l+q+p+")"},evalTpl:function($){eval($);return $},newLineRe:/\r\n|\r|\n/g,aposRe:/[']/g,intRe:/^\s*(\d+)\s*$/,tagRe:/^([\w-\.\#\$]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\/]\s?[\d\.\+\-\*\/\(\)]+)?$/},0,0,0,0,0,0,[Ext.util,"XTemplateCompiler"],function(){var b=this.prototype;b.fnArgs="out,values,parent,xindex,xcount,xkey";b.callFn=".call(this,"+b.fnArgs+")"}));(Ext.cmd.derive("Ext.XTemplate",Ext.Template,{emptyObj:{},fn:null,strict:false,apply:function(d,c){return this.applyOut(d,[],c).join("")},applyOut:function(h,e,l){var k=this,m;if(!k.fn){m=new Ext.util.XTemplateCompiler({useFormat:k.disableFormats!==true,definitions:k.definitions,strict:k.strict});k.fn=m.compile(k.html)}if(k.strict){k.fn(e,h,l||k.emptyObj,1,1)}else{try{k.fn(e,h,l||k.emptyObj,1,1)}catch(j){}}return e},compile:function(){return this},statics:{getTpl:function(e,g){var h=e[g],f;if(h&&!h.isTemplate){h=Ext.ClassManager.dynInstantiate("Ext.XTemplate",h);if(e.hasOwnProperty(g)){f=e}else{for(f=e.self.prototype;f&&!f.hasOwnProperty(g);f=f.superclass){}}f[g]=h;h.owner=f}return h||null}}},0,0,0,0,0,0,[Ext,"XTemplate"],0));Ext.Factory=function(d){var c=this;c.aliasPrefix=d+".";c.cache={};c.name=d.replace(c.fixNameRe,c.fixNameFn);c.type=d};Ext.Factory.prototype={defaultProperty:"type",instanceProp:"isInstance",create:function(q,o){var l=this,s=Ext.ClassManager,r=l.cache,p,m,n,k;if(q){if(q[l.instanceProp]){return q}if(typeof q==="string"){k=q;q={};q[l.defaultProperty]=k}m=q.xclass;k=q.type}if(m){if(!(n=s.get(m))){return s.instantiate(m,q)}}else{if(!(k=k||o||l.defaultType)){n=l.defaultClass}if(!n&&!(n=r[k])){p=l.aliasPrefix+k;m=s.getNameByAlias(p);if(!(n=m&&s.get(m))){return s.instantiateByAlias(p,q)}r[k]=n}}return n.isInstance?n:new n(q)},fixNameRe:/\.[a-z]/ig,fixNameFn:function(b){return b.substring(1).toUpperCase()},clearCache:function(){this.cache={}}};Ext.Factory.define=function(j,l){var h=Ext.Factory,g,m,k;if(j.constructor===Object){Ext.Object.each(j,h.define,h)}else{m=new Ext.Factory(j);if(l){if(l.constructor===Object){Ext.apply(m,l);if(typeof(g=m.xclass)==="string"){m.defaultClass=Ext.ClassManager.get(g)}}else{m.defaultType=l}}h[m.name]=k=m.create.bind(m);k.instance=m}return k};(Ext.cmd.derive("Ext.mixin.Factoryable",Ext.Base,{mixinId:"factoryable",onClassMixedIn:function(k){var l=k.prototype,j=l.factoryConfig,m=l.alias,g={},h;m=m&&m.length&&m[0];if(m&&(h=m.lastIndexOf("."))>0){g.type=m.substring(0,h);g.defaultType=m.substring(h+1)}if(j){delete l.factoryConfig;Ext.apply(g,j)}k.create=Ext.Factory.define(g.type,g)}},0,0,0,0,0,0,[Ext.mixin,"Factoryable"],0));(Ext.cmd.derive("Ext.util.CollectionKey",Ext.Base,{config:{collection:null,keyFn:null,property:null,rootProperty:null,unique:true},generation:0,map:null,mapRebuilds:0,constructor:function(b){this.initConfig(b)},get:function(d){var c=this.map||this.getMap();return c[d]||null},getRootProperty:function(){var c=this,d=(arguments.callee.$previous||Ext.Base.prototype.getRootProperty).call(this);return d!==null?d:c.getCollection().getRootProperty()},indexOf:function(m,q){var u=this.map||this.getMap(),l=u[m],p=this.getCollection(),t=p.length,r,o,n,s;if(!l){return -1}if(q===undefined){q=-1}if(l instanceof Array){n=l;o=t;for(s=n.length;s-->0;){r=p.indexOf(n[s]);if(rq){o=r}}if(o===t){return -1}}else{o=p.indexOf(l)}return(o>q)?o:-1},updateKey:function(m,k){var g=this,l=g.map,j,h;if(l){j=l[k];if(j instanceof Array){h=Ext.Array.indexOf(j,m);if(h>=0){if(j.length>2){j.splice(h,1)}else{l[k]=j[1-h]}}}else{if(j){delete l[k]}}g.add([m])}},onCollectionAdd:function(c,d){if(this.map){this.add(d.items)}},onCollectionItemChange:function(c,d){this.map=null},onCollectionRefresh:function(){this.map=null},onCollectionRemove:function(o,p){var m=this,s=m.map,n=p.items,r=n.length,q,k,l;if(s){if(m.getUnique()&&ro)?1:(r0,C=y.getSource(),x,D=0,L,J=false,R,F=false,A,B,N;if(C&&!C.updating){C.itemChanged(z,M,H,G)}else{B=y.getKey(z);if(K){L=y.indexOfKey(Q?H:B);F=(L<0);J=y.isItemFiltered(z);O=(F!==J)}if(O){if(J){D=[z];R=-1}else{x=[z];R=y.length}}else{if(S&&!J){if(!K){L=y.indexOfKey(Q?H:B)}N=y.getSortFn();if(L&&N(E[L-1],E[L])>0){P=-1;R=Ext.Array.binarySearch(E,z,0,L,N)}else{if(L0){P=1;R=Ext.Array.binarySearch(E,z,L+1,N)}}if(P){x=[z]}}}A={item:z,key:B,index:R,filterChanged:O,keyChanged:Q,indexChanged:!!P,filtered:J,oldIndex:L,newIndex:R,wasFiltered:F,meta:G};if(Q){A.oldKey=H}if(M){A.modified=M}y.beginUpdate();y.notify("beforeitemchange",[A]);if(Q){y.updateKey(z,H)}if(x||D){y.splice(R,D,x)}if(P>0){A.newIndex--}else{if(P<0){A.oldIndex++}}y.notify(J?"filtereditemchange":"itemchange",[A]);y.endUpdate()}},remove:function(g){var h=this,f=h.decodeRemoveItems(arguments,0),e=h.length;h.splice(0,f);return e-h.length},removeAll:function(){var c=this,d=c.length;if(c.generation&&d){c.splice(0,d)}return c},removeAt:function(n,o){var m=this,t=m.length,q=Ext.Number,r=q.clipIndices(t,[n,(o===undefined)?1:o],q.Clip.COUNT),s=r[0],u=r[1]-s,l=(u===1)&&m.getAt(s),p;m.splice(s,u);p=m.length-t;return(l&&p)?l:p},removeByKey:function(d){var c=this.getByKey(d);if(!c||!this.remove(c)){return false}return c},splice:function(Y,ao,aa){var ap=this,aw=ap.sorted&&ap.getAutoSort(),ac=ap.map,ak=ap.items,am=ap.length,ag=(ao instanceof Array)?ap.decodeRemoveItems(ao):null,af=!ag,X=Ext.Number,av=X.clipIndices(am,[Y,af?ao:0],X.Clip.COUNT),at=av[0],aq=av[1],R=aq-at,ai=ap.decodeItems(arguments,2),S=ai?ai.length:0,Z,ae,ah,ax=at,ay=ap.indices||((S||ag)?ap.getIndices():null),al=null,ar=R?[at]:null,au=null,aj=ap.getSource(),az,V,U,P,ab,W,Q,an,ad,T,k,n;if(aj&&!aj.updating){if(af){ag=[];for(P=0;P1){if(!Z.$cloned){ai=Z=Z.slice(0)}ap.sortData(Z)}}for(P=0;P0;){an=ap.getKey(ag[P]);if((W=ay[an])!==undefined){(ar||(ar=[])).push(W)}}if(!al&&!ar){return ap}ap.beginUpdate();if(ar){az=null;U=[];ah={};if(ar.length>1){ar.sort(Ext.Array.numericSortFn)}for(P=0,T=ar.length;P(az.at+V.length)){U.push(az={at:W,items:(V=[]),keys:(ad=[]),map:ah,next:az,replacement:al});if(al){al.replaced=az}}V.push(ah[an]=ab);ad.push(an);if(W1&&W===at){--R;ar[P--]=++at}}if(al){al.at=ax}for(Q=U.length;Q-->0;){az=U[Q];P=az.at;T=az.items.length;if(P+T1&&am){ap.spliceMerge(Z)}else{if(aw){if(S>1){ax=0;ap.indices=ay=null}else{ax=n.findInsertionIndex(al.items[0],ak,ap.getSortFn())}}if(ax===am){ak.push.apply(ak,Z);ay=ap.indices;if(ay){for(P=0;P-1){m=j[g];h=this.indexOf(m);if(h>-1){return h+1}--g}return 0},onCollectionAdd:function(w,v){var o=this,m=v.atItem,p=v.items,q,r,u,s,n,t;if(m){r=o.indexOf(m);if(r===-1){r=o.findInsertIndex(p[0])}else{++r}}else{r=0}if(o.getAutoFilter()&&o.filtered){for(s=0,t=p.length;sq)){q=l}}return[q,m]},count:function(b){return b.length},extremes:function(t,y,w,o,q){var s=null,x=null,u,n,r,v,p;for(u=y;uv)){v=p;x=n}}return[x,s]},max:function(k,j,l,h,m){var b=this._aggregators.bounds.call(this,k,j,l,h,m);return b[1]},maxItem:function(k,j,l,h,m){var b=this._aggregators.extremes.call(this,k,j,l,h,m);return b[1]},min:function(k,j,l,h,m){var b=this._aggregators.bounds.call(this,k,j,l,h,m);return b[0]},minItem:function(k,j,l,h,m){var b=this._aggregators.extremes.call(this,k,j,l,h,m);return b[0]},sum:function(q,n,j,l,k){for(var m,o=0,p=n;po+1||!Ext.isIterable(h);if(j){h=Ext.Array.slice(n,o);if(h.length===1&&h[0]===undefined){h.length=0}}k=l.getDecoder();if(k){if(!j){h=h.slice(0);j=true}for(m=h.length;m-->0;){if((h[m]=k.call(l,h[m]))===false){h.splice(m,1)}}}if(j){h.$cloned=true}}return h},getIndices:function(){var l=this,k=l.indices,h=l.items,j=h.length,m,g;if(!k){l.indices=k={};++l.indexRebuilds;for(m=0;m0);if(g||f){e.filtered=f;e.onFilterChange(h)}},getSortFn:function(){return this._sortFn||this.createSortFn()},getSorters:function(c){var d=this._sorters;if(!d&&c!==false){d=new Ext.util.SorterCollection();this.setSorters(d)}return d},onSortChange:function(){if(this.sorted){this.sortItems()}},sort:function(f,h,g){var e=this.getSorters();e.addSort.apply(e,arguments);return this},sortData:function(b){Ext.Array.sort(b,this.getSortFn());return b},sortItems:function(c){var d=this;if(d.sorted){c=d.getSortFn()}d.indices=null;d.notify("beforesort",[d.getSorters()]);if(d.length){Ext.Array.sort(d.items,c)}d.notify("sort")},sortBy:function(b){return this.sortItems(b)},findInsertionIndex:function(f,e,d){if(!e){e=this.items}if(!d){d=this.getSortFn()}return Ext.Array.binarySearch(e,f,d)},applySorters:function(d,c){if(d==null||(d&&d.isSorterCollection)){return d}if(d){if(!c){c=this.getSorters()}c.splice(0,c.length,d)}return c},createSortFn:function(){var f=this,e=f.getGrouper(),d=f.getSorters().getSortFn();if(!e){return d}return function(b,a){return e.sort(b,a)||d(b,a)}},updateGrouper:function(g){var l=this,h=l.getGroups(),j=l.getSorters(),k,m;l.onSorterChange();l.grouped=!!g;if(g){if(!h){h=new Ext.util.GroupCollection({itemRoot:l.getRootProperty()});l.addObserver(h);l.setGroups(h)}m=h.getSorters();m.splice(0,m.length,{property:"_groupKey",direction:g.getDirection()});k=true}else{if(h){l.removeObserver(h);h.destroy()}l.setGroups(null)}if(!j.updating){l.onEndUpdateSorters(j)}if(k){h.onCollectionRefresh(l)}},updateSorters:function(e,d){var f=this;if(d){d.un("endupdate","onEndUpdateSorters",f)}if(e){e.on("endupdate","onEndUpdateSorters",f,{prepend:true});e.$sortable=f}f.onSorterChange();f.onEndUpdateSorters(e)},onSorterChange:function(){this._sortFn=null},onEndUpdateSorters:function(h){var e=this,g=e.sorted,f=e.grouped||(h&&(h.length>0));if(g||f){e.sorted=!!f;e.onSortChange(h)}},removeObserver:function(d){var c=this.observers;if(c){Ext.Array.remove(c,d);delete this.observerMap[d.getId()]}},spliceMerge:function(s){var x=this,u,F=s.length,w=0,v=x.items,G=v.length,z=[],B=0,A=[],y=x.getSorters(),t,E,D,C,r;x.items=A;for(u=0;u1){z[B-2].next=z[B-1]}for(;u1){z[B-2].next=z[B-1]}A.push(C);for(E=u+1;E=0){break}A.push(C);t.push(C)}}for(;w0){q=p[n];r=!q.isEqual(s,q.get(m));if(r!==k){q.changingKey=true;if(o){q[o](k?null:l)}else{q.set(m,k?null:s)}q.changingKey=false}}}}),Right:Ext.define(null,{extend:"Ext.data.schema.Role",left:false,side:"right",onDrop:function(f,d){var e=this.association.field;if(e){f.set(e.name,null)}f[this.role]=null},createGetter:function(){var b=this;return function(a,d){return b.doGetFK(this,a,d)}},createSetter:function(){var b=this;return function(a,f,e){return b.doSetFK(this,a,f,e)}},checkMembership:function(h,g){var e=this.association.field,f;f=this.getSessionStore(h,g.get(e.name));if(f&&!f.contains(g)){f.add(g)}},onValueChange:function(s,p,t,u){var o=this,l,m,r,q,n;if(!s.changingKey){if(p){m=o.getSessionStore(p,u);if(m){m.remove(s)}if(t||t===0){m=o.getSessionStore(p,t);if(m&&!m.isLoading()){m.add(s)}}}else{l=s.joined;if(l){for(r=0,q=l.length;r=0){j.remove([h])}}else{if(h<0){o=j.getSession().getEntry(this.type,k);l=o&&o.record;if(l){j.add(l)}}}j.matrixUpdate=0}}},function(){var b=this;Ext.ClassManager.onCreated(function(){Ext.data.schema.ManyToMany.prototype.Right=Ext.define(null,{extend:b,left:false,side:"right"})},null,"Ext.data.schema.ManyToMany")})},0,0,0,0,0,0,[Ext.data.schema,"ManyToMany"],0));(Ext.cmd.derive("Ext.util.Inflector",Ext.Base,{singleton:true,plurals:[[(/(quiz)$/i),"$1zes"],[(/^(ox)$/i),"$1en"],[(/([m|l])ouse$/i),"$1ice"],[(/(matr|vert|ind)ix|ex$/i),"$1ices"],[(/(x|ch|ss|sh)$/i),"$1es"],[(/([^aeiouy]|qu)y$/i),"$1ies"],[(/(hive)$/i),"$1s"],[(/(?:([^f])fe|([lr])f)$/i),"$1$2ves"],[(/sis$/i),"ses"],[(/([ti])um$/i),"$1a"],[(/(buffal|tomat|potat)o$/i),"$1oes"],[(/(bu)s$/i),"$1ses"],[(/(alias|status|sex)$/i),"$1es"],[(/(octop|vir)us$/i),"$1i"],[(/(ax|test)is$/i),"$1es"],[(/^(p)erson$/i),"$1eople"],[(/^(m)an$/i),"$1en"],[(/(.*)(child)(ren)?$/i),"$1$2ren"],[(/s$/i),"s"],[(/$/),"s"]],singulars:[[(/(address)$/i),"$1"],[(/(quiz)zes$/i),"$1"],[(/(matr)ices$/i),"$1ix"],[(/(vert|ind)ices$/i),"$1ex"],[(/^(ox)en/i),"$1"],[(/(alias|status)es$/i),"$1"],[(/(octop|vir)i$/i),"$1us"],[(/(cris|ax|test)es$/i),"$1is"],[(/(shoe)s$/i),"$1"],[(/(o)es$/i),"$1"],[(/(bus)es$/i),"$1"],[(/([m|l])ice$/i),"$1ouse"],[(/(x|ch|ss|sh)es$/i),"$1"],[(/(m)ovies$/i),"$1ovie"],[(/(s)eries$/i),"$1eries"],[(/([^aeiouy]|qu)ies$/i),"$1y"],[(/([lr])ves$/i),"$1f"],[(/(tive)s$/i),"$1"],[(/(hive)s$/i),"$1"],[(/([^f])ves$/i),"$1fe"],[(/(^analy)ses$/i),"$1sis"],[(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i),"$1$2sis"],[(/([ti])a$/i),"$1um"],[(/(n)ews$/i),"$1ews"],[(/(p)eople$/i),"$1erson"],[(/s$/i),""]],uncountable:["sheep","fish","series","species","money","rice","information","equipment","grass","mud","offspring","deer","means"],singular:function(c,d){this.singulars.unshift([c,d])},plural:function(c,d){this.plurals.unshift([c,d])},clearSingulars:function(){this.singulars=[]},clearPlurals:function(){this.plurals=[]},isTransnumeral:function(b){return Ext.Array.indexOf(this.uncountable,b)!=-1},pluralize:function(j){if(this.isTransnumeral(j)){return j}var k=this.plurals,l=k.length,h,m,g;for(g=0;g1){f[e]=this.apply("capitalize",f[e])}return f.join("")},getterName:function(c){var d=c.role;if(c&&c.isMany){return d}return"get"+this.apply("capitalize",d)},inverseFieldRole:function(m,l,o,j){var n=this,k=n.apply(l?"uniRole":"multiRole",m),p=n.apply("pluralize",o),q=n.apply("undotted,pluralize",j);if(p.toLowerCase()!==q.toLowerCase()){k=o+n.apply("capitalize",k)}return k},manyToMany:function(h,j,g){var k=this,f=k.apply("undotted,capitalize,singularize",j)+k.apply("undotted,capitalize,pluralize",g);if(h){f=k.apply("capitalize",h+f)}return f},manyToOne:function(g,e,f,h){return this.apply("capitalize,singularize",f)+this.apply("capitalize",e)},matrixRole:function(f,d){var e=this.apply(f?"multiRole,capitalize":"multiRole",d);return f?f+e:e},oneToOne:function(g,e,f,h){return this.apply("undotted,capitalize,singularize",f)+this.apply("capitalize",e)},setterName:function(b){return"set"+this.apply("capitalize",b.role)},endsWithIdRe:/(?:(_id)|[^A-Z](Id))$/,cache:{},apply:function(o,q){var l=this,r=l.cache,k=r[q]||(r[q]={}),m=k[o],n,p,s;if(!m){if(o.indexOf(",")<0){m=l[o](q)}else{p=(s=o.split(",")).length;m=q;for(n=0;n0;){h[f].stub=k}}return k},isDescendantOf:function(c){for(var d=this;d=d.parent;){if(d===c){return true}}return false},onSchedule:function(){for(var f,g,j,h,k=this.parent;k;k=k.parent){h=k.bindings;if(h){for(f=0,g=h.length;f "+b.binding.getFullName()+")")},getDataObject:function(){var b=this.binding;return b&&b.getDataObject()},getRawValue:function(){var b=this.binding;return b&&b.getRawValue()},getValue:function(){var b=this.binding;return b&&b.getValue()},getTargetStub:function(){var b=this.binding;return b&&b.stub},isLoading:function(){var b=this.binding;return b?b.isLoading():false},link:function(g,e){var f=this,h=f.binding;if(h){h.destroy()}e=f.target=e||f.owner;f.linkDescriptor=g;f.binding=e.bind(g,f.onChange,f);f.binding.deep=true},onChange:function(){this.invalidate(true)},react:function(){var c=this,d=c.owner.linkData;d[c.name]=c.getValue();Ext.app.bind.Stub.prototype.react.call(this)},privates:{collect:function(){var d=this,e=Ext.app.bind.Stub.prototype.collect.call(this),f=d.binding?1:0;return e+f},sort:function(){var b=this.binding;if(b){this.scheduler.sortItem(b)}}}},0,0,0,0,0,0,[Ext.app.bind,"LinkStub"],0));(Ext.cmd.derive("Ext.app.bind.RootStub",Ext.app.bind.AbstractStub,{isRootStub:true,depth:0,createRootChild:function(u,q){var m=this,t=m.owner,p=t.getData(),s=m.children,n=s&&s[u],o=n?null:m,l,r;if(q||p.hasOwnProperty(u)||!(l=t.getParent())){r=new Ext.app.bind.Stub(t,u,o)}else{r=new Ext.app.bind.LinkStub(t,u,n?null:o);r.link("{"+u+"}",l)}if(n){n.graft(r)}return r},createStubChild:function(b){return this.createRootChild(b,true)},descend:function(l,o){var m=this,n=m.children,k=o||0,h=l[k++],j=(n&&n[h])||m.createRootChild(h);if(k0;){if(c[d].isLoading()){return true}}return false},isStatic:function(){var g=this.bindings,f=g.length,e,h;for(e=0;e=Math.max(c,d)},find:function(n,o,m,l,k,p){var q=!l,j=q&&p;return this.getData().findIndex(n,o,m,q,j,!k)},findRecord:function(){var c=this,d=c.find.apply(c,arguments);return d!==-1?c.getAt(d):null},findExact:function(d,e,f){return this.getData().findIndexBy(function(a){return a.isEqual(a.get(d),e)},this,f)},findBy:function(d,e,f){return this.getData().findIndexBy(d,e,f)},getAt:function(b){return this.getData().getAt(b)||null},getRange:function(g,e,h){var f=this.getData().getRange(g,Ext.isNumber(e)?e+1:e);if(h&&h.callback){h.callback.call(h.scope||this,f,g,e,h)}return f},applyFilters:function(c,d){if(!d){d=this.createFiltersCollection();d.setRootProperty("data")}d.add(c);return d},applySorters:function(c,d){if(!d){d=this.createSortersCollection();d.setRootProperty("data")}d.add(c);return d},updateAutoFilter:function(c){var d=this.getData();if(d.setAutoFilter){d.setAutoFilter(c)}},updateAutoSort:function(d){var c=this.getData();if(c.setAutoSort){c.setAutoSort(d)}},filter:function(d,c){if(Ext.isString(d)){d={property:d,value:c}}this.getFilters().add(d)},removeFilter:function(e){var f=this,d=f.getFilters();if(e instanceof Ext.util.Filter){d.remove(e)}else{d.removeByKey(e)}},updateRemoteSort:function(h){var f=this,g=f.getSorters(),e=f.getData();if(h){g.on("endupdate",f.onSorterEndUpdate,f);e.un("beforesort",f.onBeforeCollectionSort,f)}else{g.un("endupdate",f.onSorterEndUpdate,f);e.on("beforesort",f.onBeforeCollectionSort,f)}},updateRemoteFilter:function(f){var d=this,e=d.getFilters();if(f){e.on("endupdate",d.onFilterEndUpdate,d)}else{e.un("endupdate",d.onFilterEndUpdate,d)}},addFilter:function(b){this.getFilters().add(b)},filterBy:function(c,d){this.getFilters().add({filterFn:c,scope:d||this})},clearFilter:function(f){var d=this,e=d.getFilters(false);if(!e||e.getCount()===0){return}d.suppressNextFilter=!!f;e.removeAll();d.suppressNextFilter=false},isFiltered:function(){return this.getFilters().getCount()>0},isSorted:function(){return this.getSorters().getCount()>0||this.isGrouped()},addFieldTransform:function(h){if(h.getTransform()){return}var j=h.getProperty(),k=this.getModel(),g,f;if(k){g=k.getField(j);f=g?g.getSortType():null}if(f&&f!==Ext.identityFn){h.setTransform(f)}},beginUpdate:function(){if(!this.updating++){this.fireEvent("beginupdate")}},endUpdate:function(){if(this.updating&&!--this.updating){this.fireEvent("endupdate");this.onEndUpdate()}},getState:function(){var n=this,m=[],o=n.getFilters(),j=n.getGrouper(),l,p,q,k;n.getSorters().each(function(a){m[m.length]=a.getState();p=true});if(n.statefulFilters&&n.saveStatefulFilters){p=true;l=[];o.each(function(a){l[l.length]=a.getState()})}if(j){p=true}if(p){k={};if(m.length){k.sorters=m}if(l){k.filters=l}if(j){k.grouper=j.getState()}}return k},applyState:function(l){var n=this,k=n.getSorters(),o=n.getFilters(),h=l.sorters,j=l.filters,m=l.grouper;if(h){k.replaceAll(h)}if(j){n.saveStatefulFilters=true;o.replaceAll(j)}if(m){this.setGrouper(m)}},hasPendingLoad:Ext.emptyFn,isLoading:Ext.emptyFn,destroy:function(){var b=this;b.clearListeners();if(b.getStoreId()){Ext.data.StoreManager.unregister(b)}b.onDestroy();b.callParent()},sort:function(h,e,g){var f=this;if(arguments.length===0){if(f.getRemoteSort()){f.attemptLoad()}else{f.forceLocalSort()}}else{f.getSorters().addSort(h,e,g)}},onBeforeCollectionSort:function(d,c){this.fireEvent("beforesort",this,c.getRange())},onSorterEndUpdate:function(){var d=this,c=d.getSorters().getRange();if(c.length){if(d.getRemoteSort()){d.attemptLoad({callback:function(){d.fireEvent("sort",d,c)}})}else{d.fireEvent("datachanged",d);d.fireEvent("refresh",d);d.fireEvent("sort",d,c)}}else{d.fireEvent("sort",d,c)}},onFilterEndUpdate:function(){var c=this,d=c.suppressNextFilter;if(c.getAutoFilter()){if(c.getRemoteFilter()){c.currentPage=1;if(!d){c.attemptLoad()}}else{if(!d){c.fireEvent("datachanged",c);c.fireEvent("refresh",c)}}}if(c.trackStateChanges){c.saveStatefulFilters=true}c.fireEvent("filterchange",c,c.getFilters().getRange())},updateGroupField:function(c){var d=this.getData();if(c){d.setGrouper({property:c,direction:this.getGroupDir()})}else{d.setGrouper(null)}},getGrouper:function(){return this.getData().getGrouper()},group:function(g,j,f){var k=this,h=g||k.getSorters().getCount()>0;if(g&&typeof g==="string"){g={property:g,direction:j||k.getGroupDir()}}k.getData().setGrouper(g);if(k.isLoadBlocked()){return}if(h){if(k.getRemoteSort()){k.attemptLoad({callback:function(){k.fireEvent("groupchange",k,k.getGrouper())}})}else{k.fireEvent("datachanged",k);k.fireEvent("refresh",k);k.fireEvent("groupchange",k,k.getGrouper())}}else{k.fireEvent("groupchange",k,k.getGrouper())}},clearGrouping:function(){this.group(null)},getGroupField:function(){var d=this.getGrouper(),c="";if(d){c=d.getProperty()}return c},isGrouped:function(){return !!this.getGrouper()},applyGrouper:function(b){this.group(b);return this.getData().getGrouper()},getGroups:function(){return this.getData().getGroups()},onEndUpdate:Ext.emptyFn,deprecated:{5:{methods:{destroyStore:function(){this.destroy()}}}}},1,0,0,0,0,[[Ext.mixin.Observable.prototype.mixinId||Ext.mixin.Observable.$className,Ext.mixin.Observable],[Ext.mixin.Factoryable.prototype.mixinId||Ext.mixin.Factoryable.$className,Ext.mixin.Factoryable]],[Ext.data,"AbstractStore"],0));(Ext.cmd.derive("Ext.data.LocalStore",Ext.Mixin,{mixinConfig:{id:"localstore"},constructDataCollection:function(){var d=new Ext.util.Collection({rootProperty:"data",extraKeys:{byInternalId:{property:"internalId",rootProperty:""}}}),c;c=d.getSorters();c.setSorterConfigure(this.addFieldTransform,this);return d},createFiltersCollection:function(){return this.getData().getFilters()},createSortersCollection:function(){return this.getData().getSorters()},onCollectionSort:function(){this.onSorterEndUpdate()},onCollectionFilter:function(){this.onFilterEndUpdate()},notifySorterChange:function(){this.getData().onSorterChange()},forceLocalSort:function(){this.getData().onSortChange()},contains:function(b){return this.indexOf(b)>-1},each:function(k,l){var j=this.data.items,h=j.length,g,m;for(m=0;m]+>/gi,asText:function(b){return String(b).replace(this.stripTagsRE,"")},asUCText:function(b){return String(b).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(b){return String(b).toUpperCase()},asDate:function(b){if(!b){return 0}if(Ext.isDate(b)){return b.getTime()}return Date.parse(String(b))},asFloat:function(d){var c=parseFloat(String(d).replace(/,/g,""));return isNaN(c)?0:c},asInt:function(d){var c=parseInt(String(d).replace(/,/g,""),10);return isNaN(c)?0:c}},0,0,0,0,0,0,[Ext.data,"SortTypes"],0));(Ext.cmd.derive("Ext.data.validator.Validator",Ext.Base,{isValidator:true,type:"base",statics:{all:{},register:function(d,e){var f=this.all;f[d.toUpperCase()]=f[d.toLowerCase()]=f[d]=e.prototype}},onClassExtended:function(d,c){if(c.type){Ext.data.validator.Validator.register(c.type,d)}},constructor:function(b){if(typeof b==="function"){this.fnOnly=true;this.validate=b}else{this.initConfig(b)}},validate:function(){return true},clone:function(){var b=this;if(b.fnOnly){return new Ext.data.validator.Validator(b.validate)}return new b.self(b.getCurrentConfig())}},1,0,0,0,["data.validator.base"],[[Ext.mixin.Factoryable.prototype.mixinId||Ext.mixin.Factoryable.$className,Ext.mixin.Factoryable]],[Ext.data.validator,"Validator"],function(){this.register(this.prototype.type,this)}));(Ext.cmd.derive("Ext.data.field.Field",Ext.Base,{alternateClassName:"Ext.data.Field",aliasPrefix:"data.field.",type:"auto",factoryConfig:{defaultProperty:"name"},isDataField:true,isField:true,allowBlank:true,allowNull:false,critical:false,defaultInvalidMessage:"This field is invalid",defaultValue:undefined,definedBy:null,depends:null,dependents:null,mapping:null,name:null,ordinal:undefined,persist:null,reference:null,sortDir:"ASC",unique:false,rank:null,stripRe:/[\$,%]/g,calculated:false,evil:false,identifier:false,onClassExtended:function(m,k){var j=k.sortType,l=m.prototype,h=l.validators,g=k.validators;if(j&&Ext.isString(j)){l.sortType=Ext.data.SortTypes[j]}if(g){if(!Ext.isArray(g)){g=[g]}delete k.validators;if(h){g=h.concat(g)}l.validators=g}},argumentNamesRe:/^function\s+\(\s*([^,\)\s]+)/,calculateRe:/[^\.a-z0-9_]([a-z_][a-z_0-9]*)\.([a-z_][a-z_0-9]*)/gi,constructor:function(z){var s=this,q=s.calculateRe,w,p,r,v,A,C,u,B,t,y,x;if(z){if(Ext.isString(z)){s.name=z}else{x=z.validators;if(x){delete z.validators;s.instanceValidators=x}Ext.apply(s,z)}}if(!s.allowNull){s.allowNull=!!s.reference}w=s.calculate;A=s.depends;if(w){s.convert=s.doCalculate;if(!A){if(!(A=w.$depends)){C={};t=w.toString();w.$depends=A=[];u=s.argumentNamesRe.exec(t);B=u?u[1]:"data";while((u=q.exec(t))){if(B===u[1]&&!C[y=u[2]]){C[y]=1;A.push(y)}}}s.depends=A}}r=s.defaultValue;if(s.convert){if(r!==undefined){s.defaultValue=r=s.convert(r)}s.calculated=p=s.convert.length>1;s.evil=p&&!A}if(s.persist===null){s.persist=!p}v=s.sortType;if(!s.sortType){s.sortType=Ext.data.SortTypes.none}else{if(Ext.isString(v)){s.sortType=Ext.data.SortTypes[v]}}if(A&&typeof A==="string"){s.depends=[A]}s.cloneDefaultValue=r!==undefined&&(Ext.isDate(r)||Ext.isArray(r)||Ext.isObject(r))},setModelValidators:function(b){this._validators=null;this.modelValidators=b},compileValidators:function(){var b=this;b._validators=[];b.constructValidators(b.validators);b.constructValidators(b.modelValidators);b.constructValidators(b.instanceValidators)},constructValidators:function(g){if(g){if(!(g instanceof Array)){g=[g]}var h=g.length,k=this._validators,f,j;for(f=0;fh)?1:0)},compare:function(d,c){return(d===c)?0:((d0){(ah=P[ab]).dirty=true;L=L?Math.min(L,ah.rank):ah.rank}if(!aq||aq.persist){if(ag&&ag.hasOwnProperty(O)){if(!af||al.isEqual(ag[O],K)){delete ag[O];R.dirty=-1}}else{if(af){if(!ag){R.modified=ag={}}R.dirty=true;ag[O]=X}}}if(O===R.idField.name){Z=true;N=X;V=K}}if(!L){break}aq=ai[L-1];aq.dirty=false;if(T){delete ao[an]}else{ao=R._singleProp;T=true}an=aq.name;ao[an]=Q[an];ac=true;for(;L0;){G=(w=F[E]).name;if(!(G in z)){t=D[G];if(n&&w.serialize){t=w.serialize(t,y)}z[G]=t}}}if(x){y.getAssociatedData(z)}return z},getTransientFields:function(){var d=this.self,c=d.transientFields;if(!c){d.rankFields();c=d.transientFields}return c},isLoading:function(){return !!this.loadOperation},abort:function(){var b=this.loadOperation;if(b){b.abort()}},load:function(j){j=Ext.apply({},j);var n=this,o=j.scope||n,q=n.getProxy(),l=j.callback,k=n.loadOperation,m=n.getId(),p;if(k){p=k.extraCalls;if(!p){p=k.extraCalls=[]}p.push(j);return k}j.id=m;j.recordCreator=function(b,d,c){var a=n.session;c.recordCreator=a?a.recordCreator:null;n.set(b,n._commitOptions);return n};j.internalCallback=function(b){var f=b.wasSuccessful()&&b.getRecords().length>0,e=n.loadOperation,h=e.extraCalls,c=[n,b],g=[n,b,f],a,d;n.loadOperation=null;if(f){Ext.callback(j.success,o,c)}else{Ext.callback(j.failure,o,c)}Ext.callback(l,o,g);if(h){for(a=0,d=h.length;a0;){C=u[z];if(C in A){delete A[C];delete s[C]}}for(z=0,w=x.length;z=k.getTotal()){k.setConfig({success:false,records:[],total:0})}else{k.setRecords(Ext.Array.slice(p,r,r+o))}}n.setCompleted()}},clear:Ext.emptyFn},0,0,0,0,["proxy.memory"],0,[Ext.data.proxy,"Memory",Ext.data,"MemoryProxy"],0));(Ext.cmd.derive("Ext.data.ProxyStore",Ext.data.AbstractStore,{config:{model:undefined,fields:null,proxy:undefined,autoLoad:undefined,autoSync:false,batchUpdateMode:"operation",sortOnLoad:true,trackRemoved:true},onClassExtended:function(f,j,g){var k=j.model,h;if(typeof k==="string"){h=g.onBeforeCreated;g.onBeforeCreated=function(){var a=this,b=arguments;Ext.require(k,function(){h.apply(a,b)})}}},implicitModel:false,blockLoadCounter:0,autoSyncSuspended:0,constructor:function(d){var c=this;c.removed=[];c.blockLoad();Ext.data.AbstractStore.prototype.constructor.apply(this,arguments);c.unblockLoad()},updateAutoLoad:function(d){var f=this,e;f.getData();if(d){e=f.loadTask||(f.loadTask=new Ext.util.DelayedTask(null,null,null,null,false));e.delay(1,f.attemptLoad,f,Ext.isObject(d)?[d]:undefined)}},getTotalCount:function(){return this.totalCount||0},applyFields:function(f){var g=this,e,h;if(f){g.implicitModel=true;g.setModel(e=Ext.define(null,{extend:"Ext.data.Model",fields:f,proxy:(h=g.getProxy())}));if(h&&!h.getModel()){h.setModel(e)}}},applyModel:function(b){if(b){b=Ext.data.schema.Schema.lookupEntity(b)}else{this.getFields();return this.getModel()}return b},applyProxy:function(d){var f=this,e=f.getModel();if(d){if(d.isProxy){d.setModel(e)}else{if(Ext.isString(d)){d={type:d,model:e}}else{if(!d.model){d=Ext.apply({model:e},d)}}d=Ext.createByAlias("proxy."+d.type,d)}}else{if(e){d=e.getProxy()}}if(!d){d=Ext.createByAlias("proxy.memory")}if(!f.disableMetaChangeEvent){d.on("metachange",f.onMetaChange,f)}return d},updateTrackRemoved:function(b){this.removed=b?[]:null},onMetaChange:function(d,c){this.fireEvent("metachange",this,c)},create:function(j,m){var k=this,h=new k.model(j),l=k.getProxy(),g;m=Ext.apply({},m);if(!m.records){m.records=[h]}m.internalScope=k;m.internalCallback=k.onProxyWrite;g=l.createOperation("create",m);return g.execute()},read:function(){return this.load.apply(this,arguments)},update:function(e){var g=this,h=g.getProxy(),f;e=Ext.apply({},e);if(!e.records){e.records=g.getUpdatedRecords()}e.internalScope=g;e.internalCallback=g.onProxyWrite;f=h.createOperation("update",e);return f.execute()},onProxyWrite:function(e){var h=this,g=e.wasSuccessful(),f=e.getRecords();switch(e.getAction()){case"create":h.onCreateRecords(f,e,g);break;case"update":h.onUpdateRecords(f,e,g);break;case"destroy":h.onDestroyRecords(f,e,g);break}if(g){h.fireEvent("write",h,e);h.fireEvent("datachanged",h);h.fireEvent("refresh",h)}},onCreateRecords:Ext.emptyFn,onUpdateRecords:Ext.emptyFn,onDestroyRecords:function(d,e,f){if(f){this.removed.length=0}},erase:function(e){var g=this,h=g.getProxy(),f;e=Ext.apply({},e);if(!e.records){e.records=g.getRemovedRecords()}e.internalScope=g;e.internalCallback=g.onProxyWrite;f=h.createOperation("destroy",e);return f.execute()},onBatchOperationComplete:function(c,d){return this.onProxyWrite(d)},onBatchComplete:function(m,h){var j=this,g=m.operations,k=g.length,l;if(j.batchUpdateMode!="operation"){j.suspendEvents();for(l=0;l0){h.create=l;k=true}if(n.length>0){h.update=n;k=true}if(j.length>0){h.destroy=j;k=true}if(k&&m.fireEvent("beforesync",h)!==false){m.isSyncing=true;o=o||{};m.proxy.batch(Ext.apply(o,{operations:h,listeners:m.getBatchListeners()}))}return m},getBatchListeners:function(){var c=this,d={scope:c,exception:c.onBatchException,complete:c.onBatchComplete};if(c.batchUpdateMode=="operation"){d.operationcomplete=c.onBatchOperationComplete}return d},save:function(){return this.sync.apply(this,arguments)},blockLoad:function(b){if(b!==undefined){this.blockLoadCounter=b}else{++this.blockLoadCounter}},unblockLoad:function(d){var f=this,e=f.blockLoadCounter;if(d){f.blockLoadCounter=0}else{if(e){--f.blockLoadCounter}}return e},isLoadBlocked:function(){return !!this.blockLoadCounter},attemptLoad:function(b){if(!this.isLoadBlocked()){this.load(b)}},load:function(h){if(this.isLoadBlocked()){return}var l=this,o=l.getProxy(),m=l.loadTask,j={internalScope:l,internalCallback:l.onProxyLoad},n,k;if(l.getRemoteFilter()){n=l.getFilters();if(n.getCount()){j.filters=n.getRange()}}if(l.getRemoteSort()){k=l.getSorters();if(k.getCount()){j.sorters=k.getRange()}l.fireEvent("beforesort",l,j.sorters)}Ext.apply(j,h);j.scope=j.scope||l;l.lastOptions=j;j=o.createOperation("read",j);if(l.fireEvent("beforeload",l,j)!==false){l.loading=true;if(m){m.cancel();l.loadTask=null}j.execute()}return l},reload:function(d){var c=Ext.apply({},d,this.lastOptions);return this.load(c)},onEndUpdate:function(){var b=this;if(b.needsSync&&b.autoSync&&!b.autoSyncSuspended){b.sync()}},afterReject:function(d){var c=this;if(c.contains(d)){c.onUpdate(d,Ext.data.Model.REJECT,null);c.fireEvent("update",c,d,Ext.data.Model.REJECT,null)}},afterCommit:function(e,f){var d=this;if(!f){f=null}if(d.contains(e)){d.onUpdate(e,Ext.data.Model.COMMIT,f);d.fireEvent("update",d,e,Ext.data.Model.COMMIT,f)}},afterErase:function(b){this.onErase(b)},onErase:Ext.emptyFn,onUpdate:Ext.emptyFn,onDestroy:function(){var b=this;b.blockLoad();b.clearData();b.setProxy(null);b.setModel(null)},hasPendingLoad:function(){return !!this.loadTask||this.isLoading()},isLoading:function(){return !!this.loading},isLoaded:function(){return this.loadCount>0},suspendAutoSync:function(){++this.autoSyncSuspended},resumeAutoSync:function(c){var d=this;if(d.autoSyncSuspended&&!--d.autoSyncSuspended){if(c){d.sync()}}},removeAll:Ext.emptyFn,clearData:Ext.emptyFn},1,0,0,0,0,0,[Ext.data,"ProxyStore"],0));(Ext.cmd.derive("Ext.data.proxy.Server",Ext.data.proxy.Proxy,{alternateClassName:"Ext.data.ServerProxy",isRemote:true,config:{url:"",pageParam:"page",startParam:"start",limitParam:"limit",groupParam:"group",groupDirectionParam:"groupDir",sortParam:"sort",filterParam:"filter",directionParam:"dir",idParam:"id",simpleSortMode:false,simpleGroupMode:false,noCache:true,cacheString:"_dc",timeout:30000,api:{create:undefined,read:undefined,update:undefined,destroy:undefined},extraParams:{}},create:function(){return this.doRequest.apply(this,arguments)},read:function(){return this.doRequest.apply(this,arguments)},update:function(){return this.doRequest.apply(this,arguments)},erase:function(){return this.doRequest.apply(this,arguments)},setExtraParam:function(d,c){this.getExtraParams()[d]=c},buildRequest:function(j){var l=this,h=Ext.apply({},j.getParams()),k=Ext.applyIf(h,l.getExtraParams()||{}),m,n,o;Ext.applyIf(k,l.getParams(j));n=j.getId();o=l.getIdParam();if(n!==undefined&&k[o]===undefined){k[o]=n}m=new Ext.data.Request({params:k,action:j.getAction(),records:j.getRecords(),url:j.getUrl(),operation:j,proxy:l});m.setUrl(l.buildUrl(m));j.setRequest(m);return m},processResponse:function(l,q,m,j){var n=this,p,k,o;if(l===true){k=n.getReader();if(j.status===204){o=k.getNullResultSet()}else{o=k.read(n.extractResponseData(j),{recordCreator:q.getRecordCreator()})}q.process(o,m,j);p=!q.wasSuccessful()}else{n.setException(q,j);p=true}if(p){n.fireEvent("exception",n,j,q)}n.afterRequest(m,l)},setException:function(c,d){c.setException({status:d.status,statusText:d.statusText,response:d})},extractResponseData:Ext.identityFn,applyEncoding:function(b){return Ext.encode(b)},encodeSorters:function(h,k){var g=[],j=h.length,f;for(f=0;f0){if(G){I=0;if(Q.length>1&&H){I=1}x[L]=Q[I].getProperty();x[D]=Q[I].getDirection()}else{x[L]=w.encodeSorters(Q)}}if(B&&E&&E.length>0){x[B]=w.encodeFilters(E)}return x},buildUrl:function(f){var d=this,e=d.getUrl(f);if(d.getNoCache()){e=Ext.urlAppend(e,Ext.String.format("{0}={1}",d.getCacheString(),Ext.Date.now()))}return e},getUrl:function(c){var d;if(c){d=c.getUrl()||this.getApi()[c.getAction()]}return d?d:(arguments.callee.$previous||Ext.data.proxy.Proxy.prototype.getUrl).call(this)},doRequest:function(b){},afterRequest:Ext.emptyFn,onDestroy:function(){Ext.destroy(this.getReader(),this.getWriter())}},0,0,0,0,["proxy.server"],0,[Ext.data.proxy,"Server",Ext.data,"ServerProxy"],0));(Ext.cmd.derive("Ext.data.proxy.Ajax",Ext.data.proxy.Server,{alternateClassName:["Ext.data.HttpProxy","Ext.data.AjaxProxy"],defaultActionMethods:{create:"POST",read:"GET",update:"POST",destroy:"POST"},config:{binary:false,headers:undefined,paramsAsJson:false,withCredentials:false,useDefaultXhrHeader:true,username:null,password:null,actionMethods:{create:"POST",read:"GET",update:"POST",destroy:"POST"}},doRequest:function(j){var n=this,m=n.getWriter(),o=n.buildRequest(j),k=n.getMethod(o),h,l;if(m&&j.allowWrite()){o=m.write(o)}o.setConfig({binary:n.getBinary(),headers:n.getHeaders(),timeout:n.getTimeout(),scope:n,callback:n.createRequestCallback(o,j),method:k,useDefaultXhrHeader:n.getUseDefaultXhrHeader(),disableCaching:false});if(k.toUpperCase()!=="GET"&&n.getParamsAsJson()){l=o.getParams();if(l){h=o.getJsonData();if(h){h=Ext.Object.merge({},h,l)}else{h=l}o.setJsonData(h);o.setParams(undefined)}}if(n.getWithCredentials()){o.setWithCredentials(true);o.setUsername(n.getUsername());o.setPassword(n.getPassword())}return n.sendRequest(o)},sendRequest:function(b){b.setRawRequest(Ext.Ajax.request(b.getCurrentConfig()));this.lastRequest=b;return b},abort:function(b){b=b||this.lastRequest;if(b){Ext.Ajax.abort(b.getRawRequest())}},getMethod:function(f){var h=this.getActionMethods(),e=f.getAction(),g;if(h){g=h[e]}return g||this.defaultActionMethods[e]},createRequestCallback:function(f,e){var d=this;return function(b,a,c){if(f===d.lastRequest){d.lastRequest=null}d.processResponse(a,e,f,c)}}},0,0,0,0,["proxy.ajax"],0,[Ext.data.proxy,"Ajax",Ext.data,"HttpProxy",Ext.data,"AjaxProxy"],0));(Ext.cmd.derive("Ext.data.reader.Json",Ext.data.reader.Reader,{alternateClassName:"Ext.data.JsonReader",config:{record:null,metaProperty:"metaData",useSimpleAccessors:false,preserveRawData:false},updateRootProperty:function(){this.forceBuildExtractors()},updateMetaProperty:function(){this.forceBuildExtractors()},readRecords:function(h,e){var f=this,g;if(f.getMeta){g=f.getMeta(h);if(g){f.onMetaChange(g)}}else{if(h.metaData){f.onMetaChange(h.metaData)}}return Ext.data.reader.Reader.prototype.readRecords.call(this,h,e)},getResponseData:function(d){try{return Ext.decode(d.responseText)}catch(c){Ext.Logger.warn("Unable to parse the JSON returned by the server");return this.createReadError(c.message)}},buildExtractors:function(){var f=this,d=f.getMetaProperty(),e=f.getRootProperty();if(f.callParent(arguments)){if(e){f.getRoot=f.createAccessor(e)}else{f.getRoot=Ext.identityFn}if(d){f.getMeta=f.createAccessor(d)}}},extractData:function(h,k){var j=this.getRecord(),l=[],m,g;if(j){m=h.length;if(!m&&Ext.isObject(h)){m=1;h=[h]}for(g=0;g1||(u&&!w)){F+=y}else{if(z){a=false;if(v){++u}else{if(w){--u;a=true}}if(F){if(a){F="["+F+"]"}else{F="."+F}A+=F;D.push(""+A);F=""}}}}H=D.join(" && ");H=Ext.functionFactory("raw","return "+H)}return H}}()),createFieldAccessor:function(h){var f=this,g=h.mapping,k=g||g===0,j=k?g:h.name;if(k){if(typeof j==="function"){return function(a){return h.mapping(a,f)}}else{return f.createAccessor(j)}}}},0,0,0,0,["reader.json"],0,[Ext.data.reader,"Json",Ext.data,"JsonReader"],0));(Ext.cmd.derive("Ext.data.writer.Json",Ext.data.writer.Writer,{alternateClassName:"Ext.data.JsonWriter",config:{rootProperty:undefined,encode:false,allowSingle:true,expandData:false},getExpandedData:function(p){var r=p.length,o=0,l,s,n,q,m,j=function(c,b){var a={};a[c]=b;return a};for(;o0){m=l[s];for(;q>0;q--){m=j(n[q],m)}l[n[0]]=l[n[0]]||{};Ext.Object.merge(l[n[0]],m);delete l[s]}}}}return p},writeRecords:function(m,l){var n=this,j=n.getRootProperty(),o,k,h;if(n.getExpandData()){l=n.getExpandedData(l)}if(n.getAllowSingle()&&l.length===1){l=l[0];k=true}h=this.getTransform();if(h){l=h(l,m);m.setJsonData(l)}if(n.getEncode()){if(j){m.setParam(j,Ext.encode(l))}else{}}else{if(k||(l&&l.length)){o=m.getJsonData()||{};if(j){o[j]=l}else{o=l}m.setJsonData(o)}}return m}},0,0,0,0,["writer.json"],0,[Ext.data.writer,"Json",Ext.data,"JsonWriter"],0));(Ext.cmd.derive("Ext.util.Group",Ext.util.Collection,{config:{groupKey:null}},0,0,0,0,0,0,[Ext.util,"Group"],0));(Ext.cmd.derive("Ext.util.SorterCollection",Ext.util.Collection,{isSorterCollection:true,$sortable:null,sortFn:null,config:{sorterOptionsFn:null,sorterOptionsScope:null},constructor:function(d){var c=this;c.sortFn=Ext.util.Sorter.createComparator(c);Ext.util.Collection.prototype.constructor.call(this,d);c.setDecoder(c.decodeSorter)},addSort:function(o,p,u){var q=this,t,s,v,m,w,n,r;if(!o){q.beginUpdate();q.endUpdate()}else{m=q.getOptions();if(o instanceof Array){r=o;u=p;p=null}else{if(Ext.isString(o)){if(!(n=q.get(o))){r=[{property:o,direction:p||m.getDefaultSortDirection()}]}else{r=[n]}}else{if(Ext.isFunction(o)){r=[{sorterFn:o,direction:p||m.getDefaultSortDirection()}]}else{r=[o];u=p;p=null}}}u=q._sortModes[u||"replace"];w=q.getAt(0);t=q.length;s=u.append?t:0;q.beginUpdate();q.splice(s,u.replace?t:0,r);if(u.multi){t=q.length;v=m.getMultiSortLimit();if(t>v){q.removeAt(v,t)}}if(n&&p){n.setDirection(p)}else{if(s===0&&w&&w===q.getAt(0)){w.toggle()}}q.endUpdate()}},getSortFn:function(){return this.sortFn},getByProperty:function(h){var f=this.items,g=f.length,k,j;for(k=0;kv+1||!Ext.isIterable(u)){u=Ext.Array.slice(s,v)}var p=q.items,t=u.length,w=[],x,o,y,n,r;for(x=0;x0;){o=p[y];if(o.getSorterFn()===n){w.push(o)}}}}}}u=w;u.$cloned=true}return u},getOptions:function(){return this.$sortable||this}},1,0,0,0,0,0,[Ext.util,"SorterCollection"],0));(Ext.cmd.derive("Ext.util.FilterCollection",Ext.util.Collection,{isFilterCollection:true,$filterable:null,filterFn:null,constructor:function(d){var c=this;c.filterFn=Ext.util.Filter.createFilterFn(c);Ext.util.Collection.prototype.constructor.call(this,d);c.setDecoder(c.decodeFilter)},filterData:function(b){return this.filtered?Ext.Array.filter(b,this.filterFn):b},getFilterFn:function(){return this.filterFn},isItemFiltered:function(b){return !this.filterFn(b)},decodeFilter:function(h){var e=this.getOptions(),f=e.getRootProperty(),g;if(h.isFilter){if(!h.getRoot()){h.setRoot(f)}}else{g={root:f};if(Ext.isFunction(h)){g.filterFn=h}else{g=Ext.apply(g,h);if(g.fn){g.filterFn=g.fn;delete g.fn}if(Ext.util.Filter.isInvalid(g)){return false}}h=new Ext.util.Filter(g)}return h},decodeRemoveItems:function(u,y){var s=this,x=(y===undefined)?u:u[y];if(!x.$cloned){if(u.length>y+1||!Ext.isIterable(x)){x=Ext.Array.slice(u,y)}var C=s.items,v=x.length,A=[],F,B,E,w,G,n,z,D,t;for(B=0;B0;){n=C[D];z=false;if(G){z=n.getProperty()===F}else{if(E){z=n.getFilterFn()===F}else{if(w){z=n.getProperty()===F.property&&n.getValue()===F.value}}}if(z){A.push(n)}}}}x=A;x.$cloned=true}return x},getOptions:function(){return this.$filterable||this}},1,0,0,0,0,0,[Ext.util,"FilterCollection"],0));(Ext.cmd.derive("Ext.util.GroupCollection",Ext.util.Collection,{isGroupCollection:true,config:{itemRoot:null},observerPriority:-100,onCollectionAdd:function(c,d){this.addItemsToGroups(c,d.items)},onCollectionBeforeItemChange:function(j,g){var k=this,f=g.item,h=j.getKey(f);k.onCollectionAdd=k.onCollectionRemove=k.onCollectionUpdateKey=null;k.syncItemGrouping(j,f,h,g.oldKey)},onCollectionBeginUpdate:function(){this.beginUpdate()},onCollectionEndUpdate:function(){this.endUpdate()},onCollectionItemChange:function(c,d){delete this.onCollectionAdd;delete this.onCollectionRemove;delete this.onCollectionUpdateKey},onCollectionRefresh:function(b){this.removeAll();this.addItemsToGroups(b,b.items)},onCollectionRemove:function(s,r){var m=this,n=m.groupItems(s,r.items,false),l,k,o,q,p;for(o=0,q=n.length;o-1){s=[r];n=1}else{n=0}}else{s=[];for(p=0,n=r.length;p=0;f--){h=j[f];k.insert(h.removedFrom||0,h);h.reject()}j.length=0}},onDestroy:function(){var e=this,f=e.loadTask,g=e.getData(),h=g.getSource();Ext.data.ProxyStore.prototype.onDestroy.call(this);e.setSession(null);e.observers=null;if(f){f.cancel();e.loadTask=null}e.clearData(false,h||g);g.destroy();if(h){h.destroy()}e.setData(null)}},1,0,0,0,["store.store"],[[Ext.data.LocalStore.prototype.mixinId||Ext.data.LocalStore.$className,Ext.data.LocalStore]],[Ext.data,"Store"],0));(Ext.cmd.derive("Ext.data.reader.Array",Ext.data.reader.Json,{alternateClassName:"Ext.data.ArrayReader",config:{totalProperty:undefined,successProperty:undefined},createFieldAccessor:function(g){var e=g.mapping,h=g.hasMapping()?e:g.ordinal,f;g.mapping=h;f=Ext.data.reader.Json.prototype.createFieldAccessor.apply(this,arguments);g.mapping=e;return f},getModelData:function(b){return{}}},0,0,0,0,["reader.array"],0,[Ext.data.reader,"Array",Ext.data,"ArrayReader"],0));(Ext.cmd.derive("Ext.data.ArrayStore",Ext.data.Store,{alternateClassName:["Ext.data.SimpleStore"],config:{proxy:{type:"memory",reader:"array"}},loadData:function(h,g){if(this.expandData){var j=[],f=0,k=h.length;for(;f=o.totalCount)?t:r;p=u===0?0:u-1;w=r===t?r:r+1;o.lastRequestStart=u;o.lastRequestEnd=r;if(o.rangeCached(p,w)){o.onRangeAvailable(n);m=q.getRange(u,r+1)}else{o.fireEvent("cachemiss",o,u,r);v=function(b,a){if(o.rangeCached(p,w)){o.fireEvent("cachefilled",o,u,r);q.un("pageadded",v);o.onRangeAvailable(n)}};q.on("pageadded",v);o.prefetchRange(u,r)}o.primeCache(u,r,ug-1)?g-1:l.prefetchEnd,m;h=Math.max(0,h);m=k.getData().getRange(j,h+1);if(l.fireEvent!==false){k.fireEvent("guaranteedrange",m,j,h,l)}if(l.callback){l.callback.call(l.scope||k,m,j,h,l)}},guaranteeRange:function(h,g,j,k,f){f=Ext.apply({callback:j,scope:k},f);this.getRange(h,g+1,f)},prefetchRange:function(k,h){var m=this,n=m.getPurgePageCount(),o,j,l;if(!m.rangeCached(k,h)){o=m.getPageFromRecordIndex(k);j=m.getPageFromRecordIndex(h);m.getData().setMaxSize(n?(j-o+1)+n:0);for(l=o;l<=j;l++){if(!m.pageCached(l)){m.prefetchPage(l)}}}},primeCache:function(l,q,m){var n=this,o=n.getLeadingBufferZone(),p=n.getTrailingBufferZone(),j=n.getPageSize(),k=n.totalCount;if(m===-1){l=Math.max(l-o,0);q=Math.min(q+p,k-1)}else{if(m===1){l=Math.max(Math.min(l-p,k-j),0);q=Math.min(q+o,k-1)}else{l=Math.min(Math.max(Math.floor(l-((o+p)/2)),0),k-n.pageSize);q=Math.min(Math.max(Math.ceil(q+((o+p)/2)),0),k-1)}}n.prefetchRange(l,q)},sort:function(d,e,f){if(arguments.length===0){this.clearAndLoad()}else{this.getSorters().addSort(d,e,f)}},onSorterEndUpdate:function(){var d=this,c=d.getSorters().getRange();if(c.length){d.clearAndLoad({callback:function(){d.fireEvent("sort",d,c)}})}else{d.fireEvent("sort",d,c)}},clearAndLoad:function(b){this.getData().clear();this.loadPage(1,b)}},0,0,0,0,["store.buffered"],0,[Ext.data,"BufferedStore"],0));(Ext.cmd.derive("Ext.data.Request",Ext.Base,{config:{action:undefined,params:undefined,method:"GET",url:null,operation:null,proxy:null,disableCaching:false,headers:{},callbackKey:null,rawRequest:null,jsonData:undefined,xmlData:undefined,withCredentials:false,username:null,password:null,binary:false,callback:null,scope:null,timeout:30000,records:null,directFn:null,args:null,useDefaultXhrHeader:null},constructor:function(b){this.initConfig(b)},getParam:function(e){var f=this.getParams(),d;if(f){return f[e]}return d},setParam:function(e,d){var f=this.getParams()||{};f[e]=d;this.setParams(f)}},1,0,0,0,0,0,[Ext.data,"Request"],0));(Ext.cmd.derive("Ext.data.StoreManager",Ext.util.MixedCollection,{alternateClassName:["Ext.StoreMgr","Ext.data.StoreMgr","Ext.StoreManager"],singleton:true,register:function(){for(var d=0,c;(c=arguments[d]);d++){this.add(c)}},unregister:function(){for(var d=0,c;(c=arguments[d]);d++){this.remove(this.lookup(c))}},lookup:function(m){if(Ext.isArray(m)){var g=["field1"],k=!Ext.isArray(m[0]),j=m,l,h;if(k){j=[];for(l=0,h=m.length;l")}else{h.push(">");if((s=b.tpl)){s.applyOut(b.tplData,h)}if((s=b.html)){h.push(s)}if((s=b.cn||b.children)){c.generateMarkup(s,h)}g=c.closeTags;h.push(g[a]||(g[a]=""))}}}return h},generateStyles:function(f,c,a){var d=c||[],b,e;for(b in f){if(f.hasOwnProperty(b)){e=f[b];b=this.decamelizeName(b);if(a&&Ext.String.hasHtmlCharacters(e)){e=Ext.String.htmlEncode(e)}d.push(b,":",e,";")}}return c||d.join("")},markup:function(b){if(typeof b==="string"){return b}var a=this.generateMarkup(b,[]);return a.join("")},applyStyles:function(b,a){Ext.fly(b).applyStyles(a)},createContextualFragment:function(c){var e=this.detachedDiv,d=document.createDocumentFragment(),b,a;e.innerHTML=c;a=e.childNodes;b=a.length;while(b--){d.appendChild(a[0])}return d},createDom:function(a,d){var b=this,c=b.markup(a),e=b.detachedDiv;e.innerHTML=c;return e.firstChild},insertHtml:function(f,t,e){var a=this,h,d,g,b,u;f=f.toLowerCase();if(t.insertAdjacentHTML){if(a.ieInsertHtml){u=a.ieInsertHtml(f,t,e);if(u){return u}}h=j[f];if(h){t.insertAdjacentHTML(h[0],e);return t[h[1]]}}else{if(t.nodeType===3){f=f===k?m:f;f=f===p?n:f}d=Ext.supports.CreateContextualFragment?t.ownerDocument.createRange():undefined;b="setStart"+(this.endRe.test(f)?"After":"Before");if(q[f]){if(d){d[b](t);u=d.createContextualFragment(e)}else{u=this.createContextualFragment(e)}t.parentNode.insertBefore(u,f===m?t:t.nextSibling);return t[(f===m?"previous":"next")+"Sibling"]}else{g=(f===k?"first":"last")+"Child";if(t.firstChild){if(d){try{d[b](t[g]);u=d.createContextualFragment(e)}catch(c){u=this.createContextualFragment(e)}}else{u=this.createContextualFragment(e)}if(f===k){t.insertBefore(u,t.firstChild)}else{t.appendChild(u)}}else{t.innerHTML=e}return t[g]}}},insertBefore:function(c,a,b){return this.doInsert(c,a,b,m)},insertAfter:function(c,a,b){return this.doInsert(c,a,b,n)},insertFirst:function(c,a,b){return this.doInsert(c,a,b,k)},append:function(c,a,b){return this.doInsert(c,a,b,p)},overwrite:function(b,c,e){var a=this,d;b=Ext.getDom(b);c=a.markup(c);if(a.ieOverwrite){d=a.ieOverwrite(b,c)}if(!d){b.innerHTML=c;d=b.firstChild}return e?Ext.get(d):d},doInsert:function(b,e,f,d){var a=this,c;b=b.dom||Ext.getDom(b);if("innerHTML" in b){c=a.insertHtml(d,b,a.markup(e))}else{c=a.createDom(e,null);if(b.nodeType===3){d=d===k?m:d;d=d===p?n:d}if(q[d]){b.parentNode.insertBefore(c,d===m?b:b.nextSibling)}else{if(b.firstChild&&d===k){b.insertBefore(c,b.firstChild)}else{b.appendChild(c)}}}return f?Ext.get(c):c},createTemplate:function(a){var b=this.markup(a);return new Ext.Template(b)},createHtml:function(a){return this.markup(a)}}},0,0,0,0,0,0,[Ext.dom,"Helper",Ext,"DomHelper",Ext.core,"DomHelper"],0));Ext.define("Ext.overrides.dom.Helper",(function(){var q=/^(?:table|thead|tbody|tr|td)$/i,m=/td|tr|tbody|thead/i,n="",l="
",j=n+"",o=""+l,k=j+"",p=""+o;return{override:"Ext.dom.Helper",ieInsertHtml:function(d,b,c){var a=null;if(Ext.isIE9m&&q.test(b.tagName)){a=this.insertIntoTable(b.tagName.toLowerCase(),d,b,c)}return a},ieOverwrite:function(a,b){if(Ext.isIE9m&&q.test(a.tagName)){while(a.firstChild){a.removeChild(a.firstChild)}if(b){return this.insertHtml("afterbegin",a,b)}}},ieTable:function(f,c,e,g){var b=-1,h=this.detachedDiv,a,d;h.innerHTML=[c,e,g].join("");while(++b0?1:-1,o=this.getMinMomentumValue(),r=this.getMaxMomentumValue(),s=(p==1)?r:o,n=this.lastValue,m,t;if(q===0){return this.getStartValue()}if(!this.isOutOfBound){m=u.getValue();t=u.getVelocity();if(Math.abs(t)=o&&m<=r){return m}this.isOutOfBound=true;l.setStartTime(Ext.Date.now()).setStartVelocity(t).setStartValue(s)}m=l.getValue();if(!this.isEnded){if(!this.isBouncingBack){if(n!==null){if((p==1&&mn)){this.isBouncingBack=true}}}else{if(Math.round(m)==s){this.isEnded=true}}}this.lastValue=m;return m}},0,0,0,0,0,0,[Ext.fx.easing,"BoundMomentum"],0));(Ext.cmd.derive("Ext.fx.easing.Linear",Ext.fx.easing.Abstract,{config:{duration:0,endValue:0},updateStartValue:function(b){this.distance=this.getEndValue()-b},updateEndValue:function(b){this.distance=b-this.getStartValue()},getValue:function(){var d=Ext.Date.now()-this.getStartTime(),c=this.getDuration();if(d>c){this.isEnded=true;return this.getEndValue()}else{return this.getStartValue()+((d/c)*this.distance)}}},0,0,0,0,["easing.linear"],0,[Ext.fx.easing,"Linear"],0));(Ext.cmd.derive("Ext.fx.easing.EaseOut",Ext.fx.easing.Linear,{config:{exponent:4,duration:1500},getValue:function(){var n=Ext.Date.now()-this.getStartTime(),p=this.getDuration(),r=this.getStartValue(),l=this.getEndValue(),s=this.distance,q=n/p,m=1-q,o=1-Math.pow(m,this.getExponent()),k=r+(o*s);if(n>=p){this.isEnded=true;return l}return k}},0,0,0,0,["easing.ease-out"],0,[Ext.fx.easing,"EaseOut"],0));(Ext.cmd.derive("Ext.mixin.Responsive",Ext.Mixin,function(b){return{mixinConfig:{id:"responsive",after:{destroy:"destroy"}},config:{responsiveConfig:{$value:undefined,merge:function(h,m,j,k){if(!h){return m}var a=m?Ext.Object.chain(m):{},l;for(l in h){if(!k||!(l in a)){a[l]={fn:null,config:h[l]}}}return a}},responsiveFormulas:{$value:0,merge:function(f,a,g,h){return this.mergeNew(f,a,g,h)}}},destroy:function(){b.unregister(this);this.callParent()},privates:{statics:{active:false,all:{},context:{},count:0,nextId:0,activate:function(){b.active=true;b.updateContext();Ext.on("resize",b.onResize,b)},createRuleFn:function(a){return new Function("$c","with($c) { return ("+a+"); }")},deactivate:function(){b.active=false;Ext.un("resize",b.onResize,b)},notify:function(){var j=b.all,k=b.context,a=Ext.GlobalEvents,g=b.timer,h;if(g){b.timer=null;Ext.Function.cancelAnimationFrame(g)}b.updateContext();Ext.suspendLayouts();a.fireEvent("beforeresponsiveupdate",k);for(h in j){j[h].setupResponsiveContext()}a.fireEvent("beginresponsiveupdate",k);for(h in j){j[h].updateResponsiveState()}a.fireEvent("responsiveupdate",k);Ext.resumeLayouts(true)},onResize:function(){if(!b.timer){b.timer=Ext.Function.requestAnimationFrame(b.onTimer)}},onTimer:function(){b.timer=null;b.notify()},processConfig:function(a,j,l){var k=j&&j[l],m=a.config,o,n;if(k){n=a.getConfigurator();o=n.configs[l];m[l]=o.merge(k,m[l],a)}},register:function(a){var d=a.$responsiveId;if(!d){a.$responsiveId=d=++b.nextId;b.all[d]=a;if(++b.count===1){b.activate()}}},unregister:function(a){var d=a.$responsiveId;if(d in b.all){a.$responsiveId=null;delete b.all[d];if(--b.count===0){b.deactivate()}}},updateContext:function(){var g=Ext.Element,h=g.getViewportWidth(),a=g.getViewportHeight(),k=Ext.Microloader,j=b.context;j.width=h;j.height=a;j.tall=h',''," ({childCount} children)","",''," ({depth} deep)","",'',", {type}: {[this.time(values.sum)]} msec (","avg={[this.time(values.sum / parent.count)]}",")","",""].join(""),{time:function(c){return Math.round(c*100)/100}})}var a=this.getData(b);a.name=this.name;a.pure.type="Pure";a.total.type="Total";a.times=[a.pure,a.total];return r.apply(a)},getData:function(b){var a=this;return{count:a.count,childCount:a.childCount,depth:a.maxDepth,pure:p(a.count,a.childCount,b,a.pure),total:p(a.count,a.childCount,b,a.total)}},enter:function(){var b=this,a={accum:b,leave:q,childTime:0,parent:s};++b.depth;if(b.maxDepthh.x;f=j.y>h.y;if(k&&f){g="both"}else{if(k){g="horizontal"}else{g="vertical"}}}return g},updateDirection:function(j,k){var g=this.isAxisEnabledFlags,l=this.cls+"-vertical",h=this.cls+"-horizontal",m=this.getElement();if(k==="both"||k==="horizontal"){m.removeCls(h)}if(k==="both"||k==="vertical"){m.removeCls(l)}g.x=g.y=false;if(j==="both"||j==="horizontal"){g.x=true;m.addCls(h)}if(j==="both"||j==="vertical"){g.y=true;m.addCls(l)}},isAxisEnabled:function(b){this.getDirection();return this.isAxisEnabledFlags[b]},applyMomentumEasing:function(c){var d=Ext.fx.easing.BoundMomentum;return{x:Ext.factory(c,d),y:Ext.factory(c,d)}},applyBounceEasing:function(c){var d=Ext.fx.easing.EaseOut;return{x:Ext.factory(c,d),y:Ext.factory(c,d)}},updateBounceEasing:function(b){this.getTranslatable().setEasingX(b.x).setEasingY(b.y)},applySlotSnapEasing:function(c){var d=Ext.fx.easing.EaseOut;return{x:Ext.factory(c,d),y:Ext.factory(c,d)}},getPosition:function(){return this.getTranslatable().getPosition()},getMinPosition:function(){var b=this.minPosition;if(!b){this.minPosition=b={x:0,y:0};this.fireEvent("minpositionchange",this,b)}return b},getMaxPosition:function(){var e=this,g=e.maxPosition,f,h;if(!g){f=e.getSize();h=e.getContainerSize();e.maxPosition=g={x:Math.max(0,f.x-h.x),y:Math.max(0,f.y-h.y)};if(g.x!==e.lastMaxPosition.x||g.y!==e.lastMaxPosition.y){e.fireEvent("maxpositionchange",e,g);e.lastMaxPosition.x=g.x;e.lastMaxPosition.y=g.y}}return g},refreshMaxPosition:function(){this.maxPosition=null;this.getMaxPosition()},applyContainerSize:function(e){var h=this.getContainer().dom,f,g;if(!h){return}this.givenContainerSize=e;if(e==="auto"){f=h.clientWidth;g=h.clientHeight}else{f=e.x;g=e.y}return{x:f,y:g}},applySize:function(f){var j=this.getElement().dom,k=this.getContainer().dom,g,h;if(!j){return}this.givenSize=f;if(f==="auto"){g=Math.max(j.offsetWidth,k.clientWidth);h=Math.max(j.offsetHeight,k.clientHeight)}else{if(typeof f=="number"){g=f;h=f}else{g=f.x;h=f.y}}return{x:g,y:h}},updateAutoRefresh:function(b){this.getElement().toggleListener(b,"resize","onElementResize",this);this.getContainer().toggleListener(b,"resize","onContainerResize",this)},applySlotSnapSize:function(b){if(typeof b=="number"){return{x:b,y:b}}return b},applySlotSnapOffset:function(b){if(typeof b=="number"){return{x:b,y:b}}return b},getContainer:function(){var d=this.container,c;if(!d){c=this.getElement().getParent();this.container=d=this.FixedHBoxStretching?c.getParent():c;d.addCls(this.containerCls)}return d},refresh:function(){this.stopAnimation();this.getTranslatable().refresh();this.setSize(this.givenSize);this.setContainerSize(this.givenContainerSize);this.setDirection(this.givenDirection);this.fireEvent("refresh",this);return this},onElementResize:function(d,c){this.setSize({x:c.width,y:c.height});this.refresh()},onContainerResize:function(d,c){this.setContainerSize({x:c.width,y:c.height});this.refresh()},scrollTo:function(n,o,t){var p=this,u;if(p.isDestroyed){return p}if(typeof n!="number"&&arguments.length===1){o=n.y;n=n.x}var m=p.getTranslatable(),s=p.getPosition(),l=false,q,r;if(p.isAxisEnabled("x")){if(isNaN(n)||typeof n!="number"){n=s.x}else{if(s.x!==n){l=true}}q=this.convertX(-n)}if(p.isAxisEnabled("y")){if(isNaN(o)||typeof o!="number"){o=s.y}else{if(s.y!==o){l=true}}r=-o}if(l){if(t!==undefined&&t!==false){u=function(){p.fireEvent("scroll",p,n,o)};if(t===true){t={callback:u}}else{if(t.callback){t.callback=Ext.Function.createSequence(t.callback,u)}else{t.callback=u}}m.translateAnimated(q,r,t)}else{m.translate(q,r);p.fireEvent("scroll",p,n,o)}}return this},scrollToTop:function(c){var d=this.getInitialOffset();return this.scrollTo(d.x,d.y,c)},scrollToEnd:function(f){var d=this.getSize(),e=this.getContainerSize();return this.scrollTo(d.x-e.x,d.y-e.y,f)},scrollBy:function(e,g,h){var f=this.getPosition();e=(typeof e=="number")?e+f.x:null;g=(typeof g=="number")?g+f.y:null;return this.scrollTo(e,g,h)},onEvent:function(d){var e=this,f=d.browserEvent;if(!Ext.supports.Touch||e.getMouseEnabled()||(!e.isMouseEvent[f.type]&&f.pointerType!=="mouse")){e[e.listenerMap[d.type]](d)}},onTouchStart:function(){this.isTouching=this.self.isTouching=true;this.stopAnimation()},onTouchEnd:function(){var b=this.getPosition();this.isTouching=this.self.isTouching=false;if(!this.isDragging&&this.snapToSlot()){this.fireEvent("scrollstart",this,b.x,b.y)}},onDragStart:function(s){var e=this.getDirection(),x=s.absDeltaX,y=s.absDeltaY,u=this.getDirectionLock(),v=this.startPosition,z=this.flickStartPosition,t=this.flickStartTime,w=this.lastDragPosition,A=this.getPosition(),B=this.dragDirection,q=A.x,r=A.y,C=Ext.Date.now();this.isDragging=true;if(u&&e!=="both"){if((e==="horizontal"&&x>y)||(e==="vertical"&&y>x)){s.stopPropagation()}else{this.isDragging=false;return}}w.x=q;w.y=r;z.x=q;z.y=r;v.x=q;v.y=r;t.x=C;t.y=C;B.x=0;B.y=0;this.dragStartTime=C;this.isDragging=true;this.fireEvent("scrollstart",this,q,r)},onAxisDrag:function(A,s){if(!this.isAxisEnabled(A)){return}var B=this.flickStartPosition,x=this.flickStartTime,z=this.lastDragPosition,E=this.dragDirection,C=this.getPosition()[A],y=this.getMinPosition()[A],u=this.getMaxPosition()[A],F=this.startPosition[A],t=z[A],v=F-s,G=E[A],w=this.getOutOfBoundRestrictFactor(),D=this.getStartMomentumResetTime(),H=Ext.Date.now(),I;if(vu){I=v-u;v=u+I*w}}if(v>t){E[A]=1}else{if(vD){B[A]=C;x[A]=H}z[A]=v},onDrag:function(c){if(!this.isDragging){return}var d=this.lastDragPosition;this.onAxisDrag("x",this.convertX(c.deltaX));this.onAxisDrag("y",c.deltaY);this.scrollTo(d.x,d.y)},onDragEnd:function(f){var d,e;if(!this.isDragging){return}this.dragEndTime=Ext.Date.now();this.onDrag(f);this.isDragging=false;d=this.getAnimationEasing("x",f);e=this.getAnimationEasing("y",f);if(d||e){this.getTranslatable().animate(d,e)}else{this.onScrollEnd()}},getAnimationEasing:function(s,p){if(!this.isAxisEnabled(s)){return null}var t=this.getPosition()[s],v=this.getMinPosition()[s],q=this.getMaxPosition()[s],x=this.getMaxAbsoluteVelocity(),u=null,w=this.dragEndTime,r=p.flick.velocity[s],e=s==="x",y,o;if(tq){u=q}}if(e){t=this.convertX(t);u=this.convertX(u)}if(u!==null){o=this.getBounceEasing()[s];o.setConfig({startTime:w,startValue:-t,endValue:-u});return o}if(r===0){return null}if(r<-x){r=-x}else{if(r>x){r=x}}if(Ext.browser.is.IE){r*=2}o=this.getMomentumEasing()[s];y={startTime:w,startValue:-t,startVelocity:r*1.5,minMomentumValue:-q,maxMomentumValue:0};if(e){this.convertEasingConfig(y)}o.setConfig(y);return o},onAnimationFrame:function(h,e,g){var f=this.getPosition();this.fireEvent("scroll",this,this.convertX(f.x),f.y)},onAnimationEnd:function(){this.snapToBoundary();this.onScrollEnd()},stopAnimation:function(){this.getTranslatable().stopAnimation()},onScrollEnd:function(){var b=this.getPosition();if(this.isTouching||!this.snapToSlot()){this.fireEvent("scrollend",this,b.x,b.y)}},snapToSlot:function(){var d=this.getSnapPosition("x"),e=this.getSnapPosition("y"),f=this.getSlotSnapEasing();if(d!==null||e!==null){this.scrollTo(d,e,{easingX:f.x,easingY:f.y});return true}return false},getSnapPosition:function(o){var k=this.getSlotSnapSize()[o],n=null,j,l,m,h;if(k!==0&&this.isAxisEnabled(o)){j=this.getPosition()[o];l=this.getSlotSnapOffset()[o];m=this.getMaxPosition()[o];h=Math.floor((j-l)%k);if(h!==0){if(j!==m){if(Math.abs(h)>k/2){n=Math.min(m,j+((h>0)?k-h:h-k))}else{n=j-h}}else{n=j-h}}}return n},snapToBoundary:function(){if(!this.getSnapToBoundary()){return}var m=this.getPosition(),q=this.getMinPosition(),n=this.getMaxPosition(),o=q.x,p=q.y,r=n.x,s=n.y,k=Math.round(m.x),l=Math.round(m.y);if(kr){k=r}}if(ls){l=s}}this.scrollTo(k,l)},destroy:function(){var f=this.getElement(),d=this.sizeMonitors,e;if(d){d.element.destroy();d.container.destroy()}if(f&&!f.isDestroyed){f.removeCls(this.cls);e=this.getContainer();if(e&&!e.isDestroyed){e.removeCls(this.containerCls)}}Ext.destroy(this.getTranslatable());delete this.self.instances[this.id];Ext.Evented.prototype.destroy.apply(this,arguments)},convertX:function(b){return b},convertEasingConfig:function(b){return b}},1,0,0,0,0,0,[Ext.scroll,"Scroller"],function(){this.override({constructor:function(h){var n,m,j,k,o,l;if(!h){h={}}if(typeof h=="string"){h={direction:h}}if(arguments.length==2){n=h;h=arguments[1];if(!h){h={}}h.element=n}if(h.hasOwnProperty("acceleration")){m=h.acceleration;delete h.acceleration;Ext.merge(h,{momentumEasing:{momentum:{acceleration:m},bounce:{acceleration:m}}})}if(h.hasOwnProperty("snap")){h.slotSnapOffset=h.snap}if(h.hasOwnProperty("friction")){k=h.friction;delete h.friction;Ext.merge(h,{momentumEasing:{momentum:{friction:k}}})}if(h.hasOwnProperty("springTension")){o=h.springTension;delete h.springTension;Ext.merge(h,{momentumEasing:{momentum:{springTension:o}}})}if(h.hasOwnProperty("minVelocityForAnimation")){l=h.minVelocityForAnimation;delete h.minVelocityForAnimation;Ext.merge(h,{momentumEasing:{minVelocity:l}})}this.callOverridden(arguments)},scrollToAnimated:function(e,f,d){return this.scrollTo.apply(this,arguments)},scrollBy:function(e,f,d){if(Ext.isObject(e)){f=e.y;e=e.x}return this.callOverridden([e,f,d])},setOffset:function(b){return this.scrollToAnimated(-b.x,-b.y)}})}));(Ext.cmd.derive("Ext.util.TaskManager",Ext.util.TaskRunner,{alternateClassName:["Ext.TaskManager"],singleton:true},0,0,0,0,0,0,[Ext.util,"TaskManager",Ext,"TaskManager"],0));(Ext.cmd.derive("Ext.util.TextMetrics",Ext.Base,{statics:{shared:null,measure:function(g,j,h){var f=this,k=f.shared;if(!k){k=f.shared=new f(g,h)}k.bind(g);k.setFixedWidth(h||"auto");return k.getSize(j)},destroy:function(){var b=this;Ext.destroy(b.shared);b.shared=null}},constructor:function(f,g){var h=this,e=Ext.getBody().createChild({role:"presentation",cls:Ext.baseCSSPrefix+"textmetrics"});h.measure=e;if(f){h.bind(f)}e.position("absolute");e.setLocalXY(-1000,-1000);e.hide();if(g){e.setWidth(g)}},getSize:function(f){var d=this.measure,e;d.setHtml(f);e=d.getSize();d.setHtml("");return e},bind:function(d){var c=this;c.el=Ext.get(d);c.measure.setStyle(c.el.getStyle(["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing","word-break"]))},setFixedWidth:function(b){this.measure.setWidth(b)},getWidth:function(b){this.measure.dom.style.width="auto";return this.getSize(b).width},getHeight:function(b){return this.getSize(b).height},destroy:function(){var b=this;b.measure.destroy();delete b.el;delete b.measure}},1,0,0,0,0,0,[Ext.util,"TextMetrics"],function(){Ext.Element.override({getTextWidth:function(f,d,e){return Ext.Number.constrain(Ext.util.TextMetrics.measure(this.dom,Ext.valueFrom(f,this.dom.innerHTML,true)).width,d||0,e||1000000)}})}));(Ext.cmd.derive("Ext.ElementLoader",Ext.Base,{statics:{Renderer:{Html:function(e,d,f){e.getTarget().setHtml(d.responseText,f.scripts===true);return true}}},url:null,params:null,baseParams:null,autoLoad:false,target:null,loadMask:false,ajaxOptions:null,scripts:false,isLoader:true,constructor:function(d){var f=this,e;d=d||{};Ext.apply(f,d);f.mixins.observable.constructor.call(f);f.setTarget(f.target);if(f.autoLoad){e=f.autoLoad;if(e===true){e=null}f.load(e)}},setTarget:function(c){var d=this;c=Ext.get(c);if(d.target&&d.target!=c){d.abort()}d.target=c},getTarget:function(){return this.target||null},abort:function(){var b=this.active;if(b!==undefined){Ext.Ajax.abort(b.request);if(b.mask){this.removeMask()}delete this.active}},removeMask:function(){this.target.unmask()},addMask:function(b){this.target.mask(b===true?null:b)},load:function(q){q=Ext.apply({},q);var o=this,k=Ext.isDefined(q.loadMask)?q.loadMask:o.loadMask,n=Ext.apply({},q.params),j=Ext.apply({},q.ajaxOptions),l=q.callback||o.callback,p=q.scope||o.scope||o,m=q.rendererScope||o.rendererScope||o;Ext.applyIf(j,o.ajaxOptions);Ext.applyIf(q,j);Ext.applyIf(n,o.params);Ext.apply(n,o.baseParams);Ext.applyIf(q,{url:o.url});Ext.apply(q,{scope:o,params:n,callback:o.onComplete});if(o.fireEvent("beforeload",o,q)===false){return}if(k){o.addMask(k)}o.active={options:q,mask:k,scope:p,rendererScope:m,callback:l,success:q.success||o.success,failure:q.failure||o.failure,renderer:q.renderer||o.renderer,scripts:Ext.isDefined(q.scripts)?q.scripts:o.scripts};o.active.request=Ext.Ajax.request(q);o.setOptions(o.active,q)},setOptions:Ext.emptyFn,onComplete:function(h,l,j){var n=this,m=n.active,k,o;if(m){o=m.scope;k=m.rendererScope;if(l){l=n.getRenderer(m.renderer).call(k,n,j,m)!==false}if(l){Ext.callback(m.success,o,[n,j,h]);n.fireEvent("load",n,j,h)}else{Ext.callback(m.failure,o,[n,j,h]);n.fireEvent("exception",n,j,h)}Ext.callback(m.callback,o,[n,l,j,h]);if(m.mask){n.removeMask()}}delete n.active},getRenderer:function(b){if(Ext.isFunction(b)){return b}return this.statics().Renderer.Html},startAutoRefresh:function(e,d){var f=this;f.stopAutoRefresh();f.autoRefresh=Ext.interval(function(){f.load(d)},e)},stopAutoRefresh:function(){clearInterval(this.autoRefresh);delete this.autoRefresh},isAutoRefreshing:function(){return Ext.isDefined(this.autoRefresh)},destroy:function(){var b=this;b.stopAutoRefresh();delete b.target;b.abort();b.clearListeners()}},1,0,0,0,0,[["observable",Ext.util.Observable]],[Ext,"ElementLoader"],0));(Ext.cmd.derive("Ext.ComponentLoader",Ext.ElementLoader,{statics:{Renderer:{Data:function(g,e,j){var h=true;try{g.getTarget().update(Ext.decode(e.responseText))}catch(k){h=false}return h},Component:function(j,o,l){var k=true,m=j.getTarget(),e=[];try{e=Ext.decode(o.responseText)}catch(n){k=false}if(k){m.suspendLayouts();if(l.removeAll){m.removeAll()}m.add(e);m.resumeLayouts(true)}return k}}},target:null,loadOnRender:false,loadMask:false,renderer:"html",setTarget:function(c){var d=this;if(Ext.isString(c)){c=Ext.getCmp(c)}if(d.target&&d.target!=c){d.abort()}d.target=c;if(c&&d.loadOnRender){if(c.rendered){d.doLoadOnRender()}else{d.mon(c,"render",d.doLoadOnRender,d)}}},doLoadOnRender:function(){var b=this.loadOnRender;this.load(Ext.isObject(b)?b:null)},removeMask:function(){this.target.setLoading(false)},addMask:function(b){this.target.setLoading(b)},setOptions:function(c,d){c.removeAll=Ext.isDefined(d.removeAll)?d.removeAll:this.removeAll},getRenderer:function(c){if(Ext.isFunction(c)){return c}var d=this.statics().Renderer;switch(c){case"component":return d.Component;case"data":return d.Data;default:return Ext.ElementLoader.Renderer.Html}}},0,0,0,0,0,0,[Ext,"ComponentLoader"],0));(Ext.cmd.derive("Ext.layout.SizeModel",Ext.Base,{constructor:function(k){var h=this,j=h.self,g=j.sizeModelsArray,f;Ext.apply(h,k);h[f=h.name]=true;h.fixed=!(h.auto=h.natural||h.shrinkWrap);g[h.ordinal=g.length]=j[f]=j.sizeModels[f]=h},statics:{sizeModelsArray:[],sizeModels:{}},calculated:false,configured:false,constrainedMax:false,constrainedMin:false,natural:false,shrinkWrap:false,calculatedFromConfigured:false,calculatedFromNatural:false,calculatedFromShrinkWrap:false,names:null},1,0,0,0,0,0,[Ext.layout,"SizeModel"],function(){var m=this,j=m.sizeModelsArray,o,h,k,l,n;new m({name:"calculated"});new m({name:"configured",names:{width:"width",height:"height"}});new m({name:"natural"});new m({name:"shrinkWrap"});new m({name:"calculatedFromConfigured",configured:true,names:{width:"width",height:"height"}});new m({name:"calculatedFromNatural",natural:true});new m({name:"calculatedFromShrinkWrap",shrinkWrap:true});new m({name:"constrainedMax",configured:true,constrained:true,names:{width:"maxWidth",height:"maxHeight"}});new m({name:"constrainedMin",configured:true,constrained:true,names:{width:"minWidth",height:"minHeight"}});new m({name:"constrainedDock",configured:true,constrained:true,constrainedByMin:true,names:{width:"dockConstrainedWidth",height:"dockConstrainedHeight"}});for(o=0,k=j.length;o','",""],beginLayout:function(b){Ext.layout.container.Container.prototype.beginLayout.apply(this,arguments);this.initContextItems(b)},beforeLayoutCycle:function(g){var e=this.owner,h=e.inheritedState,f=e.inheritedStateInner;if(!h||h.invalid){h=e.getInherited();f=e.inheritedStateInner}if(g.widthModel.shrinkWrap){f.inShrinkWrapTable=true}else{delete f.inShrinkWrapTable}},beginLayoutCycle:function(v){var q=this,x=q.outerCt,s=q.lastOuterCtWidth||"",t=q.lastOuterCtHeight||"",p=q.lastOuterCtTableLayout||"",y=v.state,o,u,n,w,r;Ext.layout.container.Container.prototype.beginLayoutCycle.apply(this,arguments);u=n=w="";if(!v.widthModel.shrinkWrap){u="100%";r=q.owner.inheritedStateInner;o=q.getOverflowXStyle(v);w=(r.inShrinkWrapTable||o==="auto"||o==="scroll")?"":"fixed"}if(!v.heightModel.shrinkWrap&&!Ext.supports.PercentageHeightOverflowBug){n="100%"}if((u!==s)||q.hasOuterCtPxWidth){x.setStyle("width",u);q.lastOuterCtWidth=u;q.hasOuterCtPxWidth=false}if(w!==p){x.setStyle("table-layout",w);q.lastOuterCtTableLayout=w}if((n!==t)||q.hasOuterCtPxHeight){x.setStyle("height",n);q.lastOuterCtHeight=n;q.hasOuterCtPxHeight=false}if(q.hasInnerCtPxHeight){q.innerCt.setStyle("height","");q.hasInnerCtPxHeight=false}y.overflowAdjust=y.overflowAdjust||q.lastOverflowAdjust},calculate:function(k){var g=this,f=k.state,h=g.getContainerSize(k,true),j=f.calculatedItems||(f.calculatedItems=g.calculateItems?g.calculateItems(k,h):true);g.setCtSizeIfNeeded(k,h);if(j&&k.hasDomProp("containerChildrenSizeDone")){g.calculateContentSize(k);if(h.gotAll){if(g.manageOverflow&&!k.state.secondPass&&!g.reserveScrollbar){g.calculateOverflow(k,h)}return}}g.done=false},calculateContentSize:function(l){var m=this,j=((l.widthModel.shrinkWrap?1:0)|(l.heightModel.shrinkWrap?2:0)),o=(j&1)||undefined,k=(j&2)||undefined,n=0,h=l.props;if(o){if(isNaN(h.contentWidth)){++n}else{o=undefined}}if(k){if(isNaN(h.contentHeight)){++n}else{k=undefined}}if(n){if(o&&!l.setContentWidth(m.measureContentWidth(l))){m.done=false}if(k&&!l.setContentHeight(m.measureContentHeight(l))){m.done=false}}},calculateOverflow:function(q){var m=this,r,k,s,n,o,p,l;o=(m.getOverflowXStyle(q)==="auto");p=(m.getOverflowYStyle(q)==="auto");if(o||p){s=Ext.getScrollbarSize();l=q.overflowContext.el.dom;n=0;if(l.scrollWidth>l.clientWidth){n|=1}if(l.scrollHeight>l.clientHeight){n|=2}r=(p&&(n&2))?s.width:0;k=(o&&(n&1))?s.height:0;if(r!==m.lastOverflowAdjust.width||k!==m.lastOverflowAdjust.height){m.done=false;q.invalidate({state:{overflowAdjust:{width:r,height:k},overflowState:n,secondPass:true}})}}},completeLayout:function(b){this.lastOverflowAdjust=b.state.overflowAdjust},doRenderBody:function(m,k){var l=k.$layout,h=Ext.XTemplate,j=l.beforeBodyTpl,g=l.afterBodyTpl;if(j){h.getTpl(l,"beforeBodyTpl").applyOut(k,m)}this.renderItems(m,k);this.renderContent(m,k);if(g){h.getTpl(l,"afterBodyTpl").applyOut(k,m)}},doRenderPadding:function(f,j){var k=j.$layout,g=j.$layout.owner,h=g[g.contentPaddingProperty];if(k.managePadding&&h){f.push("padding:",g.unitizeBox(h))}},finishedLayout:function(c){var d=this.innerCt;Ext.layout.container.Container.prototype.finishedLayout.apply(this,arguments);if(Ext.isIE8){d.repaint()}if(Ext.isOpera){d.setStyle("position","relative");d.dom.scrollWidth;d.setStyle("position","")}},getContainerSize:function(e,h){var f=Ext.layout.container.Container.prototype.getContainerSize.apply(this,arguments),g=e.state.overflowAdjust;if(g){f.width-=g.width;f.height-=g.height}return f},getRenderData:function(){var d=this,c=Ext.layout.container.Container.prototype.getRenderData.call(this);c.innerCtCls=d.innerCtCls;c.outerCtCls=d.outerCtCls;return c},getRenderTarget:function(){return this.innerCt},getElementTarget:function(){return this.innerCt},getOverflowXStyle:function(b){return b.overflowXStyle||(b.overflowXStyle=this.owner.scrollFlags.overflowX||b.overflowContext.getStyle("overflow-x"))},getOverflowYStyle:function(b){return b.overflowYStyle||(b.overflowYStyle=this.owner.scrollFlags.overflowY||b.overflowContext.getStyle("overflow-y"))},initContextItems:function(h){var e=this,g=h.target,f=e.owner.customOverflowEl;h.outerCtContext=h.getEl("outerCt",e);h.innerCtContext=h.getEl("innerCt",e);if(f){h.overflowContext=h.getEl(f)}else{h.overflowContext=h.targetContext}if(g[g.contentPaddingProperty]!==undefined){h.paddingContext=h.innerCtContext}},initLayout:function(){var f=this,d=Ext.getScrollbarSize().width,e=f.owner;Ext.layout.container.Container.prototype.initLayout.call(this);if(d&&f.manageOverflow&&!f.hasOwnProperty("lastOverflowAdjust")){if(e.autoScroll||f.reserveScrollbar){f.lastOverflowAdjust={width:d,height:0}}}},measureContentHeight:function(d){var e=this.outerCt.getHeight(),f=d.target;if(this.managePadding&&(f[f.contentPaddingProperty]===undefined)){e+=d.targetContext.getPaddingInfo().height}return e},measureContentWidth:function(l){var j,m,g,h,k;if(this.chromeCellMeasureBug){j=this.innerCt.dom;m=j.style;g=m.display;if(g=="table-cell"){m.display="";j.offsetWidth;m.display=g}}if(Ext.isSafari){j=this.outerCt.dom;m=j.style;m.display="table-cell";j.offsetWidth;j.style.display=""}h=this.outerCt.getWidth();k=l.target;if(this.managePadding&&(k[k.contentPaddingProperty]===undefined)){h+=l.targetContext.getPaddingInfo().width}return h},setCtSizeIfNeeded:function(t,v){var s=this,m=v.height,q=t.paddingContext.getPaddingInfo(),o=s.getTarget(),n=s.getOverflowXStyle(t),u=(n==="auto"||n==="scroll"),w=Ext.getScrollbarSize(),r,p;if(m&&!t.heightModel.shrinkWrap){if(Ext.supports.PercentageHeightOverflowBug){r=true}if(Ext.isIE8){p=true}if((r||p)&&u&&(o.dom.scrollWidth>o.dom.clientWidth)){m=Math.max(m-w.height,0)}if(r){t.outerCtContext.setProp("height",m+q.height);s.hasOuterCtPxHeight=true}if(p){t.innerCtContext.setProp("height",m);s.hasInnerCtPxHeight=true}}},setupRenderTpl:function(b){Ext.layout.container.Container.prototype.setupRenderTpl.apply(this,arguments);b.renderPadding=this.doRenderPadding},getContentTarget:function(){return this.innerCt},getScrollerEl:function(){return this.outerCt}},0,0,0,0,["layout.auto","layout.autocontainer"],0,[Ext.layout.container,"Auto"],function(){this.prototype.chromeCellMeasureBug=Ext.isChrome&&Ext.chromeVersion>=26}));(Ext.cmd.derive("Ext.ZIndexManager",Ext.Base,{alternateClassName:"Ext.WindowGroup",statics:{zBase:9000,activeCounter:0},constructor:function(d){var c=this;c.id=Ext.id(null,"zindex-mgr-");c.zIndexStack=new Ext.util.Collection({sorters:{sorterFn:function(a,b){var f=(a.alwaysOnTop||0)-(b.alwaysOnTop||0);if(!f){f=a.getActiveCounter()-b.getActiveCounter()}return f}},filters:{filterFn:function(a){return a.isVisible()}}});c.zIndexStack.addObserver(c);c.front=null;c.globalListeners=Ext.globalEvents.on({hide:c.onComponentShowHide,show:c.onComponentShowHide,scope:c,destroyable:true});if(d){if(d.isContainer){d.on("resize",c._onContainerResize,c);c.zseed=Ext.Number.from(c.rendered?d.getEl().getStyle("zIndex"):undefined,c.getNextZSeed());c.targetEl=d.getTargetEl();c.container=d}else{Ext.on("resize",c._onContainerResize,c);c.zseed=c.getNextZSeed();c.targetEl=Ext.get(d)}}else{c.zseed=c.getNextZSeed();Ext.onReady(function(){Ext.on("resize",c._onContainerResize,c);c.targetEl=Ext.getBody()})}},getId:function(){return this.id},getNextZSeed:function(){return(Ext.ZIndexManager.zBase+=10000)},setBase:function(b){this.zseed=b;return this.onCollectionSort()},onCollectionSort:function(){var n=this,q=n.front,l=n.zIndexStack.getRange(),o=l.length,r,m=n.zseed,p,s,a;for(r=0;r0;){f=g[k];if(f.isComponent&&h.call(j||f,f)===false){return}}},destroy:function(){var g=this,e=g.zIndexStack.getRange(),f=e.length,h;for(h=0;h1){f.refresh()}if(e.hasListeners.afterlayout){e.fireEvent("afterlayout",e,d)}},onDestroy:function(){Ext.Component.prototype.onDestroy.call(this);this.refs=null},beforeDestroy:function(){var c=this,f=c.items,h=c.floatingItems,g;if(f){while((g=f.first())){c.doRemove(g,true)}}if(h){while((g=h.first())){c.doRemove(g,true)}}Ext.destroy(c.layout);Ext.Component.prototype.beforeDestroy.call(this)},beforeRender:function(){var d=this,e=d.getLayout(),f;Ext.Component.prototype.beforeRender.call(this);if(!e.initialized){e.initLayout()}f=e.targetCls;if(f){d.applyTargetCls(f)}},cascade:function(m,c,u){var n=this,r=n.items?n.items.items:[],q=r.length,s=0,o,p=u?u.concat(n):[n],t=p.length-1;if(m.apply(c||n,p)!==false){for(;s"){this.isParentReference=true;c=c.substring(0,d)}return c},applyTargetCls:function(b){this.addCls(b)},attachReference:function(e){var g=this,h,f;if(g.destroying||g.isDestroyed){return}f=g.refs||(g.refs={});h=e.referenceKey;f[h]=e},clearReference:function(d){var e=this.refs,f=d.referenceKey;if(e&&f){d.viewModelKey=d.referenceKey=e[f]=null}},clearReferences:function(){this.refs=null},detachComponent:function(b){Ext.getDetachedBody().appendChild(b.getEl())},doRemove:function(o,h){h=h===true||(h!==false&&this.autoDestroy);var l=this,m=l.layout,j=m&&l.rendered,n=o.destroying||h,k=o.floating;if(k){l.floatingItems.remove(o)}else{l.items.remove(o)}if(j&&!k){if(m.running){Ext.Component.cancelLayout(o,n)}m.onRemove(o,n)}o.onRemoved(n);l.onRemove(o,n);if(h){o.destroy()}else{if(j&&!k){m.afterRemove(o)}if(l.detachOnRemove&&o.rendered){l.detachComponent(o)}}},finishRenderChildren:function(){Ext.Component.prototype.finishRenderChildren.call(this);var b=this.getLayout();if(b){b.finishRender()}},getChildItemsToDisable:function(){return this.query("[isFormField],button")},getComponentId:function(b){return b.getItemId&&b.getItemId()},getContentTarget:function(){return this.getLayout().getContentTarget()},getDefaultContentTarget:function(){return this.el},getFocusEl:function(){return this.getTargetEl()},getScrollerEl:function(){return this.layout.getScrollerEl()||Ext.Component.prototype.getScrollerEl.call(this)},prepareItems:function(g,l){if(Ext.isArray(g)){g=g.slice()}else{g=[g]}var j=this,m=0,h=g.length,k;for(;m {ariaAttr}',' class="{[values.$comp.msgCls]} ',Ext.baseCSSPrefix,'mask-msg-inner {childElCls}">','
{msg}
',""],constructor:function(d){var f=this,e;if(arguments.length===2){e=f.target=d;d=arguments[1]}else{e=d.target}Ext.Component.prototype.constructor.call(this,d);if(e.isComponent){f.ownerCt=e;f.hidden=true;f.renderTo=f.getMaskTarget();f.external=f.renderTo===Ext.getBody();f.bindComponent(e)}else{e=Ext.get(e);f.isElement=true;f.renderTo=f.target}f.render(f.renderTo);if(f.store){f.bindStore(f.store,true)}},getRenderTree:function(){return[{cls:this.maskCls,style:"display:none"},this.callParent()]},onRender:function(){Ext.Component.prototype.onRender.apply(this,arguments);this.maskEl=this.el.prev()},initRenderData:function(){var b=Ext.Component.prototype.initRenderData.apply(this,arguments);b.msg=this.msg||"";return b},bindComponent:function(e){var f=this,d={scope:this,resize:f.sizeMask};if(f.external){d.added=f.onComponentAdded;d.removed=f.onComponentRemoved;if(e.floating){d.move=f.sizeMask;f.activeOwner=e}else{if(e.ownerCt){f.onComponentAdded(e.ownerCt)}}}f.mon(e,d);if(f.external){f.mon(Ext.GlobalEvents,{show:f.onContainerShow,hide:f.onContainerHide,expand:f.onContainerExpand,collapse:f.onContainerCollapse,scope:f})}},onComponentAdded:function(d){var c=this;delete c.activeOwner;c.floatParent=d;if(!d.floating){d=d.up("[floating]")}if(d){c.activeOwner=d;c.mon(d,"move",c.sizeMask,c);c.mon(d,"tofront",c.onOwnerToFront,c)}else{c.preventBringToFront=true}d=c.floatParent.ownerCt;if(c.rendered&&c.isVisible()&&d){c.floatOwner=d;c.mon(d,"afterlayout",c.sizeMask,c,{single:true})}},onComponentRemoved:function(f){var h=this,g=h.activeOwner,e=h.floatOwner;if(g){h.mun(g,"move",h.sizeMask,h);h.mun(g,"tofront",h.onOwnerToFront,h)}if(e){h.mun(e,"afterlayout",h.sizeMask,h)}delete h.activeOwner;delete h.floatOwner},afterRender:function(){Ext.Component.prototype.afterRender.apply(this,arguments);this.el.skipGarbageCollection=true;this.maskEl.skipGarbageCollection=true},onOwnerToFront:function(d,c){this.maskEl.setStyle("zIndex",c+1);this.el.setStyle("zIndex",c+2)},onContainerShow:function(b){this.onComponentShow()},onContainerHide:function(b){this.onComponentHide()},onContainerExpand:function(b){this.onComponentShow()},onContainerCollapse:function(b){this.onComponentHide()},onComponentHide:function(){var b=this;if(b.rendered&&b.isVisible()){b.hide();b.showNext=true}},onComponentShow:function(){if(this.showNext){this.show()}delete this.showNext},sizeMask:function(){var d=this,f=d.target,e=d.external?d.getOwner().el:d.getMaskTarget();if(d.rendered&&d.isVisible()){if(d.external){if(!d.isElement&&f.floating){d.onOwnerToFront(f,f.el.getZIndex())}d.maskEl.setSize(e.getSize()).alignTo(e,"tl-tl")}d.el.center(d.maskEl)}},bindStore:function(e,d){var f=this;f.mixins.storeholder.bindStore.apply(f,arguments);e=f.store;if(e&&e.isLoading()){f.onBeforeLoad()}},getStoreListeners:function(e){var g=this.onLoad,h=this.onBeforeLoad,f={cachemiss:h,cachefilled:g};if(!e.proxy.isSynchronous){f.beforeload=h;f.load=g}return f},onDisable:function(){Ext.Component.prototype.onDisable.apply(this,arguments);if(this.loading){this.onLoad()}},getOwner:function(){return this.ownerCt||this.ownerCmp||this.floatParent},getMaskTarget:function(){var b=this.getOwner();if(this.isElement){return this.target}return this.useTargetEl?b.getTargetEl():(b.getMaskTarget()||Ext.getBody())},onBeforeLoad:function(){var f=this,e=f.getOwner(),d;if(!f.disabled){f.loading=true;if(e.componentLayoutCounter){f.maybeShow()}else{d=e.afterComponentLayout;e.afterComponentLayout=function(){e.afterComponentLayout=d;d.apply(e,arguments);f.maybeShow()}}}},maybeShow:function(){var c=this,d=c.getOwner();if(!d.isVisible(true)){c.showNext=true}else{if(c.loading&&d.rendered){c.show()}}},hide:function(){var b=this;if(b.isElement){b.ownerCt.unmask();b.fireEvent("hide",this);return}else{b.ownerCt.enableTabbing()}delete b.showNext;b.maskEl.setDisplayed(false);b.ownerCt.setMasked(false);return Ext.Component.prototype.hide.apply(this,arguments)},show:function(){var b=this;if(b.isElement){b.ownerCt.mask(this.useMsg?this.msg:"",this.msgCls);b.fireEvent("show",this);return}else{b.ownerCt.disableTabbing()}b.maskEl.setDisplayed(true);b.ownerCt.setMasked(true);return Ext.Component.prototype.show.apply(this,arguments)},afterShow:function(){var b=this;b.loading=true;Ext.Component.prototype.afterShow.apply(this,arguments);if(b.hasOwnProperty("maskCls")){b.maskEl.dom.className=b.maskCls}if(b.useMsg){b.msgTextEl.setHtml(b.msg)}else{b.el.hide()}b.sizeMask()},onLoad:function(){this.loading=false;this.hide()},beforeDestroy:function(){this.ownerCt=null;this.bindStore(null);Ext.Component.prototype.beforeDestroy.call(this)},onDestroy:function(){var b=this;if(b.isElement){b.ownerCt.unmask()}Ext.destroy(b.maskEl);Ext.Component.prototype.onDestroy.call(this)}},1,["loadmask"],["box","component","loadmask"],{box:true,component:true,loadmask:true},["widget.loadmask"],[[Ext.util.StoreHolder.prototype.mixinId||Ext.util.StoreHolder.$className,Ext.util.StoreHolder]],[Ext,"LoadMask"],0));(Ext.cmd.derive("Ext.layout.component.Component",Ext.layout.Layout,{type:"component",isComponentLayout:true,nullBox:{},usesContentHeight:true,usesContentWidth:true,usesHeight:true,usesWidth:true,widthCache:{},heightCache:{},beginLayoutCycle:function(C,q){var v=this,D=v.owner,A=C.ownerCtContext,z=C.heightModel,y=C.widthModel,x=D.el.dom===document.body,B=D.lastBox||v.nullBox,s=D.el.lastBox||v.nullBox,E=!x,t,r,u,w;Ext.layout.Layout.prototype.beginLayoutCycle.apply(this,arguments);if(q){if(v.usesContentWidth){++C.consumersContentWidth}if(v.usesContentHeight){++C.consumersContentHeight}if(v.usesWidth){++C.consumersWidth}if(v.usesHeight){++C.consumersHeight}if(A&&!A.hasRawContent){t=D.ownerLayout;if(t){if(t.usesWidth){++C.consumersWidth}if(t.usesHeight){++C.consumersHeight}}}}if(y.configured){u=y.names.width;if(!x){E=v.setWidthInDom||(q?D[u]!==s.width:y.constrained)}C.setWidth(D[u],E)}else{if(C.isTopLevel){if(y.calculated){r=B.width;C.setWidth(r,r!=s.width)}r=B.x;C.setProp("x",r,r!=s.x)}}if(z.configured){w=z.names.height;if(!x){E=q?D[w]!==s.height:z.constrained}C.setHeight(D[w],E)}else{if(C.isTopLevel){if(z.calculated){r=B.height;C.setHeight(r,r!=s.height)}r=B.y;C.setProp("y",r,r!=s.y)}}},finishedLayout:function(r){var m=this,k=r.children,s=m.owner,o,q,l,p,n;if(k){o=k.length;for(q=0;q','
{text}
',"",'"],componentLayout:"progressbar",ariaRole:"progressbar",initRenderData:function(){var b=this;return Ext.apply(Ext.Component.prototype.initRenderData.call(this),{internalText:!b.hasOwnProperty("textEl"),text:b.text||" ",percentage:b.value?b.value*100:0})},onRender:function(){var b=this;Ext.Component.prototype.onRender.apply(this,arguments);if(b.textEl){b.textEl=Ext.get(b.textEl);b.updateText(b.text)}else{b.textEl=b.el.select("."+b.baseCls+"-text")}},updateValue:function(b){this.updateProgress(b,Math.round(b*100)+"%")},updateProgress:function(k,j,h){var l=this,g=l.value,m=l.getTextTpl();l.value=k||(k=0);if(j!=null){l.updateText(j)}else{if(m){l.updateText(m.apply({value:k,percent:k*100}))}}if(l.rendered&&!l.isDestroyed){if(h===true||(h!==false&&l.animate)){l.bar.stopAnimation();l.bar.animate(Ext.apply({from:{width:(g*100)+"%"},to:{width:(k*100)+"%"}},l.animate))}else{l.bar.setStyle("width",(k*100)+"%")}}l.fireEvent("update",l,k,j);return l},updateText:function(c){var d=this;d.text=c;if(d.rendered){d.textEl.setHtml(d.text)}return d},applyTextTpl:function(b){if(!b.isTemplate){b=new Ext.XTemplate(b)}return b},applyText:function(b){this.updateText(b)},getText:function(){return this.text},wait:function(f){var d=this,e;if(!d.waitTimer){e=d;f=f||{};d.updateText(f.text);d.waitTimer=Ext.TaskManager.start({run:function(b){var a=f.increment||10;b-=1;d.updateProgress(((((b+a)%a)+1)*(100/a))*0.01,null,f.animate)},interval:f.interval||1000,duration:f.duration,onStop:function(){if(f.fn){f.fn.apply(f.scope||d)}d.reset()},scope:e})}return d},isWaiting:function(){return this.waitTimer!==null},reset:function(d){var c=this;c.updateProgress(0);c.clearTimer();if(d===true){c.hide()}return c},clearTimer:function(){var b=this;if(b.waitTimer){b.waitTimer.onStop=null;Ext.TaskManager.stop(b.waitTimer);b.waitTimer=null}},onDestroy:function(){var c=this,d=c.bar;c.clearTimer();if(c.rendered){if(c.textEl.isComposite){c.textEl.clear()}Ext.destroyMembers(c,"textEl","progressBar");if(d&&c.animate){d.stopAnimation()}}Ext.Component.prototype.onDestroy.call(this)}},0,["progressbar"],["box","component","progressbar"],{box:true,component:true,progressbar:true},["widget.progressbar"],0,[Ext,"ProgressBar"],0));(Ext.cmd.derive("Ext.ShadowPool",Ext.Base,{singleton:true,markup:(function(){return Ext.String.format('',Ext.baseCSSPrefix,Ext.isIE&&!Ext.supports.CSS3BoxShadow?"ie":"css")}()),shadows:[],pull:function(){var b=this.shadows.shift();if(!b){b=Ext.get(Ext.DomHelper.insertHtml("afterBegin",document.body,this.markup));b.autoBoxAdjust=false}return b},push:function(b){this.shadows.push(b)},reset:function(){var f=[].concat(this.shadows),d,e=f.length;for(d=0;df.length&&(h+"."===e.substring(0,h.length+1))){f=h}}return f===""?undefined:f}})}));(Ext.cmd.derive("Ext.app.domain.Store",Ext.app.EventDomain,{singleton:true,type:"store",prefix:"store.",idMatchRe:/^\#/,constructor:function(){var b=this;b.callParent();b.monitor(Ext.data.AbstractStore)},match:function(g,e){var f=false,h=g.alias;if(e==="*"){f=true}else{if(this.idMatchRe.test(e)){f=g.getStoreId()===e.substring(1)}else{if(h){f=Ext.Array.indexOf(h,this.prefix+e)>-1}}}return f}},1,0,0,0,0,0,[Ext.app.domain,"Store"],0));(Ext.cmd.derive("Ext.app.route.Queue",Ext.Base,{queue:null,token:null,constructor:function(b){Ext.apply(this,b);this.queue=new Ext.util.MixedCollection()},queueAction:function(d,c){this.queue.add({route:d,args:c})},clearQueue:function(){this.queue.removeAll()},runQueue:function(){var e=this.queue,f=e.removeAt(0),d;if(f){d=f&&f.route;d.execute(this.token,f.args,this.onActionExecute,this)}},onActionExecute:function(b){if(b){this.clearQueue()}else{this.runQueue()}}},1,0,0,0,0,0,[Ext.app.route,"Queue"],0));(Ext.cmd.derive("Ext.app.route.Route",Ext.Base,{action:null,conditions:null,controller:null,allowInactive:false,url:null,before:null,caseInsensitive:false,matcherRegex:null,paramMatchingRegex:null,paramsInMatchString:null,constructor:function(d){var f=this,e;Ext.apply(f,d,{conditions:{}});e=f.url;f.paramMatchingRegex=new RegExp(/:([0-9A-Za-z\_]*)/g);f.paramsInMatchString=e.match(f.paramMatchingRegex)||[];f.matcherRegex=f.createMatcherRegex(e)},recognize:function(k){var j=this,g=j.controller,h,f;if((j.allowInactive||g.isActive())&&j.recognizes(k)){h=j.matchesFor(k);f=k.match(j.matcherRegex);f.shift();return Ext.applyIf(h,{controller:g,action:j.action,historyUrl:k,args:f})}return false},recognizes:function(b){return this.matcherRegex.test(b)},execute:function(q,m,l,p){var j=m.args||[],n=this.before,k=this.controller,o=this.createCallback(m,l,p);if(n){j.push(o);if(Ext.isString(n)){n=this.before=k[n]}if(n){n.apply(k,j)}}else{o.resume()}},matchesFor:function(m){var j={},k=this.paramsInMatchString,g=m.match(this.matcherRegex),l=0,h=k.length;g.shift();for(;l0){h=m.substring(0,g);j=m.substring(g+1)+"."+h}else{if(m.indexOf(".")>0&&(Ext.ClassManager.isCreated(m)||this.hasRegisteredPrefix(m))){j=m}else{if(l){j=l+"."+k+"."+m;h=m}else{j=m}}}return{absoluteName:j,shortName:h}},hasRegisteredPrefix:function(e){var f=Ext.ClassManager,d=f.getPrefix(e);return d&&d!==e}},models:null,views:null,stores:null,controllers:null,config:{application:null,refs:null,active:true,moduleClassName:null},onClassExtended:function(e,h,f){var g=f.onBeforeCreated;f.onBeforeCreated=function(b,q){var r=Ext.app.Controller,d=r.controllerRegex,a=[],c,s,o,p;o=b.prototype;c=Ext.getClassName(b);s=q.$namespace||q.namespace||Ext.app.getNamespace(c)||((p=d.exec(c))&&p[1]);if(s){o.$namespace=s}r.processDependencies(o,a,s,"model",q.models);r.processDependencies(o,a,s,"view",q.views);r.processDependencies(o,a,s,"store",q.stores);r.processDependencies(o,a,s,"controller",q.controllers);Ext.require(a,Ext.Function.pass(g,arguments,this))}},constructor:function(b){Ext.app.BaseController.prototype.constructor.apply(this,arguments);this.initAutoGetters();this.ensureId()},normalizeRefs:function(d){var f=this,e=[];if(d){if(Ext.isObject(d)){Ext.Object.each(d,function(b,a){if(Ext.isString(a)){a={selector:a}}a.ref=b;e.push(a)})}else{if(Ext.isArray(d)){e=Ext.Array.merge(e,d)}}}d=f.refs;if(d){f.refs=null;d=f.normalizeRefs(d);if(d){e=Ext.Array.merge(e,d)}}return e},applyRefs:function(b){return this.normalizeRefs(Ext.clone(b))},updateRefs:function(b){if(b){this.ref(b)}},initAutoGetters:function(){var d=this.self.prototype,f,e;for(f in d){e=d[f];if(e&&e["Ext.app.getter"]){e.call(this)}}},updateControl:function(b){this.ensureId();Ext.app.BaseController.prototype.updateControl.call(this,b)},updateListen:function(b){this.ensureId();Ext.app.BaseController.prototype.updateListen.call(this,b)},doInit:function(c){var d=this;if(!d._initialized){d.init(c);d._initialized=true}},finishInit:function(j){var l=this,k=l.controllers,g,m,h;if(l._initialized&&k&&k.length){for(m=0,h=k.length;m{iconMarkup}
role="{headerRole}">{text}
{iconMarkup}',iconTpl:'',_textAlignClasses:{left:Ext.baseCSSPrefix+"title-align-left",center:Ext.baseCSSPrefix+"title-align-center",right:Ext.baseCSSPrefix+"title-align-right"},_iconAlignClasses:{top:Ext.baseCSSPrefix+"title-icon-top",right:Ext.baseCSSPrefix+"title-icon-right",bottom:Ext.baseCSSPrefix+"title-icon-bottom",left:Ext.baseCSSPrefix+"title-icon-left"},_rotationClasses:{0:Ext.baseCSSPrefix+"title-rotate-none",1:Ext.baseCSSPrefix+"title-rotate-right",2:Ext.baseCSSPrefix+"title-rotate-left"},_rotationAngles:{1:90,2:270},baseCls:Ext.baseCSSPrefix+"title",_titleSuffix:"-title",_glyphCls:Ext.baseCSSPrefix+"title-glyph",_iconWrapCls:Ext.baseCSSPrefix+"title-icon-wrap",_baseIconCls:Ext.baseCSSPrefix+"title-icon",_itemCls:Ext.baseCSSPrefix+"title-item",_textCls:Ext.baseCSSPrefix+"title-text",afterComponentLayout:function(){var j=this,f=j.getRotation(),g,h,k;if(f&&!Ext.isIE8){k=j.el;g=j.lastBox;h=g.x;k.setStyle(j._getVerticalAdjustDirection(),(h+((f===1)?g.width:-g.height))+"px")}Ext.Component.prototype.afterComponentLayout.call(this)},onRender:function(){var f=this,e=f.getRotation(),d=f.el;Ext.Component.prototype.onRender.call(this);if(e){d.setVertical(f._rotationAngles[e])}if(Ext.supports.FixedTableWidthBug){d._needsTableWidthFix=true}},applyText:function(b){if(!b){b=" "}return b},beforeRender:function(){var b=this;Ext.Component.prototype.beforeRender.call(this);b.addCls(b._rotationClasses[b.getRotation()]);b.addCls(b._textAlignClasses[b.getTextAlign()])},getIconMarkup:function(){return this.getTpl("iconTpl").apply(this.getIconRenderData())},getIconRenderData:function(){var l=this,o=l.getIcon(),h=l.getIconCls(),m=l.getGlyph(),k=Ext._glyphFontFamily,j=l.getIconAlign(),n;if(typeof m==="string"){n=m.split("@");m=n[0];k=n[1]}return{id:l.id,ui:l.ui,itemCls:l._itemCls,iconUrl:o,iconCls:h,iconWrapCls:l._iconWrapCls,baseIconCls:l._baseIconCls,iconAlignCls:l._iconAlignClasses[j],glyph:m,glyphCls:m?l._glyphCls:"",glyphFontFamily:k}},initRenderData:function(){var d=this,e,f;f=Ext.apply({text:d.getText(),headerRole:d.headerRole,id:d.id,ui:d.ui,itemCls:d._itemCls,textCls:d._textCls,iconMarkup:null,iconBeforeTitle:null},Ext.Component.prototype.initRenderData.call(this));if(d._hasIcon()){e=d.getIconAlign();f.iconMarkup=d.getIconMarkup();f.iconBeforeTitle=(e==="top"||e==="left")}return f},onAdded:function(o,k,h){var m=this,j=m.cls||"",l=m._titleSuffix,n=o.baseCls;m.addCls([n+l,n+l+"-"+o.ui]);Ext.Component.prototype.onAdded.call(this,o,k,h)},updateGlyph:function(l,o){l=l||0;var m=this,k=m._glyphCls,h,j,n;m.glyph=l;if(m.rendered){m._syncIconVisibility();h=m.iconEl;if(typeof l==="string"){n=l.split("@");l=n[0];j=n[1]||Ext._glyphFontFamily}if(!l){h.dom.innerHTML="";h.removeCls(k)}else{if(o!=l){h.dom.innerHTML="&#"+l+";";h.addCls(k)}}if(j){h.setStyle("font-family",j)}if(m._didIconStateChange(o,l)){m.updateLayout()}}},updateIcon:function(e,g){e=e||"";var h=this,f;if(h.rendered&&e!=g){h._syncIconVisibility();f=h.iconEl;f.setStyle("background-image",e?"url("+e+")":"");if(h._didIconStateChange(g,e)){h.updateLayout()}}},updateIconAlign:function(j,m){var g=this,k=g.iconWrapEl,h,k,l;if(g.iconWrapEl){h=g.el;l=g._iconAlignClasses;if(m){k.removeCls(l[m])}k.addCls(l[j]);if(j==="top"||j==="left"){h.insertFirst(k)}else{h.appendChild(k)}g.updateLayout()}},updateIconCls:function(e,h){e=e||"";var g=this,f;if(g.rendered&&h!=e){g._syncIconVisibility();f=g.iconEl;if(h){f.removeCls(h)}f.addCls(e);if(g._didIconStateChange(h,e)){g.updateLayout()}}},updateRotation:function(m,h){var k=this,g,l,j;if(k.rendered){l=k.el;j=k._rotationClasses;k.removeCls(j[h]);k.addCls(j[m]);l.setHorizontal();if(m){l.setVertical(k._rotationAngles[m])}l.setStyle({right:"",left:"",top:"",height:"",width:""});k.lastBox=null;k.updateLayout()}},updateText:function(b){if(this.rendered){this.textEl.setHtml(b)}},updateTextAlign:function(g,e){var f=this,h=f._textAlignClasses;if(f.rendered){if(e){f.removeCls(h[e])}f.addCls(h[g]);f.updateLayout()}},privates:{_getVerticalAdjustDirection:function(){return"left"},_didIconStateChange:function(e,f){var d=Ext.isEmpty(f);return Ext.isEmpty(e)?!d:d},_hasIcon:function(){return !!(this.getIcon()||this.getIconCls()||this.getGlyph())},_syncIconVisibility:function(){var k=this,l=k.el,h=k._hasIcon(),j=k.iconWrapEl,m,g;if(h&&!j){g=k.iconAlign;m=(g==="left"||g==="top");l.dom.insertAdjacentHTML(m?"afterbegin":"beforeend",k.getIconMarkup());j=k.iconWrapEl=l[m?"first":"last"]();k.iconEl=j.first()}if(j){j.setDisplayed(h)}}}},0,["title"],["box","component","title"],{box:true,component:true,title:true},["widget.title"],0,[Ext.panel,"Title"],0));(Ext.cmd.derive("Ext.panel.Tool",Ext.Component,{isTool:true,focusable:true,baseCls:Ext.baseCSSPrefix+"tool",disabledCls:Ext.baseCSSPrefix+"tool-disabled",toolPressedCls:Ext.baseCSSPrefix+"tool-pressed",toolOverCls:Ext.baseCSSPrefix+"tool-over",ariaRole:"button",childEls:["toolEl"],renderTpl:[''],toolOwner:null,tooltipType:"qtip",stopEvent:true,cacheHeight:true,cacheWidth:true,initComponent:function(){var b=this;b.type=b.type||b.id;Ext.applyIf(b.renderData,{baseCls:b.baseCls,blank:Ext.BLANK_IMAGE_URL,type:b.type});b.tooltip=b.tooltip||b.qtip;Ext.Component.prototype.initComponent.call(this)},afterRender:function(){var d=this,c;Ext.Component.prototype.afterRender.apply(this,arguments);d.el.on({click:d.onClick,mousedown:d.onMouseDown,mouseover:d.onMouseOver,mouseout:d.onMouseOut,scope:d});c=d.tooltip;if(c){d.setTooltip(c)}},tipAttrs:{qtip:"data-qtip"},setTooltip:function(m,p){var o=this,j=o.tooltip,n=o.tooltipType,l=o.id,q=o.el,k;if(j&&Ext.quickTipsActive&&Ext.isObject(j)){Ext.tip.QuickTipManager.unregister(l)}o.tooltip=m;if(p){o.tooltipType=p}if(m){if(Ext.quickTipsActive&&Ext.isObject(m)){Ext.tip.QuickTipManager.register(Ext.apply({target:l},m))}else{if(q){if(p&&n&&p!==n){k=o.tipAttrs[n]||"title";q.dom.removeAttribute(k)}k=o.tipAttrs[p||n]||"title";q.dom.setAttribute(k,m)}}}},setType:function(e){var d=this,f=d.type;d.type=e;if(d.rendered){if(f){d.toolEl.removeCls(d.baseCls+"-"+f)}d.toolEl.addCls(d.baseCls+"-"+e)}else{d.renderData.type=e}return d},onDestroy:function(){var d=this,c=d.keyMap;d.setTooltip(null);if(c){c.destroy();d.keyMap=null}delete d.toolOwner;Ext.Component.prototype.onDestroy.call(this)},privates:{getFocusEl:function(){return this.el},onClick:function(f,d){var e=this;if(e.disabled){return false}e.el.removeCls(e.toolPressedCls+" "+e.toolOverCls);if(e.stopEvent!==false){f.stopEvent()}if(e.handler){Ext.callback(e.handler,e.scope,[f,d,e.ownerCt,e],0,e)}else{if(e.callback){Ext.callback(e.callback,e.scope,[e.toolOwner||e.ownerCt,e,f],0,e)}}e.fireEvent("click",e,f,e.toolOwner||e.ownerCt);return true},onMouseDown:function(){if(this.disabled){return false}this.el.addCls(this.toolPressedCls)},onMouseOver:function(){if(this.disabled){return false}this.el.addCls(this.toolOverCls)},onMouseOut:function(){this.el.removeCls(this.toolOverCls)}}},0,["tool"],["box","component","tool"],{box:true,component:true,tool:true},["widget.tool"],0,[Ext.panel,"Tool"],0));(Ext.cmd.derive("Ext.panel.Header",Ext.panel.Bar,{isHeader:true,defaultType:"tool",indicateDrag:false,weight:-1,shrinkWrap:3,iconAlign:"left",titleAlign:"left",titlePosition:0,titleRotation:"default",beforeRenderConfig:{glyph:null,icon:null,iconCls:null,iconAlign:null,title:{$value:{ariaRole:"presentation",xtype:"title",flex:1},merge:function(c,d){if(typeof c=="string"){c={text:c}}return Ext.merge(d?Ext.Object.chain(d):{},c)}},titleAlign:null,titlePosition:null,titleRotation:null},headerCls:Ext.baseCSSPrefix+"header",initComponent:function(){var g=this,h=g.items,e=g.itemPosition,f=[g.headerCls];g.tools=g.tools||[];g.items=h=(h?h.slice():[]);if(e!==undefined){g._userItems=h.slice();g.items=h=[]}g.indicateDragCls=g.headerCls+"-draggable";if(g.indicateDrag){f.push(g.indicateDragCls)}g.addCls(f);g.syncNoBorderCls();Ext.Array.push(h,g.tools);g.tools.length=0;Ext.panel.Bar.prototype.initComponent.call(this);g.on({dblclick:g.onDblClick,click:g.onClick,element:"el",scope:g})},addTool:function(b){this.add(Ext.ComponentManager.create(b,"tool"))},afterLayout:function(){var f=this,h,g,k,j;if(f.vertical){g=f.frameTR;if(g){h=f.frameBR;k=f.frameTL;j=(f.getWidth()-g.getPadding("r")-((k)?k.getPadding("l"):f.el.getBorderWidth("l")))+"px";h.setStyle("background-position-x",j);g.setStyle("background-position-x",j)}}Ext.panel.Bar.prototype.afterLayout.call(this)},applyTitle:function(h,k){var j=this,g,f;h=h||"";if(typeof h==="string"){h={text:h}}if(k){Ext.suspendLayouts();k.setConfig(h);Ext.resumeLayouts(true);h=k}else{h.ui=j.ui;h.headerRole=j.headerRole;f=("rotation" in h);h=Ext.create(h);if(!f&&j.vertical&&j.titleRotation==="default"){h.rotation=1}}return h},applyTitlePosition:function(c){var d=this.items.getCount();if(this._titleInItems){--d}return Math.max(Math.min(c,d),0)},beforeLayout:function(){Ext.panel.Bar.prototype.beforeLayout.call(this);this.syncBeforeAfterTitleClasses()},beforeRender:function(){var c=this,d=c.itemPosition;c.protoEl.unselectable();Ext.panel.Bar.prototype.beforeRender.call(this);if(d!==undefined){c.insert(d,c._userItems)}},getTools:function(){return this.tools.slice()},onAdd:function(d,e){var f=this.tools;Ext.panel.Bar.prototype.onAdd.call(this,d,e);if(d.isTool){f.push(d);f[d.type]=d}},onAdded:function(d,f,e){this.syncNoBorderCls();Ext.panel.Bar.prototype.onAdded.call(this,d,f,e)},onRemoved:function(d,f,e){this.syncNoBorderCls();Ext.panel.Bar.prototype.onRemoved.call(this,d,f,e)},setDock:function(k){var f=this,h=f.getTitle(),g=f.getTitleRotation(),j=h.getRotation();Ext.suspendLayouts();Ext.panel.Bar.prototype.setDock.call(this,k);if(g==="default"){g=(f.vertical?1:0);if(g!==j){h.setRotation(g)}if(f.rendered){f.resetItemMargins()}}Ext.resumeLayouts(true)},updateGlyph:function(b){this.getTitle().setGlyph(b)},updateIcon:function(b){this.getTitle().setIcon(b)},updateIconAlign:function(c,d){this.getTitle().setIconAlign(c)},updateIconCls:function(b){this.getTitle().setIconCls(b)},updateTitle:function(c,d){if(!d){this.insert(this.getTitlePosition(),c);this._titleInItems=true}this.titleCmp=c},updateTitleAlign:function(c,d){this.getTitle().setTextAlign(c)},updateTitlePosition:function(b){this.insert(b,this.getTitle())},updateTitleRotation:function(b){if(b==="default"){b=(this.vertical?1:0)}this.getTitle().setRotation(b)},privates:{fireClickEvent:function(e,f){var d="."+Ext.panel.Tool.prototype.baseCls;if(!f.getTarget(d)){this.fireEvent(e,this,f)}},getFocusEl:function(){return this.el},getFramingInfoCls:function(){var f=this,d=Ext.panel.Bar.prototype.getFramingInfoCls.call(this),e=f.ownerCt;if(!f.expanding&&e&&(e.collapsed||f.isCollapsedExpander)){d+="-"+e.collapsedCls}return d+"-"+f.dock},onClick:function(b){this.fireClickEvent("click",b)},onDblClick:function(b){this.fireClickEvent("dblclick",b)},syncBeforeAfterTitleClasses:function(w){var q=this,r=q.items,t=r.items,x=q.getTitlePosition(),y=t.length,s=r.generation,p=q.syncBeforeAfterGen,n,u,v,o;if(!w&&(p===s)){return}q.syncBeforeAfterGen=s;for(v=0;vx){if(p){o.removeCls(u)}o.addCls(n)}}}},syncNoBorderCls:function(){var d=this,e=this.ownerCt,f=d.headerCls+"-noborder";if(e?(e.border===false&&!e.frame):d.border===false){d.addCls(f)}else{d.removeCls(f)}}}},0,["header"],["box","component","container","header"],{box:true,component:true,container:true,header:true},["widget.header"],0,[Ext.panel,"Header"],0));(Ext.cmd.derive("Ext.toolbar.Fill",Ext.Component,{alternateClassName:"Ext.Toolbar.Fill",ariaRole:"presentation",isFill:true,flex:1},0,["tbfill"],["box","component","tbfill"],{box:true,component:true,tbfill:true},["widget.tbfill"],0,[Ext.toolbar,"Fill",Ext.Toolbar,"Fill"],0));(Ext.cmd.derive("Ext.layout.container.boxOverflow.None",Ext.Base,{alternateClassName:"Ext.layout.boxOverflow.None",factoryConfig:{defaultType:"none"},isBoxOverflowHandler:true,$configPrefixed:false,$configStrict:false,constructor:function(b){this.initConfig(b)},handleOverflow:Ext.emptyFn,clearOverflow:Ext.emptyFn,beginLayout:Ext.emptyFn,beginLayoutCycle:Ext.emptyFn,calculate:function(e){var f=this,h=e.state.boxPlan,g;if(h&&h.tooNarrow){g=f.handleOverflow(e);if(g){if(g.reservedSpace){f.layout.publishInnerCtSize(e,g.reservedSpace)}}}else{f.clearOverflow()}},completeLayout:Ext.emptyFn,finishedLayout:function(j){var k=this,g=k.layout.owner,f,h;if(g.hasListeners.overflowchange){f=g.query(">[hidden]");h=f.length;if(h!==k.lastHiddenCount){g.fireEvent("overflowchange",k.lastHiddenCount,h,f);k.lastHiddenCount=h}}},onRemove:Ext.emptyFn,getItem:function(b){return this.layout.owner.getComponent(b)},getOwnerType:function(d){var c;if(d.isToolbar){c="toolbar"}else{if(d.isTabBar){c="tab-bar"}else{if(d.isMenu){c="menu"}else{if(d.isBreadcrumb){c="breadcrumb"}else{c=d.getXType()}}}}return c},getPrefixConfig:Ext.emptyFn,getSuffixConfig:Ext.emptyFn,getOverflowCls:function(){return""},setVertical:function(){var d=this,e=d.layout,f=e.innerCt;f.removeCls(d.getOverflowCls(e.oppositeDirection));f.addCls(d.getOverflowCls(e.direction))}},1,0,0,0,["box.overflow.None","box.overflow.none"],[[Ext.mixin.Factoryable.prototype.mixinId||Ext.mixin.Factoryable.$className,Ext.mixin.Factoryable]],[Ext.layout.container.boxOverflow,"None",Ext.layout.boxOverflow,"None"],0));(Ext.cmd.derive("Ext.toolbar.Item",Ext.Component,{alternateClassName:"Ext.Toolbar.Item",enable:Ext.emptyFn,disable:Ext.emptyFn,focus:Ext.emptyFn},0,["tbitem"],["box","component","tbitem"],{box:true,component:true,tbitem:true},["widget.tbitem"],0,[Ext.toolbar,"Item",Ext.Toolbar,"Item"],0));(Ext.cmd.derive("Ext.toolbar.Separator",Ext.toolbar.Item,{alternateClassName:"Ext.Toolbar.Separator",baseCls:Ext.baseCSSPrefix+"toolbar-separator",ariaRole:"separator"},0,["tbseparator"],["box","component","tbitem","tbseparator"],{box:true,component:true,tbitem:true,tbseparator:true},["widget.tbseparator"],0,[Ext.toolbar,"Separator",Ext.Toolbar,"Separator"],0));(Ext.cmd.derive("Ext.dom.ButtonElement",Ext.dom.Element,{setSize:function(j,g,f){var h=this,k=h.component;Ext.dom.Element.prototype.setSize.call(this,j,g,f);k.btnWrap.setStyle("table-layout",(!j||j==="auto")?"":"fixed");k.btnEl.setStyle("height",(!g||g==="auto")?"":"auto");return h},setStyle:function(j,k){var l=this,g=l.component,m,h;Ext.dom.Element.prototype.setStyle.call(this,j,k);if(j){if(j==="width"||(typeof j!=="string"&&"width" in j)){m=k||j.width;g.btnWrap.setStyle("table-layout",(!m||m==="auto")?"":"fixed")}if(j==="height"||(typeof j!=="string"&&"height" in j)){h=k||j.height;g.btnEl.setStyle("height",(!h||h==="auto")?"":"auto")}}return l},setHeight:function(d,c){Ext.dom.Element.prototype.setHeight.call(this,d,c);this.component.btnEl.setStyle("height",(!d||d==="auto")?"":"auto");return this},setWidth:function(c,d){Ext.dom.Element.prototype.setWidth.call(this,c,d);this.component.btnWrap.setStyle("table-layout",(!c||c==="auto")?"":"fixed");return this}},0,0,0,0,0,0,[Ext.dom,"ButtonElement"],0));(Ext.cmd.derive("Ext.button.Manager",Ext.Base,{singleton:true,alternateClassName:"Ext.ButtonToggleManager",groups:{},pressedButton:null,buttonSelector:"."+Ext.baseCSSPrefix+"btn",init:function(){var b=this;if(!b.initialized){Ext.getDoc().on({keydown:b.onDocumentKeyDown,mouseup:b.onDocumentMouseUp,scope:b});b.initialized=true}},onDocumentKeyDown:function(f){var e=f.getKey(),d;if(e===f.SPACE||e===f.ENTER){d=f.getTarget(this.buttonSelector);if(d){Ext.getCmp(d.id).onClick(f)}}},onButtonMousedown:function(e,f){var d=this.pressedButton;if(d){d.onMouseUp(f)}this.pressedButton=e},onDocumentMouseUp:function(c){var d=this.pressedButton;if(d){d.onMouseUp(c);this.pressedButton=null}},toggleGroup:function(f,h){if(h){var j=this.groups[f.toggleGroup],k=j.length,g;for(g=0;g0){e=Ext.Array.slice(h.items);g=e.length;for(f=0;f50&&e){if(Ext.isIE9m&&!Ext.getDoc().contains(j.target)){return}else{for(m=0;m{[values.$comp.renderIcon(values)]}{text}{[values.$comp.renderIcon(values)]}{[values.$comp.getAfterMarkup ? values.$comp.getAfterMarkup(values) : ""]} {closeText}',iconTpl:'background-image:url({iconUrl});font-family:{glyphFontFamily};">&#{glyph}; ',scale:"small",allowedScales:["small","medium","large"],arrowAlign:"right",arrowCls:"arrow",maskOnDisable:false,shrinkWrap:3,frame:true,autoEl:{tag:"a",hidefocus:"on",unselectable:"on"},hasFrameTable:function(){return this.href&&this.frameTable},frameTableListener:function(){if(!this.disabled){this.doNavigate()}},doNavigate:function(){if(this.hrefTarget==="_blank"){window.open(this.getHref(),this.hrefTarget)}else{location.href=this.getHref()}},_triggerRegion:{},initComponent:function(){var b=this;b.addCls(Ext.baseCSSPrefix+"unselectable");if(Ext.isOpera12m&&(b.split||b.menu)&&b.getArrowVisible()){b.addCls(b._operaArrowCls+"-"+b.arrowAlign)}Ext.Component.prototype.initComponent.call(this);if(b.menu){b.split=true;b.setMenu(b.menu,false,true)}if(b.url){b.href=b.url}b.configuredWithPreventDefault=b.hasOwnProperty("preventDefault");if(b.href&&!b.configuredWithPreventDefault){b.preventDefault=false}if(Ext.isString(b.toggleGroup)&&b.toggleGroup!==""){b.enableToggle=true}if(b.html&&!b.text){b.text=b.html;delete b.html}},getElConfig:function(){var h=this,e=Ext.Component.prototype.getElConfig.call(this),f=h.getHref(),g=h.hrefTarget;if(e.tag==="a"){if(!h.disabled){e.tabIndex=h.tabIndex}if(f){if(!h.disabled){e.href=f}if(g){e.target=g}}}return e},beforeRender:function(){Ext.Component.prototype.beforeRender.call(this);if(this.pressed){this.addCls(this._pressedCls)}},initRenderData:function(){return Ext.apply(Ext.Component.prototype.initRenderData.call(this),this.getTemplateArgs())},getMenu:function(){return this.menu||null},setMenu:function(h,j,f){var k=this,g=k.menu;if(g&&!f){if(j!==false&&k.destroyMenu){g.destroy()}g.ownerCmp=null}if(h){h=Ext.menu.Manager.get(h,{ownerCmp:k});h.ownerCmp=k;k.mon(h,{scope:k,show:k.onMenuShow,hide:k.onMenuHide});if(!g&&k.getArrowVisible()){k.split=true;if(k.rendered){k._addSplitCls();k.updateLayout()}}k.menu=h}else{if(k.rendered){k._removeSplitCls();k.updateLayout()}k.split=false;k.menu=null}},onRender:function(){var h=this,g,f,e;h.doc=Ext.getDoc();Ext.Component.prototype.onRender.apply(this,arguments);f=h.el;if(h.tooltip){h.setTooltip(h.tooltip,true)}if(h.handleMouseEvents){e={scope:h,mouseover:h.onMouseOver,mouseout:h.onMouseOut,mousedown:h.onMouseDown};if(h.split){e.mousemove=h.onMouseMove}}else{e={scope:h}}if(Ext.supports.Touch){e.touchstart=h.onTouchStart}if(h.menu){h.keyMap=new Ext.util.KeyMap({target:h.el,key:Ext.event.Event.prototype.DOWN,handler:h.onDownKey,scope:h})}if(h.repeat){h.mon(new Ext.util.ClickRepeater(f,Ext.isObject(h.repeat)?h.repeat:{}),"click",h.onRepeatClick,h)}else{if(e[h.clickEvent]){g=true}else{e[h.clickEvent]=h.onClick}}h.mon(f,e);if(h.hasFrameTable()){h.mon(h.frameTable,"click",h.frameTableListener,h)}if(g){h.mon(f,h.clickEvent,h.onClick,h)}Ext.button.Manager.register(h)},getTemplateArgs:function(){var n=this,s=n._btnCls,q=n._baseIconCls,u=n.getIconAlign(),m=n.glyph,o=Ext._glyphFontFamily,l=n.text,r=n._hasIcon(),p=n._hasIconCls,t;if(typeof m==="string"){t=m.split("@");m=t[0];o=t[1]}return{innerCls:n._innerCls,splitCls:n.getArrowVisible()?n.getSplitCls():"",iconUrl:n.icon,iconCls:n.iconCls,glyph:m,glyphCls:m?n._glyphCls:"",glyphFontFamily:o,text:l||" ",closeText:n.closeText,textCls:l?n._textCls:"",noTextCls:l?"":n._noTextCls,hasIconCls:r?p:"",btnWrapCls:n._btnWrapCls,btnWrapStyle:n.width?"table-layout:fixed;":"",btnElStyle:n.height?"height:auto;":"",btnCls:s,baseIconCls:q,iconBeforeText:u==="left"||u==="top",iconAlignCls:r?(p+"-"+u):"",textAlignCls:s+"-"+n.getTextAlign()}},renderIcon:function(b){return this.getTpl("iconTpl").apply(b)},setHref:function(d){var c=this;c.href=d;if(!c.configuredWithPreventDefault){c.preventDefault=!d}if(c.rendered){if(!d||c.disabled){c.el.dom.removeAttribute("href")}else{c.el.dom.href=c.getHref()}}},getHref:function(){var c=this,d=c.href;return d?Ext.urlAppend(d,Ext.Object.toQueryString(Ext.apply({},c.params,c.baseParams))):false},setParams:function(c){var d=this;d.params=c;if(d.disabled){d.el.dom.removeAttribute("href")}else{d.el.dom.href=d.getHref()}},getSplitCls:function(){var b=this;return b.split?(b.baseCls+"-"+b.arrowCls)+" "+(b.baseCls+"-"+b.arrowCls+"-"+b.arrowAlign):""},setIcon:function(e){e=e||"";var h=this,f=h.btnIconEl,g=h.icon||"";h.icon=e;if(e!=g){if(f){f.setStyle("background-image",e?"url("+e+")":"");h._syncHasIconCls();if(h.didIconStateChange(g,e)){h.updateLayout()}}h.fireEvent("iconchange",h,g,e)}return h},setIconCls:function(e){e=e||"";var g=this,f=g.btnIconEl,h=g.iconCls||"";g.iconCls=e;if(h!=e){if(f){f.removeCls(h);f.addCls(e);g._syncHasIconCls();if(g.didIconStateChange(h,e)){g.updateLayout()}}g.fireEvent("iconchange",g,h,e)}return g},setGlyph:function(l){l=l||0;var m=this,h=m.btnIconEl,o=m.glyph,k=m._glyphCls,j,n;m.glyph=l;if(h){if(typeof l==="string"){n=l.split("@");l=n[0];j=n[1]||Ext._glyphFontFamily}if(!l){h.dom.innerHTML="";h.removeCls(k)}else{if(o!=l){h.dom.innerHTML="&#"+l+";";h.addCls(k)}}if(j){h.setStyle("font-family",j)}m._syncHasIconCls();if(m.didIconStateChange(o,l)){m.updateLayout()}}m.fireEvent("glyphchange",m,m.glyph,o);return m},setTooltip:function(f,e){var d=this;if(d.rendered){if(!e||!f){d.clearTip()}if(f){if(Ext.quickTipsActive&&Ext.isObject(f)){Ext.tip.QuickTipManager.register(Ext.apply({target:d.el.id},f));d.tooltip=f}else{d.el.dom.setAttribute(d.getTipAttr(),f)}}}else{d.tooltip=f}return d},updateIconAlign:function(j,l){var m=this,g,h,k;if(m.rendered){g=m.btnEl;h=m.btnIconEl;k=m._hasIconCls;if(l){g.removeCls(k+"-"+l)}g.addCls(k+"-"+j);if(j==="top"||j==="left"){g.insertFirst(h)}else{g.appendChild(h)}m.updateLayout()}},updateTextAlign:function(h,j){var k=this,f=k.btnEl,g=k._btnCls;if(k.rendered){f.removeCls(g+"-"+j);f.addCls(g+"-"+h)}},getTipAttr:function(){return this.tooltipType=="qtip"?"data-qtip":"title"},getRefItems:function(e){var f=this.menu,d;if(f){d=f.getRefItems(e);d.unshift(f)}return d||[]},clearTip:function(){var c=this,d=c.el;if(Ext.quickTipsActive&&Ext.isObject(c.tooltip)){Ext.tip.QuickTipManager.unregister(d)}else{d.dom.removeAttribute(c.getTipAttr())}},beforeDestroy:function(){var b=this;if(b.rendered){b.clearTip()}if(b.menu&&b.destroyMenu){b.menu.destroy()}Ext.destroy(b.repeater);Ext.Component.prototype.beforeDestroy.call(this)},onDestroy:function(){var b=this;if(b.rendered){b.doc.un("mouseover",b.monitorMouseOver,b);delete b.doc;Ext.destroy(b.keyMap);delete b.keyMap}Ext.button.Manager.unregister(b);Ext.Component.prototype.onDestroy.call(this)},setHandler:function(c,d){this.handler=c;if(arguments.length>1){this.scope=d}return this},applyText:function(j){j=j==null?"":String(j);var k=this,h=k.btnInnerEl,f=k.btnEl,g=k.text||"";if(j!=g){k.text=j;if(k.rendered){h.setHtml(j||" ");f[j?"addCls":"removeCls"](k._textCls);f[j?"removeCls":"addCls"](k._noTextCls);k.updateLayout()}k.fireEvent("textchange",k,g,j)}},didIconStateChange:function(e,f){var d=Ext.isEmpty(f);return Ext.isEmpty(e)?!d:d},setPressed:function(b){return this.toggle(b!==false)},toggle:function(f,e){var d=this;f=f===undefined?!d.pressed:!!f;if(f!==d.pressed){d[f?"addCls":"removeCls"](d._pressedCls);d.pressed=f;if(!e){d.fireEvent("toggle",d,f);Ext.callback(d.toggleHandler,d.scope,[d,f],0,d);if(d.reference&&d.publishState){d.publishState("pressed",f)}}}return d},maybeShowMenu:function(){var b=this;if(b.menu&&!b.hasVisibleMenu()&&!b.ignoreNextClick){b.showMenu(true)}},showMenu:function(d){var e=this,f=e.menu;if(e.rendered){if(e.tooltip&&Ext.quickTipsActive&&e.getTipAttr()!="title"){Ext.tip.QuickTipManager.getQuickTip().cancelShow(e.el)}if(f.isVisible()){f.hide()}if(!d||e.showEmptyMenu||f.items.getCount()>0){f.showBy(e.el,e.menuAlign)}}return e},hideMenu:function(){if(this.hasVisibleMenu()){this.menu.hide()}return this},hasVisibleMenu:function(){var b=this.menu;return b&&b.rendered&&b.isVisible()},onRepeatClick:function(d,c){this.onClick(c)},onTouchStart:function(b){this.doPreventDefault(b)},onClick:function(c){var d=this;d.doPreventDefault(c);if(c.type!=="keydown"&&c.button){return}if(!d.disabled){d.doToggle();d.maybeShowMenu();d.fireHandler(c)}},doPreventDefault:function(b){if(b&&(this.preventDefault||(this.disabled&&this.getHref()))){b.preventDefault()}},fireHandler:function(c){var d=this;if(d.fireEvent("click",d,c)!==false){Ext.callback(d.handler,d.scope,[d,c],0,d)}},doToggle:function(){var b=this;if(b.enableToggle&&(b.allowDepress!==false||!b.pressed)){b.toggle()}},onMouseOver:function(c){var d=this;if(!d.disabled&&!c.within(d.el,true,true)){d.onMouseEnter(c)}},onMouseOut:function(c){var d=this;if(!c.within(d.el,true,true)){if(d.overMenuTrigger){d.onMenuTriggerOut(c)}d.onMouseLeave(c)}},onMouseMove:function(f){var e=this,d=e.overMenuTrigger;if(e.split){if(e.isWithinTrigger(f)){if(!d){e.onMenuTriggerOver(f)}}else{if(d){e.onMenuTriggerOut(f)}}}},isWithinTrigger:function(j){var k=this,e=k.el,h,g;h=(k.arrowAlign==="right")?j.getX()-k.getX():j.getY()-e.getY();g=k.getTriggerRegion();return h>g.begin&&h(None)',menuCls:Ext.baseCSSPrefix+"box-menu",constructor:function(d){var c=this;Ext.layout.container.boxOverflow.None.prototype.constructor.apply(this,arguments);c.menuItems=[]},beginLayout:function(b){Ext.layout.container.boxOverflow.None.prototype.beginLayout.apply(this,arguments);this.clearOverflow(b)},beginLayoutCycle:function(c,d){Ext.layout.container.boxOverflow.None.prototype.beginLayoutCycle.apply(this,arguments);if(!d){this.clearOverflow(c);this.layout.cacheChildItems(c)}},onRemove:function(b){Ext.Array.remove(this.menuItems,b)},getSuffixConfig:function(){var g=this,h=g.layout,f=h.owner,e=f.id;g.menu=new Ext.menu.Menu({listeners:{scope:g,beforeshow:g.beforeMenuShow}});g.menuTrigger=new Ext.button.Button({id:e+"-menu-trigger",cls:g.menuCls+"-after "+Ext.baseCSSPrefix+"toolbar-item",plain:f.usePlainButtons,ownerCt:f,ownerLayout:h,iconCls:Ext.baseCSSPrefix+g.getOwnerType(f)+"-more-icon",ui:f.defaultButtonUI||"default",menu:g.menu,showEmptyMenu:true,getSplitCls:function(){return""}});return g.menuTrigger.getRenderTree()},getOverflowCls:function(b){return this.menuCls+"-body-"+b},handleOverflow:function(f){var d=this,e=d.layout;d.showTrigger(f);if(e.direction!=="vertical"){d.menuTrigger.setLocalY((f.state.boxPlan.maxSize-d.menuTrigger[e.names.getHeight]())/2)}return{reservedSpace:d.triggerTotalWidth}},captureChildElements:function(){var e=this,f=e.menuTrigger,d=e.layout.names;if(f.rendering){f.finishRender();e.triggerTotalWidth=f[d.getWidth]()+f.el.getMargin(d.parallelMargins)}},clearOverflow:function(m){var n=this,j=n.menuItems,o,q=0,p=j.length,k=n.layout.owner,l=k._asLayoutRoot;k.suspendLayouts();n.captureChildElements();n.hideTrigger();k.resumeLayouts();for(;qF){z=s.target;u.menuItems.push(z);z.hide()}}G.resumeLayouts()},hideTrigger:function(){var b=this.menuTrigger;if(b){b.hide()}},beforeMenuShow:function(l){var m=this,j=m.menuItems,p=0,k=j.length,n,o,q=function(a,b){return a.isXType("buttongroup")&&!(b instanceof Ext.toolbar.Separator)};l.suspendLayouts();m.clearMenu();l.removeAll();for(;p=this.getMaxScrollPosition()},setVertical:function(){var k=this,j=k.getBeforeScroller(),f=k.getAfterScroller(),h=k.layout.names,g=k.scrollerCls;j.removeCls(g+"-"+h.beforeY);f.removeCls(g+"-"+h.afterY);j.addCls(g+"-"+h.beforeX);f.addCls(g+"-"+h.afterX);Ext.layout.container.boxOverflow.None.prototype.setVertical.call(this)},scrollTo:function(j,h){var l=this,m=l.layout,k=m.names,n=l.getScrollPosition(),o=Ext.Number.constrain(j,0,l.getMaxScrollPosition());if(o!=n&&!l.scrolling){l.scrollPosition=NaN;if(h===undefined){h=l.animateScroll}m.innerCt[k.scrollTo](k.beforeScrollX,o,h?l.getScrollAnim():false);if(h){l.scrolling=true}else{l.updateScrollButtons()}l.fireEvent("scroll",l,o,h?l.getScrollAnim():false)}},scrollToItem:function(l,s){var m=this,p=m.layout,r=p.owner,n=p.names,t=p.innerCt,u,q,o;l=m.getItem(l);if(l!==undefined){if(l==r.items.first()){o=0}else{if(l===r.items.last()){o=m.getMaxScrollPosition()}else{u=m.getItemVisibility(l);if(!u.fullyVisible){q=l.getBox(false,true);o=q[n.x];if(u.hiddenEnd){o-=(t[n.getWidth]()-q[n.width])}}}}if(o!==undefined){m.scrollTo(o,s)}}},getItemVisibility:function(k){var m=this,r=m.getItem(k).getBox(true,true),q=m.layout,n=q.names,o=r[n.x],p=o+r[n.width],s=m.getScrollPosition(),l=s+q.innerCt[n.getWidth]();return{hiddenStart:ol,fullyVisible:o>s&&pn.clickPixelThresh||q>n.clickPixelThresh){n.startDrag(n.startX,n.startY)}}if(n.dragThreshMet){m.b4Drag(l);m.onDrag(l);if(!m.moveOnly){n.fireEvents(l,false)}}n.stopEvent(l);return true},fireEvents:function(B,M){var e=this,L=Ext.supports.Touch,R=e.dragCurrent,D=e.currentPoint,H=D.x,J=D.y,T,I,S,N,K=[],Q=[],O=[],V=[],A=[],C=[],U,F,E,G,W=L?document.documentElement.clientWidth/window.innerWidth:1,P;if(!R||R.isLocked()){return}P=!(R.deltaX<0||R.deltaY<0);if(L||(!e.notifyOccluded&&(!Ext.supports.CSSPointerEvents||Ext.isIE10m||Ext.isOpera)&&P)){T=R.getDragEl();if(P){T.style.visibility="hidden"}B.target=document.elementFromPoint(H/W,J/W);if(P){T.style.visibility="visible"}}for(F in e.dragOvers){S=e.dragOvers[F];delete e.dragOvers[F];if(!e.isTypeOfDD(S)||S.isDestroyed){continue}if(e.notifyOccluded){if(!this.isOverTarget(D,S,e.mode)){O.push(S)}}else{if(!B.within(S.getEl())){O.push(S)}}Q[F]=true}for(G in R.groups){if("string"!=typeof G){continue}for(F in e.ids[G]){S=e.ids[G][F];if(e.isTypeOfDD(S)&&(N=S.getEl())&&(S.isTarget)&&(!S.isLocked())&&(Ext.fly(N).isVisible(true))&&((S!=R)||(R.ignoreSelf===false))){if(e.notifyOccluded){if((S.zIndex=e.getZIndex(N))!==-1){U=true}K.push(S)}else{if(B.within(S.getEl())){K.push(S);break}}}}}if(U){Ext.Array.sort(K,e.byZIndex)}for(F=0,E=K.length;F','",""],isSplitter:true,baseCls:Ext.baseCSSPrefix+"splitter",collapsedClsInternal:Ext.baseCSSPrefix+"splitter-collapsed",canResize:true,collapsible:null,collapseOnDblClick:true,defaultSplitMin:40,defaultSplitMax:1000,collapseTarget:"next",horizontal:false,vertical:false,size:5,tracker:null,ariaRole:"separator",getTrackerConfig:function(){return Ext.apply({xclass:"Ext.resizer.SplitterTracker",el:this.el,splitter:this},this.tracker)},beforeRender:function(){var d=this,f=d.getCollapseTarget(),e=d.collapsible;Ext.Component.prototype.beforeRender.call(this);if(f.collapsed){d.addCls(d.collapsedClsInternal)}if(!d.canResize){d.addCls(d.baseCls+"-noresize")}Ext.applyIf(d.renderData,{collapseDir:d.getCollapseDirection(),collapsible:(e!==null)?e:f.collapsible});d.protoEl.unselectable()},onRender:function(){var f=this,d,e;Ext.Component.prototype.onRender.apply(this,arguments);if(f.performCollapse!==false){if(f.renderData.collapsible){f.mon(f.collapseEl,"click",f.toggleTargetCmp,f)}if(f.collapseOnDblClick){f.mon(f.el,"dblclick",f.toggleTargetCmp,f)}}f.mon(f.getCollapseTarget(),{collapse:f.onTargetCollapse,expand:f.onTargetExpand,beforeexpand:f.onBeforeTargetExpand,beforecollapse:f.onBeforeTargetCollapse,scope:f});if(f.canResize){f.tracker=Ext.create(f.getTrackerConfig());f.relayEvents(f.tracker,["beforedragstart","dragstart","dragend"])}d=f.collapseEl;if(d){d.lastCollapseDirCls=f.collapseDirProps[f.collapseDirection].cls}},getCollapseDirection:function(){var j=this,m=j.collapseDirection,k,h,g,l;if(!m){k=j.collapseTarget;if(k.isComponent){m=k.collapseDirection}if(!m){l=j.ownerCt.layout.type;if(k.isComponent){g=j.ownerCt.items;h=Number(g.indexOf(k)===g.indexOf(j)-1)<<1|Number(l==="hbox")}else{h=Number(j.collapseTarget==="prev")<<1|Number(l==="hbox")}m=["bottom","right","top","left"][h]}j.collapseDirection=m}j.setOrientation((m==="top"||m==="bottom")?"horizontal":"vertical");return m},getCollapseTarget:function(){var b=this;return b.collapseTarget.isComponent?b.collapseTarget:b.collapseTarget==="prev"?b.previousSibling():b.nextSibling()},setCollapseEl:function(c){var d=this.collapseEl;if(d){d.setDisplayed(c)}},onBeforeTargetExpand:function(b){this.setCollapseEl("none")},onBeforeTargetCollapse:function(){this.setCollapseEl("none")},onTargetCollapse:function(b){this.el.addCls(this.collapsedClsInternal+" "+(this.collapsedCls||""));this.setCollapseEl("")},onTargetExpand:function(b){this.el.removeCls(this.collapsedClsInternal+" "+(this.collapsedCls||""));this.setCollapseEl("")},collapseDirProps:{top:{cls:Ext.baseCSSPrefix+"layout-split-top"},right:{cls:Ext.baseCSSPrefix+"layout-split-right"},bottom:{cls:Ext.baseCSSPrefix+"layout-split-bottom"},left:{cls:Ext.baseCSSPrefix+"layout-split-left"}},orientationProps:{horizontal:{opposite:"vertical",fixedAxis:"height",stretchedAxis:"width"},vertical:{opposite:"horizontal",fixedAxis:"width",stretchedAxis:"height"}},applyCollapseDirection:function(){var h=this,e=h.collapseEl,g=h.collapseDirProps[h.collapseDirection],f;if(e){f=e.lastCollapseDirCls;if(f){e.removeCls(f)}e.addCls(e.lastCollapseDirCls=g.cls)}},applyOrientation:function(){var m=this,o=m.orientation,n=m.orientationProps[o],l=m.size,h=n.fixedAxis,k=n.stretchedAxis,j=m.baseCls+"-";m[o]=true;m[n.opposite]=false;if(!m.hasOwnProperty(h)||m[h]==="100%"){m[h]=l}if(!m.hasOwnProperty(k)||m[k]===l){m[k]="100%"}m.removeCls(j+n.opposite);m.addCls(j+o)},setOrientation:function(d){var c=this;if(c.orientation!==d){c.orientation=d;c.applyOrientation()}},updateOrientation:function(){delete this.collapseDirection;this.getCollapseDirection();this.applyCollapseDirection()},toggleTargetCmp:function(j,e){var k=this.getCollapseTarget(),h=k.placeholder,g;if(Ext.isFunction(k.expand)&&Ext.isFunction(k.collapse)){if(h&&!h.hidden){g=true}else{g=!k.hidden}if(g){if(k.collapsed){k.expand()}else{if(k.collapseDirection){k.collapse()}else{k.collapse(this.renderData.collapseDir)}}}}},setSize:function(){var b=this;Ext.Component.prototype.setSize.apply(this,arguments);if(Ext.isIE&&b.el){b.el.repaint()}},beforeDestroy:function(){Ext.destroy(this.tracker);Ext.Component.prototype.beforeDestroy.call(this)}},0,["splitter"],["box","component","splitter"],{box:true,component:true,splitter:true},["widget.splitter"],0,[Ext.resizer,"Splitter"],0));(Ext.cmd.derive("Ext.layout.container.Box",Ext.layout.container.Container,{alternateClassName:"Ext.layout.BoxLayout",type:"box",config:{align:"begin",constrainAlign:false,enableSplitters:true,overflowHandler:{$value:null,merge:function(c,d){if(typeof c=="string"){c={type:c}}return Ext.merge(d?Ext.Object.chain(d):{},c)}},padding:0,pack:"start",stretchMaxPartner:undefined,vertical:false,alignRoundingMethod:"round"},scrollOffset:0,itemCls:Ext.baseCSSPrefix+"box-item",targetCls:Ext.baseCSSPrefix+"box-layout-ct",targetElCls:Ext.baseCSSPrefix+"box-target",innerCls:Ext.baseCSSPrefix+"box-inner",availableSpaceOffset:0,reserveOffset:true,manageMargins:true,createsInnerCt:true,childEls:["innerCt","targetEl"],renderTpl:['{%var oc,l=values.$comp.layout,oh=l.overflowHandler;if (oh && oh.getPrefixConfig!==Ext.emptyFn) {if(oc=oh.getPrefixConfig())dh.generateMarkup(oc, out)}%}{%if (oh && oh.getSuffixConfig!==Ext.emptyFn) {if(oc=oh.getSuffixConfig())dh.generateMarkup(oc, out)}%}',{disableFormats:true,definitions:"var dh=Ext.DomHelper;"}],constructor:function(e){var f=this,d;Ext.layout.container.Container.prototype.constructor.apply(this,arguments);f.setVertical(f.vertical);f.flexSortFn=f.flexSort.bind(f);d=typeof f.padding;if(d==="string"||d==="number"){f.padding=Ext.util.Format.parseBox(f.padding);f.padding.height=f.padding.top+f.padding.bottom;f.padding.width=f.padding.left+f.padding.right}},_beginRe:/^(?:begin|left|top)$/,_centerRe:/^(?:center|middle)$/,_endRe:/^(?:end|right|bottom)$/,_percentageRe:/^\s*(\d+(?:\.\d*)?)\s*[%]\s*$/,getItemSizePolicy:function(r,q){var v=this,x=v.sizePolicy,y=v.align,z=r.flex,t=y,w=v.names,D=r[w.width],s=r[w.height],B=v._percentageRe,C=B.test(D),A=(y==="stretch"),E=(y==="stretchmax"),u=v.constrainAlign;if(!q&&(A||z||C||(u&&!E))){q=v.owner.getSizeModel()}if(A){if(!B.test(s)&&q[w.height].shrinkWrap){t="stretchmax"}}else{if(!E){if(B.test(s)){t="stretch"}else{if(u&&!q[w.height].shrinkWrap){t="stretchmax"}else{t=""}}}}if(z||C){if(!q[w.width].shrinkWrap){x=x.flex}}return x[t]},flexSort:function(u,v){var x=this.names.maxWidth,D=this.names.minWidth,w=Infinity,y=u.target,a=v.target,A=y.flex,B=a.flex,G=0,F,t,z,E,b,C;z=y[x]||w;E=a[x]||w;F=y[D]||0;t=a[D]||0;b=isFinite(F)||isFinite(t);C=isFinite(z)||isFinite(E);if(b||C){if(C){G=z-E}if(G===0&&b){G=t-F}if(G===0){if(C){G=B-A}else{G=A-B}}}return G},isItemBoxParent:function(b){return true},isItemShrinkWrap:function(b){return true},roundFlex:function(b){return Math.ceil(b)},beginCollapse:function(c){var d=this;if(d.direction==="vertical"&&c.collapsedVertical()){c.collapseMemento.capture(["flex"]);delete c.flex}else{if(d.direction==="horizontal"&&c.collapsedHorizontal()){c.collapseMemento.capture(["flex"]);delete c.flex}}},beginExpand:function(b){b.collapseMemento.restore(["flex"])},beginLayout:function(m){var n=this,j=n.owner,k=j.stretchMaxPartner,o=n.innerCt.dom.style,l=n.names,h=n.overflowHandler;m.boxNames=l;if(h){h.beginLayout(m)}if(typeof k==="string"){k=Ext.getCmp(k)||j.query(k)[0]}m.stretchMaxPartner=k&&m.context.getCmp(k);Ext.layout.container.Container.prototype.beginLayout.apply(this,arguments);m.innerCtContext=m.getEl("innerCt",n);m.targetElContext=m.getEl("targetEl",n);n.scrollParallel=j.scrollFlags[l.x];n.scrollPerpendicular=j.scrollFlags[l.y];if(n.scrollParallel){n.scrollPos=j.getTargetEl().dom[l.scrollLeft]}o.width="";o.height=""},beginLayoutCycle:function(r,k){var n=this,p=n.align,o=r.boxNames,l=n.pack,s=n._centerRe,m=o.heightModel,q=n.overflowHandler;if(q){q.beginLayoutCycle(r,k)}Ext.layout.container.Container.prototype.beginLayoutCycle.apply(this,arguments);r.parallelSizeModel=r[o.widthModel];r.perpendicularSizeModel=r[m];r.boxOptions={align:p={stretch:p==="stretch",stretchmax:p==="stretchmax",center:s.test(p),bottom:n._endRe.test(p)},pack:l={center:s.test(l),end:l==="end"}};if(p.stretch&&r.perpendicularSizeModel.shrinkWrap){p.stretchmax=true;p.stretch=false}p.nostretch=!(p.stretch||p.stretchmax);if(r.parallelSizeModel.shrinkWrap){l.center=l.end=false}n.cacheFlexes(r);n.targetEl.setWidth(20000)},cacheFlexes:function(E){var u=this,D=E.boxNames,M=D.widthModel,J=D.heightModel,K=E.boxOptions.align.nostretch,A=0,L=E.childItems,y=L.length,w=[],C=0,F=D.minWidth,H=u._percentageRe,x=0,v=0,I,B,z,G;while(y--){B=L[y];I=B.target;if(B[M].calculated){B.flex=z=I.flex;if(z){A+=z;w.push(B);C+=I[F]||0}else{G=H.exec(I[D.width]);B.percentageParallel=parseFloat(G[1])/100;++x}}if(K&&B[J].calculated){G=H.exec(I[D.height]);B.percentagePerpendicular=parseFloat(G[1])/100;++v}}E.flexedItems=w;E.flexedMinSize=C;E.totalFlex=A;E.percentageWidths=x;E.percentageHeights=v;Ext.Array.sort(w,u.flexSortFn)},calculate:function(n){var p=this,q=p.getContainerSize(n),l=n.boxNames,o=n.state,m=o.boxPlan||(o.boxPlan={}),j=n.targetContext,k=p.overflowHandler;m.targetSize=q;if(!o.parallelDone){o.parallelDone=p.calculateParallel(n,l,m)}if(!o.perpendicularDone){o.perpendicularDone=p.calculatePerpendicular(n,l,m)}if(o.parallelDone&&o.perpendicularDone){p.publishInnerCtSize(n,p.reserveOffset?p.availableSpaceOffset:0);if(p.done&&n.boxOptions.align.stretchmax&&!o.stretchMaxDone){p.calculateStretchMax(n,l,m);o.stretchMaxDone=true}if(k){k.calculate(n)}}else{p.done=false}},calculateParallel:function(ab,Y,aj){var M=this,G=Y.width,ak=ab.childItems,Q=Y.beforeX,ag=Y.afterX,U=Y.setWidth,W=ak.length,I=ab.flexedItems,S=I.length,K=ab.boxOptions.pack,Z=M.padding,ah=aj.targetSize,ad=ah[G],T=0,af=Z[Q],O=af+Z[ag]+M.scrollOffset+(M.reserveOffset?M.availableSpaceOffset:0),J=Ext.getScrollbarSize()[Y.width],L,aa,ae,H,X,N,P,V,R,ai,ac;if(!ab.parallelSizeModel.shrinkWrap&&!ah[Y.gotWidth]){return false}if(J&&M.scrollPerpendicular&&ab.parallelSizeModel.shrinkWrap&&!ab.boxOptions.align.stretch&&!ab.perpendicularSizeModel.shrinkWrap){if(!ab.state.perpendicularDone){return false}R=true}for(L=0;Laj.targetSize[Y.height])){V+=J;ab[Y.hasOverflowY]=true;ab.target.componentLayout[Y.setWidthInDom]=true;ab[Y.invalidateScrollY]=Ext.isIE8}ab[Y.setContentWidth](V);return true},calculatePerpendicular:function(ag,Q,ab){var ah=this,aw=ag.perpendicularSizeModel.shrinkWrap,ay=ab.targetSize,ar=ag.childItems,ac=ar.length,ao=Math.max,ap=Q.height,an=Q.setHeight,at=Q.beforeY,ai=Q.y,T=ah.padding,aq=T[at],am=ay[ap]-aq-T[Q.afterY],W=ag.boxOptions.align,al=W.stretch,ak=W.stretchmax,N=W.center,O=W.bottom,U=ah.constrainAlign,V=0,Z=0,X=ah.onBeforeConstrainInvalidateChild,aa=ah.onAfterConstrainInvalidateChild,az=Ext.getScrollbarSize().height,ad,S,Y,af,ae,ax,aj,av,P,R,au;if(al||((N||O)&&!aw)){if(isNaN(am)){return false}}if(!al&&!ag.parallelSizeModel.shrinkWrap&&!ag.state.parallelDone&&ah.scrollParallel){return false}if(ah.scrollParallel&&ab.tooNarrow){if(aw){R=true}else{am-=az;ab.targetSize[ap]-=az}}if(al){ax=am}else{for(S=0;Sam){aj.invalidate({before:X,after:aa,layout:ah,childHeight:am,names:Q});ag.state.parallelDone=false}if(isNaN(V=ao(V,Y+af,aj.target[Q.minHeight]||0))){return false}}if(R){V+=az;ag[Q.hasOverflowX]=true;ag.target.componentLayout[Q.setHeightInDom]=true;ag[Q.invalidateScrollX]=Ext.isIE8}av=ag.stretchMaxPartner;if(av){ag.setProp("maxChildHeight",V);P=av.childItems;if(P&&P.length){V=ao(V,av.getProp("maxChildHeight"));if(isNaN(V)){return false}}}ag[Q.setContentHeight](V+ah.padding[ap]+ag.targetContext.getPaddingInfo()[ap]);if(R){V-=az}ab.maxSize=V;if(ak){ax=V}else{if(N||O||Z){if(U){ax=aw?V:am}else{ax=aw?V:ao(am,V)}ax-=ag.innerCtContext.getBorderInfo()[ap]}}}for(S=0;S0){ad=aq+Math[ah.alignRoundingMethod](ae/2)}}else{if(O){ad=ao(0,ax-ad-aj.props[ap])}}}aj.setProp(ai,ad)}return true},onBeforeConstrainInvalidateChild:function(d,e){var f=e.names.heightModel;if(!d[f].constrainedMin){d[f]=Ext.layout.SizeModel.calculated}},onAfterConstrainInvalidateChild:function(d,e){var f=e.names;d.setProp(f.beforeY,0);if(d[f.heightModel].calculated){d[f.setHeight](e.childHeight)}},calculateStretchMax:function(C,w,u){var v=this,y=w.height,t=w.width,z=C.childItems,E=z.length,r=u.maxSize,s=v.onBeforeStretchMaxInvalidateChild,A=v.onAfterStretchMaxInvalidateChild,q,x,B,D;for(B=0;B=l){return}}if(!q){return}m=n.findNextFocusableChild(null,true,o,k);if(m){n.activateFocusable(m)}return m},clearFocusables:function(){var h=this,f,j,k,g;f=h.getFocusables();for(k=0,g=f.length;k0?(j0?j+m:k-1);for(;;p+=m){if(j<0&&(p>=k||p<0)){return null}else{if(p>=k){p=-1;continue}else{if(p<0){p=k;continue}else{if(p===j){return null}}}}n=q[p];if(!n||!n.focusable){continue}if(o||n.isFocusable()){return n}}return null},getFocusableContainerEl:function(){return this.el},onFocusableChildAdd:function(b){return this.doFocusableChildAdd(b)},activateFocusableContainerEl:function(b){b=b||this.getFocusableContainerEl();b.set({tabindex:this.activeChildTabIndex})},deactivateFocusableContainerEl:function(b){b=b||this.getFocusableContainerEl();b.set({tabindex:this.inactiveChildTabIndex})},doFocusableChildAdd:function(b){if(b.focusable){b.focusableContainer=this;this.deactivateFocusable(b)}},onFocusableChildRemove:function(b){return this.doFocusableChildRemove(b)},doFocusableChildRemove:function(b){delete b.focusableContainer},onFocusableContainerMousedown:function(f,d){var e=Ext.Component.getComponentByElement(d);if(e===this){f.preventDefault()}},onFocusableContainerFocus:function(h){var e=this,f,g;g=e.initDefaultFocusable();if(g){e.deactivateFocusableContainerEl();g.focus()}},onFocusableContainerFocusEnter:function(f){var d=this,e=d.lastFocusedChild;if(e){d.deactivateFocusableContainerEl()}},onFocusableContainerFocusLeave:function(f){var d=this,e=d.lastFocusedChild;d.clearFocusables();if(e){d.activateFocusable(e)}else{d.activateFocusableContainerEl()}},beforeFocusableChildBlur:Ext.privateFn,afterFocusableChildBlur:Ext.privateFn,beforeFocusableChildFocus:function(f){var d=this,e;d.clearFocusables();d.activateFocusable(f);if(f.needArrowKeys){d.guardFocusableChild(f)}},guardFocusableChild:function(g){var h=this,f=h.activeChildTabIndex,e;e=h.findNextFocusableChild(g,-1);if(e){e.setTabIndex(f)}e=h.findNextFocusableChild(g,1);if(e){e.setTabIndex(f)}},afterFocusableChildFocus:function(b){this.lastFocusedChild=b},onFocusableChildShow:Ext.privateFn,onFocusableChildHide:Ext.privateFn,onFocusableChildEnable:Ext.privateFn,onFocusableChildDisable:Ext.privateFn,onFocusableChildMasked:Ext.privateFn,onFocusableChildDestroy:Ext.privateFn,onFocusableChildUpdate:Ext.privateFn}},0,0,0,0,0,0,[Ext.util,"FocusableContainer"],0));(Ext.cmd.derive("Ext.toolbar.Toolbar",Ext.container.Container,{alternateClassName:"Ext.Toolbar",isToolbar:true,baseCls:Ext.baseCSSPrefix+"toolbar",ariaRole:"toolbar",defaultType:"button",layout:undefined,vertical:false,enableOverflow:false,overflowHandler:null,defaultButtonUI:"default-toolbar",defaultFieldUI:"default",defaultFooterButtonUI:"default",defaultFooterFieldUI:"default",trackMenus:true,itemCls:Ext.baseCSSPrefix+"toolbar-item",statics:{shortcuts:{"-":"tbseparator"," ":"tbspacer"},shortcutsHV:{0:{"->":{xtype:"tbfill",height:0}},1:{"->":{xtype:"tbfill",width:0}}}},initComponent:function(){var c=this,d=c.layout;if(c.dock==="right"||c.dock==="left"){c.vertical=true}c.layout=d=Ext.applyIf(Ext.isString(d)?{type:d}:d||{},{type:c.vertical?"vbox":"hbox",align:c.vertical?"stretchmax":"middle"});if(c.overflowHandler){d.overflowHandler=c.overflowHandler}else{if(c.enableOverflow){d.overflowHandler="menu"}}if(c.vertical){c.addClsWithUI("vertical")}if(c.ui==="footer"){c.ignoreBorderManagement=true}Ext.container.Container.prototype.initComponent.call(this)},getRefItems:function(g){var h=this,f=Ext.container.Container.prototype.getRefItems.apply(this,arguments),j=h.layout,k;if(g&&(h.enableOverflow||(h.overflowHandler==="menu"))){k=j.overflowHandler;if(k&&k.menu){f=f.concat(k.menu.getRefItems(g))}}return f},lookupComponent:function(g){var h=arguments;if(typeof g==="string"){var c=Ext.toolbar.Toolbar,f=c.shortcutsHV[this.vertical?1:0][g]||c.shortcuts[g];if(typeof f==="string"){g={xtype:f}}else{if(f){g=Ext.apply({},f)}else{g={xtype:"tbtext",text:g}}}this.applyDefaults(g);h=[g]}return Ext.container.Container.prototype.lookupComponent.apply(this,h)},onBeforeAdd:function(e){var h=this,g=h.ui==="footer",f=g?h.defaultFooterButtonUI:h.defaultButtonUI;if(e.isSegmentedButton){if(e.getDefaultUI()==="default"&&!e.config.hasOwnProperty("defaultUI")){e.setDefaultUI(f)}}else{if(e.ui==="default"&&!e.hasOwnProperty("ui")){if(e.isButton){e.ui=f}else{if(e.isFormField){e.ui=g?h.defaultFooterFieldUI:h.defaultFieldUI}}}}if(e instanceof Ext.toolbar.Separator){e.setUI((h.vertical)?"vertical":"horizontal")}Ext.container.Container.prototype.onBeforeAdd.apply(this,arguments)},onAdd:function(b){Ext.container.Container.prototype.onAdd.apply(this,arguments);this.trackMenu(b)},onRemove:function(b){Ext.container.Container.prototype.onRemove.apply(this,arguments);this.trackMenu(b,true)},privates:{applyDefaults:function(b){if(!Ext.isString(b)){b=Ext.container.Container.prototype.applyDefaults.apply(this,arguments)}return b},trackMenu:function(h,f){if(this.trackMenus&&h.menu){var g=f?"mun":"mon",e=this;e[g](h,"mouseover",e.onButtonOver,e);e[g](h,"menushow",e.onButtonMenuShow,e);e[g](h,"menuhide",e.onButtonMenuHide,e)}},getChildItemsToDisable:function(){return this.items.getRange()},onButtonOver:function(b){if(this.activeMenuBtn&&this.activeMenuBtn!==b){this.activeMenuBtn.hideMenu();b.showMenu();this.activeMenuBtn=b}},onButtonMenuShow:function(b){this.activeMenuBtn=b},onButtonMenuHide:function(b){delete this.activeMenuBtn}}},0,["toolbar"],["box","component","container","toolbar"],{box:true,component:true,container:true,toolbar:true},["widget.toolbar"],[[Ext.util.FocusableContainer.prototype.mixinId||Ext.util.FocusableContainer.$className,Ext.util.FocusableContainer]],[Ext.toolbar,"Toolbar",Ext,"Toolbar"],0));(Ext.cmd.derive("Ext.dd.DragDrop",Ext.Base,{constructor:function(f,e,d){if(f){this.init(f,e,d)}},id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true},moveOnly:false,unlock:function(){this.locked=false},isTarget:true,padding:null,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,triggerEvent:"mousedown",b4StartDrag:function(d,c){},startDrag:function(d,c){},b4Drag:function(b){},onDrag:function(b){},onDragEnter:function(d,c){},b4DragOver:function(b){},onDragOver:function(d,c){},b4DragOut:function(b){},onDragOut:function(d,c){},b4DragDrop:function(b){},onDragDrop:function(d,c){},onInvalidDrop:function(b){},b4EndDrag:function(b){},endDrag:function(b){},b4MouseDown:function(b){},onMouseDown:function(b){},onMouseUp:function(b){},onAvailable:function(){},defaultPadding:{left:0,right:0,top:0,bottom:0},constrainTo:function(t,v,n){if(Ext.isNumber(v)){v={left:v,right:v,top:v,bottom:v}}v=v||this.defaultPadding;var r=Ext.get(this.getEl()).getBox(),c=Ext.get(t),o=c.getScroll(),s,q=c.dom,p,u,w;if(q==document.body){s={x:o.left,y:o.top,width:Ext.Element.getViewportWidth(),height:Ext.Element.getViewportHeight()}}else{p=c.getXY();s={x:p[0],y:p[1],width:q.clientWidth,height:q.clientHeight}}u=r.y-s.y;w=r.x-s.x;this.resetConstraints();this.setXConstraint(w-(v.left||0),s.width-w-r.width-(v.right||0),this.xTickSize);this.setYConstraint(u-(v.top||0),s.height-u-r.height-(v.bottom||0),this.yTickSize)},getEl:function(){if(!this._domRef){this._domRef=Ext.getDom(this.id)}return this._domRef},getDragEl:function(){return Ext.getDom(this.dragElId)},init:function(g,f,e){var h=this;h.el=h.el||Ext.get(g);h.initTarget(g,f,e);Ext.get(h.id).on(h.triggerEvent,h.handleMouseDown,h)},initTarget:function(f,e,d){this.config=d||{};this.DDMInstance=Ext.dd.DragDropManager;this.groups={};if(typeof f!=="string"){f=Ext.id(f)}this.id=f;this.addToGroup((e)?e:"default");this.handleElId=f;this.setDragElId(f);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();this.handleOnAvailable()},applyConfig:function(){this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false)},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable()},setPadding:function(h,f,g,e){if(!f&&0!==f){this.padding=[h,h,h,h]}else{if(!g&&0!==g){this.padding=[h,f,h,f]}else{this.padding=[h,f,g,e]}}},setInitPosition:function(l,m){var k=this.getEl(),g,h,j;if(!this.DDMInstance.verifyEl(k)){return}g=l||0;h=m||0;j=Ext.fly(k).getXY();this.initPageX=j[0]-g;this.initPageY=j[1]-h;this.lastPageX=j[0];this.lastPageY=j[1];this.setStartPosition(j)},setStartPosition:function(c){var d=c||Ext.fly(this.getEl()).getXY();this.deltaSetXY=null;this.startPageX=d[0];this.startPageY=d[1]},addToGroup:function(b){this.groups[b]=true;this.DDMInstance.regDragDrop(this,b)},removeFromGroup:function(b){if(this.groups[b]){delete this.groups[b]}this.DDMInstance.removeDDFromGroup(this,b)},setDragElId:function(b){this.dragElId=b},setHandleElId:function(b){if(typeof b!=="string"){b=Ext.id(b)}this.handleElId=b;this.DDMInstance.regHandle(this.id,b)},setOuterHandleElId:function(b){if(typeof b!=="string"){b=Ext.id(b)}Ext.get(b).on(this.triggerEvent,this.handleMouseDown,this);this.setHandleElId(b);this.hasOuterHandles=true},unreg:function(){var c=this,d;if(c._domRef){d=Ext.fly(c.id);if(d){d.un(c.triggerEvent,c.handleMouseDown,c)}}c._domRef=null;c.DDMInstance._remove(c,c.autoGroup)},destroy:function(){this.unreg();this.isDestroyed=true},isLocked:function(){return(this.DDMInstance.isLocked()||this.locked)},handleMouseDown:function(f,d){var e=this;if((e.primaryButtonOnly&&f.button!=0)||e.isLocked()){return}e.DDMInstance.refreshCache(e.groups);if(e.hasOuterHandles||e.DDMInstance.isOverTarget(f.getPoint(),e)){if(e.clickValidator(f)){e.setStartPosition();e.b4MouseDown(f);e.onMouseDown(f);e.DDMInstance.handleMouseDown(f,e);e.DDMInstance.stopEvent(f)}}},clickValidator:function(c){var d=c.getTarget();return(this.isValidHandleChild(d)&&(this.id==this.handleElId||this.DDMInstance.handleWasClicked(d,this.id)))},addInvalidHandleType:function(d){var c=d.toUpperCase();this.invalidHandleTypes[c]=c},addInvalidHandleId:function(b){if(typeof b!=="string"){b=Ext.id(b)}this.invalidHandleIds[b]=b},addInvalidHandleClass:function(b){this.invalidHandleClasses.push(b)},removeInvalidHandleType:function(d){var c=d.toUpperCase();delete this.invalidHandleTypes[c]},removeInvalidHandleId:function(b){if(typeof b!=="string"){b=Ext.id(b)}delete this.invalidHandleIds[b]},removeInvalidHandleClass:function(d){for(var f=0,e=this.invalidHandleClasses.length;f=this.minX;e=e-f){if(!h[e]){this.xTicks[this.xTicks.length]=e;h[e]=true}}for(e=this.initPageX;e<=this.maxX;e=e+f){if(!h[e]){this.xTicks[this.xTicks.length]=e;h[e]=true}}Ext.Array.sort(this.xTicks,this.DDMInstance.numericSort)},setYTicks:function(g,f){this.yTicks=[];this.yTickSize=f;var h={},e;for(e=this.initPageY;e>=this.minY;e=e-f){if(!h[e]){this.yTicks[this.yTicks.length]=e;h[e]=true}}for(e=this.initPageY;e<=this.maxY;e=e+f){if(!h[e]){this.yTicks[this.yTicks.length]=e;h[e]=true}}Ext.Array.sort(this.yTicks,this.DDMInstance.numericSort)},setXConstraint:function(f,d,e){this.leftConstraint=f;this.rightConstraint=d;this.minX=this.initPageX-f;this.maxX=this.initPageX+d;if(e){this.setXTicks(this.initPageX,e)}this.constrainX=true},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks()},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0},setYConstraint:function(e,f,d){this.topConstraint=e;this.bottomConstraint=f;this.minY=this.initPageY-e;this.maxY=this.initPageY+f;if(d){this.setYTicks(this.initPageY,d)}this.constrainY=true},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var c=(this.maintainOffset)?this.lastPageX-this.initPageX:0,d=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(c,d)}else{this.setInitPosition()}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize)}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize)}},getTick:function(k,n){if(!n){return k}else{if(n[0]>=k){return n[0]}else{var h,j,o,l,m;for(h=0,j=n.length;h=k){l=k-n[h];m=n[o]-k;return(m>l)?n[h]:n[o]}}return n[n.length-1]}}},toString:function(){return("DragDrop "+this.id)}},3,0,0,0,0,0,[Ext.dd,"DragDrop"],0));(Ext.cmd.derive("Ext.dd.DD",Ext.dd.DragDrop,{constructor:function(f,e,d){if(f){this.init(f,e,d)}},scroll:true,autoOffset:function(h,e){var f=h-this.startPageX,g=e-this.startPageY;this.setDelta(f,g)},setDelta:function(c,d){this.deltaX=c;this.deltaY=d},setDragElPos:function(f,d){var e=this.getDragEl();this.alignElWithMouse(e,f,d)},alignElWithMouse:function(v,s,u){var r=this.getTargetCoord(s,u),t=v.dom?v:Ext.fly(v,"_dd"),m=t.getSize(),p=Ext.Element,o,w,n,q;if(!this.deltaSetXY){o=this.cachedViewportSize={width:p.getDocumentWidth(),height:p.getDocumentHeight()};w=[Math.max(0,Math.min(r.x,o.width-m.width)),Math.max(0,Math.min(r.y,o.height-m.height))];t.setXY(w);n=this.getLocalX(t);q=t.getLocalY();this.deltaSetXY=[n-r.x,q-r.y]}else{o=this.cachedViewportSize;this.setLocalXY(t,Math.max(0,Math.min(r.x+this.deltaSetXY[0],o.width-m.width)),Math.max(0,Math.min(r.y+this.deltaSetXY[1],o.height-m.height)))}this.cachePosition(r.x,r.y);this.autoScroll(r.x,r.y,v.offsetHeight,v.offsetWidth);return r},cachePosition:function(d,e){if(d){this.lastPageX=d;this.lastPageY=e}else{var f=Ext.fly(this.getEl()).getXY();this.lastPageX=f[0];this.lastPageY=f[1]}},autoScroll:function(t,u,y,s){if(this.scroll){var r=Ext.Element.getViewportHeight(),B=Ext.Element.getViewportWidth(),h=this.DDMInstance.getScrollTop(),z=this.DDMInstance.getScrollLeft(),v=y+u,q=s+t,w=(r+h-u-this.deltaY),x=(B+z-t-this.deltaX),A=40,C=(document.all)?80:30;if(v>r&&w0&&u-hB&&x0&&t-zthis.maxX){f=this.maxX}}if(this.constrainY){if(gthis.maxY){g=this.maxY}}f=this.getTick(f,this.xTicks);g=this.getTick(g,this.yTicks);return{x:f,y:g}},applyConfig:function(){Ext.dd.DragDrop.prototype.applyConfig.call(this);this.scroll=(this.config.scroll!==false)},b4MouseDown:function(c){var d=c.getXY();this.autoOffset(d[0],d[1])},b4Drag:function(c){var d=c.getXY();this.setDragElPos(d[0],d[1])},toString:function(){return("DD "+this.id)},getLocalX:function(b){return b.getLocalX()},setLocalXY:function(d,e,f){d.setLocalXY(e,f)}},3,0,0,0,0,0,[Ext.dd,"DD"],0));(Ext.cmd.derive("Ext.dd.DDProxy",Ext.dd.DD,{statics:{dragElId:"ygddfdiv"},constructor:function(f,e,d){if(f){this.init(f,e,d);this.initFrame()}},resizeFrame:true,centerFrame:false,createFrame:function(){var e=this,f=document.body,g,h;if(!f||!f.firstChild){Ext.defer(function(){e.createFrame()},50);return}g=this.getDragEl();if(!g){g=document.createElement("div");g.id=this.dragElId;g.setAttribute("role","presentation");h=g.style;h.position="absolute";h.visibility="hidden";h.cursor="move";h.border="2px solid #aaa";h.zIndex=999;f.insertBefore(g,f.firstChild)}},initFrame:function(){this.createFrame()},applyConfig:function(){Ext.dd.DD.prototype.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||Ext.dd.DDProxy.dragElId)},showFrame:function(h,j){var k=this.getEl(),g=this.getDragEl(),f=g.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(f.width,10)/2),Math.round(parseInt(f.height,10)/2))}this.setDragElPos(h,j);Ext.fly(g).show()},_resizeProxy:function(){if(this.resizeFrame){var b=this.getEl();Ext.fly(this.getDragEl()).setSize(b.offsetWidth,b.offsetHeight)}},b4MouseDown:function(h){var e=h.getXY(),f=e[0],g=e[1];this.autoOffset(f,g);this.setDragElPos(f,g)},b4StartDrag:function(d,c){this.showFrame(d,c)},b4EndDrag:function(b){Ext.fly(this.getDragEl()).hide()},endDrag:function(f){var d=this.getEl(),e=this.getDragEl();e.style.visibility="";this.beforeMove();d.style.visibility="hidden";Ext.dd.DDM.moveToEl(d,e);e.style.visibility="hidden";d.style.visibility="";this.afterDrag()},beforeMove:function(){},afterDrag:function(){},toString:function(){return("DDProxy "+this.id)}},3,0,0,0,0,0,[Ext.dd,"DDProxy"],0));(Ext.cmd.derive("Ext.dd.StatusProxy",Ext.Component,{animRepair:false,childEls:["ghost"],renderTpl:[''],repairCls:Ext.baseCSSPrefix+"dd-drag-repair",ariaRole:"presentation",constructor:function(d){var c=this;d=d||{};Ext.apply(c,{hideMode:"visibility",hidden:true,floating:true,id:c.id||Ext.id(),cls:Ext.baseCSSPrefix+"dd-drag-proxy "+this.dropNotAllowed,shadow:d.shadow||false,renderTo:Ext.getDetachedBody()});Ext.Component.prototype.constructor.apply(this,arguments);this.dropStatus=this.dropNotAllowed},dropAllowed:Ext.baseCSSPrefix+"dd-drop-ok",dropNotAllowed:Ext.baseCSSPrefix+"dd-drop-nodrop",setStatus:function(b){b=b||this.dropNotAllowed;if(this.dropStatus!=b){this.el.replaceCls(this.dropStatus,b);this.dropStatus=b}},reset:function(d){var f=this,e=Ext.baseCSSPrefix+"dd-drag-proxy ";f.el.replaceCls(e+f.dropAllowed,e+f.dropNotAllowed);f.dropStatus=f.dropNotAllowed;if(d){f.ghost.setHtml("")}},update:function(d){if(typeof d=="string"){this.ghost.setHtml(d)}else{this.ghost.setHtml("");d.style.margin="0";this.ghost.dom.appendChild(d)}var c=this.ghost.dom.firstChild;if(c){Ext.fly(c).setStyle("float","none")}},getGhost:function(){return this.ghost},hide:function(b){Ext.Component.prototype.hide.call(this);if(b){this.reset(true)}},stop:function(){if(this.anim&&this.anim.isAnimated&&this.anim.isAnimated()){this.anim.stop()}},sync:function(){this.el.sync()},repair:function(h,g,f){var e=this;e.callback=g;e.scope=f;if(h&&e.animRepair!==false){e.el.addCls(e.repairCls);e.el.hideUnders(true);e.anim=e.el.animate({duration:e.repairDuration||500,easing:"ease-out",to:{x:h[0],y:h[1]},stopAnimation:true,callback:e.afterRepair,scope:e})}else{e.afterRepair()}},afterRepair:function(){var b=this;b.hide(true);b.el.removeCls(b.repairCls);if(typeof b.callback=="function"){b.callback.call(b.scope||b)}delete b.callback;delete b.scope}},1,0,["box","component"],{box:true,component:true},0,0,[Ext.dd,"StatusProxy"],0));(Ext.cmd.derive("Ext.dd.DragSource",Ext.dd.DDProxy,{dropAllowed:Ext.baseCSSPrefix+"dd-drop-ok",dropNotAllowed:Ext.baseCSSPrefix+"dd-drop-nodrop",animRepair:true,repairHighlightColor:"c3daf9",constructor:function(c,d){this.el=Ext.get(c);if(!this.dragData){this.dragData={}}Ext.apply(this,d);if(!this.proxy){this.proxy=new Ext.dd.StatusProxy({id:this.el.id+"-drag-status-proxy",animRepair:this.animRepair})}Ext.dd.DDProxy.prototype.constructor.call(this,this.el.dom,this.ddGroup||this.group,{dragElId:this.proxy.id,resizeFrame:false,isTarget:false,scroll:this.scroll===true});this.dragging=false},getDragData:function(b){return this.dragData},onDragEnter:function(h,g){var e=Ext.dd.DragDropManager.getDDById(g),f;this.cachedTarget=e;if(this.beforeDragEnter(e,h,g)!==false){if(e.isNotifyTarget){f=e.notifyEnter(this,h,this.dragData);this.proxy.setStatus(f)}else{this.proxy.setStatus(this.dropAllowed)}if(this.afterDragEnter){this.afterDragEnter(e,h,g)}}},beforeDragEnter:function(d,e,f){return true},onDragOver:function(h,g){var e=this.cachedTarget||Ext.dd.DragDropManager.getDDById(g),f;if(this.beforeDragOver(e,h,g)!==false){if(e.isNotifyTarget){f=e.notifyOver(this,h,this.dragData);this.proxy.setStatus(f)}if(this.afterDragOver){this.afterDragOver(e,h,g)}}},beforeDragOver:function(d,e,f){return true},onDragOut:function(d,f){var e=this.cachedTarget||Ext.dd.DragDropManager.getDDById(f);if(this.beforeDragOut(e,d,f)!==false){if(e.isNotifyTarget){e.notifyOut(this,d,this.dragData)}this.proxy.reset();if(this.afterDragOut){this.afterDragOut(e,d,f)}}this.cachedTarget=null},beforeDragOut:function(d,e,f){return true},onDragDrop:function(d,f){var e=this.cachedTarget||Ext.dd.DragDropManager.getDDById(f);if(this.beforeDragDrop(e,d,f)!==false){if(e.isNotifyTarget){if(e.notifyDrop(this,d,this.dragData)!==false){this.onValidDrop(e,d,f)}else{this.onInvalidDrop(e,d,f)}}else{this.onValidDrop(e,d,f)}if(this.afterDragDrop){this.afterDragDrop(e,d,f)}}delete this.cachedTarget},beforeDragDrop:function(d,e,f){return true},onValidDrop:function(d,e,f){this.hideProxy();if(this.afterValidDrop){this.afterValidDrop(d,e,f)}},getRepairXY:function(c,d){return this.el.getXY()},onInvalidDrop:function(h,e,g){var f=this;if(!e){e=h;h=null;g=e.getTarget().id}if(f.beforeInvalidDrop(h,e,g)!==false){if(f.cachedTarget){if(f.cachedTarget.isNotifyTarget){f.cachedTarget.notifyOut(f,e,f.dragData)}f.cacheTarget=null}f.proxy.repair(f.getRepairXY(e,f.dragData),f.afterRepair,f);if(f.afterInvalidDrop){f.afterInvalidDrop(e,g)}}},afterRepair:function(){var b=this;if(Ext.enableFx){b.el.highlight(b.repairHighlightColor)}b.dragging=false},beforeInvalidDrop:function(d,e,f){return true},handleMouseDown:function(c){if(this.dragging){return}var d=this.getDragData(c);if(d&&this.onBeforeDrag(d,c)!==false){this.dragData=d;this.proxy.stop();Ext.dd.DDProxy.prototype.handleMouseDown.apply(this,arguments)}},onBeforeDrag:function(d,c){return true},onStartDrag:Ext.emptyFn,alignElWithMouse:function(){this.proxy.ensureAttachedToBody(true);return Ext.dd.DDProxy.prototype.alignElWithMouse.apply(this,arguments)},startDrag:function(d,c){this.proxy.reset();this.proxy.hidden=false;this.dragging=true;this.proxy.update("");this.onInitDrag(d,c);this.proxy.show()},onInitDrag:function(e,f){var d=this.el.dom.cloneNode(true);d.id=Ext.id();this.proxy.update(d);this.onStartDrag(e,f);return true},getProxy:function(){return this.proxy},hideProxy:function(){this.proxy.hide();this.proxy.reset(true);this.dragging=false},triggerCacheRefresh:function(){Ext.dd.DDM.refreshCache(this.groups)},b4EndDrag:function(b){},endDrag:function(b){this.onEndDrag(this.dragData,b)},onEndDrag:function(d,c){},autoOffset:function(d,c){this.setDelta(-12,-20)},destroy:function(){Ext.dd.DDProxy.prototype.destroy.call(this);Ext.destroy(this.proxy)}},1,0,0,0,0,0,[Ext.dd,"DragSource"],0));(Ext.cmd.derive("Ext.panel.Proxy",Ext.Base,{alternateClassName:"Ext.dd.PanelProxy",moveOnDrag:true,constructor:function(e,d){var f=this;f.panel=e;f.id=f.panel.id+"-ddproxy";Ext.apply(f,d)},insertProxy:true,setStatus:Ext.emptyFn,reset:Ext.emptyFn,update:Ext.emptyFn,stop:Ext.emptyFn,sync:Ext.emptyFn,getEl:function(){return this.ghost.el},getGhost:function(){return this.ghost},getProxy:function(){return this.proxy},hide:function(){var b=this;if(b.ghost){if(b.proxy){b.proxy.destroy();delete b.proxy}b.panel.unghost(null,b.moveOnDrag);delete b.ghost}},show:function(){var c=this,d;if(!c.ghost){d=c.panel.getSize();c.panel.el.setVisibilityMode(Ext.Element.DISPLAY);c.ghost=c.panel.ghost();if(c.insertProxy){c.proxy=c.panel.el.insertSibling({role:"presentation",cls:Ext.baseCSSPrefix+"panel-dd-spacer"});c.proxy.setSize(d)}}},repair:function(d,f,e){this.hide();Ext.callback(f,e||this)},moveProxy:function(d,c){if(this.proxy){d.insertBefore(this.proxy.dom,c)}}},1,0,0,0,0,0,[Ext.panel,"Proxy",Ext.dd,"PanelProxy"],0));(Ext.cmd.derive("Ext.panel.DD",Ext.dd.DragSource,{constructor:function(d,e){var f=this;f.panel=d;f.dragData={panel:d};f.panelProxy=new Ext.panel.Proxy(d,e);f.proxy=f.panelProxy.proxy;Ext.dd.DragSource.prototype.constructor.call(this,d.el,e);f.setupEl(d)},setupEl:function(f){var h=this,g=f.header,e=f.body;if(g){h.setHandleElId(g.id);e=g.el}if(e){e.setStyle("cursor","move");h.scroll=false}else{f.on("boxready",h.setupEl,h,{single:true})}},showFrame:Ext.emptyFn,startDrag:Ext.emptyFn,b4StartDrag:function(d,c){this.panelProxy.show()},b4MouseDown:function(h){var e=h.getXY(),f=e[0],g=e[1];this.autoOffset(f,g)},onInitDrag:function(d,c){this.onStartDrag(d,c);return true},createFrame:Ext.emptyFn,getDragEl:function(c){var d=this.panelProxy.ghost;if(d){return d.el.dom}},endDrag:function(b){this.panelProxy.hide();this.panel.saveState()},autoOffset:function(d,c){d-=this.startPageX;c-=this.startPageY;this.setDelta(d,c)},onInvalidDrop:function(h,e,g){var f=this;if(f.beforeInvalidDrop(h,e,g)!==false){if(f.cachedTarget){if(f.cachedTarget.isNotifyTarget){f.cachedTarget.notifyOut(f,e,f.dragData)}f.cacheTarget=null}if(f.afterInvalidDrop){f.afterInvalidDrop(e,g)}}}},1,0,0,0,0,0,[Ext.panel,"DD"],0));(Ext.cmd.derive("Ext.layout.component.Dock",Ext.layout.component.Component,{alternateClassName:"Ext.layout.component.AbstractDock",type:"dock",horzAxisProps:{name:"horz",oppositeName:"vert",dockBegin:"left",dockEnd:"right",horizontal:true,marginBegin:"margin-left",maxSize:"maxWidth",minSize:"minWidth",pos:"x",setSize:"setWidth",shrinkWrapDock:"shrinkWrapDockWidth",size:"width",sizeModel:"widthModel"},vertAxisProps:{name:"vert",oppositeName:"horz",dockBegin:"top",dockEnd:"bottom",horizontal:false,marginBegin:"margin-top",maxSize:"maxHeight",minSize:"minHeight",pos:"y",setSize:"setHeight",shrinkWrapDock:"shrinkWrapDockHeight",size:"height",sizeModel:"heightModel"},initializedBorders:-1,horizontalCollapsePolicy:{width:true,x:true},verticalCollapsePolicy:{height:true,y:true},finishRender:function(){var d=this,f,e;Ext.layout.component.Component.prototype.finishRender.call(this);f=d.getRenderTarget();e=d.getDockedItems();d.finishRenderItems(f,e)},isItemBoxParent:function(b){return true},isItemShrinkWrap:function(b){return true},noBorderClasses:[Ext.baseCSSPrefix+"docked-noborder-top",Ext.baseCSSPrefix+"docked-noborder-right",Ext.baseCSSPrefix+"docked-noborder-bottom",Ext.baseCSSPrefix+"docked-noborder-left"],noBorderClassesSides:{top:Ext.baseCSSPrefix+"docked-noborder-top",right:Ext.baseCSSPrefix+"docked-noborder-right",bottom:Ext.baseCSSPrefix+"docked-noborder-bottom",left:Ext.baseCSSPrefix+"docked-noborder-left"},borderWidthProps:{top:"border-top-width",right:"border-right-width",bottom:"border-bottom-width",left:"border-left-width"},_itemCls:Ext.baseCSSPrefix+"docked",handleItemBorders:function(){var u=this,E=u.owner,v,q,y=u.lastDockedItems,z=u.borders,D=E.dockedItems.generation,C=u.noBorderClassesSides,t=u.borderWidthProps,A,w,r,s,x,B=u.collapsed;if(u.initializedBorders==D||(E.border&&!E.manageBodyBorders)){return}u.initializedBorders=D;u.collapsed=false;u.lastDockedItems=q=u.getLayoutItems();u.collapsed=B;v={top:[],right:[],bottom:[],left:[]};for(A=0,w=q.length;AH){E=u.constrainedMax;y=H}else{if(CH){F=u.constrainedMax;z=H}else{if(C {bodyCls}',' {baseCls}-body-{ui}',' {parent.baseCls}-body-{parent.ui}-{.}','{childElCls}"',' role="{bodyRole}" role="presentation"',' style="{bodyStyle}">',"{%this.renderContainer(out,values);%}","","{% this.renderDockedItems(out,values,1); %}"],headerPosition:"top",iconAlign:"left",titleAlign:"left",titleRotation:"default",beforeRenderConfig:{glyph:null,headerPosition:null,icon:null,iconAlign:null,iconCls:null,title:null,titleAlign:null,titleRotation:null},animCollapse:Ext.enableFx,border:true,closable:false,closeAction:"destroy",collapsed:false,collapsedCls:"collapsed",collapseFirst:true,collapsible:undefined,constrain:false,constrainHeader:false,dockedItems:null,tbar:null,bbar:null,fbar:null,lbar:null,rbar:null,buttons:null,floatable:true,frame:false,frameHeader:true,hideCollapseTool:false,manageHeight:true,maskElement:"el",minButtonWidth:75,preventHeader:false,shrinkWrapDock:false,titleCollapse:undefined,baseCls:Ext.baseCSSPrefix+"panel",bodyPosProps:{x:"x",y:"y"},componentLayout:"dock",contentPaddingProperty:"bodyPadding",emptyArray:[],isPanel:true,defaultBindProperty:"title",addBodyCls:function(d){var f=this,e=f.rendered?f.body:f.getProtoBody();e.addCls(d);return f},addTool:function(m){if(!Ext.isArray(m)){m=[m]}var n=this,k=n.header,j=m.length,l=n.tools,o,h;if(!k||!k.isHeader){k=null;if(!l){n.tools=l=[]}}for(o=0;oA){if(s.anchorToTarget){s.defaultAlign="r-l";if(s.mouseOffset){s.mouseOffset[0]*=-1}}s.anchor="right";return s.getTargetXY()}if(z[1]t){if(s.anchorToTarget){s.defaultAlign="b-t";if(s.mouseOffset){s.mouseOffset[1]*=-1}}s.anchor="bottom";return s.getTargetXY()}}s.anchorCls=Ext.baseCSSPrefix+"tip-anchor-"+s.getAnchorPosition();s.anchorEl.addCls(s.anchorCls);s.targetCounter=0;return z}else{x=s.getMouseOffset();return(s.targetXY)?[s.targetXY[0]+x[0],s.targetXY[1]+x[1]]:x}},getMouseOffset:function(){var d=this,c=d.anchor?[0,0]:[15,18];if(d.mouseOffset){c[0]+=d.mouseOffset[0];c[1]+=d.mouseOffset[1]}return c},fadeOut:function(){var b=this;b.el.fadeOut({duration:b.fadeOutDuration,callback:function(){b.hide();b.el.setOpacity("")}})},getAnchorPosition:function(){var c=this,d;if(c.anchor){c.tipAnchor=c.anchor.charAt(0)}else{d=c.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/);c.tipAnchor=d[1].charAt(0)}switch(c.tipAnchor){case"t":return"top";case"b":return"bottom";case"r":return"right"}return"left"},getAnchorAlign:function(){switch(this.anchor){case"top":return"tl-bl";case"left":return"tl-tr";case"right":return"tr-tl";default:return"bl-tl"}},getOffsets:function(){var h=this,g,e,f=h.getAnchorPosition().charAt(0);if(h.anchorToTarget&&!h.trackMouse){switch(f){case"t":e=[0,9];break;case"b":e=[0,-13];break;case"r":e=[-13,0];break;default:e=[9,0];break}}else{switch(f){case"t":e=[-15-h.anchorOffset,30];break;case"b":e=[-19-h.anchorOffset,-13-h.el.dom.offsetHeight];break;case"r":e=[-15-h.el.dom.offsetWidth,-13-h.anchorOffset];break;default:e=[25,-13-h.anchorOffset];break}}g=h.getMouseOffset();e[0]+=g[0];e[1]+=g[1];return e},onTargetOver:function(g){var h=this,e=h.delegate,f;if(h.disabled||g.within(h.target.dom,true)){return}f=e?g.getTarget(e):true;if(f){h.triggerElement=f;h.triggerEvent=g;h.clearTimer("hide");h.targetXY=g.getXY();h.delayShow()}},delayShow:function(f){var e=this,d=e.el&&(f===false||!e.trackMouse)&&e.getTargetXY();if(e.hidden&&!e.showTimer){if(Ext.Date.getElapsed(e.lastActive)',' for="{inputId}" {labelAttrTpl}>','',"{beforeLabelTextTpl}",'{fieldLabel}','{labelSeparator}',"","{afterLabelTextTpl}","","","{afterLabelTpl}",'
',' {fieldBodyCls} {fieldBodyCls}-{ui} {growCls} {extraFieldBodyCls}"',' style="{bodyStyle}">',"{beforeBodyEl}","{beforeSubTpl}","{[values.$comp.getSubTplMarkup(values)]}","{afterSubTpl}","{afterBodyEl}","
",'','
','","
","
",{disableFormats:true}],activeErrorsTpl:undefined,htmlActiveErrorsTpl:['','
    ','','
    {fieldLabel}
    ',"
    ",'
  • {.}
  • ',"
","
"],plaintextActiveErrorsTpl:['','','{fieldLabel}\n',"",'\n{.}',""],isFieldLabelable:true,formItemCls:Ext.baseCSSPrefix+"form-item",labelCls:Ext.baseCSSPrefix+"form-item-label",topLabelCls:Ext.baseCSSPrefix+"form-item-label-top",rightLabelCls:Ext.baseCSSPrefix+"form-item-label-right",labelInnerCls:Ext.baseCSSPrefix+"form-item-label-inner",topLabelSideErrorCls:Ext.baseCSSPrefix+"form-item-label-top-side-error",errorMsgCls:Ext.baseCSSPrefix+"form-error-msg",errorWrapCls:Ext.baseCSSPrefix+"form-error-wrap",errorWrapSideCls:Ext.baseCSSPrefix+"form-error-wrap-side",errorWrapUnderCls:Ext.baseCSSPrefix+"form-error-wrap-under",errorWrapUnderSideLabelCls:Ext.baseCSSPrefix+"form-error-wrap-under-side-label",baseBodyCls:Ext.baseCSSPrefix+"form-item-body",invalidIconCls:Ext.baseCSSPrefix+"form-invalid-icon",invalidUnderCls:Ext.baseCSSPrefix+"form-invalid-under",fieldBodyCls:"",invalidCls:Ext.baseCSSPrefix+"form-invalid",fieldLabel:undefined,labelAlign:"left",labelWidth:100,labelPad:5,labelSeparator:":",hideLabel:false,hideEmptyLabel:true,preventMark:false,autoFitErrors:true,msgTarget:"qtip",msgTargets:{qtip:1,title:1,under:1,side:1,none:1},noWrap:true,labelableInsertions:["beforeBodyEl","afterBodyEl","beforeLabelTpl","afterLabelTpl","beforeSubTpl","afterSubTpl","beforeLabelTextTpl","afterLabelTextTpl","labelAttrTpl"],statics:{initTip:function(){var d=this.tip,e,f;if(d){return}e={id:"ext-form-error-tip",ui:"form-invalid"};if(Ext.supports.Touch){e.dismissDelay=0;e.anchor="top";e.showDelay=0;e.listeners={beforeshow:function(){this.minWidth=Ext.fly(this.anchorTarget).getWidth()}}}d=this.tip=Ext.create("Ext.tip.QuickTip",e);f=Ext.apply({},d.tagConfig);f.attribute="errorqtip";d.setTagConfig(f)},destroyTip:function(){this.tip=Ext.destroy(this.tip)}},initLabelable:function(){var d=this,c=d.padding;if(c){d.padding=undefined;d.extraMargins=Ext.Element.parseBox(c)}if(!d.activeErrorsTpl){if(d.msgTarget=="title"){d.activeErrorsTpl=d.plaintextActiveErrorsTpl}else{d.activeErrorsTpl=d.htmlActiveErrorsTpl}}d.addCls([d.formItemCls,d.formItemCls+"-"+d.ui]);d.lastActiveError="";d.enableBubble("errorchange")},trimLabelSeparator:function(){var h=this,g=h.labelSeparator,f=h.fieldLabel||"",e=f.substr(f.length-1);return e===g?f.slice(0,-1):f},getFieldLabel:function(){return this.trimLabelSeparator()},setFieldLabel:function(o){o=o||"";var n=this,m=n.labelSeparator,h=n.labelEl,j=n.errorWrapEl,k=(n.labelAlign!=="top"),l=n.errorWrapUnderSideLabelCls;n.fieldLabel=o;if(n.rendered){if(Ext.isEmpty(o)&&n.hideEmptyLabel){h.setDisplayed("none");if(k&&j){j.removeCls(l)}}else{if(m){o=n.trimLabelSeparator()+m}h.first().setHtml(o);h.setDisplayed("");if(k&&j){j.addCls(l)}}n.updateLayout()}},getInsertionRenderData:function(j,h){var f=h.length,g,k;while(f--){g=h[f];k=this[g];if(k){if(typeof k!="string"){if(!k.isTemplate){k=Ext.XTemplate.getTpl(this,g)}k=k.apply(j)}}j[g]=k||""}return j},getLabelableRenderData:function(){var w=this,t=w.labelAlign,G=(t==="top"),z=(t==="right"),C=(w.msgTarget==="side"),F=(w.msgTarget==="under"),u=w.errorMsgCls,E=w.labelPad,x=w.labelWidth,J=w.labelClsExtra||"",D=C?w.errorWrapSideCls:w.errorWrapUnderCls,K="",A="",H=w.hasVisibleLabel(),y=w.autoFitErrors,B=w.defaultBodyWidth,I,v;if(G){J+=" "+w.topLabelCls;if(E){A="padding-bottom:"+E+"px;"}if(C&&!y){J+=" "+w.topLabelSideErrorCls}}else{if(z){J+=" "+w.rightLabelCls}if(E){K+=w.getHorizontalPaddingStyle()+E+"px;"}K+="width:"+(x+(E?E:0))+"px;";A="width:"+x+"px"}if(H){if(!G&&F){D+=" "+w.errorWrapUnderSideLabelCls}}else{K+="display:none;"}if(B){I="min-width:"+B+"px;max-width:"+B+"px;"}v={id:w.id,inputId:w.getInputId(),labelCls:w.labelCls,labelClsExtra:J,labelStyle:K+(w.labelStyle||""),labelInnerStyle:A,labelInnerCls:w.labelInnerCls,unselectableCls:Ext.Element.unselectableCls,bodyStyle:I,baseBodyCls:w.baseBodyCls,fieldBodyCls:w.fieldBodyCls,extraFieldBodyCls:w.extraFieldBodyCls,errorWrapCls:w.errorWrapCls,errorWrapExtraCls:D,renderError:C||F,invalidMsgCls:C?w.invalidIconCls:F?w.invalidUnderCls:"",errorMsgCls:u,growCls:w.grow?w.growCls:"",errorWrapStyle:(C&&!y)?"visibility:hidden":"display:none",fieldLabel:w.getFieldLabel(),labelSeparator:w.labelSeparator};w.getInsertionRenderData(v,w.labelableInsertions);return v},getHorizontalPaddingStyle:function(){return"padding-right:"},beforeLabelRender:function(){var b=this;b.setFieldDefaults(b.getInherited().fieldDefaults);if(b.ownerLayout){b.addCls(Ext.baseCSSPrefix+b.ownerLayout.type+"-form-item")}},onLabelRender:function(){var l=this,m={},j=Ext.Element,h=l.errorWrapEl,k,g;if(h){h.setVisibilityMode((l.msgTarget==="side"&&!l.autoFitErrors)?j.VISIBILITY:j.DISPLAY)}if(l.extraMargins){k=l.el.getMargin();for(g in k){if(k.hasOwnProperty(g)){m["margin-"+g]=(k[g]+l.extraMargins[g])+"px"}}l.el.setStyle(m)}},hasVisibleLabel:function(){if(this.hideLabel){return false}return !(this.hideEmptyLabel&&!this.getFieldLabel())},getSubTplMarkup:function(){return""},getInputId:function(){return""},getActiveError:function(){return this.activeError||""},hasActiveError:function(){return !!this.getActiveError()},setActiveError:function(b){this.setActiveErrors(b)},getActiveErrors:function(){return this.activeErrors||[]},setActiveErrors:function(m){var o=this,n=o.errorWrapEl,q=o.msgTarget,r=q==="side",k=q==="qtip",s,p,l;m=Ext.Array.from(m);p=o.getTpl("activeErrorsTpl");o.activeErrors=m;s=o.activeError=p.apply({fieldLabel:o.fieldLabel,errors:m,listCls:Ext.plainListCls});o.renderActiveError();if(o.rendered){if(r){o.errorEl.dom.setAttribute("data-errorqtip",s)}else{if(k){o.getActionEl().dom.setAttribute("data-errorqtip",s)}else{if(q==="title"){o.getActionEl().dom.setAttribute("title",s)}}}if(r||k){Ext.form.Labelable.initTip()}if(!o.msgTargets[q]){l=Ext.get(q);if(l){l.dom.innerHTML=s}}}if(n){n.setVisible(m.length>0);if(r&&o.autoFitErrors){o.labelEl.addCls(o.topLabelSideErrorCls)}o.updateLayout()}},unsetActiveError:function(){var h=this,f=h.errorWrapEl,e=h.msgTarget,g;delete h.activeError;delete h.activeErrors;h.renderActiveError();if(h.rendered){if(e==="qtip"){h.getActionEl().dom.removeAttribute("data-errorqtip")}else{if(e==="title"){h.getActionEl().dom.removeAttribute("title")}}if(!h.msgTargets[e]){g=Ext.get(e);if(g){g.dom.innerHTML=""}}if(f){f.hide();if(e==="side"&&h.autoFitErrors){h.labelEl.removeCls(h.topLabelSideErrorCls)}h.updateLayout()}}},renderActiveError:function(){var f=this,d=f.getActiveError(),e=!!d;if(d!==f.lastActiveError){f.lastActiveError=d;f.fireEvent("errorchange",f,d)}if(f.rendered&&!f.isDestroyed&&!f.preventMark){f.toggleInvalidCls(e);if(f.errorEl){f.errorEl.dom.innerHTML=d}}},toggleInvalidCls:function(b){this.el[b?"addCls":"removeCls"](this.invalidCls)},setFieldDefaults:function(c){var d;for(d in c){if(!this.hasOwnProperty(d)){this[d]=c[d]}}}},0,0,0,0,0,0,[Ext.form,"Labelable"],function(){if(Ext.supports.Touch){this.prototype.msgTarget="side"}}));(Ext.cmd.derive("Ext.form.field.Field",Ext.Base,{mixinId:"field",isFormField:true,config:{validation:null,validationField:null},disabled:false,submitValue:true,validateOnChange:true,valuePublishEvent:"change",suspendCheckChange:0,dirty:false,initField:function(){var g=this,h=g.valuePublishEvent,f,e;g.initValue();if(Ext.isString(h)){g.on(h,g.publishValue,g)}else{for(e=0,f=h.length;e name="{name}"',' value="{[Ext.util.Format.htmlEncode(values.value)]}"',' placeholder="{placeholder}"','{%if (values.maxLength !== undefined){%} maxlength="{maxLength}"{%}%}',' readonly="readonly"',' disabled="disabled"',' tabindex="{tabIdx}"',' style="{fieldStyle}"',' class="{fieldCls} {typeCls} {typeCls}-{ui} {editableCls} {inputCls}" autocomplete="off"/>',{disableFormats:true}],defaultBindProperty:"value",subTplInsertions:["inputAttrTpl"],childEls:["inputEl"],inputType:"text",isTextInput:true,invalidText:"The value in this field is invalid",fieldCls:Ext.baseCSSPrefix+"form-field",focusCls:"form-focus",dirtyCls:Ext.baseCSSPrefix+"form-dirty",checkChangeEvents:Ext.isIE&&(!document.documentMode||document.documentMode<=9)?["change","propertychange","keyup"]:["change","input","textInput","keyup","dragdrop"],ignoreChangeRe:/data\-errorqtip|style\.|className/,checkChangeBuffer:50,liquidLayout:true,readOnly:false,readOnlyCls:Ext.baseCSSPrefix+"form-readonly",validateOnBlur:true,hasFocus:false,baseCls:Ext.baseCSSPrefix+"field",fieldBodyCls:Ext.baseCSSPrefix+"field-body",maskOnDisable:false,stretchInputElFixed:true,initComponent:function(){var b=this;Ext.Component.prototype.initComponent.call(this);b.subTplData=b.subTplData||{};b.initLabelable();b.initField();if(!b.name){b.name=b.getInputId()}if(b.readOnly){b.addCls(b.readOnlyCls)}b.addCls(Ext.baseCSSPrefix+"form-type-"+b.inputType)},getInputId:function(){return this.inputId||(this.inputId=this.id+"-inputEl")},getSubTplData:function(f){var j=this,k=j.inputType,g=j.getInputId(),h;h=Ext.apply({ui:j.ui,id:g,cmpId:j.id,name:j.name||g,disabled:j.disabled,readOnly:j.readOnly,value:j.getRawValue(),type:k,fieldCls:j.fieldCls,fieldStyle:j.getFieldStyle(),childElCls:f.childElCls,tabIdx:j.tabIndex,inputCls:j.inputCls,typeCls:Ext.baseCSSPrefix+"form-"+(j.isTextInput?"text":k),role:j.ariaRole},j.subTplData);j.getInsertionRenderData(h,j.subTplInsertions);return h},getSubTplMarkup:function(g){var m=this,l=m.getSubTplData(g),k=m.getTpl("preSubTpl"),j=m.getTpl("postSubTpl"),h="";if(k){h+=k.apply(l)}h+=m.getTpl("fieldSubTpl").apply(l);if(j){h+=j.apply(l)}return h},initRenderData:function(){return Ext.applyIf(Ext.Component.prototype.initRenderData.call(this),this.getLabelableRenderData())},setFieldStyle:function(e){var d=this,f=d.inputEl;if(f){f.applyStyles(e)}d.fieldStyle=e},getFieldStyle:function(){var b=this.fieldStyle;return Ext.isObject(b)?Ext.DomHelper.generateStyles(b,null,true):b||""},onRender:function(){Ext.Component.prototype.onRender.apply(this,arguments);this.mixins.labelable.self.initTip();this.renderActiveError()},isFileUpload:function(){return this.inputType==="file"},getSubmitData:function(){var e=this,d=null,f;if(!e.disabled&&e.submitValue){f=e.getSubmitValue();if(f!==null){d={};d[e.getName()]=f}}return d},getSubmitValue:function(){return this.processRawValue(this.getRawValue())},getRawValue:function(){var c=this,d=(c.inputEl?c.inputEl.getValue():Ext.valueFrom(c.rawValue,""));c.rawValue=d;return d},setRawValue:function(f){var e=this,d=e.rawValue;if(!e.transformRawValue.$nullFn){f=e.transformRawValue(f)}f=Ext.valueFrom(f,"");if(d===undefined||d!==f){e.rawValue=f;if(e.inputEl){e.bindPropertyChange(false);e.inputEl.dom.value=f;e.bindPropertyChange(true)}if(e.rendered&&e.reference){e.publishState("rawValue",f)}}return f},transformRawValue:Ext.identityFn,valueToRaw:function(b){return""+Ext.valueFrom(b,"")},rawToValue:Ext.identityFn,processRawValue:Ext.identityFn,getValue:function(){var d=this,c=d.rawToValue(d.processRawValue(d.getRawValue()));d.value=c;return c},setValue:function(c){var d=this;d.setRawValue(d.valueToRaw(c));return d.mixins.field.setValue.call(d,c)},onBoxReady:function(){var b=this;Ext.Component.prototype.onBoxReady.call(this);if(b.setReadOnlyOnBoxReady){b.setReadOnly(b.readOnly)}},onDisable:function(){var d=this,c=d.inputEl;Ext.Component.prototype.onDisable.call(this);if(c){c.dom.disabled=true;if(d.hasActiveError()){d.clearInvalid();d.needsValidateOnEnable=true}}},onEnable:function(){var d=this,c=d.inputEl;Ext.Component.prototype.onEnable.call(this);if(c){c.dom.disabled=false;if(d.needsValidateOnEnable){delete d.needsValidateOnEnable;d.forceValidation=true;d.isValid();delete d.forceValidation}}},setReadOnly:function(f){var e=this,d=e.inputEl;f=!!f;e[f?"addCls":"removeCls"](e.readOnlyCls);e.readOnly=f;if(d){d.dom.readOnly=f}else{if(e.rendering){e.setReadOnlyOnBoxReady=true}}e.fireEvent("writeablechange",e,f)},fireKey:function(b){if(b.isSpecialKey()){this.fireEvent("specialkey",this,b)}},initEvents:function(){var n=this,m=n.inputEl,q,o,l=n.checkChangeEvents,e=n.ignoreChangeRe,r=l.length,p,s;if(m){n.mon(m,Ext.supports.SpecialKeyDownRepeat?"keydown":"keypress",n.fireKey,n);q=new Ext.util.DelayedTask(n.checkChange,n);n.onChangeEvent=o=function(a){if(!(a.type=="propertychange"&&e.test(a.browserEvent.propertyName))){q.delay(n.checkChangeBuffer)}};for(p=0;p style="{fieldStyle}"',' class="{fieldCls} {fieldCls}-{ui}">{value}',{compiled:true,disableFormats:true}],focusable:false,readOnly:true,fieldCls:Ext.baseCSSPrefix+"form-display-field",fieldBodyCls:Ext.baseCSSPrefix+"form-display-field-body",htmlEncode:false,noWrap:false,validateOnChange:false,initEvents:Ext.emptyFn,submitValue:false,valueToRaw:function(b){if(!b&&b!==0){return""}else{return b}},isDirty:function(){return false},isValid:Ext.returnTrue,validate:Ext.returnTrue,getRawValue:function(){return this.rawValue},setRawValue:function(c){var d=this;c=Ext.valueFrom(c,"");d.rawValue=c;if(d.rendered){d.inputEl.dom.innerHTML=d.getDisplayValue();d.updateLayout()}return c},getDisplayValue:function(){var e=this,d=this.getRawValue(),f;if(e.renderer){f=e.renderer.call(e.scope||e,d,e)}else{f=e.htmlEncode?Ext.util.Format.htmlEncode(d):d}return f},getSubTplData:function(c){var d=Ext.form.field.Base.prototype.getSubTplData.apply(this,arguments);d.value=this.getDisplayValue();return d}},0,["displayfield"],["box","component","displayfield","field"],{box:true,component:true,displayfield:true,field:true},["widget.displayfield"],0,[Ext.form.field,"Display",Ext.form,"DisplayField",Ext.form,"Display"],0));(Ext.cmd.derive("Ext.layout.container.Fit",Ext.layout.container.Container,{alternateClassName:"Ext.layout.FitLayout",itemCls:Ext.baseCSSPrefix+"fit-item",targetCls:Ext.baseCSSPrefix+"layout-fit",type:"fit",manageMargins:true,sizePolicies:{0:{readsWidth:1,readsHeight:1,setsWidth:0,setsHeight:0},1:{readsWidth:0,readsHeight:1,setsWidth:1,setsHeight:0},2:{readsWidth:1,readsHeight:0,setsWidth:0,setsHeight:1},3:{readsWidth:0,readsHeight:0,setsWidth:1,setsHeight:1}},getItemSizePolicy:function(e,h){var f=h||this.owner.getSizeModel(),g=(f.width.shrinkWrap?0:1)|(f.height.shrinkWrap?0:2);return this.sizePolicies[g]},beginLayoutCycle:function(D,G){var u=this,c=u.lastHeightModel&&u.lastHeightModel.calculated,F=u.lastWidthModel&&u.lastWidthModel.calculated,z=F||c,C=0,B=0,v,J,y,w,H,K,E,A,x,I;Ext.layout.container.Container.prototype.beginLayoutCycle.apply(this,arguments);if(z&&D.targetContext.el.dom.tagName.toUpperCase()!="TD"){z=F=c=false}J=D.childItems;H=J.length;for(y=0;y0){for(z=0;z'+d.view.emptyText+""}d.view.getComponentLayout().headerCt=d.headerCt;d.mon(d.view,{uievent:d.processEvent,scope:d});f.view=d.view;d.headerCt.view=d.view;if(d.hasListeners.viewcreated){d.fireEvent("viewcreated",d,d.view)}}return d.view},getColumnManager:function(){return this.columnManager},getVisibleColumnManager:function(){return this.visibleColumnManager},getTopLevelColumnManager:function(){return this.ownerGrid.getColumnManager()},getTopLevelVisibleColumnManager:function(){return this.ownerGrid.getVisibleColumnManager()},setAutoScroll:Ext.emptyFn,processEvent:function(o,m,l,s,n,p,q,e){var r=p.position.column;if(r){return r.processEvent.apply(r,arguments)}},scrollByDeltaY:function(c,d){this.getView().scrollBy(0,c,d)},scrollByDeltaX:function(c,d){this.getView().scrollBy(c,0,d)},afterCollapse:function(){this.saveScrollPos();Ext.panel.Panel.prototype.afterCollapse.apply(this,arguments)},afterExpand:function(){Ext.panel.Panel.prototype.afterExpand.apply(this,arguments);this.restoreScrollPos()},saveScrollPos:Ext.emptyFn,restoreScrollPos:Ext.emptyFn,onHeaderResize:function(){if(this.view.scrollManager){this.view.scrollManager.refresh()}},onHeaderMove:function(k,j,h,g,l){var m=this;if(m.optimizedColumnMove===false){m.view.refreshView()}else{m.view.moveColumn(g,l,h)}m.delayScroll()},onHeaderHide:function(d,c){if(this.view.refreshCounter){this.view.refreshView()}},onHeaderShow:function(d,c){if(this.view.refreshCounter){this.view.refreshView()}},onHeadersChanged:function(d,f){var e=this;if(e.rendered&&!e.reconfiguring){e.view.refreshView();e.delayScroll()}},delayScroll:function(){var b=this.view;if(b){this.scrollTask.delay(10,null,null,[b])}},onViewReady:function(){this.fireEvent("viewready",this)},onRestoreHorzScroll:function(){var c=this,d=c.scrollXPos;if(d){c.syncHorizontalScroll(c,true)}},getScrollerOwner:function(){var b=this;if(!this.scrollerOwner){b=this.up("[scrollerOwner]")}return b},getLhsMarker:function(){var b=this;return b.lhsMarker||(b.lhsMarker=Ext.DomHelper.append(b.el,{role:"presentation",cls:b.resizeMarkerCls},true))},getRhsMarker:function(){var b=this;return b.rhsMarker||(b.rhsMarker=Ext.DomHelper.append(b.el,{role:"presentation",cls:b.resizeMarkerCls},true))},getSelection:function(){return this.getSelectionModel().getSelection()},updateSelection:function(e){var d=this,f;if(!d.ignoreNextSelection){d.ignoreNextSelection=true;f=d.getSelectionModel();if(e){f.select(e)}else{f.deselectAll()}d.ignoreNextSelection=false}},updateBindSelection:function(f,h){var g=this,e=null;if(!g.ignoreNextSelection){g.ignoreNextSelection=true;if(h.length){e=f.getLastSelected();g.hasHadSelection=true}if(g.hasHadSelection){g.setSelection(e)}g.ignoreNextSelection=false}},getNavigationModel:function(){return this.getView().getNavigationModel()},getSelectionModel:function(){var k=this,g=k.selModel,h,j,f;if(!g){g={};h=true}if(!g.events){f=g.selType||k.selType;h=!g.mode;g=k.selModel=Ext.create("selection."+f,g)}if(k.simpleSelect){j="SIMPLE"}else{if(k.multiSelect){j="MULTI"}}Ext.applyIf(g,{allowDeselect:k.allowDeselect});if(j&&h){g.setSelectionMode(j)}if(!g.hasRelaySetup){k.relayEvents(g,["selectionchange","beforeselect","beforedeselect","select","deselect"]);g.hasRelaySetup=true;if(g.isRowModel){g.on("selectionchange",k.updateBindSelection,k)}}if(k.disableSelection){g.locked=true}return g},getScrollTarget:function(){var d=this.getScrollerOwner(),c=d.query("tableview");return c[1]||c[0]},onHorizontalScroll:function(b){this.syncHorizontalScroll(b)},syncHorizontalScroll:function(h,k){var j=this,g=j.view.getScrollX(),f;k=k===true;if(j.rendered&&(k||g!==j.scrollXPos)){if(k){f=j.getScrollTarget();f.setScrollX(g)}j.headerCt.setScrollX(g);j.scrollXPos=g}},onStoreLoad:Ext.emptyFn,getEditorParent:function(){return this.body},bindStore:function(f,k){var j=this,g=j.getView(),h=j.bufferedRenderer;if(f){j.store=f;if(h&&h.isBufferedRenderer&&h.store){h.bindStore(f)}if(g.store!==f){g.bindStore(f,false)}j.mon(f,{load:j.onStoreLoad,scope:j});j.storeRelayers=j.relayEvents(f,["filterchange","groupchange"])}else{j.unbindStore()}},unbindStore:function(){var f=this,d=f.store,e;if(d){f.store=null;f.mun(d,{load:f.onStoreLoad,scope:f});Ext.destroy(f.storeRelayers);e=f.view;if(e.store){e.bindStore(null)}}},setColumns:function(b){if(b.length||this.getColumnManager().getColumns().length){this.reconfigure(undefined,b)}},setStore:function(b){this.reconfigure(b)},reconfigure:function(h,m){var l=this,j=l.store,k=l.headerCt,g=k?k.items.getRange():l.columns;if(arguments.length===1&&Ext.isArray(h)){m=h;h=null}if(m){m=Ext.Array.slice(m)}l.reconfiguring=true;l.fireEvent("beforereconfigure",l,h,m,j,g);if(l.lockable){l.reconfigureLockable(h,m)}else{Ext.suspendLayouts();if(m){delete l.scrollXPos;k.removeAll();k.add(m)}if(h&&(h=Ext.StoreManager.lookup(h))!==j){l.unbindStore();l.bindStore(h)}else{l.getView().refreshView()}Ext.resumeLayouts(true)}l.fireEvent("reconfigure",l,h,m,j,g);delete l.reconfiguring},beforeDestroy:function(){var b=this.scrollTask;if(b){b.cancel();this.scrollTask=null}Ext.destroy(this.focusEnterLeaveListeners);Ext.panel.Panel.prototype.beforeDestroy.call(this)},onDestroy:function(){var b=this;if(b.lockable){b.destroyLockable()}b.unbindStore();Ext.panel.Panel.prototype.onDestroy.call(this);b.columns=b.storeRelayers=b.columnManager=b.visibleColumnManager=null},destroy:function(){var b=this;Ext.panel.Panel.prototype.destroy.call(this);if(b.isDestroyed){b.view=b.selModel=b.headerCt=null}},privates:{getFocusEl:function(){return this.getView().getFocusEl()}}},1,["tablepanel"],["box","component","container","panel","tablepanel"],{box:true,component:true,container:true,panel:true,tablepanel:true},["widget.tablepanel"],0,[Ext.panel,"Table"],0));Ext.define("ExtThemeNeptune.panel.Table",{override:"Ext.panel.Table",initComponent:function(){var b=this;if(!b.hasOwnProperty("bodyBorder")&&!b.hideHeaders){b.bodyBorder=true}(arguments.callee.$previous||Ext.panel.Panel.prototype.initComponent).call(this)}});(Ext.cmd.derive("Ext.selection.Model",Ext.util.Observable,{alternateClassName:"Ext.AbstractSelectionModel",allowDeselect:undefined,toggleOnClick:true,selected:null,pruneRemoved:true,suspendChange:0,ignoreRightMouseSelection:false,constructor:function(d){var c=this;d=d||{};Ext.apply(c,d);c.modes={SINGLE:true,SIMPLE:true,MULTI:true};c.setSelectionMode(d.mode||c.mode);c.selected=new Ext.util.MixedCollection();Ext.util.Observable.prototype.constructor.apply(this,arguments)},bindStore:function(e,d){var f=this;f.mixins.storeholder.bindStore.apply(f,arguments);if(f.store&&!d){f.refresh()}},getStoreListeners:function(){var b=this;return{add:b.onStoreAdd,clear:b.onStoreClear,remove:b.onStoreRemove,update:b.onStoreUpdate,idchanged:b.onIdChanged,load:b.onStoreLoad,refresh:b.onStoreRefresh}},suspendChanges:function(){++this.suspendChange},resumeChanges:function(){if(this.suspendChange){--this.suspendChange}},selectAll:function(g){var k=this,l=k.store.getRange(),m=0,h=l.length,j=k.getSelection().length;k.suspendChanges();for(;m1){z=[];for(u=0;u=x){t.deselectRange(p,x-1)}else{if(r!==w){t.selectRange(r,w,z)}}}t.lastSelected=w}else{if(q){if(!z){t.doSelect(w,false)}}else{t.selectWithEvent(w,u)}}}}break;case"SIMPLE":if(y){t.doDeselect(w)}else{t.doSelect(w,true)}break;case"SINGLE":if(e){if(y){if(t.allowDeselect){t.doDeselect(w)}}else{t.doSelect(w)}}else{if(z){break}else{if(e&&t.allowDeselect&&y){t.doDeselect(w)}else{t.doSelect(w,false)}}}break}if(!u.shiftKey){if(t.isSelected(w)){t.selectionStart=w}}},selectRange:function(q,x,p){var t=this,r=t.store,y=t.selected.items,o,v,u,w,A,s,z;if(t.isLocked()){return}o=t.normalizeRowRange(q,x);q=o[0];x=o[1];w=[];for(v=q;v<=x;v++){if(!t.isSelected(r.getAt(v))){w.push(r.getAt(v))}}if(!p){A=[];t.suspendChanges();for(v=0,u=y.length;vx){A.push(z)}}for(v=0,u=A.length;v0)}},deselectRange:function(o,p){var l=this,q=l.store,k,m,n,j;if(l.isLocked()){return}k=l.normalizeRowRange(o,p);o=k[0];p=k[1];n=[];for(m=o;m<=p;m++){j=q.getAt(m);if(l.isSelected(j)){n.push(j)}}if(n.length){l.doDeselect(n)}},normalizeRowRange:function(h,e){var f=this.store,g;if(!Ext.isNumber(h)){h=f.indexOf(h)}h=Math.max(0,h);if(!Ext.isNumber(e)){e=f.indexOf(e)}e=Math.min(e,f.getCount()-1);if(h>e){g=e;e=h;h=g}return[h,e]},select:function(d,f,e){if(Ext.isDefined(d)&&!(Ext.isArray(d)&&!d.length)){this.doSelect(d,f,e)}},deselect:function(c,d){this.doDeselect(c,d)},doSelect:function(k,h,f){var j=this,g;if(j.locked||!j.store){return}if(typeof k==="number"){g=j.store.getAt(k);if(!g){return}k=[g]}if(j.selectionMode==="SINGLE"&&k){g=k.length?k[0]:k;j.doSingleSelect(g,f)}else{j.doMultiSelect(k,h,f)}},doMultiSelect:function(A,p,r){var u=this,z=u.selected,s=false,o,x,v,w,y,t=u.view,q;if(u.locked){return}A=!Ext.isArray(A)?[A]:A;v=A.length;if(!p&&z.getCount()>0){o=u.deselectDuringSelect(A,z.getRange(),r);if(o[0]){u.maybeFireSelectionChange(o[1]>0&&!r);return}else{s=o[1]>0}}y=function(){z.add(w);s=true};for(x=0;x0&&!m);return p===l},doSingleSelect:function(q,p){var n=this,j=n.view,k,l=false,o=n.selected,m;if(n.locked){return}if(n.isSelected(q)){return}m=function(){if(o.getCount()){n.suspendChanges();if(!n.doDeselect(n.lastSelected,p)){n.resumeChanges();return false}n.resumeChanges()}o.add(q);n.lastSelected=q;l=true};n.onSelectChange(q,true,p,m);if(l){if(j&&j.rendered&&!p&&!n.preventFocus){k=j.getNavigationModel();if(k){k.setPosition(q,null,null,p,true)}}n.maybeFireSelectionChange(!p)}},maybeFireSelectionChange:function(d){var c=this;if(d&&!c.suspendChange){c.fireEvent("selectionchange",c,c.getSelection())}},getLastSelected:function(){return this.lastSelected},getSelection:function(){return this.selected.getRange()},getSelectionMode:function(){return this.selectionMode},setSelectionMode:function(b){b=b?b.toUpperCase():"SINGLE";this.selectionMode=this.modes[b]?b:"SINGLE"},isLocked:function(){return this.locked},setLocked:function(b){this.locked=!!b},isRangeSelected:function(l,m){var j=this,g=j.store,k,h;h=j.normalizeRowRange(l,m);l=h[0];m=h[1];for(k=l;k<=m;k++){if(!j.isSelected(g.getAt(k))){return false}}return true},isSelected:function(b){b=Ext.isNumber(b)?this.store.getAt(b):b;return this.selected.contains(b)},hasSelection:function(){return this.selected.getCount()>0},pruneIf:function(){var k=this,m=k.selected,h=k.store,n=[],j=m.length,o,l;if(k.pruneRemoved){for(o=0;o0){this.clearSelections();this.maybeFireSelectionChange(true)}},onStoreRemove:function(k,f,j,g){var h=this;if(h.selectionStart&&Ext.Array.contains(f,h.selectionStart)){h.selectionStart=null}if(g||h.locked||!h.pruneRemoved){return}h.deselect(f)},deselectDeletedRecords:function(h){var l=this,n=l.selected,o,m=h.length,k=0,j;for(o=0;othis.view.all.getCount()-1){d=0}this.setPosition(d,c)},onKeyRight:function(c){var d=this.recordIndex+1;if(d>this.view.all.getCount()-1){d=0}this.setPosition(d,c)},onKeyLeft:function(c){var d=this.recordIndex-1;if(d<0){d=this.view.all.getCount()-1}this.setPosition(d,c)},onKeyPageDown:Ext.emptyFn,onKeyPageUp:Ext.emptyFn,onKeyHome:function(b){this.setPosition(0,b)},onKeyEnd:function(b){this.setPosition(this.view.all.getCount()-1,b)},onKeyTab:Ext.returnTrue,onKeySpace:function(b){this.fireNavigateEvent(b)},onKeyEnter:function(b){b.view.fireEvent("itemclick",b.view,b.record,b.item,b.recordIndex,b)},onSelectAllKeyPress:function(b){this.fireNavigateEvent(b)},fireNavigateEvent:function(c){var d=this;d.fireEvent("navigate",{navigationModel:d,keyEvent:c,previousRecordIndex:d.previousRecordIndex,previousRecord:d.previousRecord,previousItem:d.previousItem,recordIndex:d.recordIndex,record:d.record,item:d.item})},destroy:function(){Ext.destroy(this.dataSourceListeners,this.viewListeners)}},1,0,0,0,["view.navigation.default"],[[Ext.util.Observable.prototype.mixinId||Ext.util.Observable.$className,Ext.util.Observable],[Ext.mixin.Factoryable.prototype.mixinId||Ext.mixin.Factoryable.$className,Ext.mixin.Factoryable]],[Ext.view,"NavigationModel"],0));(Ext.cmd.derive("Ext.view.AbstractView",Ext.Component,{inheritableStatics:{getRecord:function(b){return this.getBoundView(b).getRecord(b)},getBoundView:function(b){return Ext.getCmp(b.boundView)}},defaultBindProperty:"store",statics:{updateDelay:200,queueRecordChange:function(t,r,y,D,C){var u=this,E=u.changeQueue||(u.changeQueue={}),x=y.internalId,v,z,w,B,q,s,A;v=E[x]||(E[x]={operation:D,record:y,data:{},views:[]});z=v.data;Ext.Array.include(v.views,t);if(C&&(w=C.length)){for(B=0;B
{1}
',h.itemCls,g,h.itemAriaRole);h.tpl=new Ext.XTemplate(g,e)}Ext.Component.prototype.initComponent.call(this);h.tpl=h.getTpl("tpl");if(h.overItemCls){h.trackOver=true}h.addCmpEvents();h.store=Ext.data.StoreManager.lookup(h.store||"ext-empty-store");if(!h.dataSource){h.dataSource=h.store}h.bindStore(h.dataSource,true,"dataSource");if(!h.all){h.all=new Ext.CompositeElementLite()}h.scrollState={top:0,left:0};h.on({scroll:h.onViewScroll,element:"el",onFrame:!!Ext.global.requestAnimationFrame,scope:h});h.savedTabIndexAttribute="data-savedtabindex-"+h.id;this.getNavigationModel().bindComponent(this);this.getSelectionModel().bindComponent(this)},getElConfig:function(){var b=this.mixins.renderable.getElConfig.call(this);if(this.focusable){b.tabIndex=0}return b},onRender:function(){var h=this,f=h.loadMask,j=h.getMaskStore(),g={target:h,msg:h.loadingText,useMsg:h.loadingUseMsg,store:j},k;Ext.Component.prototype.onRender.apply(this,arguments);if(f){k=j.getProxy();if(k&&!k.isSynchronous){if(h.loadingCls){g.msgCls=h.loadingCls}if(Ext.isObject(f)){g=Ext.apply(g,f)}h.loadMask=new Ext.LoadMask(g);h.loadMask.on({scope:h,beforeshow:h.onMaskBeforeShow,hide:h.onMaskHide})}}},beforeLayout:function(){var b=this;Ext.Component.prototype.beforeLayout.apply(this,arguments);if(b.refreshNeeded&&!b.pendingRefresh){if(b.refreshCounter){b.refresh()}else{b.doFirstRefresh(b.dataSource)}}},getMaskStore:function(){return this.store},onMaskBeforeShow:function(){var c=this,d=c.loadingHeight;if(d&&d>c.getHeight()){c.hasLoadingHeight=true;c.oldMinHeight=c.minHeight;c.minHeight=d;c.updateLayout()}},onMaskHide:function(){var b=this;if(!b.destroying&&b.hasLoadingHeight){b.minHeight=b.oldMinHeight;b.updateLayout();delete b.hasLoadingHeight}},beforeRender:function(){Ext.Component.prototype.beforeRender.apply(this,arguments);this.getSelectionModel().beforeViewRender(this)},afterRender:function(){Ext.Component.prototype.afterRender.apply(this,arguments);if(this.focusable){this.focusEl=this.el}},getRefItems:function(){var c=this.loadMask,d=[];if(c&&c.isComponent){d.push(c)}return d},getSelection:function(){return this.getSelectionModel().getSelection()},updateSelection:function(e){var d=this,f;if(!d.ignoreNextSelection){d.ignoreNextSelection=true;f=d.getSelectionModel();if(e){f.select(e)}else{f.deselectAll()}d.ignoreNextSelection=false}},updateBindSelection:function(f,h){var g=this,e=null;if(!g.ignoreNextSelection){g.ignoreNextSelection=true;if(h.length){e=f.getLastSelected();g.hasHadSelection=true}if(g.hasHadSelection){g.setSelection(e)}g.ignoreNextSelection=false}},getSelectionModel:function(){var d=this,f="SINGLE",e=d.selModel;if(d.simpleSelect){f="SIMPLE"}else{if(d.multiSelect){f="MULTI"}}if(!e||!e.events){e=d.selModel=new Ext.selection.DataViewModel(Ext.apply({allowDeselect:d.allowDeselect,mode:f},e))}if(!e.hasRelaySetup){d.relayEvents(e,["selectionchange","beforeselect","beforedeselect","select","deselect","focuschange"]);e.hasRelaySetup=true;e.on("selectionchange",d.updateBindSelection,d)}if(d.disableSelection){e.locked=true}return e},applyNavigationModel:function(b){return Ext.Factory.viewNavigation(b)},initFocusableEvents:function(){var b=this;this.mixins.focusable.initFocusableEvents.call(this);b.focusEnterLeaveListeners=b.el.on({focusenter:b.onFocusEnter,focusleave:b.onFocusLeave,scope:b,destroyable:true})},onFocus:function(b){Ext.Component.prototype.onFocus.call(this,b);this.handleFocusEnter(b)},onFocusEnter:function(b){this.handleFocusEnter(b)},handleFocusEnter:function(g){var h=this,e=h.getNavigationModel(),f;if(!h.containsFocus){f=e.getLastFocused();e.setPosition(f||0,g,null,!f);h.containsFocus=e.getPosition()!=null}if(h.containsFocus){this.focusEl.dom.setAttribute("tabindex","-1")}},onFocusLeave:function(c){var d=this;if(d.containsFocus){d.getNavigationModel().setPosition(null,c,null,true);d.containsFocus=false;d.focusEl.dom.setAttribute("tabindex",0)}},onRemoved:function(b){Ext.Component.prototype.onRemoved.call(this,b);this.onFocusLeave()},refresh:function(){var p=this,m=p.all,w=m.getCount(),s=p.refreshCounter,o,r,t,u,q,n=s&&m.getCount()&&p.preserveScrollOnRefresh&&!p.bufferedRenderer,v;if(!p.rendered||p.isDestroyed||p.preventRefresh){return}if(!p.hasListeners.beforerefresh||p.fireEvent("beforerefresh",p)!==false){p.refreshing=true;o=p.getTargetEl();u=p.getViewRange();t=o.dom;if(n){r=p.getOverflowEl();v=r.getScroll()}if(s){q=true;p.clearViewEl();p.refreshCounter++}else{p.refreshCounter=1}p.tpl.append(o,p.collectData(u,m.startIndex||0));if(u.length<1){if(p.emptyText&&!p.getStore().isLoading()&&(!p.deferEmptyText||q)){p.emptyEl=Ext.core.DomHelper.insertHtml("beforeEnd",o.dom,p.emptyText)}m.clear()}else{p.collectNodes(o.dom);p.updateIndexes(0)}Ext.deferCallback(o.saveChildrenTabbableState,o,[p.savedTabIndexAttribute]);if(q){if(p.refreshSelmodelOnRefresh!==false){p.selModel.refresh()}else{if(!p.preventPrune){p.selModel.pruneIf()}}}p.refreshNeeded=false;p.refreshSize(m.getCount()!==w);p.fireEvent("refresh",p,u);if(n){r.setScrollLeft(v.left);r.setScrollTop(v.top)}if(!p.viewReady){p.viewReady=true;p.fireEvent("viewready",p)}p.refreshing=false;p.refreshScroll()}},collectNodes:function(c){var d=this.all;d.fill(Ext.fly(c).query(this.getItemSelector()),d.startIndex||0);if(this.focusable){d.set({tabindex:"-1"})}},getViewRange:function(){return this.dataSource.getRange()},refreshSize:function(g){var e=this,f=e.getSizeModel(),h=e.scrollManager;if(f.height.shrinkWrap||f.width.shrinkWrap||g){e.updateLayout()}else{if(e.touchScroll&&!e.bufferedRenderer){if(h){h.refresh()}else{e.on({boxready:e.refreshScroll,scope:e,single:true})}}}},onResize:function(){var d=this,c=d.scrollManager;if(c&&!d._hasScrollListener){c.on({scroll:d.onViewScroll,scope:d,onFrame:!!Ext.global.requestAnimationFrame});d._hasScrollListener=true}Ext.Component.prototype.onResize.apply(this,arguments)},clearViewEl:function(){var d=this,f=d.getTargetEl(),e=d.getNodeContainer()===f;d.clearEmptyEl();d.all.clear(!e);if(e){f.dom.innerHTML=""}},clearEmptyEl:function(){var b=this.emptyEl;if(b){b.parentNode.removeChild(b)}this.emptyEl=null},onViewScroll:function(){this.fireEvent("scroll",this)},saveScrollState:function(){var d=this,c=d.scrollState;if(d.rendered){c.left=d.getScrollX();c.top=d.getScrollY()}},restoreScrollState:function(){var d=this,c=d.scrollState;if(d.rendered){d.setScrollX(c.left);d.setScrollY(c.top)}},prepareData:function(k,l,m){var g,h,j;if(m){g=m.getAssociatedData();for(h in g){if(g.hasOwnProperty(h)){if(!j){k=Ext.Object.chain(k);j=true}k[h]=g[h]}}}return k},collectData:function(m,j){var k=[],l=0,h=m.length,g;for(;l-1){if(h.getNode(g)){j=h.bufferRender([g],k)[0];h.all.replaceElement(k,j,true);h.updateIndexes(k,k);h.selModel.onUpdate(g);h.refreshSizePending=true;if(h.selModel.isSelected(g)){h.onItemSelect(g)}if(h.hasListeners.itemupdate){h.fireEvent("itemupdate",g,k,j)}return j}}}},onReplace:function(p,o,v,u){var q=this,r,j=q.all,w,n,s,t;if(q.rendered){w=q.bufferRender(u,o,true);n=j.item(o);if(n){j.item(o).insertSibling(w,"before",true)}else{q.appendNodes(w)}j.insert(o,w);o+=u.length;r=o+v.length-1;j.removeRange(o,r,true);if(q.refreshSelmodelOnRefresh!==false){q.selModel.refresh()}q.updateIndexes(o);q.refreshSizePending=true;if(q.hasListeners.itemremove){for(s=v.length,t=r;s>=0;--s,--t){q.fireEvent("itemremove",v[s],t,q)}}if(q.hasListeners.itemadd){q.fireEvent("itemadd",u,o,w)}}},onAdd:function(k,f,j){var h=this,g;if(h.rendered){if(h.all.getCount()===0){h.refresh();g=h.all.slice()}else{g=h.doAdd(f,j);if(h.refreshSelmodelOnRefresh!==false){h.selModel.refresh()}h.updateIndexes(j);h.refreshSizePending=true}if(h.hasListeners.itemadd){h.fireEvent("itemadd",f,j,g)}}},appendNodes:function(e){var h=document.createDocumentFragment(),f=e.length,g;for(g=0;gk){l.appendNodes(j)}else{if(p<=o){n.item(o).insertSibling(j,"before",true)}else{n.item(p).insertSibling(j,"before",true)}}n.insert(p,j);return j},onRemove:function(v,s,p){var o=this,m=o.all,u=o.hasListeners.itemremove,n,r,q,w,t;if(m.getCount()){if(o.dataSource.getCount()===0){if(u){o.fireEvent("itemremove",s,p,o.getNodes(p,p+s.length-1))}o.preventPrune=true;o.refresh();o.preventPrune=false}else{if(u){w=[]}for(r=s.length-1;r>=0;--r){q=s[r];n=p+r;if(w){t=m.item(n);w[r]=t?t.dom:undefined}if(m.item(n)){o.doRemove(q,n)}}if(u){o.fireEvent("itemremove",s,p,w,o)}o.updateIndexes(p)}o.refreshSizePending=true}},doRemove:function(d,c){this.all.removeElement(c,true)},refreshNode:function(b){if(Ext.isNumber(b)){b=this.store.getAt(b)}this.onUpdate(this.dataSource,b)},updateIndexes:function(h,j){var f=this.all.elements,g=this.getViewRange(),k;h=h||0;j=j||((j===0)?0:(f.length-1));for(k=h;k<=j;k++){f[k].viewIndex=k;f[k].viewRecordId=g[k].internalId;if(!f[k].boundView){f[k].boundView=this.id}}},bindStore:function(f,e,g){var h=this;h.mixins.storeholder.bindStore.apply(h,arguments);if(h.componentLayoutCounter&&!h.preventRefresh){h.doFirstRefresh(f,!e)}},doFirstRefresh:function(e,f){var d=this;if(d.deferInitialRefresh&&!f){Ext.defer(d.doFirstRefresh,1,d,[e,true])}else{if(e&&!e.loading){d.refresh()}}},onUnbindStore:function(b){this.setMaskBind(null)},onBindStore:function(f,e,g){var h=this;h.getSelectionModel().bindStore(f);h.setMaskBind(f);if(!e&&g==="store"){h.preventRefresh=true;h.store=f;h.bindStore(f,false,"dataSource");h.preventRefresh=false}},setMaskBind:function(c){var d=this.loadMask;if(d&&d.bindStore){d.bindStore(c)}},getStoreListeners:function(){var b=this;return{refresh:b.onDataRefresh,replace:b.onReplace,add:b.onAdd,remove:b.onRemove,update:b.onUpdate,clear:b.refresh,beginupdate:b.onBeginUpdate,endupdate:b.onEndUpdate}},onBeginUpdate:Ext.emptyFn,onEndUpdate:function(){if(this.refreshSizePending){this.refreshSize(true);this.refreshSizePending=false}},onDataRefresh:function(){this.refreshView()},refreshView:function(){var c=this,d=c.blockRefresh||!c.rendered||c.up("[collapsed],[isCollapsingOrExpanding],[hidden]");if(d){c.refreshNeeded=true}else{if(c.bufferedRenderer&&c.all.getCount()){c.bufferedRenderer.refreshView()}else{c.refresh()}}},findItemByChild:function(b){return Ext.fly(b).findParent(this.getItemSelector(),this.getTargetEl())},findTargetByEvent:function(b){return b.getTarget(this.getItemSelector(),this.getTargetEl())},getSelectedNodes:function(){var e=[],f=this.selModel.getSelection(),g=f.length,h=0;for(;hm.bottom){k=q.bottom-m.bottom}}if(q.leftm.right){j=q.right-m.right}}if(j||k){n.scrollBy(j,k,false)}Ext.fly(o).set({tabIndex:-1});o.focus()}},bindStore:function(e,h,f){var g=this[f];if(g&&g.isFeatureStore){if(e.isFeatureStore){this.bindStoreListeners(e);g.bindStore(g.store)}else{g.bindStore(e)}this.getSelectionModel().bindStore(g.store)}else{Ext.view.AbstractView.prototype.bindStore.apply(this,arguments)}},privates:{repaintBorder:function(c){var d=this.getNode(c);if(d){d.className=d.className}}}},0,["dataview"],["box","component","dataview"],{box:true,component:true,dataview:true},["widget.dataview"],0,[Ext.view,"View",Ext,"DataView"],0));(Ext.cmd.derive("Ext.grid.CellContext",Ext.Base,{isCellContext:true,constructor:function(b){this.view=b},isEqual:function(b){if(b){return this.record===b.record&&this.column===b.column}return false},setPosition:function(f,e){var d=this;if(arguments.length===1){if(f.view){d.view=f.view}e=f.column;f=f.row}d.setRow(f);d.setColumn(e);return d},setAll:function(g,m,l,h,j){var k=this;k.view=g;k.rowIdx=m;k.colIdx=l;k.record=h;k.column=j;return k},setRow:function(f){var e=this,d=e.view.dataSource;if(f!==undefined){if(typeof f==="number"){e.rowIdx=Math.max(Math.min(f,d.getCount()-1),0);e.record=d.getAt(f)}else{if(f.isModel){e.record=f;e.rowIdx=d.indexOf(f)}else{if(f.tagName){e.record=e.view.getRecord(f);e.rowIdx=d.indexOf(e.record)}}}}},setColumn:function(e){var d=this,f=d.view.getVisibleColumnManager();if(e!==undefined){if(typeof e==="number"){d.colIdx=e;d.column=f.getHeaderAtIndex(e)}else{if(e.isHeader){d.column=e;d.colIdx=f.getHeaderIndex(e)}}}},equal:function(b){return(b&&b.isCellContext&&b.view===this.view&&b.record===this.record&&b.column===this.column)},clone:function(){var c=this,d=new c.self(c.view);d.rowIdx=c.rowIdx;d.colIdx=c.colIdx;d.record=c.record;d.column=c.column;return d}},1,0,0,0,0,0,[Ext.grid,"CellContext"],0));(Ext.cmd.derive("Ext.util.CSS",Ext.Base,function(){var k,h=null,j=document,f=/(-[a-z])/gi,g=function(b,a){return a.charAt(1).toUpperCase()};return{singleton:true,rules:h,initialized:false,constructor:function(){k=this},createStyleSheet:function(c,a){var d,e=j.getElementsByTagName("head")[0],b=j.createElement("style");b.setAttribute("type","text/css");if(a){b.setAttribute("id",a)}d=b.styleSheet;if(d){e.appendChild(b);d.cssText=c}else{b.appendChild(j.createTextNode(c));e.appendChild(b);d=b.sheet}k.cacheStyleSheet(d);return d},removeStyleSheet:function(a){var b=j.getElementById(a);if(b){b.parentNode.removeChild(b)}},swapStyleSheet:function(a,c){var b;k.removeStyleSheet(a);b=j.createElement("link");b.setAttribute("rel","stylesheet");b.setAttribute("type","text/css");b.setAttribute("id",a);b.setAttribute("href",c);j.getElementsByTagName("head")[0].appendChild(b)},cacheStyleSheet:function(b){if(!h){h=k.rules={}}try{var q=b.cssRules||b.rules,c=q.length-1,e=b.imports,p=e?e.length:0,r,d;for(d=0;d=0;--c){r=q[c];if(r.styleSheet){k.cacheStyleSheet(r.styleSheet)}k.cacheRule(r,b)}}catch(a){}},cacheRule:function(d,a){if(d.styleSheet){return k.cacheStyleSheet(d.styleSheet)}var b=d.selectorText,c,e;if(b){b=b.split(",");c=b.length;for(e=0;e=j+h;m--){k[m]=k[m-h];k[m].setAttribute("data-recordIndex",m)}}l.endIndex=l.endIndex+h}else{l.startIndex=j;l.endIndex=j+h-1}for(m=0;m-1){k=Ext.getDom(k);if(g){j=h[f];j.parentNode.insertBefore(k,j);Ext.removeNode(j);k.setAttribute("data-recordIndex",f)}this.elements[f]=k}return this},indexOf:function(d){var f=this.elements,e;d=Ext.getDom(d);for(e=this.startIndex;e<=this.endIndex;e++){if(f[e]===d){return e}}return -1},removeRange:function(r,n,p){var l=this,s=l.elements,o,m,q,k;if(n==null){n=l.endIndex+1}else{n=Math.min(l.endIndex+1,n+1)}if(r==null){r=l.startIndex}q=n-r;for(m=r,k=n;m<=l.endIndex;m++,k++){if(p&&m=q.startIndex&&o<=q.endIndex){m[m.length]=o}}Ext.Array.sort(m);s=m.length}else{if(mq.endIndex){return}s=1;m=[m]}for(r=p=m[0],v=0;r<=q.endIndex;r++,p++){if(v=q.startIndex){t=w[r]=w[p];t.setAttribute("data-recordIndex",r)}else{delete w[r]}}q.endIndex-=s;q.count-=s},scroll:function(D,v,G){var x=this,w=x.view,u=w.store,I=x.elements,s=D.length,B,F,H,C,y=w.getNodeContainer(),t=document.createDocumentFragment(),E=w.hasListeners.itemremove,z=w.hasListeners.itemadd,A=x.statics().range;if(v===-1){if(G){if(A){A.setStartBefore(I[(x.endIndex-G)+1]);A.setEndAfter(I[x.endIndex]);A.deleteContents();for(B=(x.endIndex-G)+1;B<=x.endIndex;B++){F=I[B];delete I[B];if(E){w.fireEvent("itemremove",u.getByInternalId(F.getAttribute("data-recordId")),B,F,w)}}}else{for(B=(x.endIndex-G)+1;B<=x.endIndex;B++){F=I[B];delete I[B];F.parentNode.removeChild(F);if(E){w.fireEvent("itemremove",u.getByInternalId(F.getAttribute("data-recordId")),B,F,w)}}}x.endIndex-=G}if(D.length){C=w.bufferRender(D,x.startIndex-=s);for(B=0;B',"{[view.renderTHead(values, out, parent)]}","{%","view.renderRows(values.rows, values.columns, values.viewStartIndex, out);","%}","{[view.renderTFoot(values, out, parent)]}","",{definitions:"var view, tableCls, columns, i, len, column;",priority:0}],outerRowTpl:['',"{%","this.nextTpl.applyOut(values, out, parent)","%}","
",{priority:9999}],rowTpl:["{%",'var dataRowCls = values.recordIndex === -1 ? "" : " '+Ext.baseCSSPrefix+'grid-row";',"%}",'','{%',"parent.view.renderCell(values, parent.record, parent.recordIndex, parent.rowIndex, xindex - 1, out, parent)","%}","","",{priority:0}],cellTpl:['{tdStyle}" tabindex="-1" {ariaCellAttr} data-columnid="{[values.column.getItemId()]}">','
{style}" {ariaCellInnerAttr}>{value}
',"",{priority:0}],refreshSelmodelOnRefresh:false,tableValues:{},rowValues:{itemClasses:[],rowClasses:[]},cellValues:{classes:[Ext.baseCSSPrefix+"grid-cell "+Ext.baseCSSPrefix+"grid-td"]},renderBuffer:document.createElement("div"),constructor:function(b){if(b.grid.isTree){b.baseCls=Ext.baseCSSPrefix+"tree-view"}Ext.view.View.prototype.constructor.call(this,b)},hasVariableRowHeight:function(d){var c=this;return c.variableRowHeight||c.store.isGrouped()||c.getVisibleColumnManager().hasVariableRowHeight()||(!d&&c.lockingPartner&&c.lockingPartner.hasVariableRowHeight(true))},initComponent:function(){var c=this,d=c.scroll;if(c.columnLines){c.addCls(c.grid.colLinesCls)}if(c.rowLines){c.addCls(c.grid.rowLinesCls)}c.body=new Ext.dom.Fly();c.body.id=c.id+"gridBody";c.autoScroll=undefined;if(!c.trackOver){c.overItemCls=null}if(d===true||d==="both"){c.autoScroll=true}else{if(d==="horizontal"){c.overflowX="auto"}else{if(d==="vertical"){c.overflowY="auto"}}}c.selModel.view=c.headerCt.view=c;c.grid.view=c;c.initFeatures(c.grid);c.itemSelector=c.getItemSelector();c.all=new Ext.view.NodeCache(c);Ext.view.View.prototype.initComponent.call(this)},getVisibleColumnManager:function(){return this.ownerCt.getVisibleColumnManager()},getColumnManager:function(){return this.ownerCt.getColumnManager()},getTopLevelVisibleColumnManager:function(){return this.ownerGrid.getVisibleColumnManager()},beforeLayout:function(){var c=this,d=!c.firstRefreshDone&&c.headerCt.layout.running;Ext.view.View.prototype.beforeLayout.apply(this,arguments);if(d&&c.body.dom){c.headerCt.layout.injectViewContext(c.headerCt.layout.ownerContext,c)}},moveColumn:function(K,j,D){var u=this,w=D>1,B=w&&document.createRange?document.createRange():null,J=w&&!B?document.createDocumentFragment():null,C=j,A=u.getGridColumns().length,v=A-1,G=(u.firstCls||u.lastCls)&&(j===0||j===A||K===0||K===v),y,z,E,x,I,H,F;if(u.rendered&&j!==K){E=u.el.query(u.rowSelector);if(j>K&&J){C-=1}for(y=0,x=E.length;y-1){return d.store.data.getAt(e)}}}return d.dataSource.getByInternalId(f.getAttribute("data-recordId"))}},indexOf:function(b){b=this.getNode(b);if(!b&&b!==0){return -1}return this.all.indexOf(b)},indexInStore:function(b){return b?this.dataSource.indexOf(this.getRecord(b)):-1},renderRows:function(l,m,n,h){var k=this.rowValues,j=l.length,o;k.view=this;k.columns=m;for(o=0;o');for(n=0;n')}o.push("")},renderRow:function(s,y,t){var q=this,u=y===-1,r=q.selModel,n=q.rowValues,v=n.itemClasses,w=n.rowClasses,x=q.itemCls,o,p=q.rowTpl;n.rowAttr={};n.record=s;n.recordId=s.internalId;n.recordIndex=q.store.indexOf(s);n.rowIndex=y;n.rowId=q.getRowId(s);n.itemCls=n.rowCls="";if(!n.columns){n.columns=q.ownerCt.getVisibleColumnManager().getColumns()}v.length=w.length=0;if(!u){v[0]=x;if(!q.ownerCt.disableSelection&&r.isRowSelected){if(r.isRowSelected(s)){v.push(q.selectedItemCls)}}if(q.stripeRows&&y%2!==0){v.push(q.altRowCls)}if(q.getRowClass){o=q.getRowClass(s,y,null,q.dataSource);if(o){w.push(o)}}}if(t){p.applyOut(n,t,q.tableValues)}else{return p.apply(n,q.tableValues)}},renderCell:function(B,y,z,s,w,A){var u=this,D,x=u.selModel,v=u.cellValues,C=v.classes,E=y.data[B.dataIndex],r=u.cellTpl,q,t;v.record=y;v.column=B;v.recordIndex=z;v.rowIndex=s;v.columnIndex=w;v.cellIndex=w;v.align=B.align;v.innerCls=B.innerCls;v.tdCls=v.tdStyle=v.tdAttr=v.style="";v.unselectableAttr=u.enableTextSelection?"":'unselectable="on"';C[1]=B.getCellId();t=2;if(B.renderer&&B.renderer.call){D=u.ownerCt.columnManager.getHeaderIndex(B);q=B.renderer.call(B.usingDefaultRenderer?B:B.scope||u.ownerCt,E,v,y,z,D,u.dataSource,u);if(v.css){y.cssWarning=true;v.tdCls+=" "+v.css;v.css=null}if(v.tdCls){C[t++]=v.tdCls}}else{q=E}v.value=(q==null||q==="")?B.emptyCellText:q;if(B.tdCls){C[t++]=B.tdCls}if(u.markDirty&&y.isModified(B.dataIndex)){C[t++]=u.dirtyCls}if(B.isFirstVisible){C[t++]=u.firstCls}if(B.isLastVisible){C[t++]=u.lastCls}if(!u.enableTextSelection){C[t++]=u.unselectableCls}if(x&&x.isCellModel&&x.isCellSelected(u,z,B)){C[t++]=(u.selectedCellCls)}C.length=t;v.tdCls=C.join(" ");r.applyOut(v,A);v.column=null},getRow:function(d){var c;if((!d&&d!==0)||!this.rendered){return null}if(d.target){d=d.target}if(Ext.isString(d)){return Ext.fly(d).down(this.rowSelector,true)}if(Ext.isNumber(d)){c=this.all.item(d);return c&&c.down(this.rowSelector,true)}if(d.isModel){return this.getRowByRecord(d)}c=Ext.fly(d);if(c.is(this.itemSelector)){return this.getRowFromItem(c)}return c.findParent(this.rowSelector,this.getTargetEl())},getRowId:function(b){return this.id+"-record-"+b.internalId},constructRowId:function(b){return this.id+"-record-"+b},getNodeById:function(b){b=this.constructRowId(b);return this.retrieveNode(b,false)},getRowById:function(b){b=this.constructRowId(b);return this.retrieveNode(b,true)},getNodeByRecord:function(b){return this.retrieveNode(this.getRowId(b),false)},getRowByRecord:function(b){return this.retrieveNode(this.getRowId(b),true)},getRowFromItem:function(h){var g=Ext.getDom(h).tBodies[0].childNodes,f=g.length,e;for(e=0;eh){Ext.fly(k).setHeight(m);Ext.fly(g).setHeight(m)}else{if(h>m){Ext.fly(k).setHeight(h);Ext.fly(g).setHeight(h)}}}}}},handleUpdate:function(ab,af,Y,J){var N=this,U=N.rowTpl,S,W,Z,ae,X,H,T,ad,O,aa,M,ai,ag,Q=[],V,I,L=N.variableRowHeight,ac,R=0,aj,ah,K,P,ak,G=N.ownerCt;if(N.viewReady){W=N.getNodeByRecord(af);if(W){O=N.overItemCls;aa=N.focusedItemCls;M=N.selectedItemCls;ai=N.ownerCt.getVisibleColumnManager().getColumns();for(I=0,V=ai.length;I1)){S=Ext.fly(W,"_internal");ae=N.createRowElement(af,N.dataSource.indexOf(af),Q);if(S.hasCls(O)){Ext.fly(ae).addCls(O)}if(S.hasCls(aa)){Ext.fly(ae).addCls(aa)}if(S.hasCls(M)){Ext.fly(ae).addCls(M)}if(Ext.isIE9m&&W.mergeAttributes){W.mergeAttributes(ae,true)}else{X=ae.attributes;H=X.length;for(ad=0;ad0){if(Ext.supports.ScrollWidthInlinePaddingBug){o+=p.getCellPaddingAfter(l[0])}if(p.columnLines){o+=Ext.fly(l[0].parentNode).getBorderWidth("lr")}}u.setWidth(1);r.titleEl.setStyle("text-overflow","clip");m=r.textEl.dom.offsetWidth+r.titleEl.getPadding("lr");r.titleEl.setStyle("text-overflow","");for(;s=s:m<=s){return l||s}m+=p;if((t=Ext.fly(r.getRow(m)))&&t.isVisible(true)){q+=p;l=m}}while(q!==u);return m},walkRecs:function(v,w){var q=this,n=q.dataSource,p=0,m=v,u,s=(w<0)?0:(n.isBufferedStore?n.getTotalCount():n.getCount())-1,o=s?1:-1,r=n.indexOf(v),t;do{if(s?r>=s:r<=s){return m}r+=o;t=n.getAt(r);if(!t.isCollapsedPlaceholder&&(u=Ext.fly(q.getNodeByRecord(t)))&&u.isVisible(true)){p+=o;m=t}}while(p!==w);return m},getFirstVisibleRowIndex:function(){var f=this,d=(f.dataSource.isBufferedStore?f.dataSource.getTotalCount():f.dataSource.getCount()),e=f.indexOf(f.all.first())-1;do{e+=1;if(e===d){return}}while(!Ext.fly(f.getRow(e)).isVisible(true));return e},getLastVisibleRowIndex:function(){var c=this,d=c.indexOf(c.all.last());do{d-=1;if(d===-1){return}}while(!Ext.fly(c.getRow(d)).isVisible(true));return d},getHeaderCt:function(){return this.headerCt},getPosition:function(d,c){return new Ext.grid.CellContext(this).setPosition(d,c)},beforeDestroy:function(){var b=this;if(b.rendered){b.el.clearListeners()}Ext.view.View.prototype.beforeDestroy.apply(this,arguments)},onDestroy:function(){var g=this,h=g.featuresMC,f,e;if(h){for(e=0,f=h.getCount();e','',"{beforeBoxLabelTpl}",'","{afterBoxLabelTpl}","",' tabindex="{tabIdx}"',' disabled="disabled"',' style="{fieldStyle}"',' class="{fieldCls} {typeCls} {typeCls}-{ui} {inputCls} {inputCls}-{ui} {childElCls} {afterLabelCls}" autocomplete="off" hidefocus="true" />','',"{beforeBoxLabelTpl}",'","{afterBoxLabelTpl}","","",{disableFormats:true,compiled:true}],publishes:{checked:1},subTplInsertions:["beforeBoxLabelTpl","afterBoxLabelTpl","beforeBoxLabelTextTpl","afterBoxLabelTextTpl","boxLabelAttrTpl","inputAttrTpl"],isCheckbox:true,focusCls:"form-checkbox-focus",fieldBodyCls:Ext.baseCSSPrefix+"form-cb-wrap",checked:false,checkedCls:Ext.baseCSSPrefix+"form-cb-checked",boxLabelCls:Ext.baseCSSPrefix+"form-cb-label",boxLabelAlign:"after",afterLabelCls:Ext.baseCSSPrefix+"form-cb-after",wrapInnerCls:Ext.baseCSSPrefix+"form-cb-wrap-inner",noBoxLabelCls:Ext.baseCSSPrefix+"form-cb-wrap-inner-no-box-label",inputValue:"on",checkChangeEvents:[],inputType:"checkbox",isTextInput:false,ariaRole:"checkbox",onRe:/^on$/i,inputCls:Ext.baseCSSPrefix+"form-cb",initComponent:function(){var d=this,c=d.value;if(c!==undefined){d.checked=d.isChecked(c,d.inputValue)}Ext.form.field.Base.prototype.initComponent.apply(this,arguments);d.getManager().add(d)},initValue:function(){var c=this,d=!!c.checked;c.originalValue=c.lastValue=d;c.setValue(d)},getElConfig:function(){var b=this;if(b.isChecked(b.rawValue,b.inputValue)){b.addCls(b.checkedCls)}return Ext.form.field.Base.prototype.getElConfig.call(this)},getSubTplData:function(g){var k=this,f=k.boxLabel,h=k.boxLabelAlign,j=f&&h==="before";return Ext.apply(Ext.form.field.Base.prototype.getSubTplData.apply(this,arguments),{disabled:k.readOnly||k.disabled,wrapInnerCls:k.wrapInnerCls,boxLabel:f,boxLabelCls:k.boxLabelCls,boxLabelAlign:h,labelAlignedBefore:j,afterLabelCls:j?k.afterLabelCls:"",noBoxLabelCls:!f?k.noBoxLabelCls:"",role:k.ariaRole})},initEvents:function(){var b=this;Ext.form.field.Base.prototype.initEvents.call(this);b.mon(b.inputEl,"click",b.onBoxClick,b,{translate:false})},setBoxLabel:function(d){var c=this;c.boxLabel=d;if(c.rendered){c.boxLabelEl.setHtml(d)}},onBoxClick:function(){var b=this;if(!b.disabled&&!b.readOnly){this.setValue(!this.checked)}},getRawValue:function(){return this.checked},getValue:function(){return this.checked},getSubmitValue:function(){var d=this.uncheckedValue,c=Ext.isDefined(d)?d:null;return this.checked?this.inputValue:c},isChecked:function(c,d){return(c===true||c==="true"||c==="1"||c===1||(((Ext.isString(c)||Ext.isNumber(c))&&d)?c==d:this.onRe.test(c)))},setRawValue:function(h){var e=this,g=e.inputEl,f=e.isChecked(h,e.inputValue);if(g){e[f?"addCls":"removeCls"](e.checkedCls)}e.checked=e.rawValue=f;if(!e.duringSetValue){e.lastValue=f}return f},setValue:function(j){var k=this,m,g,h,l;if(Ext.isArray(j)){m=k.getManager().getByName(k.name,k.getFormId()).items;h=m.length;for(g=0;ge.tolerance){e.triggerStart(h)}else{return}}if(e.fireEvent("mousemove",e,h)===false){e.onMouseUp(h)}else{e.onDrag(h);e.fireEvent("drag",e,h)}},onMouseUp:function(c){var d=this;d.mouseIsDown=false;if(d.mouseIsOut){d.mouseIsOut=false;d.onMouseOut(c)}if(d.preventDefault!==false){c.preventDefault()}if(Ext.isIE&&document.releaseCapture){document.releaseCapture()}d.fireEvent("mouseup",d,c);d.endDrag(c)},endDrag:function(f){var d=this,e=d.active;Ext.getDoc().un({mousemove:d.onMouseMove,mouseup:d.onMouseUp,selectstart:d.stopSelect,capture:true,scope:d});d.clearStart();d.active=false;if(e){d.dragEnded=true;d.onEnd(f);d.fireEvent("dragend",d,f)}d._constrainRegion=null},triggerStart:function(c){var d=this;d.clearStart();d.active=true;d.onStart(c);d.fireEvent("dragstart",d,c)},clearStart:function(){var b=this.timer;if(b){clearTimeout(b);this.timer=null}},stopSelect:function(b){b.stopEvent();return false},onBeforeStart:function(b){},onStart:function(b){},onDrag:function(b){},onEnd:function(b){},getDragTarget:function(){return this.dragTarget},getDragCt:function(){return this.el},getConstrainRegion:function(){var b=this;if(b.constrainTo){if(b.constrainTo instanceof Ext.util.Region){return b.constrainTo}if(!b._constrainRegion){b._constrainRegion=Ext.fly(b.constrainTo).getViewRegion()}}else{if(!b._constrainRegion){b._constrainRegion=b.getDragCt().getViewRegion()}}return b._constrainRegion},getXY:function(b){return b?this.constrainModes[b](this,this.lastXY):this.lastXY},getOffset:function(f){var d=this.getXY(f),e=this.startXY;return[d[0]-e[0],d[1]-e[1]]},onDragStart:function(b){b.stopPropagation()},constrainModes:{point:function(e,g){var h=e.dragRegion,f=e.getConstrainRegion();if(!f){return g}h.x=h.left=h[0]=h.right=g[0];h.y=h.top=h[1]=h.bottom=g[1];h.constrainTo(f);return[h.left,h.top]},dragTarget:function(m,j){var g=m.startXY,k=m.startRegion.copy(),h=m.getConstrainRegion(),l;if(!h){return j}k.translateBy(j[0]-g[0],j[1]-g[1]);if(k.right>h.right){j[0]+=l=(h.right-k.right);k.left+=l}if(k.lefth.bottom){j[1]+=l=(h.bottom-k.bottom);k.top+=l}if(k.topL.getHeaderIndex(A),J,K;if(I.pos==="after"){B++;N+=F.isGroupHeader?F.query(":not([hidden]):not([isGroupHeader])").length:1}if(e.isLock){J=w.up("[scrollerOwner]");J.lock(A,B,O)}else{if(e.isUnlock){J=w.up("[scrollerOwner]");J.unlock(A,B,O)}else{this.invalidateDrop();K=A.getWidth();if(G){if(B>E){B-=1}if(B===E){H.onHeaderMoved(A,D,z,N);return}}Ext.suspendLayouts();if(G){O.move(E,B)}else{if(x&&(N===B)){B-=1}w.isDDMoveInGrid=O.isDDMoveInGrid=!e.crossPanel;w.remove(A,false);O.insert(B,A);w.isDDMoveInGrid=O.isDDMoveInGrid=false}if(O.isGroupHeader){if(!G){A.savedFlex=A.flex;delete A.flex;A.width=K}}else{if(A.savedFlex){A.flex=A.savedFlex;delete A.width}}Ext.resumeLayouts(true);if(!G){H.onHeaderMoved(A,D,z,N)}}}}}},1,0,0,0,0,0,[Ext.grid.header,"DropZone"],0));(Ext.cmd.derive("Ext.grid.plugin.HeaderReorderer",Ext.plugin.Abstract,{init:function(b){this.headerCt=b;b.on({render:this.onHeaderCtRender,single:true,scope:this})},destroy:function(){Ext.destroy(this.dragZone,this.dropZone)},onHeaderCtRender:function(){var b=this;b.dragZone=new Ext.grid.header.DragZone(b.headerCt);b.dropZone=new Ext.grid.header.DropZone(b.headerCt);if(b.disabled){b.dragZone.disable()}},enable:function(){this.disabled=false;if(this.dragZone){this.dragZone.enable()}},disable:function(){this.disabled=true;if(this.dragZone){this.dragZone.disable()}}},0,0,0,0,["plugin.gridheaderreorderer"],0,[Ext.grid.plugin,"HeaderReorderer"],0));(Ext.cmd.derive("Ext.grid.header.Container",Ext.container.Container,{border:true,baseCls:Ext.baseCSSPrefix+"grid-header-ct",dock:"top",weight:100,defaultType:"gridcolumn",detachOnRemove:false,defaultWidth:100,sortAscText:"Sort Ascending",sortDescText:"Sort Descending",sortClearText:"Clear Sort",columnsText:"Columns",headerOpenCls:Ext.baseCSSPrefix+"column-header-open",menuSortAscCls:Ext.baseCSSPrefix+"hmenu-sort-asc",menuSortDescCls:Ext.baseCSSPrefix+"hmenu-sort-desc",menuColsIcon:Ext.baseCSSPrefix+"cols-icon",ddLock:false,dragging:false,enableFocusableContainer:false,sortable:true,enableColumnHide:true,initComponent:function(){var b=this;b.headerCounter=0;b.plugins=b.plugins||[];b.defaults=b.defaults||{};if(!b.isColumn){if(b.enableColumnResize){b.resizer=new Ext.grid.plugin.HeaderResizer();b.plugins.push(b.resizer)}if(b.enableColumnMove){b.reorderer=new Ext.grid.plugin.HeaderReorderer();b.plugins.push(b.reorderer)}}if(b.isColumn&&!b.isGroupHeader){if(!b.items||b.items.length===0){b.isContainer=false;b.focusable=true;b.layout={type:"container",calculate:Ext.emptyFn}}}else{b.layout=Ext.apply({type:"gridcolumn",align:"stretch"},b.initialConfig.layout);b.defaults.columnLines=b.columnLines;if(!b.isGroupHeader){b.isRootHeader=true;if(!b.hiddenHeaders){b.enableFocusableContainer=true;b.ariaRole="row"}b.columnManager=new Ext.grid.ColumnManager(false,b);b.visibleColumnManager=new Ext.grid.ColumnManager(true,b);if(b.grid){b.grid.columnManager=b.columnManager;b.grid.visibleColumnManager=b.visibleColumnManager}}else{b.visibleColumnManager=new Ext.grid.ColumnManager(true,b);b.columnManager=new Ext.grid.ColumnManager(false,b)}}b.menuTask=new Ext.util.DelayedTask(b.updateMenuDisabledState,b);Ext.container.Container.prototype.initComponent.call(this)},initEvents:function(){var f=this,e=f.onHeaderCtEvent,d={click:e,dblclick:e,contextmenu:e,mouseover:f.onHeaderCtMouseOver,mouseout:f.onHeaderCtMouseOut,scope:f};if(Ext.supports.Touch){d.longpress=f.onHeaderCtLongPress}Ext.container.Container.prototype.initEvents.call(this);if(!f.isColumn&&!f.isGroupHeader){f.mon(f.el,d)}},onHeaderCtEvent:function(n,e){var o=this,k=o.getHeaderElByEvent(n),l,m,j;if(o.longPressFired){o.longPressFired=false;return}if(k&&!o.ddLock){l=Ext.getCmp(k.id);if(l){m=l[l.clickTargetName];if(n.within(m)){if(n.type==="click"||n.type==="tap"){j=l.onTitleElClick(n,m);if(j){o.onHeaderTriggerClick(j,n,Ext.supports.Touch?j.el:j.triggerEl)}else{o.onHeaderClick(l,n,e)}}else{if(n.type==="contextmenu"){o.onHeaderContextMenu(l,n,e)}else{if(n.type==="dblclick"&&l.resizable){l.onTitleElDblClick(n,m.dom)}}}}}}},onHeaderCtMouseOver:function(e,g){var h,j,k;if(!e.within(this.el,true)){h=e.getTarget("."+Ext.grid.column.Column.prototype.baseCls);j=h&&Ext.getCmp(h.id);if(j){k=j[j.clickTargetName];if(e.within(k)){j.onTitleMouseOver(e,k.dom)}}}},onHeaderCtMouseOut:function(m,o){var n="."+Ext.grid.column.Column.prototype.baseCls,e=m.getTarget(n),j=m.getRelatedTarget(n),k,l;if(e!==j){if(e){k=Ext.getCmp(e.id);if(k){l=k[k.clickTargetName];k.onTitleMouseOut(m,l.dom)}}if(j){k=Ext.getCmp(j.id);if(k){l=k[k.clickTargetName];k.onTitleMouseOver(m,l.dom)}}}},onHeaderCtLongPress:function(e){var f=this,g=f.getHeaderElByEvent(e),h=Ext.getCmp(g.id);if(!h.menuDisabled){f.longPressFired=true;f.showMenuBy(g,h)}},getHeaderElByEvent:function(b){return b.getTarget("."+Ext.grid.column.Column.prototype.baseCls)},isLayoutRoot:function(){if(this.hiddenHeaders){return false}return Ext.container.Container.prototype.isLayoutRoot.call(this)},getOwnerHeaderCt:function(){var b=this;return b.isRootHeader?b:b.up("[isRootHeader]")},onDestroy:function(){var b=this;if(b.menu){b.menu.un("hide",b.onMenuHide,b)}b.menuTask.cancel();Ext.container.Container.prototype.onDestroy.call(this);Ext.destroy(b.visibleColumnManager,b.columnManager,b.menu);b.columnManager=b.visibleColumnManager=null},applyColumnsState:function(t){if(!t||!t.length){return}var n=this,p=n.items.items,q=p.length,s=0,v=t.length,o,u,w,r,c=false;for(o=0;o=k.visibleFromIdx){q++}Ext.container.Container.prototype.onMove.apply(this,arguments);if(k.isGroupHeader){l=k.visibleColumnManager.getColumns().length}o.onHeaderMoved(k,l,k.visibleFromIdx,q)},onRemove:function(f){var c=this,e=c.ownerCt;Ext.container.Container.prototype.onRemove.apply(this,arguments);if(!c.destroying){if(!c.isDDMoveInGrid){c.onHeadersChanged(f,false)}if(c.isGroupHeader&&!c.items.getCount()&&e){if(f.rendered){c.detachComponent(f)}Ext.suspendLayouts();e.remove(c);Ext.resumeLayouts(true)}}},onHeadersChanged:function(g,f){var c,h=this.getOwnerHeaderCt();this.purgeHeaderCtCache(this);if(h){h.onColumnsChanged();if(!g.isGroupHeader){c=h.ownerCt;if(c&&!f){c.onHeadersChanged(h,g)}}}},onHeaderMoved:function(j,h,m,k){var l=this,g=l.ownerCt;if(l.rendered){if(g&&g.onHeaderMove){g.onHeaderMove(l,j,h,m,k)}l.fireEvent("columnmove",l,j,m,k)}},onColumnsChanged:function(){var h=this,g=h.menu,f,e;if(h.rendered){h.fireEvent("columnschanged",h);if(g&&(f=g.child("#columnItemSeparator"))){e=g.child("#columnItem");f.destroy();e.destroy()}}},lookupComponent:function(c){var d=Ext.container.Container.prototype.lookupComponent.apply(this,arguments);if(!d.isGroupHeader&&d.width===undefined&&!d.flex){d.width=this.defaultWidth}return d},setSortState:function(){var g=this.up("[store]").store,l=this.visibleColumnManager.getColumns(),h=l.length,m,j,k;for(m=0;mgridcolumn[hideable]"),k=j.length,n;for(;hw.el.dom.clientHeight?Ext.getScrollbarSize().width:0),E=0,y=x.getVisibleGridColumns(),B=C.hidden,z,D,t,A,G;function v(){for(D=0,z=y.length;DA){C.width=A;F=true}else{C.width=G;I-=G+s;v()}u();Ext.resumeLayouts(true)},autoSizeColumn:function(c){var d=this.view;if(d){d.autoSizeColumn(c);if(this.forceFit){this.applyForceFit(c)}}},privates:{getFocusables:function(){return this.getVisibleGridColumns()},createFocusableContainerKeyNav:function(d){var c=this;return new Ext.util.KeyNav(d,{scope:c,down:c.showHeaderMenu,left:c.onFocusableContainerLeftKey,right:c.onFocusableContainerRightKey,space:c.toggleColumnSort,enter:c.toggleColumnSort})},showHeaderMenu:function(c){var d=this.getFocusableFromEvent(c);if(d&&d.triggerEl){this.onHeaderTriggerClick(d,c,d.triggerEl)}},toggleColumnSort:function(c){var d=this.getFocusableFromEvent(c);if(d&&d.sortable){d.toggleSortState();this.onHeaderClick(d,c,d.el)}},onFocusableContainerMousedown:Ext.privateFn}},0,["headercontainer"],["box","component","container","headercontainer"],{box:true,component:true,container:true,headercontainer:true},["widget.headercontainer"],[[Ext.util.FocusableContainer.prototype.mixinId||Ext.util.FocusableContainer.$className,Ext.util.FocusableContainer]],[Ext.grid.header,"Container"],0));(Ext.cmd.derive("Ext.grid.ColumnComponentLayout",Ext.layout.component.Auto,{type:"columncomponent",setWidthInDom:true,beginLayout:function(b){Ext.layout.component.Auto.prototype.beginLayout.apply(this,arguments);b.titleContext=b.getEl("titleEl");b.triggerContext=b.getEl("triggerEl")},beginLayoutCycle:function(c){var d=this.owner;Ext.layout.component.Auto.prototype.beginLayoutCycle.apply(this,arguments);if(c.widthModel.shrinkWrap){d.el.setWidth("")}d.titleEl.setStyle({paddingTop:"",paddingBottom:""})},publishInnerHeight:function(q,m){var o=this,t=o.owner,u,r,n,p,l,s;if(t.getOwnerHeaderCt().hiddenHeaders){q.setProp("innerHeight",0);return}u=m-q.getBorderInfo().height;r=u;if(t.headerWrap&&!q.hasDomProp("width")){o.done=false;return}if(q.hasRawContent){n=t.textEl.getHeight();if(n){r-=n;if(r>0){l=Math.floor(r/2);s=r-l;q.titleContext.setProp("padding-top",l);q.titleContext.setProp("padding-bottom",s)}}}else{q.setProp("innerHeight",u-t.titleEl.getHeight(),false)}},measureContentHeight:function(b){return b.el.dom.offsetHeight},publishInnerWidth:function(d,c){if(!d.hasRawContent){d.setProp("innerWidth",c-d.getBorderInfo().width,false)}},calculateOwnerHeightFromContentHeight:function(g,h){var e=Ext.layout.component.Auto.prototype.calculateOwnerHeightFromContentHeight.apply(this,arguments),f=this.owner;if(!g.hasRawContent){if(!f.headerWrap||g.hasDomProp("width")){return h+f.titleEl.getHeight()+g.getBorderInfo().height}return null}return e},calculateOwnerWidthFromContentWidth:function(j,g){var h=this.owner,k=j.getPaddingInfo().width,l=this.getTriggerOffset(h,j),m;if(h.isGroupHeader){m=g}else{m=Math.max(g,h.textEl.getWidth()+j.titleContext.getPaddingInfo().width)}return m+k+l},getTriggerOffset:function(e,f){var d=0;if(f.widthModel.shrinkWrap&&!e.menuDisabled){if(e.query(">:not([hidden])").length===0){d=e.self.triggerElWidth}}return d}},0,0,0,0,["layout.columncomponent"],0,[Ext.grid,"ColumnComponentLayout"],0));(Ext.cmd.derive("Ext.grid.column.Column",Ext.grid.header.Container,{alternateClassName:"Ext.grid.Column",config:{triggerVisible:false},baseCls:Ext.baseCSSPrefix+"column-header",hoverCls:Ext.baseCSSPrefix+"column-header-over",handleWidth:Ext.supports.Touch?10:4,ariaRole:"columnheader",enableFocusableContainer:false,sortState:null,possibleSortStates:["ASC","DESC"],childEls:["titleEl","triggerEl","textEl"],headerWrap:false,renderTpl:['
',Ext.baseCSSPrefix,'column-header-inner-empty">','',"{text}","",'','',"","
","{%this.renderContainer(out,values)%}"],dataIndex:null,text:" ",menuText:null,emptyCellText:" ",sortable:true,resizable:true,hideable:true,menuDisabled:false,renderer:false,align:"left",draggable:true,tooltipType:"qtip",initDraggable:Ext.emptyFn,tdCls:"",isHeader:true,isColumn:true,producesHTML:true,tabIndex:-1,ascSortCls:Ext.baseCSSPrefix+"column-header-sort-ASC",descSortCls:Ext.baseCSSPrefix+"column-header-sort-DESC",componentLayout:"columncomponent",groupSubHeaderCls:Ext.baseCSSPrefix+"group-sub-header",groupHeaderCls:Ext.baseCSSPrefix+"group-header",clickTargetName:"titleEl",detachOnRemove:true,initResizable:Ext.emptyFn,rendererNames:{column:"renderer",edit:"editRenderer",summary:"summaryRenderer"},formatterNames:{column:"formatter",edit:"editFormatter",summary:"summaryFormatter"},initComponent:function(){var b=this;if(b.header!=null){b.text=b.header;b.header=null}if(b.cellWrap){b.tdCls=(b.tdCls||"")+" "+Ext.baseCSSPrefix+"wrap-cell"}if(b.columns!=null){b.isGroupHeader=true;b.items=b.columns;b.columns=b.flex=b.width=null;b.cls=(b.cls||"")+" "+b.groupHeaderCls;b.sortable=b.resizable=false;b.align="center"}else{if(b.flex){b.minWidth=b.minWidth||Ext.grid.plugin.HeaderResizer.prototype.minColWidth}}b.addCls(Ext.baseCSSPrefix+"column-header-align-"+b.align);b.setupRenderer();b.setupRenderer("edit");b.setupRenderer("summary");Ext.grid.header.Container.prototype.initComponent.apply(this,arguments)},bindFormatter:function(c){var d=this;return function(a){return c.format(a,c.scope||d.scope||d.resolveListenerScope())}},bindRenderer:function(c){var d=this;d.hasCustomRenderer=true;return function(){return Ext.callback(c,d.scope,arguments,0,d)}},setupRenderer:function(g){g=g||"column";var m=this,k=m[m.formatterNames[g]],l=m[m.rendererNames[g]],h=g==="column",j;if(!k){if(l){if(typeof l==="string"){l=m[m.rendererNames[g]]=m.bindRenderer(l)}if(h){m.hasCustomRenderer=l.length>1}}else{if(h&&m.defaultRenderer){m.renderer=m.defaultRenderer;m.usingDefaultRenderer=true}}}else{j=k.indexOf("this.")===0;if(j){k=k.substring(5)}k=Ext.app.bind.Template.prototype.parseFormat(k);m[m.formatterNames[g]]=null;if(j){k.scope=null}m[m.rendererNames[g]]=m.bindFormatter(k)}},getView:function(){var b=this.getOwnerHeaderCt();if(b){return b.view}},onResize:function(n,j,o,k){var m=this,h,l;Ext.grid.header.Container.prototype.onResize.apply(this,arguments);if(o&&m.cellWrap){h=m.getView();if(h){l=h.bufferedRenderer;if(l){l.onWrappedColumnWidthChange(o,n)}}}},initItems:function(){var b=this;Ext.grid.header.Container.prototype.initItems.apply(this,arguments);if(b.isGroupHeader){if(!b.hasVisibleChildColumns()){b.hide()}}},hasVisibleChildColumns:function(){var e=this.items.items,f=e.length,h,g;for(h=0;h:not([hidden]):not([menuDisabled])");f=d.length;if(Ext.Array.contains(d,e.hideCandidate)){f--}if(f){return false}e.hideCandidate=this},isLockable:function(){var b={result:this.lockable!==false};if(b.result){this.ownerCt.bubble(this.hasMultipleVisibleChildren,null,[b])}return b.result},isLocked:function(){return this.locked||!!this.up("[isColumn][locked]","[isRootHeader]")},hasMultipleVisibleChildren:function(b){if(!this.isXType("headercontainer")){b.result=false;return false}if(this.query(">:not([hidden])").length>1){return false}},hide:function(q){var l=this,o=l.getOwnerHeaderCt(),r=l.getRefOwner(),s,k,m,n,p;if(r.constructing){Ext.grid.header.Container.prototype.hide.call(this);return l}if(l.rendered&&!l.isVisible()){return l}if(o.forceFit){l.visibleSiblingCount=o.getVisibleGridColumns().length-1;if(l.flex){l.savedWidth=l.getWidth();l.flex=null}}s=r.isGroupHeader;if(s&&!q){m=r.query(">:not([hidden])");if(m.length===1&&m[0]===l){l.ownerCt.hide();return}}Ext.suspendLayouts();if(l.isGroupHeader){m=l.items.items;for(p=0,n=m.length;p=s.left&&q style="{triggerStyle}">',"{[values.$trigger.renderBody(values)]}",""],statics:{weightComparator:function(d,c){return d.weight-c.weight}},constructor:function(d){var f=this,e;Ext.apply(f,d);if(f.compat4Mode){e=f.cls;f.focusCls=[f.focusCls,e+"-focus"];f.overCls=[f.overCls,e+"-over"];f.clickCls=[f.clickCls,e+"-click"]}},afterFieldRender:function(){this.initEvents()},destroy:function(){var d=this,c=d.clickRepeater;if(c){c.destroy()}if(d.el){d.el.destroy()}d.el=null;d.isDestroyed=true},getBodyRenderData:Ext.emptyFn,getEl:function(){return this.el||null},getStateEl:function(){return this.el},hide:function(){var c=this,d=c.el;c.hidden=true;if(d){d.hide()}},initEvents:function(){var g=this,f=g.isFieldEnabled,h=g.getStateEl(),e=g.el;h.addClsOnOver(g.overCls,f,g);h.addClsOnClick(g.clickCls,f,g);if(g.repeatClick){g.clickRepeater=new Ext.util.ClickRepeater(e,{preventDefault:true,handler:g.onClick,listeners:{mousedown:g.onClickRepeaterMouseDown,scope:g},scope:g})}else{g.field.mon(e,{click:g.onClick,mousedown:g.onMouseDown,scope:g})}},isFieldEnabled:function(){return !this.field.disabled},isVisible:function(){var e=this,f=e.field,d=false;if(e.hidden||!f||!e.rendered||e.isDestroyed){d=true}return !d},onClick:function(){var k=this,g=arguments,h=k.clickRepeater?g[1]:g[0],e=k.handler,j=k.field;if(e&&!j.readOnly&&k.isFieldEnabled()){Ext.callback(k.handler,k.scope,[j,k,h],0,j)}},resolveListenerScope:function(b){return this.field.resolveListenerScope(b)},onMouseDown:function(b){if(!b.parentEvent||b.parentEvent.type==="mousedown"){this.field.inputEl.focus()}b.preventDefault()},onClickRepeaterMouseDown:function(c,d){if(!d.parentEvent||d.parentEvent.type==="mousedown"){this.field.inputEl.focus()}d.preventDefault()},onFieldBlur:function(){this.getStateEl().removeCls(this.focusCls)},onFieldFocus:function(){this.getStateEl().addCls(this.focusCls)},onFieldRender:function(){var c=this,d=c.el=c.field.triggerWrap.selectNode("#"+c.domId,false);d.setVisibilityMode(Ext.Element.DISPLAY);c.rendered=true},renderBody:function(d){var e=this,f=e.bodyTpl;Ext.apply(d,e.getBodyRenderData());return f?Ext.XTemplate.getTpl(e,"bodyTpl").apply(d):""},renderTrigger:function(f){var h=this,e=h.width,g=h.hidden?"display:none;":"";if(e){g+="width:"+e}return Ext.XTemplate.getTpl(h,"renderTpl").apply({$trigger:h,fieldData:f,ui:f.ui,childElCls:f.childElCls,triggerId:h.domId=h.field.id+"-trigger-"+h.id,cls:h.cls,triggerStyle:g,extraCls:h.extraCls,baseCls:h.baseCls})},setHidden:function(b){if(b!==this.hidden){this[b?"hide":"show"]()}},setVisible:function(b){this.setHidden(!b)},show:function(){var c=this,d=c.el;c.hidden=false;if(d){d.show()}}},1,0,0,0,["trigger.trigger"],[[Ext.mixin.Factoryable.prototype.mixinId||Ext.mixin.Factoryable.$className,Ext.mixin.Factoryable]],[Ext.form.trigger,"Trigger"],0));(Ext.cmd.derive("Ext.form.field.Text",Ext.form.field.Base,{alternateClassName:["Ext.form.TextField","Ext.form.Text"],config:{hideTrigger:false,triggers:undefined},growMin:30,growMax:800,growAppend:"W",allowBlank:true,validateBlank:false,allowOnlyWhitespace:true,minLength:0,maxLength:Number.MAX_VALUE,minLengthText:"The minimum length for this field is {0}",maxLengthText:"The maximum length for this field is {0}",blankText:"This field is required",regexText:"",emptyCls:Ext.baseCSSPrefix+"form-empty-field",requiredCls:Ext.baseCSSPrefix+"form-required-field",valueContainsPlaceholder:false,ariaRole:"textbox",editable:true,repeatTriggerClick:false,triggerWrapCls:Ext.baseCSSPrefix+"form-trigger-wrap",triggerWrapFocusCls:Ext.baseCSSPrefix+"form-trigger-wrap-focus",triggerWrapInvalidCls:Ext.baseCSSPrefix+"form-trigger-wrap-invalid",fieldBodyCls:Ext.baseCSSPrefix+"form-text-field-body",inputWrapCls:Ext.baseCSSPrefix+"form-text-wrap",inputWrapFocusCls:Ext.baseCSSPrefix+"form-text-wrap-focus",inputWrapInvalidCls:Ext.baseCSSPrefix+"form-text-wrap-invalid",growCls:Ext.baseCSSPrefix+"form-text-grow",monitorTab:true,mimicing:false,needArrowKeys:true,childEls:["triggerWrap","inputWrap"],preSubTpl:['
','
'],postSubTpl:["
",'{[values.renderTrigger(parent)]}',"
"],initComponent:function(){var c=this,d=c.emptyCls;if(c.allowOnlyWhitespace===false){c.allowBlank=false}if(c.size){c.defaultBodyWidth=c.size*6.5+20}if(!c.onTrigger1Click){c.onTrigger1Click=c.onTriggerClick}Ext.form.field.Base.prototype.initComponent.call(this);c.setReadOnly(c.readOnly);c.fieldFocusCls=c.baseCls+"-focus";c.emptyUICls=d+" "+d+"-"+c.ui;c.addStateEvents("change")},initEvents:function(){var c=this,d=c.inputEl;Ext.form.field.Base.prototype.initEvents.call(this);if(c.selectOnFocus||c.emptyText){c.mon(d,"mousedown",c.onMouseDown,c)}if(c.maskRe||(c.vtype&&c.disableKeyFilter!==true&&(c.maskRe=Ext.form.field.VTypes[c.vtype+"Mask"]))){c.mon(d,"keypress",c.filterKeys,c)}if(c.enableKeyEvents){c.mon(d,{scope:c,keyup:c.onKeyUp,keydown:c.onKeyDown,keypress:c.onKeyPress})}},isEqual:function(c,d){return this.isEqualAsString(c,d)},onChange:function(c,d){Ext.form.field.Base.prototype.onChange.apply(this,arguments);this.autoSize()},getSubTplData:function(g){var m=this,l=m.getRawValue(),j=m.emptyText&&l.length<1,h=m.maxLength,k;if(m.enforceMaxLength){if(h===Number.MAX_VALUE){h=undefined}}else{h=undefined}if(j){if(Ext.supports.Placeholder){k=m.emptyText}else{l=m.emptyText;m.valueContainsPlaceholder=true}}return Ext.apply(Ext.form.field.Base.prototype.getSubTplData.apply(this,arguments),{triggerWrapCls:m.triggerWrapCls,inputWrapCls:m.inputWrapCls,triggers:m.orderedTriggers,maxLength:h,readOnly:!m.editable||m.readOnly,placeholder:k,value:l,fieldCls:m.fieldCls+((j&&(k||l))?" "+m.emptyUICls:"")+(m.allowBlank?"":" "+m.requiredCls)})},onRender:function(){var k=this,f=k.getTriggers(),j=[],h,g;if(Ext.supports.FixedTableWidthBug){k.el._needsTableWidthFix=true}Ext.form.field.Base.prototype.onRender.call(this);if(f){this.invokeTriggers("onFieldRender");for(h in f){j.push(f[h].el)}g=k.triggerEl=k.triggerCell=new Ext.CompositeElement(j,true)}k.inputCell=k.inputWrap},afterRender:function(){var b=this;b.autoSize();Ext.form.field.Base.prototype.afterRender.call(this);this.invokeTriggers("afterFieldRender")},onMouseDown:function(){var b=this;if(!b.hasFocus){b.mon(b.inputEl,"mouseup",Ext.emptyFn,b,{single:true,preventDefault:true})}},applyTriggers:function(q){var p=this,u=p.getHideTrigger(),n=p.readOnly,m=p.orderedTriggers=[],o=p.repeatTriggerClick,v,r,t,w,s;if(!q){q={};if(p.triggerCls&&!p.trigger1Cls){p.trigger1Cls=p.triggerCls}for(s=1;w=p["trigger"+s+"Cls"];s++){q["trigger"+s]={cls:w,extraCls:Ext.baseCSSPrefix+"trigger-index-"+s,handler:"onTrigger"+s+"Click",compat4Mode:true,scope:p}}}for(v in q){if(q.hasOwnProperty(v)){r=q[v];r.field=p;r.id=v;if((n&&r.hideOnReadOnly!==false)||(u&&r.hidden!==false)){r.hidden=true}if(o&&(r.repeatClick!==false)){r.repeatClick=true}t=q[v]=Ext.form.trigger.Trigger.create(r);m.push(t)}}Ext.Array.sort(m,Ext.form.trigger.Trigger.weightComparator);return q},invokeTriggers:function(h,m){var k=this,l=k.getTriggers(),j,g;if(l){for(j in l){if(l.hasOwnProperty(j)){g=l[j];g[h].apply(g,m||[])}}}},getTrigger:function(b){return this.getTriggers()[b]},updateHideTrigger:function(b){if(this.rendered){this.invokeTriggers(b?"hide":"show")}},setEditable:function(d){var c=this;c.editable=d;if(c.rendered){c.setReadOnlyAttr(!d||c.readOnly)}},setReadOnly:function(j){var l=this,m=l.getTriggers(),g=l.getHideTrigger(),h,k;j=!!j;Ext.form.field.Base.prototype.setReadOnly.call(this,j);if(l.rendered){l.setReadOnlyAttr(j||!l.editable);if(m){for(k in m){h=m[k];if(h.hideOnReadOnly===true||(h.hideOnReadOnly!==false&&!g)){h[j?"hide":"show"].call(h)}}}}},setReadOnlyAttr:function(g){var e=this,f="readonly",h=e.inputEl.dom;if(g){h.setAttribute(f,f)}else{h.removeAttribute(f)}},processRawValue:function(e){var f=this,g=f.stripCharsRe,h;if(g){h=e.replace(g,"");if(h!==e){f.setRawValue(h);e=h}}return e},onDisable:function(){Ext.form.field.Base.prototype.onDisable.call(this);if(Ext.isIE){this.inputEl.dom.unselectable="on"}},onEnable:function(){Ext.form.field.Base.prototype.onEnable.call(this);if(Ext.isIE){this.inputEl.dom.unselectable=""}},onKeyDown:function(b){this.fireEvent("keydown",this,b)},onKeyUp:function(b){this.fireEvent("keyup",this,b)},onKeyPress:function(b){this.fireEvent("keypress",this,b)},reset:function(){Ext.form.field.Base.prototype.reset.call(this);this.applyEmptyText()},applyEmptyText:function(){var d=this,e=d.emptyText,f;if(d.rendered&&e){f=d.getRawValue().length<1&&!d.hasFocus;if(Ext.supports.Placeholder){d.inputEl.dom.placeholder=e}else{if(f){d.setRawValue(e);d.valueContainsPlaceholder=true}}if(f){d.inputEl.addCls(d.emptyUICls)}d.autoSize()}},afterFirstLayout:function(){Ext.form.field.Base.prototype.afterFirstLayout.call(this);if(Ext.isIE&&this.disabled){var b=this.inputEl;if(b){b.dom.unselectable="on"}}},toggleInvalidCls:function(d){var c=d?"addCls":"removeCls";Ext.form.field.Base.prototype.toggleInvalidCls.call(this);this.triggerWrap[c](this.triggerWrapInvalidCls);this.inputWrap[c](this.inputWrapInvalidCls)},beforeFocus:function(){var e=this,h=e.inputEl,f=e.emptyText,g;Ext.form.field.Base.prototype.beforeFocus.apply(this,arguments);if((f&&!Ext.supports.Placeholder)&&(h.dom.value===e.emptyText&&e.valueContainsPlaceholder)){e.setRawValue("");g=true;h.removeCls(e.emptyUICls);e.valueContainsPlaceholder=false}else{if(Ext.supports.Placeholder){h.removeCls(e.emptyUICls)}}if(e.selectOnFocus||g){if(Ext.isWebKit){if(!e.inputFocusTask){e.inputFocusTask=new Ext.util.DelayedTask(e.focusInput,e)}e.inputFocusTask.delay(1)}else{e.focusInput()}}},focusInput:function(){var b=this.inputEl;if(b){b=b.dom;if(b){b.select()}}},onFocus:function(c){var d=this;Ext.form.field.Base.prototype.onFocus.apply(this,arguments);if(d.emptyText){d.autoSize()}d.addCls(d.fieldFocusCls);d.triggerWrap.addCls(d.triggerWrapFocusCls);d.inputWrap.addCls(d.inputWrapFocusCls);d.invokeTriggers("onFieldFocus",[c])},onBlur:function(c){var d=this;Ext.form.field.Base.prototype.onBlur.apply(this,arguments);d.removeCls(d.fieldFocusCls);d.triggerWrap.removeCls(d.triggerWrapFocusCls);d.inputWrap.removeCls(d.inputWrapFocusCls);d.invokeTriggers("onFieldBlur",[c]);d.postBlur()},postBlur:function(){var b=this.inputFocusTask;Ext.form.field.Base.prototype.postBlur.apply(this,arguments);this.applyEmptyText();if(b){b.cancel()}},filterKeys:function(f){if(f.ctrlKey&&!f.altKey){return}var d=f.getKey(),e=String.fromCharCode(f.getCharCode());if((Ext.isGecko||Ext.isOpera)&&(f.isNavKeyPress()||d===f.BACKSPACE||(d===f.DELETE&&f.button===-1))){return}if((!Ext.isGecko&&!Ext.isOpera)&&f.isSpecialKey()&&!e){return}if(!this.maskRe.test(e)){f.stopEvent()}},getState:function(){return this.addPropertyToState(Ext.form.field.Base.prototype.getState.call(this),"value")},applyState:function(b){Ext.form.field.Base.prototype.applyState.apply(this,arguments);if(b.hasOwnProperty("value")){this.setValue(b.value)}},getRawValue:function(){var c=this,d=Ext.form.field.Base.prototype.getRawValue.call(this);if(d===c.emptyText&&c.valueContainsPlaceholder){d=""}return d},setValue:function(d){var e=this,f=e.inputEl;if(f&&e.emptyText&&!Ext.isEmpty(d)){f.removeCls(e.emptyUICls);e.valueContainsPlaceholder=false}Ext.form.field.Base.prototype.setValue.apply(this,arguments);e.applyEmptyText();return e},getErrors:function(m){m=arguments.length?(m==null?"":m):this.processRawValue(this.getRawValue());var r=this,o=Ext.form.field.Base.prototype.getErrors.call(this,m),w=r.validator,t=r.vtype,q=Ext.form.field.VTypes,p=r.regex,n=Ext.String.format,v,s,u;if(Ext.isFunction(w)){v=w.call(r,m);if(v!==true){o.push(v)}}s=r.allowOnlyWhitespace?m:Ext.String.trim(m);if(s.length<1||(m===r.emptyText&&r.valueContainsPlaceholder)){if(!r.allowBlank){o.push(r.blankText)}if(!r.validateBlank){return o}u=true}if(!u&&m.lengthr.maxLength){o.push(n(r.maxLengthText,r.maxLength))}if(t){if(!q[t](m,r)){o.push(r.vtypeText||q[t+"Text"])}}if(p&&!p.test(m)){o.push(r.regexText||r.invalidText)}return o},selectText:function(l,k){var m=this,q=m.getRawValue(),p=true,n=m.inputEl.dom,o,j;if(q.length>0){l=l===o?0:l;k=k===o?q.length:k;if(n.setSelectionRange){n.setSelectionRange(l,k)}else{if(n.createTextRange){j=n.createTextRange();j.moveStart("character",l);j.moveEnd("character",k-q.length);j.select()}}p=Ext.isGecko||Ext.isOpera}if(p){m.focus()}},autoSize:function(){var o=this,p,k,r,m,l,q,s,n;if(o.grow&&o.rendered&&o.getSizeModel().width.auto){l=o.inputEl;p=o.getTriggers();m=0;n=Ext.util.Format.htmlEncode(l.dom.value||(o.hasFocus?"":o.emptyText)||"");n+=o.growAppend;for(k in p){m+=p[k].el.getWidth()}s=l.getTextWidth(n)+m+o.inputWrap.getBorderWidth("lr")+o.triggerWrap.getBorderWidth("lr");s=Math.min(Math.max(s,o.growMin),o.growMax);o.bodyEl.setWidth(s);o.updateLayout();o.fireEvent("autosize",o,s)}},onDestroy:function(){var b=this;b.invokeTriggers("destroy");Ext.destroy(b.triggerRepeater);Ext.form.field.Base.prototype.onDestroy.call(this);if(b.inputFocusTask){b.inputFocusTask.cancel();b.inputFocusTask=null}},onTriggerClick:Ext.emptyFn,privates:{getTdType:function(){return"textfield"}},deprecated:{5:{methods:{getTriggerWidth:function(){var d=this.getTriggers(),e=0,f;if(d&&this.rendered){for(f in d){if(d.hasOwnProperty(f)){e+=d[f].el.getWidth()}}}return e}}}}},0,["textfield"],["box","component","field","textfield"],{box:true,component:true,field:true,textfield:true},["widget.textfield"],0,[Ext.form.field,"Text",Ext.form,"TextField",Ext.form,"Text"],0));(Ext.cmd.derive("Ext.resizer.BorderSplitter",Ext.resizer.Splitter,{collapseTarget:null,getTrackerConfig:function(){var b=Ext.resizer.Splitter.prototype.getTrackerConfig.call(this);b.xclass="Ext.resizer.BorderSplitterTracker";return b}},0,["bordersplitter"],["bordersplitter","box","component","splitter"],{bordersplitter:true,box:true,component:true,splitter:true},["widget.bordersplitter"],0,[Ext.resizer,"BorderSplitter"],0));(Ext.cmd.derive("Ext.layout.container.Border",Ext.layout.container.Container,{alternateClassName:"Ext.layout.BorderLayout",targetCls:Ext.baseCSSPrefix+"border-layout-ct",itemCls:[Ext.baseCSSPrefix+"border-item",Ext.baseCSSPrefix+"box-item"],type:"border",isBorderLayout:true,padding:undefined,percentageRe:/(\d+)%/,horzPositionProp:"left",padOnContainerProp:"left",padNotOnContainerProp:"right",axisProps:{horz:{borderBegin:"west",borderEnd:"east",horizontal:true,posProp:"x",sizeProp:"width",sizePropCap:"Width"},vert:{borderBegin:"north",borderEnd:"south",horizontal:false,posProp:"y",sizeProp:"height",sizePropCap:"Height"}},centerRegion:null,manageMargins:true,panelCollapseAnimate:true,panelCollapseMode:"placeholder",regionWeights:{north:20,south:10,center:0,west:-10,east:-20},beginAxis:function(G,P,w){var y=this,O=y.axisProps[w],B=!O.horizontal,H=O.sizeProp,D=0,Q=G.childItems,L=Q.length,z,C,E,K,A,M,I,F,N,x,J;for(C=0;Ch){h=a.weight}}},this);return h},getSplitterTarget:function(c){var d=c.collapseTarget;if(d&&d.collapsed){return d.placeholder||d}return d},isItemBoxParent:function(b){return true},isItemShrinkWrap:function(b){return true},insertSplitter:function(n,o,l,h){var k=n.region,m=Ext.apply({xtype:"bordersplitter",collapseTarget:n,id:n.id+"-splitter",hidden:l,canResize:n.splitterResize!==false,splitterFor:n,synthetic:true},h),j=o+((k==="south"||k==="east")?0:1);if(n.collapseMode==="mini"){m.collapsedCls=n.collapsedCls}n.splitter=this.owner.add(j,m)},getMoveAfterIndex:function(c){var d=Ext.layout.container.Container.prototype.getMoveAfterIndex.apply(this,arguments);if(c.splitter){d++}return d},moveItemBefore:function(e,g){var f=this.owner,h;if(g&&g.splitter){h=g.region;if(h==="south"||h==="east"){g=g.splitter}}return Ext.layout.container.Container.prototype.moveItemBefore.call(this,e,g)},onAdd:function(k,p){var n=this,q=k.placeholderFor,l=k.region,o,m,s,r;Ext.layout.container.Container.prototype.onAdd.apply(this,arguments);if(l){Ext.apply(k,n.regionFlags[l]);if(k.initBorderRegion){k.initBorderRegion()}o=l==="center";if(o){n.centerRegion=k}else{m=k.split;s=!!k.hidden;if(typeof m==="object"){r=m;m=true}if((k.isHorz||k.isVert)&&(m||k.collapseMode=="mini")){n.insertSplitter(k,p,s||!m,r)}}if(!o&&!k.hasOwnProperty("collapseMode")){k.collapseMode=n.panelCollapseMode}if(!k.hasOwnProperty("animCollapse")){if(k.collapseMode!=="placeholder"){k.animCollapse=false}else{k.animCollapse=n.panelCollapseAnimate}}}else{if(q){Ext.apply(k,n.regionFlags[q.region]);k.region=q.region;k.weight=q.weight}}},onDestroy:function(){this.centerRegion=null;Ext.layout.container.Container.prototype.onDestroy.call(this)},onRemove:function(j,p){var o=this,l=j.region,n=j.splitter,k=o.owner,m=k.destroying,q;if(l){if(j.isCenter){o.centerRegion=null}delete j.isCenter;delete j.isHorz;delete j.isVert;if(n&&!k.destroying){k.doRemove(n,true)}delete j.splitter}Ext.layout.container.Container.prototype.onRemove.apply(this,arguments);if(!m&&!p&&j.rendered){q=j.getEl();if(q){q.setStyle("top","");q.setStyle(o.horzPositionProp,"")}}},regionMeta:{center:{splitterDelta:0},north:{splitterDelta:1},south:{splitterDelta:-1},west:{splitterDelta:1},east:{splitterDelta:-1}},regionFlags:{center:{isCenter:true,isHorz:false,isVert:false},north:{isCenter:false,isHorz:false,isVert:true,collapseDirection:"top"},south:{isCenter:false,isHorz:false,isVert:true,collapseDirection:"bottom"},west:{isCenter:false,isHorz:true,isVert:false,collapseDirection:"left"},east:{isCenter:false,isHorz:true,isVert:false,collapseDirection:"right"}},setupSplitterNeighbors:function(r){var j={},w=r.length,p=this.touchedRegions,u,v,A,s,x,t,q,z,y;for(u=0;u style="{bodyStyle}">{%this.renderContainer(out,values)%}',_reverseDockNames:{left:"right",right:"left"},_layoutAlign:{top:"end",right:"begin",bottom:"begin",left:"end"},initComponent:function(){var h=this,g=h.initialConfig.layout,k=g&&g.align,f=g&&g.overflowHandler,j;if(h.plain){h.addCls(h.baseCls+"-plain")}Ext.panel.Bar.prototype.initComponent.call(this);h.setLayout({align:k||(h.getTabStretchMax()?"stretchmax":h._layoutAlign[h.dock]),overflowHandler:f||"scroller"});h.on({click:h.onClick,element:"el",scope:h})},initRenderData:function(){var b=this;return Ext.apply(Ext.panel.Bar.prototype.initRenderData.call(this),{bodyCls:b.bodyCls,baseBodyCls:b._baseBodyCls,bodyTargetCls:b.bodyTargetCls,stripCls:b._stripCls,dock:b.dock})},setDock:function(k){var l=this,j=l.items,o=l.ownerCt,m,h,n;j=j&&j.items;if(j){for(h=0,n=j.length;h1){return(c.previousTab&&c.previousTab!==d&&!c.previousTab.disabled)?c.previousTab:(d.next("tab[disabled=false]")||d.prev("tab[disabled=false]"))}},setActiveTab:function(d,e){var f=this;if(!d.disabled&&d!==f.activeTab){if(f.activeTab){if(f.activeTab.isDestroyed){f.previousTab=null}else{f.previousTab=f.activeTab;f.activeTab.deactivate()}}d.activate();f.activeTab=d;f.needsScroll=true;if(!e){f.fireEvent("change",f,d,d.card);f.updateLayout()}}},privates:{applyTargetCls:function(b){this.bodyTargetCls=b},getTargetEl:function(){return this.body||this.frameBody||this.el},onClick:function(n,o){var p=this,l=p.tabPanel,m,q,e,k;if(n.getTarget("."+Ext.baseCSSPrefix+"box-scroller")){return}if(Ext.isIE8&&p.vertical){k=p.getTabInfoFromPoint(n.getXY());q=k.tab;e=k.close}else{m=n.getTarget("."+Ext.tab.Tab.prototype.baseCls);q=m&&Ext.getCmp(m.id);e=q&&q.closeEl&&(o===q.closeEl.dom)}if(e){n.preventDefault()}if(q&&q.isDisabled&&!q.isDisabled()){if(q.closable&&e){q.onCloseClick()}else{p.doActivateTab(q)}q.afterClick(e)}},doActivateTab:function(d){var c=this.tabPanel;if(c){c.setActiveTab(d.card)}else{this.setActiveTab(d)}},beforeFocusableChildFocus:function(g,h){var e=this,f=e.mixins.focusablecontainer;f.beforeFocusableChildFocus.call(e,g,h);if(!g.active){g.activate()}e.doActivateTab(g)}}},0,["tabbar"],["box","component","container","tabbar"],{box:true,component:true,container:true,tabbar:true},["widget.tabbar"],[[Ext.util.FocusableContainer.prototype.mixinId||Ext.util.FocusableContainer.$className,Ext.util.FocusableContainer]],[Ext.tab,"Bar"],0));(Ext.cmd.derive("Ext.tab.Panel",Ext.panel.Panel,{alternateClassName:["Ext.TabPanel"],config:{tabBar:undefined,tabPosition:"top",tabRotation:"default",tabStretchMax:true},removePanelHeader:true,plain:false,itemCls:Ext.baseCSSPrefix+"tabpanel-child",minTabWidth:undefined,maxTabWidth:undefined,deferredRender:true,_defaultTabRotation:{top:0,right:1,bottom:0,left:2},initComponent:function(){var m=this,s=m.activeTab||(m.activeTab=0),k=m.getTabPosition(),n=m.getTabRotation(),l=m.dockedItems,o=m.header,r=m.tabBarHeaderPosition,q=m.getTabBar(),p;m.layout=new Ext.layout.container.Card(Ext.apply({owner:m,deferredRender:m.deferredRender,itemCls:m.itemCls,activeItem:s},m.layout));if(r!=null){if(!o){o=m.header={}}p=o.items=(o.items?o.items.slice():[]);o.itemPosition=r;p.push(q);o.hasTabBar=true}else{l=[].concat(m.dockedItems||[]);l.push(q);m.dockedItems=l}Ext.panel.Panel.prototype.initComponent.apply(this,arguments);s=m.activeTab=m.getComponent(s);if(s){q.setActiveTab(s.tab,true)}},onRender:function(){var d=this.items.items,e=d.length,f;Ext.panel.Panel.prototype.onRender.apply(this,arguments);for(f=0;f-1}}}}return f}},1,0,0,0,0,0,[Ext.app.domain,"Controller"],0));(Ext.cmd.derive("Ext.container.Monitor",Ext.Base,{target:null,selector:"",scope:null,addHandler:null,removeHandler:null,invalidateHandler:null,disabled:0,constructor:function(b){Ext.apply(this,b)},bind:function(c){var d=this;d.target=c;c.on("beforedestroy",d.disable,d);d.onContainerAdd(c)},unbind:function(){var d=this,c=d.target;if(c){c.un("beforedestroy",d.disable,d)}d.items=null},disable:function(){++this.disabled},enable:function(){if(this.disabled>0){--this.disabled}},handleAdd:function(c,d){if(!this.disabled){if(d.is(this.selector)){this.onItemAdd(d.ownerCt,d)}if(d.isQueryable){this.onContainerAdd(d)}}},onItemAdd:function(k,f){var h=this,g=h.items,j=h.addHandler;if(!h.disabled){if(j){j.call(h.scope||f,f)}if(g){g.add(f)}}},onItemRemove:function(k,f){var h=this,g=h.items,j=h.removeHandler;if(!h.disabled){if(j){j.call(h.scope||f,f)}if(g){g.remove(f)}}},onContainerAdd:function(n,r){var k=this,l,m,q=k.handleAdd,s=k.handleRemove,p,o;if(n.isContainer){n.on("add",q,k);n.on("dockedadd",q,k);n.on("remove",s,k);n.on("dockedremove",s,k)}if(r!==true){l=n.query(k.selector);for(p=0,m=l.length;pcontainer");for(p=0,m=l.length;p[flex]"),x=y.length,E=A==="vertical",z=0,C=E?"width":"height",D=0,s,e;for(;zp+h.left){o=p-n-u;r=true}if((q+s)>t+h.top){q=t-s-u;r=true}if(o name="{name}"',' placeholder="{placeholder}"',' maxlength="{maxLength}"',' readonly="readonly"',' disabled="disabled"',' tabindex="{tabIdx}"',' class="{fieldCls} {typeCls} {typeCls}-{ui} {inputCls}" ',' style="{fieldStyle}"',' autocomplete="off">\n','{[Ext.util.Format.htmlEncode(values.value)]}',"",{disableFormats:true}],growMin:60,growMax:1000,growAppend:"\n-",enterIsSpecial:false,preventScrollbars:false,returnRe:/\r/g,inputCls:Ext.baseCSSPrefix+"form-textarea",extraFieldBodyCls:Ext.baseCSSPrefix+"form-textarea-body",getSubTplData:function(e){var g=this,h=g.getFieldStyle(),f=Ext.form.field.Text.prototype.getSubTplData.apply(this,arguments);if(g.grow){if(g.preventScrollbars){f.fieldStyle=(h||"")+";overflow:hidden;height:"+g.growMin+"px"}}return f},afterRender:function(){var b=this;Ext.form.field.Text.prototype.afterRender.apply(this,arguments);b.needsMaxCheck=b.enforceMaxLength&&b.maxLength!==Number.MAX_VALUE&&!Ext.supports.TextAreaMaxLength;if(b.needsMaxCheck){b.inputEl.on("paste",b.onPaste,b)}},transformRawValue:function(b){return this.stripReturns(b)},getValue:function(){return this.stripReturns(Ext.form.field.Text.prototype.getValue.call(this))},valueToRaw:function(b){b=this.stripReturns(b);return Ext.form.field.Text.prototype.valueToRaw.call(this,b)},stripReturns:function(b){if(b&&typeof b==="string"){b=b.replace(this.returnRe,"")}return b},onPaste:function(){var b=this;if(!b.pasteTask){b.pasteTask=new Ext.util.DelayedTask(b.pasteCheck,b)}b.pasteTask.delay(1)},pasteCheck:function(){var d=this,f=d.getValue(),e=d.maxLength;if(f.length>e){f=f.substr(0,e);d.setValue(f)}},fireKey:function(g){var e=this,f=g.getKey(),h;if(g.isSpecialKey()&&(e.enterIsSpecial||(f!==g.ENTER||g.hasModifier()))){e.fireEvent("specialkey",e,g)}if(e.needsMaxCheck&&f!==g.BACKSPACE&&f!==g.DELETE&&!g.isNavKeyPress()&&!e.isCutCopyPasteSelectAll(g,f)){h=e.getValue();if(h.length>=e.maxLength){g.stopEvent()}}},isCutCopyPasteSelectAll:function(c,d){if(c.ctrlKey){return d===c.A||d===c.C||d===c.V||d===c.X}return false},autoSize:function(){var l=this,j,m,h,g,k;if(l.grow&&l.rendered&&l.getSizeModel().height.auto){j=l.inputEl;g=j.getWidth(true);k=Ext.util.Format.htmlEncode(j.dom.value)||" ";k+=l.growAppend;k=k.replace(/\n/g,"
");h=Ext.util.TextMetrics.measure(j,k,g).height+j.getPadding("tb")+l.inputWrap.getBorderWidth("tb")+l.triggerWrap.getBorderWidth("tb");h=Math.min(Math.max(h,l.growMin),l.growMax);l.bodyEl.setHeight(h);l.updateLayout();l.fireEvent("autosize",l,h)}},beforeDestroy:function(){var b=this.pasteTask;if(b){b.cancel();this.pasteTask=null}Ext.form.field.Text.prototype.beforeDestroy.call(this)}},0,["textarea","textareafield"],["box","component","field","textarea","textareafield","textfield"],{box:true,component:true,field:true,textarea:true,textareafield:true,textfield:true},["widget.textarea","widget.textareafield"],0,[Ext.form.field,"TextArea",Ext.form,"TextArea"],0));(Ext.cmd.derive("Ext.window.MessageBox",Ext.window.Window,{OK:1,YES:2,NO:4,CANCEL:8,OKCANCEL:9,YESNO:6,YESNOCANCEL:14,INFO:Ext.baseCSSPrefix+"message-box-info",WARNING:Ext.baseCSSPrefix+"message-box-warning",QUESTION:Ext.baseCSSPrefix+"message-box-question",ERROR:Ext.baseCSSPrefix+"message-box-error",hideMode:"offsets",closeAction:"hide",resizable:false,autoScroll:true,title:" ",defaultMinWidth:250,defaultMaxWidth:600,defaultMinHeight:110,defaultMaxHeight:500,minWidth:null,maxWidth:null,minHeight:null,maxHeight:null,constrain:true,cls:[Ext.baseCSSPrefix+"message-box",Ext.baseCSSPrefix+"hidden-offsets"],layout:{type:"vbox",align:"stretch"},shrinkWrapDock:true,defaultTextHeight:75,minProgressWidth:250,minPromptWidth:250,buttonText:{ok:"OK",yes:"Yes",no:"No",cancel:"Cancel"},buttonIds:["ok","yes","no","cancel"],titleText:{confirm:"Confirm",prompt:"Prompt",wait:"Loading...",alert:"Attention"},baseIconCls:Ext.baseCSSPrefix+"message-box-icon",ariaRole:"alertdialog",makeButton:function(d){var c=this.buttonIds[d];return new Ext.button.Button({handler:this.btnCallback,itemId:c,scope:this,text:this.buttonText[c],minWidth:75})},btnCallback:function(f){var e=this,h,g;if(e.cfg.prompt||e.cfg.multiline){if(e.cfg.multiline){g=e.textArea}else{g=e.textField}h=g.getValue();g.reset()}e.hide();e.userCallback(f.itemId,h,e.cfg)},hide:function(){var c=this,d=c.cfg?c.cfg.cls:"";c.progressBar.reset();if(d){c.removeCls(d)}Ext.window.Window.prototype.hide.apply(this,arguments)},constructor:function(d){var c=this;Ext.window.Window.prototype.constructor.apply(this,arguments);c.minWidth=c.defaultMinWidth=(c.minWidth||c.defaultMinWidth);c.maxWidth=c.defaultMaxWidth=(c.maxWidth||c.defaultMaxWidth);c.minHeight=c.defaultMinHeight=(c.minHeight||c.defaultMinHeight);c.maxHeight=c.defaultMaxHeight=(c.maxHeight||c.defaultMaxHeight)},initComponent:function(g){var h=this,f=h.id,j,k;h.title=h.title||" ";h.iconCls=h.iconCls||"";h.topContainer=new Ext.container.Container({layout:"hbox",padding:10,style:{overflow:"hidden"},items:[h.iconComponent=new Ext.Component({cls:h.baseIconCls}),h.promptContainer=new Ext.container.Container({flex:1,layout:{type:"vbox",align:"stretch"},items:[h.msg=new Ext.form.field.Display({id:f+"-displayfield",cls:h.baseCls+"-text"}),h.textField=new Ext.form.field.Text({id:f+"-textfield",enableKeyEvents:true,listeners:{keydown:h.onPromptKey,scope:h}}),h.textArea=new Ext.form.field.TextArea({id:f+"-textarea",height:75})]})]});h.progressBar=new Ext.ProgressBar({id:f+"-progressbar",margin:"0 10 10 10"});h.items=[h.topContainer,h.progressBar];h.msgButtons=[];for(j=0;j<4;j++){k=h.makeButton(j);h.msgButtons[k.itemId]=k;h.msgButtons.push(k)}h.bottomTb=new Ext.toolbar.Toolbar({id:f+"-toolbar",ui:"footer",dock:"bottom",layout:{pack:"center"},items:[h.msgButtons[0],h.msgButtons[1],h.msgButtons[2],h.msgButtons[3]]});h.dockedItems=[h.bottomTb];h.on("close",h.onClose,h);Ext.window.Window.prototype.initComponent.call(this)},onClose:function(){var b=this.header.child("[type=close]");b.itemId="cancel";this.btnCallback(b);delete b.itemId},onPromptKey:function(e,f){var d=this;if(f.keyCode===f.RETURN||f.keyCode===10){if(d.msgButtons.ok.isVisible()){d.msgButtons.ok.handler.call(d,d.msgButtons.ok)}else{if(d.msgButtons.yes.isVisible()){d.msgButtons.yes.handler.call(d,d.msgButtons.yes)}}}},reconfigure:function(L){var w=this,z=0,I=true,v=w.buttonText,J=w.resizer,B=w.header,x=B&&!B.isHeader,K=L&&(L.message||L.msg),u,D,G,A,y,H,M,F,C,E;w.updateButtonText();w.cfg=L=L||{};if(L.width){D=L.width}if(L.height){G=L.height}w.minWidth=L.minWidth||w.defaultMinWidth;w.maxWidth=L.maxWidth||w.defaultMaxWidth;w.minHeight=L.minHeight||w.defaultMinHeight;w.maxHeight=L.maxHeight||w.defaultMaxHeight;if(J){u=J.resizeTracker;J.minWidth=u.minWidth=w.minWidth;J.maxWidth=u.maxWidth=w.maxWidth;J.minHeight=u.minHeight=w.minHeight;J.maxHeight=u.maxHeight=w.maxHeight}delete w.defaultFocus;if(L.defaultFocus){w.defaultFocus=L.defaultFocus}w.animateTarget=L.animateTarget||undefined;w.modal=L.modal!==false;w.setTitle(L.title||(x&&B.title)||w.title);w.setIconCls(L.iconCls||(x&&B.iconCls)||w.iconCls);if(Ext.isObject(L.buttons)){w.buttonText=L.buttons;z=0}else{w.buttonText=L.buttonText||w.buttonText;z=Ext.isNumber(L.buttons)?L.buttons:0}z=z|w.updateButtonText();w.buttonText=v;Ext.suspendLayouts();delete w.width;delete w.height;if(D||G){if(D){w.setWidth(D)}if(G){w.setHeight(G)}}w.hidden=false;if(!w.rendered){w.render(Ext.getBody())}w.closable=L.closable!==false&&!L.wait;B=w.header;if(B){B.child("[type=close]").setVisible(w.closable);if(!L.title&&!w.closable&&!L.iconCls){B.hide()}else{B.show()}}w.liveDrag=!L.proxyDrag;w.userCallback=Ext.Function.bindCallback(L.callback||L.fn||Ext.emptyFn,L.scope||Ext.global);w.setIcon(L.icon);M=w.msg;if(K){M.setValue(K);M.show()}else{M.hide()}y=w.textArea;H=w.textField;if(L.prompt||L.multiline){w.multiline=L.multiline;if(L.multiline){y.setValue(L.value);y.setHeight(L.defaultTextHeight||w.defaultTextHeight);y.show();H.hide();w.defaultFocus=y}else{H.setValue(L.value);y.hide();H.show();w.defaultFocus=H}}else{y.hide();H.hide()}F=w.progressBar;if(L.progress||L.wait){F.show();w.updateProgress(0,L.progressText);E=L.wait;if(E===true){L=L.waitConfig}if(E){F.wait(E)}}else{F.hide()}C=w.msgButtons;for(A=0;A<4;A++){if(z&Math.pow(2,A)){if(!w.defaultFocus){w.defaultFocus=C[A]}C[A].show();I=false}else{C[A].hide()}}if(I){w.bottomTb.hide()}else{w.bottomTb.show()}Ext.resumeLayouts(true)},updateButtonText:function(){var j=this,k=j.buttonText,f=0,h,g;for(h in k){if(k.hasOwnProperty(h)){g=j.msgButtons[h];if(g){if(j.cfg&&j.cfg.buttonText){f=f|Math.pow(2,Ext.Array.indexOf(j.buttonIds,h))}if(g.text!=k[h]){g.setText(k[h])}}}}return f},show:function(e){var f=this,d;e=e||{};if(Ext.Component.layoutSuspendCount){Ext.on({resumelayouts:function(){f.show(e)},single:true});return f}f.reconfigure(e);if(e.cls){f.addCls(e.cls)}d=f.query("textfield:not([hidden]),textarea:not([hidden]),button:not([hidden])");f.preventFocusOnActivate=!d.length;f.hidden=true;Ext.window.Window.prototype.show.call(this);return f},onShow:function(){Ext.window.Window.prototype.onShow.apply(this,arguments);this.center()},updateText:function(b){this.msg.setValue(b)},setIcon:function(l,m,h){var k=this,j=k.iconComponent,g=k.messageIconCls;if(g){j.removeCls(g)}if(l){j.show();if(m||h){j.setSize(m||j.getWidth(),h||j.getHeight())}j.addCls(Ext.baseCSSPrefix+"dlg-icon");j.addCls(k.messageIconCls=l)}else{j.removeCls(Ext.baseCSSPrefix+"dlg-icon");j.hide()}return k},updateProgress:function(f,e,d){this.progressBar.updateProgress(f,e);if(d){this.updateText(d)}return this},onEsc:function(){if(this.closable!==false){Ext.window.Window.prototype.onEsc.apply(this,arguments)}},confirm:function(f,g,h,e){if(Ext.isString(f)){f={title:f,icon:this.QUESTION,message:g,buttons:this.YESNO,callback:h,scope:e}}return this.show(f)},prompt:function(j,l,m,g,h,k){if(Ext.isString(j)){j={prompt:true,title:j,minWidth:this.minPromptWidth,message:l,buttons:this.OKCANCEL,callback:m,scope:g,multiline:h,value:k}}return this.show(j)},wait:function(d,f,e){if(Ext.isString(d)){d={title:f,message:d,closable:false,wait:true,modal:true,minWidth:this.minProgressWidth,waitConfig:e}}return this.show(d)},alert:function(g,h,e,f){if(Ext.isString(g)){g={title:g,message:h,buttons:this.OK,fn:e,scope:f,minWidth:this.minWidth}}return this.show(g)},progress:function(f,d,e){if(Ext.isString(f)){f={title:f,message:d,progress:true,progressText:e}}return this.show(f)}},1,["messagebox"],["box","component","container","messagebox","panel","window"],{box:true,component:true,container:true,messagebox:true,panel:true,window:true},["widget.messagebox"],0,[Ext.window,"MessageBox"],function(){Ext.MessageBox=Ext.Msg=new this()}));(Ext.cmd.derive("Ext.form.Basic",Ext.util.Observable,{alternateClassName:"Ext.form.BasicForm",taskDelay:10,constructor:function(e,h){var g=this,f;g.owner=e;g.checkValidityTask=new Ext.util.DelayedTask(g.checkValidity,g);g.checkDirtyTask=new Ext.util.DelayedTask(g.checkDirty,g);g.checkErrorTask=new Ext.util.DelayedTask(g.checkError,g);g.monitor=new Ext.container.Monitor({selector:"[isFormField]:not([excludeForm])",scope:g,addHandler:g.onFieldAdd,removeHandler:g.onFieldRemove,invalidateHandler:g.onMonitorInvalidate});g.monitor.bind(e);Ext.apply(g,h);if(Ext.isString(g.paramOrder)){g.paramOrder=g.paramOrder.split(/[\s,|]/)}f=g.reader;if(f&&!f.isReader){if(typeof f==="string"){f={type:f}}g.reader=Ext.createByAlias("reader."+f.type,f)}f=g.errorReader;if(f&&!f.isReader){if(typeof f==="string"){f={type:f}}g.errorReader=Ext.createByAlias("reader."+f.type,f)}Ext.util.Observable.prototype.constructor.call(this)},initialize:function(){this.initialized=true;this.onValidityChange(!this.hasInvalidField())},timeout:30,paramsAsHash:false,waitTitle:"Please Wait...",trackResetOnLoad:false,wasDirty:false,destroy:function(){var c=this,d=c.monitor;if(d){d.unbind();c.monitor=null}c.clearListeners();c.checkValidityTask.cancel();c.checkDirtyTask.cancel();c.checkErrorTask.cancel();c.checkValidityTask=c.checkDirtyTask=checkErrorTask=null;c.isDestroyed=true},onFieldAdd:function(c){var d=this;d.mon(c,"validitychange",d.checkValidityDelay,d);d.mon(c,"dirtychange",d.checkDirtyDelay,d);d.mon(c,"errorchange",d.checkErrorDelay,d);d.onMonitorInvalidate()},onFieldRemove:function(c){var d=this;d.mun(c,"validitychange",d.checkValidityDelay,d);d.mun(c,"dirtychange",d.checkDirtyDelay,d);d.mun(c,"errorchange",d.checkErrorDelay,d);d.onMonitorInvalidate()},onMonitorInvalidate:function(){if(this.initialized){this.checkValidityDelay()}},getFields:function(){return this.monitor.getItems()},getBoundItems:function(){var b=this._boundItems;if(!b||b.getCount()===0){b=this._boundItems=new Ext.util.MixedCollection();b.addAll(this.owner.query("[formBind]"))}return b},hasInvalidField:function(){return !!this.getFields().findBy(function(f){var e=f.preventMark,d;f.preventMark=true;d=f.isValid();f.preventMark=e;return !d})},isValid:function(){var d=this,c;Ext.suspendLayouts();c=d.getFields().filterBy(function(a){return !a.validate()});Ext.resumeLayouts(true);return c.length<1},checkValidity:function(){var c=this,d;if(c.isDestroyed){return}d=!c.hasInvalidField();if(d!==c.wasValid){c.onValidityChange(d);c.fireEvent("validitychange",c,d);c.wasValid=d}},checkValidityDelay:function(){var b=this.taskDelay;if(b){this.checkValidityTask.delay(b)}else{this.checkValidity()}},checkError:function(){this.fireEvent("errorchange",this)},checkErrorDelay:function(){var b=this.taskDelay;if(b){this.checkErrorTask.delay(b)}else{this.checkError()}},onValidityChange:function(j){var l=this.getBoundItems(),g,m,h,k;if(l){g=l.items;h=g.length;for(m=0;m
',getBodyRenderData:function(){var b=this;return{vertical:b.vertical,upDisabledCls:b.upEnabled?"":(b.spinnerUpCls+"-disabled"),downDisabledCls:b.downEnabled?"":(b.spinnerDownCls+"-disabled"),spinnerCls:b.spinnerCls,spinnerUpCls:b.spinnerUpCls,spinnerDownCls:b.spinnerDownCls}},getStateEl:function(){return this.spinnerEl},onClick:function(g){var e=this,f=arguments,g=e.clickRepeater?f[1]:f[0],h=e.field;if(!h.readOnly&&!h.disabled){if(e.upEl.contains(g.target)){Ext.callback(e.upHandler,e.scope,[h,e,g],0,h)}else{if(e.downEl.contains(g.target)){Ext.callback(e.downHandler,e.scope,[h,e,g],0,h)}}}h.inputEl.focus()},onFieldRender:function(){var e=this,f=e.vertical,g,h;Ext.form.trigger.Trigger.prototype.onFieldRender.call(this);g=e.spinnerEl=e.el.select("."+e.spinnerCls,true);h=g.elements;e.upEl=f?h[0]:h[1];e.downEl=f?h[1]:h[0]},setUpEnabled:function(b){this.upEl[b?"removeCls":"addCls"](this.spinnerUpCls+"-disabled")},setDownEnabled:function(b){this.downEl[b?"removeCls":"addCls"](this.spinnerDownCls+"-disabled")}},0,0,0,0,["trigger.spinner"],0,[Ext.form.trigger,"Spinner"],0));(Ext.cmd.derive("Ext.form.field.Spinner",Ext.form.field.Text,{alternateClassName:"Ext.form.Spinner",config:{triggers:{spinner:{type:"spinner",upHandler:"onSpinnerUpClick",downHandler:"onSpinnerDownClick",scope:"this"}}},spinUpEnabled:true,spinDownEnabled:true,keyNavEnabled:true,mouseWheelEnabled:true,repeatTriggerClick:true,onSpinUp:Ext.emptyFn,onSpinDown:Ext.emptyFn,ariaRole:"spinbutton",applyTriggers:function(d){var f=this,e=d.spinner;e.upEnabled=f.spinUpEnabled;e.downEnabled=f.spinDownEnabled;return Ext.form.field.Text.prototype.applyTriggers.call(this,d)},onRender:function(){var c=this,d=c.getTrigger("spinner");Ext.form.field.Text.prototype.onRender.call(this);if(c.keyNavEnabled){c.spinnerKeyNav=new Ext.util.KeyNav(c.inputEl,{scope:c,up:c.spinUp,down:c.spinDown})}if(c.mouseWheelEnabled){c.mon(c.bodyEl,"mousewheel",c.onMouseWheel,c)}c.spinUpEl=d.upEl;c.spinDownEl=d.downEl},onSpinnerUpClick:function(){this.spinUp()},onSpinnerDownClick:function(){this.spinDown()},spinUp:function(){var b=this;if(b.spinUpEnabled&&!b.disabled){b.fireEvent("spin",b,"up");b.fireEvent("spinup",b);b.onSpinUp()}},spinDown:function(){var b=this;if(b.spinDownEnabled&&!b.disabled){b.fireEvent("spin",b,"down");b.fireEvent("spindown",b);b.onSpinDown()}},setSpinUpEnabled:function(e){var d=this,f=d.spinUpEnabled;d.spinUpEnabled=e;if(f!==e&&d.rendered){d.getTrigger("spinner").setUpEnabled(e)}},setSpinDownEnabled:function(e){var d=this,f=d.spinDownEnabled;d.spinDownEnabled=e;if(f!==e&&d.rendered){d.getTrigger("spinner").setDownEnabled(e)}},onMouseWheel:function(d){var e=this,f;if(e.hasFocus){f=d.getWheelDelta();if(f>0){e.spinUp()}else{if(f<0){e.spinDown()}}d.stopEvent()}},onDestroy:function(){Ext.destroyMembers(this,"spinnerKeyNav");Ext.form.field.Text.prototype.onDestroy.call(this)}},0,["spinnerfield"],["box","component","field","spinnerfield","textfield"],{box:true,component:true,field:true,spinnerfield:true,textfield:true},["widget.spinnerfield"],0,[Ext.form.field,"Spinner",Ext.form,"Spinner"],0));(Ext.cmd.derive("Ext.form.field.Number",Ext.form.field.Spinner,{alternateClassName:["Ext.form.NumberField","Ext.form.Number"],allowExponential:true,allowDecimals:true,decimalSeparator:null,submitLocaleSeparator:true,decimalPrecision:2,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,step:1,minText:"The minimum value for this field is {0}",maxText:"The maximum value for this field is {0}",nanText:"{0} is not a valid number",negativeText:"The value cannot be negative",baseChars:"0123456789",autoStripChars:false,initComponent:function(){var b=this;if(b.decimalSeparator===null){b.decimalSeparator=Ext.util.Format.decimalSeparator}Ext.form.field.Spinner.prototype.initComponent.call(this);b.setMinValue(b.minValue);b.setMaxValue(b.maxValue)},getErrors:function(k){k=arguments.length>0?k:this.processRawValue(this.getRawValue());var f=this,h=Ext.form.field.Spinner.prototype.getErrors.call(this,k),j=Ext.String.format,g;if(k.length<1){return h}k=String(k).replace(f.decimalSeparator,".");if(isNaN(k)){h.push(j(f.nanText,k))}g=f.parseValue(k);if(f.minValue===0&&g<0){h.push(this.negativeText)}else{if(gf.maxValue){h.push(j(f.maxText,f.maxValue))}return h},rawToValue:function(c){var d=this.fixPrecision(this.parseValue(c));if(d===null){d=c||null}return d},valueToRaw:function(f){var d=this,e=d.decimalSeparator;f=d.parseValue(f);f=d.fixPrecision(f);f=Ext.isNumber(f)?f:parseFloat(String(f).replace(e,"."));f=isNaN(f)?"":String(f).replace(".",e);return f},getSubmitValue:function(){var d=this,c=Ext.form.field.Spinner.prototype.getSubmitValue.call(this);if(!d.submitLocaleSeparator){c=c.replace(d.decimalSeparator,".")}return c},onChange:function(){this.toggleSpinners();Ext.form.field.Spinner.prototype.onChange.apply(this,arguments)},toggleSpinners:function(){var h=this,g=h.getValue(),e=g===null,f;if(h.spinUpEnabled||h.spinUpDisabledByToggle){f=e||gh.minValue;h.setSpinDownEnabled(f,true)}},setMinValue:function(d){var e=this,f;e.minValue=Ext.Number.from(d,Number.NEGATIVE_INFINITY);e.toggleSpinners();if(e.disableKeyFilter!==true){f=e.baseChars+"";if(e.allowExponential){f+=e.decimalSeparator+"e+-"}else{if(e.allowDecimals){f+=e.decimalSeparator}if(e.minValue<0){f+="-"}}f=Ext.String.escapeRegex(f);e.maskRe=new RegExp("["+f+"]");if(e.autoStripChars){e.stripCharsRe=new RegExp("[^"+f+"]","gi")}}},setMaxValue:function(b){this.maxValue=Ext.Number.from(b,Number.MAX_VALUE);this.toggleSpinners()},parseValue:function(b){b=parseFloat(String(b).replace(this.decimalSeparator,"."));return isNaN(b)?null:b},fixPrecision:function(g){var h=this,e=isNaN(g),f=h.decimalPrecision;if(e||!g){return e?"":g}else{if(!h.allowDecimals||f<=0){f=0}}return parseFloat(Ext.Number.toFixed(parseFloat(g),f))},onBlur:function(f){var d=this,e=d.rawToValue(d.getRawValue());if(!Ext.isEmpty(e)){d.setValue(e)}Ext.form.field.Spinner.prototype.onBlur.call(this,f)},setSpinUpEnabled:function(c,d){Ext.form.field.Spinner.prototype.setSpinUpEnabled.apply(this,arguments);if(!d){delete this.spinUpDisabledByToggle}else{this.spinUpDisabledByToggle=!c}},onSpinUp:function(){var b=this;if(!b.readOnly){b.setSpinValue(Ext.Number.constrain(b.getValue()+b.step,b.minValue,b.maxValue))}},setSpinDownEnabled:function(c,d){Ext.form.field.Spinner.prototype.setSpinDownEnabled.apply(this,arguments);if(!d){delete this.spinDownDisabledByToggle}else{this.spinDownDisabledByToggle=!c}},onSpinDown:function(){var b=this;if(!b.readOnly){b.setSpinValue(Ext.Number.constrain(b.getValue()-b.step,b.minValue,b.maxValue))}},setSpinValue:function(c){var d=this;if(d.enforceMaxLength){if(d.fixPrecision(c).toString().length>d.maxLength){return}}d.setValue(c)}},0,["numberfield"],["box","component","field","numberfield","spinnerfield","textfield"],{box:true,component:true,field:true,numberfield:true,spinnerfield:true,textfield:true},["widget.numberfield"],0,[Ext.form.field,"Number",Ext.form,"NumberField",Ext.form,"Number"],0));(Ext.cmd.derive("Ext.toolbar.Paging",Ext.toolbar.Toolbar,{alternateClassName:"Ext.PagingToolbar",displayInfo:false,prependButtons:false,displayMsg:"Displaying {0} - {1} of {2}",emptyMsg:"No data to display",beforePageText:"Page",afterPageText:"of {0}",firstText:"First Page",prevText:"Previous Page",nextText:"Next Page",lastText:"Last Page",refreshText:"Refresh",inputItemWidth:30,getPagingItems:function(){var c=this,d={scope:c,blur:c.onPagingBlur};d[Ext.supports.SpecialKeyDownRepeat?"keydown":"keypress"]=c.onPagingKeyDown;return[{itemId:"first",tooltip:c.firstText,overflowText:c.firstText,iconCls:Ext.baseCSSPrefix+"tbar-page-first",disabled:true,handler:c.moveFirst,scope:c},{itemId:"prev",tooltip:c.prevText,overflowText:c.prevText,iconCls:Ext.baseCSSPrefix+"tbar-page-prev",disabled:true,handler:c.movePrevious,scope:c},"-",c.beforePageText,{xtype:"numberfield",itemId:"inputItem",name:"inputItem",cls:Ext.baseCSSPrefix+"tbar-page-number",allowDecimals:false,minValue:1,hideTrigger:true,enableKeyEvents:true,keyNavEnabled:false,selectOnFocus:true,submitValue:false,isFormField:false,width:c.inputItemWidth,margin:"-1 2 3 2",listeners:d},{xtype:"tbtext",itemId:"afterTextItem",text:Ext.String.format(c.afterPageText,1)},"-",{itemId:"next",tooltip:c.nextText,overflowText:c.nextText,iconCls:Ext.baseCSSPrefix+"tbar-page-next",disabled:true,handler:c.moveNext,scope:c},{itemId:"last",tooltip:c.lastText,overflowText:c.lastText,iconCls:Ext.baseCSSPrefix+"tbar-page-last",disabled:true,handler:c.moveLast,scope:c},"-",{itemId:"refresh",tooltip:c.refreshText,overflowText:c.refreshText,iconCls:Ext.baseCSSPrefix+"tbar-loading",disabled:c.store.isLoading(),handler:c.doRefresh,scope:c}]},initComponent:function(){var d=this,e=d.items||d.buttons||[],f;d.bindStore(d.store||"ext-empty-store",true);f=d.getPagingItems();if(d.prependButtons){d.items=e.concat(f)}else{d.items=f.concat(e)}delete d.buttons;if(d.displayInfo){d.items.push("->");d.items.push({xtype:"tbtext",itemId:"displayItem"})}Ext.toolbar.Toolbar.prototype.initComponent.call(this)},beforeRender:function(){var b=this;Ext.toolbar.Toolbar.prototype.beforeRender.apply(this,arguments);if(!b.store.isLoading()){b.calledFromRender=true;b.onLoad();delete b.calledFromRender}},updateInfo:function(){var k=this,m=k.child("#displayItem"),h=k.store,g=k.getPageData(),l,j;if(m){l=h.getCount();if(l===0){j=k.emptyMsg}else{j=Ext.String.format(k.displayMsg,g.fromRecord,g.toRecord,g.total)}m.setText(j)}},onLoad:function(){var m=this,p,j,q,k,n,l,o;n=m.store.getCount();l=n===0;if(!l){p=m.getPageData();j=p.currentPage;q=p.pageCount;if(j>q){m.store.loadPage(q);return}k=Ext.String.format(m.afterPageText,isNaN(q)?1:q)}else{j=0;q=0;k=Ext.String.format(m.afterPageText,0)}Ext.suspendLayouts();o=m.child("#afterTextItem");if(o){o.setText(k)}o=m.getInputItem();if(o){o.setDisabled(l).setValue(j)}m.setChildDisabled("#first",j===1||l);m.setChildDisabled("#prev",j===1||l);m.setChildDisabled("#next",j===q||l);m.setChildDisabled("#last",j===q||l);m.setChildDisabled("#refresh",false);m.updateInfo();Ext.resumeLayouts(true);if(!m.calledFromRender){m.fireEvent("change",m,p)}},setChildDisabled:function(e,d){var f=this.child(e);if(f){f.setDisabled(d)}},getPageData:function(){var c=this.store,d=c.getTotalCount();return{total:d,currentPage:c.currentPage,pageCount:Math.ceil(d/c.pageSize),fromRecord:((c.currentPage-1)*c.pageSize)+1,toRecord:Math.min(c.currentPage*c.pageSize,d)}},onLoadError:function(){this.setChildDisabled("#refresh",false)},getInputItem:function(){return this.child("#inputItem")},readPageFromInput:function(e){var h=this.getInputItem(),g=false,f;if(h){f=h.getValue();g=parseInt(f,10);if(!f||isNaN(g)){h.setValue(e.currentPage);return false}}return g},onPagingBlur:function(f){var d=this.getInputItem(),e;if(d){e=this.getPageData().currentPage;d.setValue(e)}},onPagingKeyDown:function(c,d){this.processKeyEvent(c,d)},processKeyEvent:function(k,l){var n=this,e=l.getKey(),o=n.getPageData(),j=l.shiftKey?10:1,m;if(e==l.RETURN){l.stopEvent();m=n.readPageFromInput(o);if(m!==false){m=Math.min(Math.max(1,m),o.pageCount);if(m!==o.currentPage&&n.fireEvent("beforechange",n,m)!==false){n.store.loadPage(m)}}}else{if(e==l.HOME||e==l.END){l.stopEvent();m=e==l.HOME?1:o.pageCount;k.setValue(m)}else{if(e==l.UP||e==l.PAGE_UP||e==l.DOWN||e==l.PAGE_DOWN){l.stopEvent();m=n.readPageFromInput(o);if(m){if(e==l.DOWN||e==l.PAGE_DOWN){j*=-1}m+=j;if(m>=1&&m<=o.pageCount){k.setValue(m)}}}}}},beforeLoad:function(){this.setChildDisabled("#refresh",true)},moveFirst:function(){if(this.fireEvent("beforechange",this,1)!==false){this.store.loadPage(1);return true}return false},movePrevious:function(){var f=this,e=f.store,d=e.currentPage-1;if(d>0){if(f.fireEvent("beforechange",f,d)!==false){e.previousPage();return true}}return false},moveNext:function(){var g=this,f=g.store,h=g.getPageData().pageCount,e=f.currentPage+1;if(e<=h){if(g.fireEvent("beforechange",g,e)!==false){f.nextPage();return true}}return false},moveLast:function(){var c=this,d=c.getPageData().pageCount;if(c.fireEvent("beforechange",c,d)!==false){c.store.loadPage(d);return true}return false},doRefresh:function(){var d=this,e=d.store,f=e.currentPage;if(d.fireEvent("beforechange",d,f)!==false){e.loadPage(f);return true}return false},getStoreListeners:function(){return{beforeload:this.beforeLoad,load:this.onLoad,exception:this.onLoadError}},onDestroy:function(){this.bindStore(null);Ext.toolbar.Toolbar.prototype.onDestroy.call(this)}},0,["pagingtoolbar"],["box","component","container","pagingtoolbar","toolbar"],{box:true,component:true,container:true,pagingtoolbar:true,toolbar:true},["widget.pagingtoolbar"],[[Ext.util.StoreHolder.prototype.mixinId||Ext.util.StoreHolder.$className,Ext.util.StoreHolder]],[Ext.toolbar,"Paging",Ext,"PagingToolbar"],0));Ext.define("ExtThemeNeptune.toolbar.Paging",{override:"Ext.toolbar.Paging",defaultButtonUI:"plain-toolbar",inputItemWidth:40});(Ext.cmd.derive("Ext.grid.ColumnManager",Ext.Base,{alternateClassName:["Ext.grid.ColumnModel"],columns:null,constructor:function(d,f,e){this.headerCt=f;if(e){this.secondHeaderCt=e}this.visibleOnly=!!d},getColumns:function(){if(!this.columns){this.cacheColumns()}return this.columns},hasVariableRowHeight:function(){var g=this,h=g.getColumns(),f=h.length,e;if(g.variableRowHeight==null){g.variableRowHeight=false;for(e=0;!g.variableRowHeight&&e0){e=this.getColumns()[d-1]}return e},getNextSibling:function(f){var d=this.getHeaderIndex(f),e;if(d!==-1){e=this.getColumns()[d+1]}return e||null},getFirst:function(){var b=this.getColumns();return b.length>0?b[0]:null},getLast:function(){var c=this.getColumns(),d=c.length;return d>0?c[d-1]:null},getHeaderByDataIndex:function(j){var k=this.getColumns(),g=k.length,f,h;for(f=0;f{text} {linkHrefCls}{childElCls}" href="{href}" role="menuitem" target="{hrefTarget}" hidefocus="true" unselectable="on" tabindex="{tabIndex}">{text}',maskOnDisable:false,iconAlign:"left",activate:function(c){var d=this;if(c||(!d.activated&&d.canActivate&&d.rendered&&!d.isDisabled()&&d.isVisible())){if(!d.plain){d.el.addCls(d.activeCls)}d.focus(false,true);d.activated=true;if(d.hasListeners.activate){d.fireEvent("activate",d)}}},deactivate:function(){var c=this,d;if(c.activated){d=c.up("");if(!c.plain){c.el.removeCls(c.activeCls)}if(d){d.focus(false,true)}c.hideMenu();c.activated=false;if(c.hasListeners.deactivate){c.fireEvent("deactivate",c)}}},deferHideMenu:function(){if(this.menu.isVisible()){this.menu.hide()}},cancelDeferHide:function(){clearTimeout(this.hideMenuTimer)},deferHideParentMenus:function(){var b;Ext.menu.Manager.hideAll();if(!Ext.Element.getActiveElement()){b=this.up(":not([hidden])");if(b){b.focus()}}},expandMenu:function(d){var c=this;if(c.menu){c.cancelDeferHide();if(d===0){c.doExpandMenu()}else{clearTimeout(c.expandMenuTimer);c.expandMenuTimer=Ext.defer(c.doExpandMenu,Ext.isNumber(d)?d:c.menuExpandDelay,c)}}},doExpandMenu:function(){var d=this,c=d.menu;if(d.activated&&(!c.rendered||!c.isVisible())){d.parentMenu.activeChild=c;c.ownerCmp=d;c.parentMenu=d.parentMenu;c.constrainTo=document.body;c.showBy(d,d.menuAlign)}},getRefItems:function(e){var f=this.menu,d;if(f){d=f.getRefItems(e);d.unshift(f)}return d||[]},hideMenu:function(d){var c=this;if(c.menu){clearTimeout(c.expandMenuTimer);c.hideMenuTimer=Ext.defer(c.deferHideMenu,Ext.isNumber(d)?d:c.menuHideDelay,c)}},initComponent:function(){var e=this,h=Ext.baseCSSPrefix,f="",g;if(e.plain){f+=h+"menu-item-plain"}if(e.cls){f+=" "+e.cls}e.cls=f;if(e.menu){g=e.menu;delete e.menu;e.setMenu(g)}Ext.Component.prototype.initComponent.apply(this,arguments)},onClick:function(j){var k=this,e=k.clickHideDelay,h=j.browserEvent,g;if(!k.href||k.disabled){j.stopEvent()}if(k.disabled||k.handlingClick){return}if(k.hideOnClick&&j.browserEvent.type!=="touchcancel"&&!(j.type==="tap"&&k.menu)){if(!e){k.deferHideParentMenus()}else{k.deferHideParentMenusTimer=Ext.defer(k.deferHideParentMenus,e,k)}}Ext.callback(k.handler,k.scope,[k,j],0,k);k.fireEvent("click",k,j);if(Ext.isIE9m){g=(h.returnValue===false)?true:false}else{g=!!h.defaultPrevented}if(k.href&&j.type!=="click"&&!g){k.handlingClick=true;k.itemEl.dom.click();delete k.handlingClick}if(!k.hideOnClick){k.focus()}},onRemoved:function(){var b=this;if(b.activated&&b.parentMenu.activeItem===b){b.parentMenu.deactivateActiveItem()}Ext.Component.prototype.onRemoved.apply(this,arguments);b.parentMenu=b.ownerCmp=null},beforeDestroy:function(){var b=this;if(b.rendered){b.clearTip()}Ext.Component.prototype.beforeDestroy.call(this)},onDestroy:function(){var b=this;clearTimeout(b.expandMenuTimer);b.cancelDeferHide();clearTimeout(b.deferHideParentMenusTimer);b.setMenu(null);Ext.Component.prototype.onDestroy.apply(this,arguments)},beforeRender:function(){var o=this,n=o.glyph,p=Ext._glyphFontFamily,s=!!(o.icon||o.iconCls||n),m=!!o.menu,r=((o.iconAlign==="right")&&!m),u=o.isMenuCheckItem,w=[],t=o.ownerCt,q=t.plain,v;Ext.Component.prototype.beforeRender.call(this);if(s){if(m&&o.showCheckbox){s=false}}if(typeof n==="string"){v=n.split("@");n=v[0];p=v[1]}if(!q||(s&&!r)||u){if(t.showSeparator&&!q){w.push(o.indentCls)}else{w.push(o.indentNoSeparatorCls)}}if(m){w.push(o.indentRightArrowCls)}else{if(s&&(r||u)){w.push(o.indentRightIconCls)}}Ext.applyIf(o.renderData,{hasHref:!!o.href,href:o.href||"#",hrefTarget:o.hrefTarget,icon:o.icon,iconCls:o.iconCls,glyph:n,glyphCls:n?Ext.baseCSSPrefix+"menu-item-glyph":undefined,glyphFontFamily:p,hasIcon:s,hasMenu:m,indent:!q||s||u,isCheckItem:u,rightIcon:r,plain:o.plain,text:o.text,arrowCls:o.arrowCls,baseIconCls:o.baseIconCls,textCls:o.textCls,indentCls:w.join(" "),linkCls:o.linkCls,linkHrefCls:o.linkHrefCls,groupCls:o.group?o.groupCls:"",tabIndex:o.tabIndex})},onRender:function(){var b=this;Ext.Component.prototype.onRender.apply(this,arguments);if(b.tooltip){b.setTooltip(b.tooltip,true)}},setMenu:function(h,j){var k=this,f=k.menu,g=k.arrowEl;if(f){f.ownerCmp=f.parentMenu=null;if(j===true||(j!==false&&k.destroyMenu)){Ext.destroy(f)}}if(h){h=k.menu=Ext.menu.Manager.get(h,{ownerCmp:k});h.ownerCmp=k}else{h=k.menu=null}if(h&&k.rendered&&!k.destroying&&g){g[h?"addCls":"removeCls"](k.arrowCls)}},setHandler:function(c,d){this.handler=c||null;this.scope=d},setIcon:function(d){var e=this.iconEl,f=this.icon;if(e){e.src=d||Ext.BLANK_IMAGE_URL}this.icon=d;this.fireEvent("iconchange",this,f,d)},setIconCls:function(e){var g=this,f=g.iconEl,h=g.iconCls;if(f){if(g.iconCls){f.removeCls(g.iconCls)}if(e){f.addCls(e)}}g.iconCls=e;g.fireEvent("iconchange",g,h,e)},setText:function(g){var h=this,e=h.textEl||h.el,f=h.text;h.text=g;if(h.rendered){e.setHtml(g||"");h.ownerCt.updateLayout()}h.fireEvent("textchange",h,f,g)},getTipAttr:function(){return this.tooltipType=="qtip"?"data-qtip":"title"},clearTip:function(){if(Ext.quickTipsActive&&Ext.isObject(this.tooltip)){Ext.tip.QuickTipManager.unregister(this.itemEl)}},setTooltip:function(f,e){var d=this;if(d.rendered){if(!e){d.clearTip()}if(Ext.quickTipsActive&&Ext.isObject(f)){Ext.tip.QuickTipManager.register(Ext.apply({target:d.itemEl.id},f));d.tooltip=f}else{d.itemEl.dom.setAttribute(d.getTipAttr(),f)}}else{d.tooltip=f}return d},privates:{getFocusEl:function(){return this.itemEl}}},0,["menuitem"],["box","component","menuitem"],{box:true,component:true,menuitem:true},["widget.menuitem"],[[Ext.mixin.Queryable.prototype.mixinId||Ext.mixin.Queryable.$className,Ext.mixin.Queryable]],[Ext.menu,"Item",Ext.menu,"TextItem"],0));(Ext.cmd.derive("Ext.menu.CheckItem",Ext.menu.Item,{checkedCls:Ext.baseCSSPrefix+"menu-item-checked",uncheckedCls:Ext.baseCSSPrefix+"menu-item-unchecked",groupCls:Ext.baseCSSPrefix+"menu-group-icon",hideOnClick:false,checkChangeDisabled:false,ariaRole:"menuitemcheckbox",childEls:["checkEl"],showCheckbox:true,isMenuCheckItem:true,checkboxCls:Ext.baseCSSPrefix+"menu-item-checkbox",initComponent:function(){var b=this;b.checked=!!b.checked;Ext.menu.Item.prototype.initComponent.apply(this,arguments);Ext.menu.Manager.registerCheckable(b);if(b.group){if(b.initialConfig.hideOnClick!==false){b.hideOnClick=true}}},beforeRender:function(){var b=this;Ext.menu.Item.prototype.beforeRender.call(this);Ext.apply(b.renderData,{checkboxCls:b.checkboxCls,showCheckbox:b.showCheckbox})},afterRender:function(){var b=this;Ext.menu.Item.prototype.afterRender.call(this);b.checked=!b.checked;b.setChecked(!b.checked,true);if(b.checkChangeDisabled){b.disableCheckChange()}},disableCheckChange:function(){var c=this,d=c.checkEl;if(d){d.addCls(c.disabledCls)}if(Ext.isIE8&&c.rendered){c.el.repaint()}c.checkChangeDisabled=true},enableCheckChange:function(){var c=this,d=c.checkEl;if(d){d.removeCls(c.disabledCls)}c.checkChangeDisabled=false},onClick:function(c){var d=this;if(!d.disabled&&!d.checkChangeDisabled&&!(d.checked&&d.group)){d.setChecked(!d.checked)}Ext.menu.Item.prototype.onClick.call(this,c)},onDestroy:function(){Ext.menu.Manager.unregisterCheckable(this);Ext.menu.Item.prototype.onDestroy.apply(this,arguments)},setChecked:function(l,g){var m=this,k=m.checkedCls,j=m.uncheckedCls,h=m.el;if(m.checked!==l&&(g||m.fireEvent("beforecheckchange",m,l)!==false)){if(h){if(l){h.addCls(k);h.removeCls(j)}else{h.addCls(j);h.removeCls(k)}}m.checked=l;Ext.menu.Manager.onCheckChange(m,l);if(!g){Ext.callback(m.checkHandler,m.scope||m,[m,l]);m.fireEvent("checkchange",m,l)}}}},0,["menucheckitem"],["box","component","menucheckitem","menuitem"],{box:true,component:true,menucheckitem:true,menuitem:true},["widget.menucheckitem"],0,[Ext.menu,"CheckItem"],0));(Ext.cmd.derive("Ext.menu.KeyNav",Ext.util.KeyNav,{constructor:function(d){var c=this;c.menu=d.target;Ext.util.KeyNav.prototype.constructor.call(this,Ext.apply({down:c.down,enter:c.enter,esc:c.escape,left:c.left,right:c.right,space:c.enter,tab:c.tab,up:c.up},d))},down:function(d){var e=this,f=e.menu.focusedItem;if(f&&d.getKey()==d.DOWN&&e.isWhitelisted(f)){return true}e.focusNextItem(1)},enter:function(d){var f=this.menu,e=f.focusedItem;if(f.activeItem){f.onClick(d)}else{if(e&&e.isFormField){return true}}},escape:function(b){Ext.menu.Manager.hideAll()},focusNextItem:function(r){var s=this.menu,o=s.items,m=s.focusedItem,n=m?o.indexOf(m):-1,l=n+r,p=o.length,q=0,k;while(q=p){l=0}}k=o.getAt(l);if(s.canActivateItem(k)){s.setActiveItem(k);break}l+=r;++q}},isWhitelisted:function(b){return !!b.needArrowKeys},left:function(e){var d=this.menu,f=d.focusedItem;if(f&&this.isWhitelisted(f)){return true}if(d.parentMenu){d.hide();d.parentMenu.focus()}},right:function(k){var j=this.menu,h=j.focusedItem,g=j.activeItem,e;if(h&&this.isWhitelisted(h)){return true}if(g){e=j.activeItem.menu;if(e){g.expandMenu(0);e.setActiveItem(e.child(":focusable"))}}},tab:function(c){var d=this;if(c.shiftKey){d.up(c)}else{d.down(c)}},up:function(d){var e=this,f=e.menu.focusedItem;if(f&&d.getKey()==d.UP&&e.isWhitelisted(f)){return true}e.focusNextItem(-1)}},1,0,0,0,0,0,[Ext.menu,"KeyNav"],0));(Ext.cmd.derive("Ext.menu.Separator",Ext.menu.Item,{focusable:false,canActivate:false,hideOnClick:false,plain:true,separatorCls:Ext.baseCSSPrefix+"menu-item-separator",text:" ",ariaRole:"separator",beforeRender:function(e,f){var d=this;Ext.menu.Item.prototype.beforeRender.call(this);d.addCls(d.separatorCls)}},0,["menuseparator"],["box","component","menuitem","menuseparator"],{box:true,component:true,menuitem:true,menuseparator:true},["widget.menuseparator"],0,[Ext.menu,"Separator"],0));(Ext.cmd.derive("Ext.menu.Menu",Ext.panel.Panel,{enableKeyNav:true,allowOtherMenus:false,ariaRole:"menu",floating:true,constrain:true,hidden:true,hideMode:"visibility",ignoreParentClicks:false,isMenu:true,showSeparator:true,minWidth:undefined,defaultMinWidth:120,defaultAlign:"tl-bl?",focusable:true,baseCls:Ext.baseCSSPrefix+"menu",_iconSeparatorCls:Ext.baseCSSPrefix+"menu-icon-separator",_itemCmpCls:Ext.baseCSSPrefix+"menu-item-cmp",layout:{type:"vbox",align:"stretchmax",overflowHandler:"Scroller"},initComponent:function(){var e=this,f=[Ext.baseCSSPrefix+"menu"],h=e.bodyCls?[e.bodyCls]:[],g=e.floating!==false;Ext.menu.Manager.register(e);if(e.plain){f.push(Ext.baseCSSPrefix+"menu-plain")}e.cls=f.join(" ");h.push(Ext.baseCSSPrefix+"menu-body",Ext.dom.Element.unselectableCls);e.bodyCls=h.join(" ");if(g){if(e.minWidth===undefined){e.minWidth=e.defaultMinWidth}}else{e.hidden=!!e.initialConfig.hidden;e.constrain=false}Ext.panel.Panel.prototype.initComponent.apply(this,arguments);Ext.override(e.getLayout(),{configureItem:e.configureItem})},initFloatConstrain:Ext.emptyFn,initHierarchyEvents:Ext.emptyFn,getInherited:function(){var b=Ext.panel.Panel.prototype.getInherited.call(this);b.hidden=this.hidden;return b},beforeRender:function(){Ext.panel.Panel.prototype.beforeRender.apply(this,arguments);if(!this.getSizeModel().width.shrinkWrap){this.layout.align="stretch"}},onBoxReady:function(){var d=this,e={click:d.onClick,mouseover:d.onMouseOver,scope:d},f=d._iconSeparatorCls;if(Ext.supports.Touch){e.pointerdown=d.onMouseOver;d.mon(Ext.GlobalEvents,"mousedown",d.onDocMouseDown,d)}Ext.panel.Panel.prototype.onBoxReady.apply(this,arguments);if(d.showSeparator){d.iconSepEl=d.body.insertFirst({role:"presentation",cls:f+" "+f+"-"+d.ui,html:" "})}d.mon(d.el,e);d.mouseMonitor=d.el.monitorMouseLeave(100,d.onMouseLeave,d);if(d.enableKeyNav){d.keyNav=new Ext.menu.KeyNav({target:d,keyMap:d.getKeyMap()})}},canActivateItem:function(b){return b&&!b.isDisabled()&&b.isVisible()&&(b.canActivate||!b.isMenuItem)},deactivateActiveItem:function(e){var h=this,g=h.activeItem,f=h.focusedItem;if(g){g.deactivate();if(!g.activated){delete h.activeItem}}if(f&&e){f.blur();delete h.focusedItem}},hide:function(){this.deactivateActiveItem(true);Ext.panel.Panel.prototype.hide.apply(this,arguments)},getItemFromEvent:function(g){var f=this,h=f.layout.getRenderTarget().dom,e=g.getTarget();while(e.parentNode!==h){e=e.parentNode;if(!e){return}}return Ext.getCmp(e.id)},lookupComponent:function(c){var d=this;if(typeof c=="string"){c=d.lookupItemFromString(c)}else{if(Ext.isObject(c)){c=d.lookupItemFromObject(c)}}c.minWidth=c.minWidth||d.minWidth;return c},lookupItemFromObject:function(c){var d=this;if(!c.isComponent){if(!c.xtype){c=Ext.create("Ext.menu."+(Ext.isBoolean(c.checked)?"Check":"")+"Item",c)}else{c=Ext.ComponentManager.create(c,c.xtype)}}if(c.isMenuItem){c.parentMenu=d}return c},lookupItemFromString:function(b){return(b=="separator"||b=="-")?new Ext.menu.Separator():new Ext.menu.Item({canActivate:false,hideOnClick:false,plain:true,text:b})},configureItem:function(m){var g=this.owner,k=Ext.baseCSSPrefix,l=g.ui,h,j;if(m.isMenuItem){m.setUI(l)}else{if(g.items.getCount()>1&&!m.rendered&&!m.dock){j=g._itemCmpCls;h=[j+" "+j+"-"+l];if(!g.plain&&(m.indent!==false||m.iconCls==="no-icon")){h.push(k+"menu-item-indent-"+l)}if(m.rendered){m.el.addCls(h)}else{m.cls=(m.cls||"")+" "+h.join(" ")}}}this.callParent(arguments)},onClick:function(g){var h=this,f=g.type,e;if(h.disabled){g.stopEvent();return}e=(f!=="keydown")?h.getItemFromEvent(g):h.activeItem;if(e&&e.isMenuItem){if(!e.menu||!h.ignoreParentClicks){e.onClick(g)}else{g.stopEvent()}}if(!e||e.disabled){e=undefined}h.fireEvent("click",h,e,g)},onDestroy:function(){var b=this;Ext.menu.Manager.unregister(b);b.parentMenu=b.ownerCmp=null;if(b.rendered){b.el.un(b.mouseMonitor);Ext.destroy(b.keyNav);b.keyNav=null}Ext.panel.Panel.prototype.onDestroy.apply(this,arguments)},onDocMouseDown:function(b){if(!this.owns(b.target)){this.deactivateActiveItem()}},onMouseLeave:function(c){var d=this;d.deactivateActiveItem();if(d.disabled){return}d.fireEvent("mouseleave",d,c)},onMouseOver:function(l){var m=this,k=l.getRelatedTarget(),e=!m.el.contains(k),n=m.getItemFromEvent(l),o=m.parentMenu,j=m.ownerCmp;if(e&&o){o.setActiveItem(j);j.cancelDeferHide();o.mouseMonitor.mouseenter()}if(m.disabled){return}if(n&&!n.activated){m.setActiveItem(n);if(n.activated&&n.expandMenu){n.expandMenu()}}if(e){m.fireEvent("mouseenter",m,l)}m.fireEvent("mouseover",m,n,l)},setActiveItem:function(c){var d=this;if(c&&(c!=d.activeItem)){d.deactivateActiveItem();if(d.canActivateItem(c)){if(c.activate){c.activate(true);if(c.activated){d.activeItem=c;d.focusedItem=c}}else{c.focus();d.focusedItem=c}}}},beforeShow:function(){var c=this,d;if(c.floating){c.savedMaxHeight=c.maxHeight;d=c.container.getViewSize().height;c.maxHeight=Math.min(c.maxHeight||d,d)}Ext.panel.Panel.prototype.beforeShow.apply(this,arguments)},afterShow:function(){var b=this;Ext.panel.Panel.prototype.afterShow.apply(this,arguments);if(b.floating){b.maxHeight=b.savedMaxHeight}},privates:{getFocusEl:function(){return this.el}}},0,["menu"],["box","component","container","menu","panel"],{box:true,component:true,container:true,menu:true,panel:true},["widget.menu"],0,[Ext.menu,"Menu"],0));Ext.define("ExtThemeNeptune.menu.Separator",{override:"Ext.menu.Separator",border:true});Ext.define("ExtThemeNeptune.menu.Menu",{override:"Ext.menu.Menu",showSeparator:false});(Ext.cmd.derive("Ext.grid.locking.HeaderContainer",Ext.grid.header.Container,{headerCtRelayEvents:["blur","focus","move","resize","destroy","beforedestroy","boxready","afterrender","render","beforerender","removed","hide","beforehide","show","beforeshow","enable","disable","added","deactivate","beforedeactivate","activate","beforeactivate","remove","add","beforeremove","beforeadd","afterlayout","menucreate","sortchange","columnschanged","columnshow","columnhide","columnmove","headertriggerclick","headercontextmenu","headerclick","columnresize","statesave","beforestatesave","staterestore","beforestaterestore"],constructor:function(e){var f=this,g=e.lockedGrid,h=e.normalGrid;f.lockable=e;Ext.grid.header.Container.prototype.constructor.call(this);g.visibleColumnManager.rootColumns=h.visibleColumnManager.rootColumns=e.visibleColumnManager=f.visibleColumnManager=new Ext.grid.ColumnManager(true,g.headerCt,h.headerCt);g.columnManager.rootColumns=h.columnManager.rootColumns=e.columnManager=f.columnManager=new Ext.grid.ColumnManager(false,g.headerCt,h.headerCt);f.relayEvents(g.headerCt,f.headerCtRelayEvents);f.relayEvents(h.headerCt,f.headerCtRelayEvents)},getRefItems:function(){return this.lockable.lockedGrid.headerCt.getRefItems().concat(this.lockable.normalGrid.headerCt.getRefItems())},getGridColumns:function(){return this.lockable.lockedGrid.headerCt.getGridColumns().concat(this.lockable.normalGrid.headerCt.getGridColumns())},getColumnsState:function(){var d=this,e=d.lockable.lockedGrid.headerCt.getColumnsState(),f=d.lockable.normalGrid.headerCt.getColumnsState();return e.concat(f)},applyColumnsState:function(y){var r=this,A=r.lockable.lockedGrid,z=A.headerCt,t=r.lockable.normalGrid.headerCt,q=Ext.Array.toValueMap(z.items.items,"headerId"),x=Ext.Array.toValueMap(t.items.items,"headerId"),u=[],s=[],v=1,D=y.length,w,E,B,C;for(w=0;w=h){g=Ext.apply({},g);g.column-=h;return this.normalView.getCellInclusive(g,e)}else{return this.lockedView.getCellInclusive(g,e)}},getCellByPosition:function(h,k){var j=this,g=h.view,f=h.column;if(g===j){g=f.getView()}return g.getCellByPosition(h,k)},getRecord:function(c){var d=this.lockedView.getRecord(c);if(!d){d=this.normalView.getRecord(c)}return d},scrollBy:function(){var b=this.normalView;b.scrollBy.apply(b,arguments)},addElListener:function(){this.relayFn("addElListener",arguments)},refreshNode:function(){this.relayFn("refreshNode",arguments)},addRowCls:function(){this.relayFn("addRowCls",arguments)},removeRowCls:function(){this.relayFn("removeRowCls",arguments)},destroy:function(){var b=this;b.bindStore(null,false,"dataSource");b.isDestroyed=true;b.clearListeners();Ext.destroy(b.loadMask,b.navigationModel,b.selModel)}},1,0,0,0,0,[[Ext.util.Observable.prototype.mixinId||Ext.util.Observable.$className,Ext.util.Observable],[Ext.util.StoreHolder.prototype.mixinId||Ext.util.StoreHolder.$className,Ext.util.StoreHolder],[Ext.util.Focusable.prototype.mixinId||Ext.util.Focusable.$className,Ext.util.Focusable]],[Ext.grid.locking,"View",Ext.grid,"LockingView"],function(){this.borrow(Ext.Component,["up"]);this.borrow(Ext.view.AbstractView,["doFirstRefresh","applyFirstRefresh"])}));(Ext.cmd.derive("Ext.grid.locking.Lockable",Ext.Base,{alternateClassName:"Ext.grid.Lockable",supportsOverflowX:"overflow-x" in document.documentElement.style,syncRowHeight:true,headerCounter:0,scrollDelta:40,lockedGridCls:Ext.baseCSSPrefix+"grid-inner-locked",normalGridCls:Ext.baseCSSPrefix+"grid-inner-normal",unlockText:"Unlock",lockText:"Lock",bothCfgCopy:["invalidateScrollerOnRefresh","hideHeaders","enableColumnHide","enableColumnMove","enableColumnResize","sortableColumns","multiColumnSort","columnLines","rowLines","variableRowHeight","numFromEdge","trailingBufferZone","leadingBufferZone","scrollToLoadBuffer"],normalCfgCopy:["verticalScroller","verticalScrollDock","verticalScrollerType","scroll"],lockedCfgCopy:[],determineXTypeToCreate:function(m){var o=this,k,n,h,l,j;if(o.subGridXType){k=o.subGridXType}else{if(!m){return"gridpanel"}n=this.getXTypes().split("/");h=n.length;l=n[h-1];j=n[h-2];if(j!=="tablepanel"){k=j}else{k=l}}return k},injectLockable:function(){this.focusable=false;this.lockable=true;this.hasView=true;var v=this,I=Ext.getScrollbarSize().height,K=v.store=Ext.StoreManager.lookup(v.store),F=v.getSelectionModel(),D,C,x,G,B,L,J,y,H,u,E,w=v.viewConfig,M=w&&w.loadMask,A=(M!==undefined)?M:v.loadMask,z=v.findPlugin("bufferedrenderer");D=v.constructLockableFeatures();v.features=null;C=v.constructLockablePlugins();v.plugins=C.topPlugins;x=Ext.apply({id:v.id+"-locked",isLocked:true,ownerGrid:v,ownerLockable:v,xtype:v.determineXTypeToCreate(true),store:K,bufferedRenderer:v.bufferedRenderer,scrollerOwner:false,animate:false,scroll:I?false:"vertical",selModel:F,border:false,cls:v.lockedGridCls,isLayoutRoot:function(){return this.floatedFromCollapse||v.normalGrid.floatedFromCollapse},features:D.lockedFeatures,plugins:C.lockedPlugins},v.lockedGridConfig);G=Ext.apply({id:v.id+"-normal",isLocked:false,ownerGrid:v,ownerLockable:v,xtype:v.determineXTypeToCreate(),store:K,bufferedRenderer:v.bufferedRenderer,scrollerOwner:false,selModel:F,border:false,cls:v.normalGridCls,isLayoutRoot:function(){return this.floatedFromCollapse||v.lockedGrid.floatedFromCollapse},features:D.normalFeatures,plugins:C.normalPlugins},v.normalGridConfig);v.addCls(Ext.baseCSSPrefix+"grid-locked");Ext.copyTo(G,v,v.bothCfgCopy,true);Ext.copyTo(x,v,v.bothCfgCopy,true);Ext.copyTo(G,v,v.normalCfgCopy,true);Ext.copyTo(x,v,v.lockedCfgCopy,true);for(B=0;B>#normalHeaderCt",items:t},v={itemId:"normalHeaderCt",stretchMaxPartner:"^^>>#lockedHeaderCt",items:A},p={lockedWidth:z.width||0,locked:B,normal:v},q=!(z.width||z.flex),C;if(!r.hasOwnProperty("shrinkWrapLocked")){r.shrinkWrapLocked=q}if(Ext.isObject(x)){Ext.applyIf(B,x);Ext.applyIf(v,x);C=Ext.apply({},x);delete C.items;Ext.apply(s,C);x=x.items}for(w=0,u=x.length;w0&&e)){l.stopEvent();m+=k;q.setScrollY(m);p.normalGrid.getView().setScrollY(m);p.onNormalViewScroll()}}},onLockedViewScroll:function(){var l=this,m=l.lockedGrid.getView(),n=l.normalGrid.getView(),o=m.getScrollY(),k=n.getScrollY(),j,h;if(k!==o){n.setScrollY(o);if(n.bufferedRenderer){h=m.body.dom;j=n.body.dom;j.style.position="absolute";j.style.top=h.style.top}}},onNormalViewScroll:function(){var l=this,m=l.lockedGrid.getView(),g=l.normalGrid.getView(),h=m.getScrollY(),j=g.getScrollY(),k;if(j!==h){m.setScrollY(j);if(g.bufferedRenderer){k=m.body;if(k.dom){k.dom.style.position="absolute";k.translate(null,g.bufferedRenderer.bodyTop)}}}},syncRowHeights:function(){if(!this.isDestroyed){var n=this,k,o=n.lockedGrid.getView(),j=n.normalGrid.getView(),m=o.all.slice(),p=j.all.slice(),q=m.length,l;if(p.length===q){for(k=0;k0){m.onViewResize(h,null,j);if(o&&(l.getCount()!==o.length)){o.length=0;o.push.apply(o,m.store.getRange(l.startIndex,l.endIndex))}}}},onViewResize:function(o,m,j,h,k){var l=this,n;l.tableTopBorderWidth=o.body.getBorderWidth("t");if(!k||j!==k){n=Math.ceil(j/l.rowHeight)+l.trailingBufferZone+l.leadingBufferZone;l.viewSize=l.setViewSize(n);l.viewClientHeight=o.el.dom.clientHeight}},onWrappedColumnWidthChange:function(e,g){var h=this,f=h.view;if(h.store.getCount()&&h.bodyTop){delete h.rowHeight;h.stretchView(f,h.getScrollHeight(true));h.setViewSize(Math.ceil(f.getHeight()/h.rowHeight)+h.trailingBufferZone+h.leadingBufferZone);if(h.viewSize>=h.store.getCount()){h.setBodyTop(0)}else{if(g>e&&h.bodyTop+f.body.dom.offsetHeight-1>h.scrollHeight){h.setBodyTop(Math.max(0,h.scrollHeight-f.body.dom.offsetHeight))}else{if(h.bodyTop>h.scrollTop||h.bodyTop+f.body.dom.offsetHeighth){k.position=k.scrollTop=h-g.body.dom.offsetHeight;k.view.setScrollY(k.scrollTop)}if(k.bodyTop>h){g.body.translate(null,k.bodyTop=k.position)}if(g.touchScroll){if(g.scrollManager){k.refreshScroller(g,h)}else{if(!k.pendingScrollerRefresh){g.on({boxready:function(){k.refreshScroller(g,h);k.pendingScrollerRefresh=false},single:true});k.pendingScrollerRefresh=true}}}if(!Ext.supports.touchScroll||Ext.supports.touchScroll===1){if(!k.stretcher){m=g.getTargetEl();if(g.refreshCounter){g.fixedNodes++}j={style:{width:"1px",height:"1px",marginTop:(h-1)+"px",position:"absolute"}};j.style[k.isRTL?"right":"left"]=0;k.stretcher=m.createChild(j,m.dom.firstChild)}if(k.hasOwnProperty("viewSize")&&l<=k.viewSize){k.stretcher.dom.style.display="none"}else{k.stretcher.dom.style.marginTop=(h-1)+"px";k.stretcher.dom.style.display=""}}},refreshScroller:function(c,d){c.scrollManager.scroller.setSize({x:c.headerCt.getTableWidth(),y:d});c.scrollManager.refresh()},setViewSize:function(u){var v=this,r=v.store,t=v.view,j=t.all,C=j.getCount(),E,B,x=v.view.lockingPartner&&v.view.lockingPartner.bufferedRenderer,s=C-u,z,A,D,y,w;if(s){v.scrollTop=v.view.getScrollY();v.viewSize=u;if(r.isBufferedStore){r.setViewSize(u)}if(C){w=r.getCount();E=j.startIndex;B=Math.min(E+u-1,w-1);if(!(E===j.startIndex&&B===j.endIndex)){if(x){x.disable()}if(s<0){if(w>C){r.getRange(j.endIndex+1,B,{callback:function(a,b){y=t.doAdd(a,b);t.fireEvent("itemadd",a,b,y)}})}}else{E=j.endIndex-(s-1);B=j.endIndex;j.removeRange(E,B,true);if(t.hasListeners.itemremove){D=r.getRange(E,B);for(z=B,A=D.length-1;A>=0;--z,--A){t.fireEvent("itemremove",D[A],z,v)}}}if(x){x.enable()}}}}return u},getViewRange:function(){var e=this,h=e.view.all,f=e.store,g=0;if(h.getCount()){g=h.startIndex}else{if(f.isBufferedStore){if(!f.currentPage){f.currentPage=1}g=h.startIndex=(f.currentPage-1)*(f.pageSize||1);f.currentPage=1}}if(f.data.getCount()){return f.getRange(g,g+e.viewSize-1)}else{return[]}},onReplace:function(n,m,t,r){var p=this,o=p.view,l=o.all,u=l.getCount(),q=n.getCount(),s=l.first(true);if(!u||m<=p.getLastVisibleRowIndex()+p.leadingBufferZone||(ut.length)||qp.viewSize){p.setBodyTop(p.bodyTop-s.offsetTop)}}if(q<=p.viewSize){if(p.stretcher){p.setBodyTop(0);p.stretcher.dom.style.display="none"}}else{if(p.bodyTop+o.body.dom.offsetHeight-1>p.scrollHeight){p.setBodyTop(p.scrollHeight-(o.body.dom.offsetHeight-1))}}}}else{p.refreshing=true;p.onViewRefresh(o);p.refreshing=false}},scrollTo:function(y,F,u,s){var B=this,z=B.view,t=z.el.dom,x=B.store,A=x.getCount(),C,H,D,I,v,G,w,E;if((G=z.dataSource.groupingFeature)&&(G.collapsible!==false)){y=Math.min(Math.max(y,0),z.store.getCount()-1);E=z.store.getAt(y);w=G.getGroup(E);if(w.isCollapsed){G.expand(w.getGroupKey());A=x.getCount()}y=G.indexOf(E)}else{y=Math.min(Math.max(y,0),A-1)}C=Math.max(Math.min(y-(Math.floor((B.leadingBufferZone+B.trailingBufferZone)/2)),A-B.viewSize+1),0);v=Math.max(C*B.rowHeight-B.tableTopBorderWidth,0);H=Math.min(C+B.viewSize-1,A-1);x.getRange(C,H,{callback:function(b,a,c){B.renderRange(a,c,true);D=x.data.getRange(y,y+1)[0];I=z.getNode(D);z.body.translate(null,B.bodyTop=v);B.position=B.scrollTop=v=Math.min(Math.max(0,v-z.body.getOffsetsTo(I)[1]),t.scrollHeight-t.clientHeight);z.setScrollY(v);if(Ext.isIE){z.setScrollY(v)}if(F){z.selModel.select(D)}if(u){u.call(s||B,y,D)}}})},onViewScroll:function(){var n=this,q=n.store,k=(q.getCount()),o,l,m=n.scrollTop=n.view.getScrollY(),j=false,p=n.view.lockingPartner&&n.view.lockingPartner.bufferedRenderer;if(!(n.disabled||k0?1:-1;if(Math.abs(o)>=20||(l!==n.lastScrollDirection)){n.lastScrollDirection=l;j=n.handleViewScroll(n.lastScrollDirection)}}if(!j){if(p&&p.scrollTop!==m){p.view.setScrollY(p.position=m)}}},handleViewScroll:function(m){var o=this,n=o.view.all,k=o.store,l=o.viewSize,q=(k.getCount())-1,p,j;if(m===-1){if(n.startIndex){if(o.topOfViewCloseToEdge()){p=Math.max(0,o.getLastVisibleRowIndex()+o.trailingBufferZone-l)}}}else{if(n.endIndexb.scrollTop-(b.numFromEdge*b.rowHeight)}else{return(b.getFirstVisibleRowIndex()-b.view.all.startIndex)n.viewSize){k=m-n.viewSize+1}j.getRange(k,m,{callback:n.doRefreshView,scope:n,containedFocus:o})},doRefreshView:function(s,p,t,n){var r=this,q=r.view,w=q.getNavigationModel(),o=q.all,x=o.getCount(),u,y=p!==o.startIndex,v;if(q.refreshCounter){q.refreshing=r.refreshing=true;q.clearViewEl(true);if(s.length){u=q.doAdd(s,p);q.refreshSize(o.getCount()!==x);if(y){if(p>o.startIndex){v+=o.item(p,true).offsetTop}else{if(r.variableRowHeight){v=r.scrollTop-r.rowHeight*(r.scrollTopD.endIndex){v=D.startIndex-H;C.clearViewEl(true);w=C.doAdd(B,H);C.fireEvent("itemadd",B,H,w);for(y=0;yD.endIndex||ID.endIndex){G=Math.max(H-D.startIndex,0);if(z){u=D.item(D.startIndex+G,true).offsetTop}D.scroll(Ext.Array.slice(B,D.endIndex+1-H),1,G,H,I);if(z){F=t.bodyTop+u}else{F=x}}else{G=Math.max(D.endIndex-I,0);K=D.startIndex;D.scroll(Ext.Array.slice(B,0,D.startIndex-H),-1,G,H,I);if(z){F=t.bodyTop-D.item(K,true).offsetTop;if(!D.startIndex){if(F){C.setScrollY(t.position=(t.scrollTop-=F));F=0}}else{if(F<0){u=D.startIndex*t.rowHeight;C.setScrollY(t.position=(t.scrollTop+=u));F=t.bodyTop+u}}}else{F=x}}}t.position=t.scrollTop;F=Math.max(Math.floor(F),0);if(C.positionBody){t.setBodyTop(F)}if(E&&!E.disabled&&!A){E.onRangeFetched(null,H,I,J,true);if(E.bodyTop!==F){E.setBodyTop(F)}if(E.scrollTop!==t.scrollTop){E.view.setScrollY(E.scrollTop=E.position=t.scrollTop)}}},setBodyTop:function(j){var h=this,f=h.view,k=h.store,g=f.body;g.translate((h.isRTL&&Ext.supports.xOriginBug&&f.scrollFlags.y)?Ext.getScrollbarSize().width:null,h.bodyTop=j);if(h.variableRowHeight){if(f.all.endIndex===(k.getCount())-1){h.stretchView(f,h.bodyTop+g.dom.offsetHeight-1)}else{if(h.bodyTop+g.dom.offsetHeight-1>h.scrollHeight){h.stretchView(f,h.scrollHeight+=((k.getCount())-f.all.endIndex)*h.rowHeight)}}}},getFirstVisibleRowIndex:function(p,w,x,t){var s=this,r=s.view,n=r.all,y=n.elements,v=s.viewClientHeight,u,o,q=s.bodyTop;if(n.getCount()&&s.variableRowHeight){if(!arguments.length){p=n.startIndex;w=n.endIndex;x=s.scrollTop;t=x+v;if(q>t||q+r.body.dom.offsetHeightv||r+s.body.dom.offsetHeightv){return t.getLastVisibleRowIndex(q,w-1,z,v)}u=p+A[w].offsetHeight;if(u>=v){return w}else{if(w!==y){return t.getLastVisibleRowIndex(w+1,y,z,v)}}}return t.getFirstVisibleRowIndex()+Math.ceil(x/t.rowHeight)},getScrollHeight:function(n){var m=this,k=m.view,l=k.all,q=m.store,p=q.getCount(),j,o;if(!p){return 0}if(!m.hasOwnProperty("rowHeight")){if(j=l.getCount()){m.rowHeight=m.variableRowHeight?Math.floor(k.body.dom.clientHeight/j):l.first(true).offsetHeight}}o=Math.floor(p*m.rowHeight);if(!n){if(o&&(l.endIndex===p-1)){o=Math.max(o,m.bodyTop+k.body.dom.offsetHeight-1)}}return m.scrollHeight=o},attemptLoad:function(f,e){var d=this;if(d.scrollToLoadBuffer){if(!d.loadTask){d.loadTask=new Ext.util.DelayedTask(d.doAttemptLoad,d,[])}d.loadTask.delay(d.scrollToLoadBuffer,d.doAttemptLoad,d,[f,e])}else{d.store.getRange(f,e,{callback:d.onRangeFetched,scope:d,fireEvent:false})}},cancelLoad:function(){if(this.loadTask){this.loadTask.cancel()}},doAttemptLoad:function(c,d){this.store.getRange(c,d,{callback:this.onRangeFetched,scope:this,fireEvent:false})},destroy:function(){var c=this,d=c.view;if(d&&d.el){d.un("scroll",c.onViewScroll,c)}Ext.destroy(c.viewListeners,c.storeListeners,c.gridListeners)}},0,0,0,0,["plugin.bufferedrenderer"],0,[Ext.grid.plugin,"BufferedRenderer"],function(b){if(Ext.supports.Touch){b.prototype.leadingBufferZone=b.prototype.trailingBufferZone=2;b.prototype.numFromEdge=1}}));(Ext.cmd.derive("Ext.layout.ClassList",Ext.Base,(function(){var c=Ext.String.splitWords,d=Ext.Array.toMap;return{dirty:false,constructor:function(a){this.owner=a;this.map=d(this.classes=c(a.el.className))},add:function(b){var a=this;if(!a.map[b]){a.map[b]=true;a.classes.push(b);if(!a.dirty){a.dirty=true;a.owner.markDirty()}}},addMany:function(a){Ext.each(c(a),this.add,this)},contains:function(a){return this.map[a]},flush:function(){this.owner.el.className=this.classes.join(" ");this.dirty=false},remove:function(b){var a=this;if(a.map[b]){delete a.map[b];a.classes=Ext.Array.filter(a.classes,function(f){return f!=b});if(!a.dirty){a.dirty=true;a.owner.markDirty()}}},removeMany:function(b){var a=this,f=d(c(b));a.classes=Ext.Array.filter(a.classes,function(e){if(!f[e]){return true}delete a.map[e];if(!a.dirty){a.dirty=true;a.owner.markDirty()}return false})}}}()),1,0,0,0,0,0,[Ext.layout,"ClassList"],0));(Ext.cmd.derive("Ext.util.Queue",Ext.Base,{constructor:function(){this.clear()},add:function(f){var d=this,e=d.getKey(f);if(!d.map[e]){++d.length;d.items.push(f);d.map[e]=f}return f},clear:function(){var c=this,d=c.items;c.items=[];c.map={};c.length=0;return d},contains:function(c){var d=this.getKey(c);return this.map.hasOwnProperty(d)},getCount:function(){return this.length},getKey:function(b){return b.id},remove:function(h){var j=this,k=j.getKey(h),g=j.items,f;if(j.map[k]){f=Ext.Array.indexOf(g,h);Ext.Array.erase(g,f,1);delete j.map[k];--j.length}return h}},1,0,0,0,0,0,[Ext.util,"Queue"],0));(Ext.cmd.derive("Ext.layout.ContextItem",Ext.Base,{heightModel:null,widthModel:null,sizeModel:null,optOut:false,ownerSizePolicy:null,boxChildren:null,boxParent:null,children:[],dirty:null,dirtyCount:0,hasRawContent:true,isContextItem:true,isTopLevel:false,consumersContentHeight:0,consumersContentWidth:0,consumersContainerHeight:0,consumersContainerWidth:0,consumersHeight:0,consumersWidth:0,ownerCtContext:null,remainingChildDimensions:0,props:null,state:null,wrapsComponent:false,constructor:function(w){var v=this,y=Ext.layout.SizeModel.sizeModels,D=y.configured,E=y.shrinkWrap,L,x,A,B,H,J,u,I,z,C,K,F,G,M;Ext.apply(v,w);L=v.el;v.id=L.id;v.flushedProps={};v.props=H={};v.styles={};u=v.target;if(!u.isComponent){x=L.lastBox}else{v.wrapsComponent=true;v.framing=u.frameSize||null;v.isComponentChild=u.ownerLayout&&u.ownerLayout.isComponentLayout;x=u.lastBox;A=u.ownerCt;if(A&&(B=A.el&&v.context.items[A.el.id])){v.ownerCtContext=B}v.sizeModel=J=u.getSizeModel(B&&B.widthModel.pairsByHeightOrdinal[B.heightModel.ordinal]);v.widthModel=F=J.width;v.heightModel=G=J.height;if(x&&x.invalid===false){C=(u.width===(I=x.width));K=(u.height===(z=x.height));if(F===E&&G===E){M=true}else{if(F===D&&C){M=G===E||(G===D&&K)}}if(M){v.optOut=true;H.width=I;H.height=z}}}v.lastBox=x},init:function(H,M){var y=this,O=y.props,L=y.dirty,F=y.ownerCtContext,C=y.target.ownerLayout,I=!y.state,x=H||I,K,D,E,B,N,w,n=y.heightModel,J=y.widthModel,G,A,z=0;y.dirty=y.invalid=false;y.props={};y.remainingChildDimensions=0;if(y.boxChildren){y.boxChildren.length=0}if(!I){y.clearAllBlocks("blocks");y.clearAllBlocks("domBlocks")}if(!y.wrapsComponent){return x}w=y.target;y.state={};if(I){if(w.beforeLayout&&w.beforeLayout!==Ext.emptyFn){w.beforeLayout()}if(!F&&(B=w.ownerCt)){F=y.context.items[B.el.id]}if(F){y.ownerCtContext=F;y.isBoxParent=C&&C.isItemBoxParent(y)}else{y.isTopLevel=true}y.frameBodyContext=y.getEl("frameBody")}else{F=y.ownerCtContext;y.isTopLevel=!F;K=y.children;for(D=0,E=K.length;D0);if(H){y.widthModel=y.heightModel=null;N=w.getSizeModel(F&&F.widthModel.pairsByHeightOrdinal[F.heightModel.ordinal]);if(I){y.sizeModel=N}y.widthModel=N.width;y.heightModel=N.height;if(F&&!y.isComponentChild){if(C.needsItemSize||!w.liquidLayout){F.remainingChildDimensions+=2}else{if(y.widthModel.calculated){++F.remainingChildDimensions}if(y.heightModel.calculated){++F.remainingChildDimensions}}}}else{if(O){y.recoverProp("x",O,L);y.recoverProp("y",O,L);if(y.widthModel.calculated){y.recoverProp("width",O,L)}else{if("width" in O){++z}}if(y.heightModel.calculated){y.recoverProp("height",O,L)}else{if("height" in O){++z}}if(F&&!y.isComponentChild){F.remainingChildDimensions+=z}}}if(O&&C&&C.manageMargins){y.recoverProp("margin-top",O,L);y.recoverProp("margin-right",O,L);y.recoverProp("margin-bottom",O,L);y.recoverProp("margin-left",O,L)}if(M){G=M.heightModel;A=M.widthModel;if(A&&G&&J&&n){if(J.shrinkWrap&&n.shrinkWrap){if(A.constrainedMax&&G.constrainedMin){G=null}}}if(A){y.widthModel=A}if(G){y.heightModel=G}if(M.state){Ext.apply(y.state,M.state)}}return x},initContinue:function(m){var k=this,n=k.ownerCtContext,j=k.target,o=k.widthModel,l=j.getInherited(),h;if(o.fixed){l.inShrinkWrapTable=false}else{delete l.inShrinkWrapTable}if(m){if(n&&o.shrinkWrap){h=n.isBoxParent?n:n.boxParent;if(h){h.addBoxChild(k)}}else{if(o.natural){k.boxParent=n}}}return m},initDone:function(g){var e=this,f=e.props,h=e.state;if(e.remainingChildDimensions===0){f.containerChildrenSizeDone=true}if(g){f.containerLayoutDone=true}if(e.boxChildren&&e.boxChildren.length&&e.widthModel.shrinkWrap){e.el.setWidth(10000);h.blocks=(h.blocks||0)+1}},initAnimation:function(){var d=this,f=d.target,e=d.ownerCtContext;if(e&&e.isTopLevel){d.animatePolicy=f.ownerLayout.getAnimatePolicy(d)}else{if(!e&&f.isCollapsingOrExpanding&&f.animCollapse){d.animatePolicy=f.componentLayout.getAnimatePolicy(d)}}if(d.animatePolicy){d.context.queueAnimation(d)}},addCls:function(b){this.getClassList().addMany(b)},removeCls:function(b){this.getClassList().removeMany(b)},addBlock:function(g,l,k){var m=this,j=m[g]||(m[g]={}),h=j[k]||(j[k]={});if(!h[l.id]){h[l.id]=l;++l.blockCount;++m.context.blockCount}},addBoxChild:function(g){var h=this,e,f=g.widthModel;g.boxParent=this;g.measuresBox=f.shrinkWrap?g.hasRawContent:f.natural;if(g.measuresBox){e=h.boxChildren;if(e){e.push(g)}else{h.boxChildren=[g]}}},addPositionStyles:function(j,f){var g=f.x,h=f.y,k=0;if(g!==undefined){j.left=g+"px";++k}if(h!==undefined){j.top=h+"px";++k}return k},addTrigger:function(n,m){var o=this,k=m?"domTriggers":"triggers",l=o[k]||(o[k]={}),j=o.context,p=j.currentLayout,q=l[n]||(l[n]={});if(!q[p.id]){q[p.id]=p;++p.triggerCount;q=j.triggers[m?"dom":"data"];(q[p.id]||(q[p.id]=[])).push({item:this,prop:n});if(o.props[n]!==undefined){if(!m||!(o.dirty&&(n in o.dirty))){++p.firedTriggers}}}},boxChildMeasured:function(){var d=this,f=d.state,e=(f.boxesMeasured=(f.boxesMeasured||0)+1);if(e==d.boxChildren.length){f.clearBoxWidth=1;++d.context.progressCount;d.markDirty()}},borderNames:["border-top-width","border-right-width","border-bottom-width","border-left-width"],marginNames:["margin-top","margin-right","margin-bottom","margin-left"],paddingNames:["padding-top","padding-right","padding-bottom","padding-left"],trblNames:["top","right","bottom","left"],cacheMissHandlers:{borderInfo:function(d){var c=d.getStyles(d.borderNames,d.trblNames);c.width=c.left+c.right;c.height=c.top+c.bottom;return c},marginInfo:function(d){var c=d.getStyles(d.marginNames,d.trblNames);c.width=c.left+c.right;c.height=c.top+c.bottom;return c},paddingInfo:function(d){var e=d.frameBodyContext||d,f=e.getStyles(d.paddingNames,d.trblNames);f.width=f.left+f.right;f.height=f.top+f.bottom;return f}},checkCache:function(b){return this.cacheMissHandlers[b](this)},clearAllBlocks:function(e){var f=this[e],d;if(f){for(d in f){this.clearBlocks(e,d)}}},clearBlocks:function(o,l){var k=this[o],h=k&&k[l],n,m,j;if(h){delete k[l];n=this.context;for(j in h){m=h[j];--n.blockCount;if(!--m.blockCount&&!m.pending&&!m.done){n.queueLayout(m)}}}},block:function(d,c){this.addBlock("blocks",d,c)},domBlock:function(d,c){this.addBlock("domBlocks",d,c)},fireTriggers:function(h,l){var k=this[h],n=k&&k[l],o=this.context,m,j;if(n){for(j in n){m=n[j];++m.firedTriggers;if(!m.done&&!m.blockCount&&!m.pending){o.queueLayout(m)}}}},flush:function(){var e=this,f=e.dirty,h=e.state,g=e.el;e.dirtyCount=0;if(e.classList&&e.classList.dirty){e.classList.flush()}if("attributes" in e){g.set(e.attributes);delete e.attributes}if("innerHTML" in e){g.innerHTML=e.innerHTML;delete e.innerHTML}if(h&&h.clearBoxWidth){h.clearBoxWidth=0;e.el.setStyle("width",null);if(!--h.blocks){e.context.queueItemLayouts(e)}}if(f){delete e.dirty;e.writeProps(f,true)}},flushAnimations:function(){var j=this,y=j.previousSize,r,p,w,u,v,x,t,q,s,A,z;if(y){r=j.target;p=r.getAnimationProps();w=p.duration;u=Ext.Object.getKeys(j.animatePolicy);v=Ext.apply({},{from:{},to:{},duration:w||Ext.fx.Anim.prototype.duration},p);for(x=0,t=0,q=u.length;t0},runLayout:function(d){var e=this,f=e.getCmp(d.owner);d.pending=false;if(f.state.blocks){return}d.done=true;++d.calcCount;++e.calcCount;d.calculate(f);if(d.done){e.layoutDone(d);if(d.completeLayout){e.queueCompletion(d)}if(d.finalizeLayout){e.queueFinalize(d)}}else{if(!d.pending&&!d.invalid&&!(d.blockCount+d.triggerCount-d.firedTriggers)){e.queueLayout(d)}}},setItemSize:function(k,l,h){var n=k,j=1,o,m;if(k.isComposite){n=k.elements;j=n.length;k=n[0]}else{if(!k.dom&&!k.el){j=n.length;k=n[0]}}for(m=0;m> flushInvalidates")}var b=this.callParent(arguments);if(this.logOn.flushInvalidate){Ext.log("<< flushInvalidates")}return b},getCmp:function(c){var d=this.callParent(arguments);if(!d.wrapsComponent){Ext.Error.raise({msg:c.id+" is not a component"})}return d},getEl:function(d,f){var e=this.callParent(arguments);if(e&&e.wrapsComponent){Ext.Error.raise({msg:d.id+"/"+f.id+" is a component (expected element)"})}return e},getLayoutName:function(b){return b.owner.id+"<"+b.type+">"},layoutDone:function(f){var d=this,e=d.getLayoutName(f);if(d.logOn.layoutDone){Ext.log("layoutDone: ",e," ( ",d.remainingLayouts," running)")}if(!f.running){Ext.Error.raise({msg:e+" is already done"})}if(!d.remainingLayouts){Ext.Error.raise({msg:e+" finished but no layouts are running"})}d.callParent(arguments)},layoutTreeHasFailures:function(j,g){var k=this;function h(b){var d=!b.done,c,a;if(b.done){for(c in k.layouts){if(k.layouts.hasOwnProperty(c)){a=k.layouts[c];if(a.owner.ownerLayout===b){if(h(a)){d=true}}}}}return d}if(h(j)){return true}function f(b){var c,a;g[b.id]=1;for(c in k.layouts){if(k.layouts.hasOwnProperty(c)){a=k.layouts[c];if(a.owner.ownerLayout===b){f(a)}}}}f(j);return false},queueLayout:function(b){if(b.done||b.blockCount||b.pending){Ext.Error.raise({msg:this.getLayoutName(b)+" should not be queued for layout"})}if(this.logOn.queueLayout){Ext.log("Queue ",this.getLayoutName(b))}return this.callParent(arguments)},reportLayoutResult:function(x,q){var v=this,E=x.owner,B=v.getCmp(E),z=[],y=[],s,t,A,D,u,r,w,C;q[x.id]=1;for(s in x.blockedBy){if(x.blockedBy.hasOwnProperty(s)){z.push(x.blockedBy[s])}}z.sort();for(s in v.triggersByLayoutId[x.id]){if(v.triggersByLayoutId[x.id].hasOwnProperty(s)){t=v.triggersByLayoutId[x.id][s];y.push({name:s,info:t})}}y.sort(function(a,b){return a.name ",F[B].id)}}}}if(z){Ext.log("----------------- SUCCESS -----------------")}else{Ext.log({level:"error"},"----------------- FAILURE -----------------")}for(s in v.layouts){if(v.layouts.hasOwnProperty(s)){A=v.layouts[s];if(A.running){Ext.log.error("Layout left running: ",v.getLayoutName(A))}if(A.ownerContext){Ext.log.error("Layout left connected: ",v.getLayoutName(A))}}}if(!z||v.reportOnSuccess){n={};w=0;for(s in v.layouts){if(v.layouts.hasOwnProperty(s)){A=v.layouts[s];if(v.items[A.owner.el.id].isTopLevel){if(v.reportOnSuccess||v.layoutTreeHasFailures(A,n)){v.reportLayoutResult(A,n)}}}}for(s in v.layouts){if(v.layouts.hasOwnProperty(s)){A=v.layouts[s];if(!n[A.id]){if(!w){Ext.log("----- Unreported!! -----")}++w;v.reportLayoutResult(A,n)}}}}Ext.log("Cycles: ",v.cycleCount,", Flushes: ",v.flushCount,", Calculates: ",v.calcCount," in ",v.round(D)," msec");Ext.log("Calculates by type:");G=[];for(s in v.numByType){if(v.numByType.hasOwnProperty(s)){u=v.numByType[s];G.push({type:s,total:u,calcs:v.calcsByType[s],multiple:Math.round(v.calcsByType[s]/u*10)/10,calcTime:v.round(v.timesByType[s]),avgCalcTime:v.round(v.timesByType[s]/v.calcsByType[s])})}}G.sort(function(a,b){return b.calcTime-a.calcTime});x=G.length;for(B=0;B>> Cycle ",this.cycleCount," (queue length: ",this.layoutQueue.length,")")}return this.callParent(arguments)},runLayout:function(m){var n=this,o=m.type,j=n.accumByType[o],k,h,l;if(n.logOn.calculate){Ext.log("-- calculate ",this.getLayoutName(m))}k=j&&j.enter();l=Ext.perf.getTimestamp();h=n.callParent(arguments);l=Ext.perf.getTimestamp()-l;if(j){k.leave()}n.calcsByType[o]=(n.calcsByType[o]||0)+1;n.timesByType[o]=(n.timesByType[o]||0)+l;return h}}},1,0,0,0,0,0,[Ext.layout,"Context"],0));(Ext.cmd.derive("Ext.plugin.Manager",Ext.Base,{alternateClassName:["Ext.PluginManager","Ext.PluginMgr"],singleton:true,typeName:"ptype",create:function(f,h,j){var g,k;if(f.init){g=f}else{if(j){f=Ext.apply({},f);f.cmp=j}else{j=f.cmp}if(f.xclass){g=Ext.create(f)}else{k="plugin."+(f.ptype||h);g=Ext.ClassManager.instantiateByAlias(k,f)}}if(g&&j&&g.setCmp&&!g.setCmpCalled){g.setCmp(j);g.setCmpCalled=true}return g}},0,0,0,0,0,0,[Ext.plugin,"Manager",Ext,"PluginManager",Ext,"PluginMgr"],0));(Ext.cmd.derive("Ext.resizer.BorderSplitterTracker",Ext.resizer.SplitterTracker,{getPrevCmp:null,getNextCmp:null,calculateConstrainRegion:function(){var z=this,W=z.splitter,K=W.collapseTarget,T=W.defaultSplitMin,Q=W.vertical?"Width":"Height",U="min"+Q,D="max"+Q,P="get"+Q,E=W.neighbors,S=E.length,L=K.el.getBox(),R=L.x,J=L.y,A=L.right,O=L.bottom,H=W.vertical?(A-R):(O-J),B,N,G,M,C,F,I,V;M=(K[U]||Math.min(H,T))-H;C=K[D];if(!C){C=1000000000}else{C-=H}V=H;for(B=0;BI){C=I}}if(C-M<2){return null}L=new Ext.util.Region(J,A,O,R);z.constraintAdjusters[z.getCollapseDirection()](L,M,C,W);z.dragInfo={minRange:M,maxRange:C,targetSize:V};return L},constraintAdjusters:{left:function(h,f,e,g){h[0]=h.x=h.left=h.right+f;h.right+=e+g.getWidth()},top:function(h,f,e,g){h[1]=h.y=h.top=h.bottom+f;h.bottom+=e+g.getHeight()},bottom:function(h,f,e,g){h.bottom=h.top-f;h.top-=e+g.getHeight()},right:function(h,f,e,g){h.right=h.left-f;h[0]=h.x=h.left=h.x-e+g.getWidth()}},onBeforeStart:function(l){var o=this,n=o.splitter,p=n.collapseTarget,e=n.neighbors,q=e.length,k,m;if(p.collapsed){return false}for(k=0;kk){j.minWidth=j.el.getWidth()*g}else{j.minHeight=j.el.getHeight()*k}}if(j.throttle){h=Ext.Function.createThrottled(function(){Ext.resizer.ResizeTracker.prototype.resize.apply(j,arguments)},j.throttle);j.resize=function(b,a,c){if(c){Ext.resizer.ResizeTracker.prototype.resize.apply(j,arguments)}else{h.apply(null,arguments)}}}},onBeforeStart:function(b){this.startBox=this.target.getBox()},getProxy:function(){var b=this;if(!b.dynamic&&!b.proxy){b.proxy=b.createProxy(b.target||b.el);b.hideProxy=true}if(b.proxy){b.proxy.show();return b.proxy}},createProxy:function(f){var d,e=this.proxyCls;if(f.isComponent){d=f.getProxy().addCls(e)}else{d=f.createProxy({tag:"div",role:"presentation",cls:e,id:f.id+"-rzproxy"},Ext.getBody())}d.removeCls(Ext.baseCSSPrefix+"proxy-el");return d},onStart:function(b){this.activeResizeHandle=Ext.get(this.getDragTarget().id);if(!this.dynamic){this.resize(this.startBox)}},onDrag:function(b){if(this.dynamic||this.proxy){this.updateDimensions(b)}},updateDimensions:function(y,C){var x=this,K=x.activeResizeHandle.region,I=x.getOffset(x.constrainTo?"dragTarget":null),E=x.startBox,H,A=0,w=0,F,z,M=0,e=0,v,G,L,J,B,D;K=x.convertRegionName(K);switch(K){case"south":w=I[1];L=2;break;case"north":w=-I[1];e=-w;L=2;break;case"east":A=I[0];L=1;break;case"west":A=-I[0];M=-A;L=1;break;case"northeast":w=-I[1];e=-w;A=I[0];G=[E.x,E.y+E.height];L=3;break;case"southeast":w=I[1];A=I[0];G=[E.x,E.y];L=3;break;case"southwest":A=-I[0];M=-A;w=I[1];G=[E.x+E.width,E.y];L=3;break;case"northwest":w=-I[1];e=-w;A=-I[0];M=-A;G=[E.x+E.width,E.y+E.height];L=3;break}J={width:E.width+A,height:E.height+w,x:E.x+M,y:E.y+e};F=Ext.Number.snap(J.width,x.widthIncrement);z=Ext.Number.snap(J.height,x.heightIncrement);if(F!=J.width||z!=J.height){switch(K){case"northeast":J.y-=z-J.height;break;case"north":J.y-=z-J.height;break;case"southwest":J.x-=F-J.width;break;case"west":J.x-=F-J.width;break;case"northwest":J.x-=F-J.width;J.y-=z-J.height}J.width=F;J.height=z}if(J.widthx.maxWidth){J.width=Ext.Number.constrain(J.width,x.minWidth,x.maxWidth);if(M){J.x=E.x+(E.width-J.width)}}else{x.lastX=J.x}if(J.heightx.maxHeight){J.height=Ext.Number.constrain(J.height,x.minHeight,x.maxHeight);if(e){J.y=E.y+(E.height-J.height)}}else{x.lastY=J.y}if(x.preserveRatio||y.shiftKey){H=x.startBox.width/x.startBox.height;B=Math.min(Math.max(x.minHeight,J.width/H),x.maxHeight);D=Math.min(Math.max(x.minWidth,J.height*H),x.maxWidth);if(L==1){J.height=B}else{if(L==2){J.width=D}else{v=Math.abs(G[0]-this.lastXY[0])/Math.abs(G[1]-this.lastXY[1]);if(v>H){J.height=B}else{J.width=D}if(K=="northeast"){J.y=E.y-(J.height-E.height)}else{if(K=="northwest"){J.y=E.y-(J.height-E.height);J.x=E.x-(J.width-E.width)}else{if(K=="southwest"){J.x=E.x-(J.width-E.width)}}}}}}x.setPosition=J.x!==x.startBox.x||J.y!==x.startBox.y;x.resize(J,C)},resize:function(j,g){var k=this,h,f=k.setPosition;if(k.dynamic||(!k.dynamic&&g)){if(f){k.target.setBox(j)}else{k.target.setSize(j.width,j.height)}}if(!g){h=k.getProxy();if(h&&h!==k.target){if(f||k.hideProxy){h.setBox(j)}else{h.setSize(j.width,j.height)}}}},onEnd:function(b){this.updateDimensions(b,true);if(this.proxy&&this.hideProxy){this.proxy.hide()}},convertRegionName:function(b){return b}},1,0,0,0,0,0,[Ext.resizer,"ResizeTracker"],0));(Ext.cmd.derive("Ext.resizer.Resizer",Ext.Base,{alternateClassName:"Ext.Resizable",handleCls:Ext.baseCSSPrefix+"resizable-handle",overCls:Ext.baseCSSPrefix+"resizable-handle-over",pinnedCls:Ext.baseCSSPrefix+"resizable-pinned",wrapCls:Ext.baseCSSPrefix+"resizable-wrap",wrappedCls:Ext.baseCSSPrefix+"resizable-wrapped",delimiterRe:/(?:\s*[,;]\s*)|\s+/,dynamic:true,handles:"s e se",height:null,width:null,heightIncrement:0,widthIncrement:0,minHeight:20,minWidth:20,maxHeight:10000,maxWidth:10000,pinned:false,preserveRatio:false,transparent:false,possiblePositions:{n:"north",s:"south",e:"east",w:"west",se:"southeast",sw:"southwest",nw:"northwest",ne:"northeast"},ariaRole:"presentation",constructor:function(H){var z=this,u=z.handles,A=Ext.dom.Element.unselectableCls,w=[],v,G,x,s,C,E,y,I,D,F,t,B;if(Ext.isString(H)||Ext.isElement(H)||H.dom){v=H;H=arguments[1]||{};H.target=v}z.mixins.observable.constructor.call(z,H);v=z.target;if(v){if(v.isComponent){v.addClsWithUI("resizable");if(v.minWidth){z.minWidth=v.minWidth}if(v.minHeight){z.minHeight=v.minHeight}if(v.maxWidth){z.maxWidth=v.maxWidth}if(v.maxHeight){z.maxHeight=v.maxHeight}if(v.floating){if(!z.hasOwnProperty("handles")){z.handles="n ne e se s sw w nw"}}z.el=v.getEl()}else{v=z.el=z.target=Ext.get(v)}}else{v=z.target=z.el=Ext.get(z.el)}z.el.addCls(Ext.Component.prototype.borderBoxCls);if(Ext.isNumber(z.width)){z.width=Ext.Number.constrain(z.width,z.minWidth,z.maxWidth)}if(Ext.isNumber(z.height)){z.height=Ext.Number.constrain(z.height,z.minHeight,z.maxHeight)}if(z.width!==null||z.height!==null){z.target.setSize(z.width,z.height)}s=z.el.dom.tagName.toUpperCase();if(s==="TEXTAREA"||s==="IMG"||s==="TABLE"){z.originalTarget=z.target;F=v.isComponent?v.getEl():v;z.el.addCls(z.wrappedCls);z.target=z.el=z.el.wrap({role:"presentation",cls:z.wrapCls,id:z.el.id+"-rzwrap",style:F.getStyle(["margin-top","margin-bottom"])});t=F.getPositioning();z.el.setPositioning(t);F.clearPositioning();D=F.getBox();if(t.position!="absolute"){D.x=0;D.y=0}z.el.setBox(D);F.setStyle("position","absolute");z.isTargetWrapped=true}z.el.position();if(z.pinned){z.el.addCls(z.pinnedCls)}z.resizeTracker=new Ext.resizer.ResizeTracker({disabled:z.disabled,target:v,el:z.el,constrainTo:z.constrainTo,handleCls:z.handleCls,overCls:z.overCls,throttle:z.throttle,proxy:z.originalTarget?z.el:null,dynamic:z.originalTarget?true:z.dynamic,originalTarget:z.originalTarget,delegate:"."+z.handleCls,preserveRatio:z.preserveRatio,heightIncrement:z.heightIncrement,widthIncrement:z.widthIncrement,minHeight:z.minHeight,maxHeight:z.maxHeight,minWidth:z.minWidth,maxWidth:z.maxWidth});z.resizeTracker.on({mousedown:z.onBeforeResize,drag:z.onResize,dragend:z.onResizeEnd,scope:z});if(z.handles=="all"){z.handles="n s e w ne nw se sw"}u=z.handles=z.handles.split(z.delimiterRe);x=z.possiblePositions;C=u.length;G=z.handleCls+" "+z.handleCls+"-{0}";if(z.target.isComponent){B=z.target.baseCls;G+=" "+B+"-handle "+B+"-handle-{0}";if(Ext.supports.CSS3BorderRadius){G+=" "+B+"-handle-{0}-br"}}for(E=0;E")}}Ext.DomHelper.append(z.el,w.join(""));w.length=0;for(E=0;Eu){z=o(q(s-(s*(p-u)/A),x));w=v+s-z}else{w=o(p/u*v)}}y[t.setPosition](w);y[t.setLength](z)},show:function(){var d=this,e=d.el,f=e.getActiveAnimation();if(f){f.end()}d.refreshLength();e.setStyle("opacity","")},destroy:function(){this.el.destroy()}},1,0,0,0,0,0,[Ext.scroll,"Indicator"],0));(Ext.cmd.derive("Ext.scroll.Manager",Ext.util.Observable,{minIndicatorLength:24,refreshCounter:0,translationMethods:{1:"scrollparent",2:"csstransform"},constructor:function(e){var h=this,f={dragend:"onDragEnd",dragcancel:"onDragEnd",scope:h},g;if(Ext.supports.touchScroll===2){f.mousewheel="onMouseWheel";f.scroll={fn:"onElementScroll",delegated:false,scope:h}}Ext.util.Observable.prototype.constructor.apply(this,arguments);h.scroller=new Ext.scroll.Scroller({autoRefresh:false,element:h.el,direction:h.direction,momentumEasing:{bounce:{springTension:1}},outOfBoundRestrictFactor:0,translatable:{translationMethod:h.translationMethods[Ext.supports.touchScroll]},listeners:{scrollstart:"onScrollStart",scroll:"onScroll",scrollend:"onScrollEnd",scope:h}});Ext.GlobalEvents.on("idle",h.doRefresh,h);g=h.containerEl=h.el.parent();h.owner.mon(g,f);h.initIndicators()},onElementScroll:function(d,c){c.scrollTop=c.scrollLeft=0},destroy:function(){var b=this;b.clearListeners();Ext.GlobalEvents.un("idle",b.doRefresh,b);b.scroller.destroy()},initIndicators:function(){var h=this,g=h.containerEl,f=h.scroller,e=h.minIndicatorLength;if(Ext.supports.touchScroll===2){h.xIndicator=new Ext.scroll.Indicator({axis:"x",scroller:f,containerEl:g,minLength:e});h.yIndicator=new Ext.scroll.Indicator({axis:"y",scroller:f,containerEl:g,minLength:e});h.refreshIndicators()}},invokeIndicators:function(k,l,g){var j=this,h=j.xIndicator,m=j.yIndicator;if(h&&j.isAxisEnabled("x")){h[k].apply(h,l)}if(m&&j.isAxisEnabled("y")){m[k].apply(m,g||l)}},getPosition:function(){return this.scroller.getPosition()},refresh:function(b){++this.refreshCounter;if(b){this.doRefresh()}},refreshIndicators:function(){var h=this,f=h.scroller,g=f.getMaxPosition(),e=f.getSize();h.invokeIndicators("setMaxScrollPosition",[g.x],[g.y]);h.invokeIndicators("setScrollSize",[e.x],[e.y]);h.invokeIndicators("setHasOpposite",[h.isAxisEnabled("y")],[h.isAxisEnabled("x")])},doRefresh:function(){var c=this,d=c.scroller;if(c.refreshCounter){d.refresh();c.refreshIndicators();c.refreshCounter=0}},onScrollStart:function(){this.isTouching=Ext.isScrolling=true;this.invokeIndicators("show");this.toggleOthers(true)},onScroll:function(e,f,g){var h=this;h.invokeIndicators("setValue",[f],[g]);h.fireEvent("scroll",h,f,g)},onScrollEnd:function(){var b=this;Ext.isScrolling=false;if(b.isTouching){return}b.invokeIndicators("hide")},onDragEnd:function(){this.isTouching=false;this.toggleOthers(false)},onMouseWheel:function(r){var q=this,u=q.scroller,e=r.getWheelDeltas(),x=-e.x,z=-e.y,v=u.getPosition(),w=u.getMaxPosition(),A=u.getMinPosition(),p=Math.max,y=Math.min,s=p(y(v.x+x,w.x),A.x),t=p(y(v.y+z,w.y),A.y);x=s-v.x;z=t-v.y;if(!x&&!z){return}r.stopEvent();q.onScrollStart();q.scrollBy(x,z);q.onScroll(u,s,t);q.onScrollEnd(u)},isAxisEnabled:function(b){return this.scroller.isAxisEnabled(b)},setScrollX:function(c){var d=this.scroller;d.scrollTo(c,d.getPosition().y)},setScrollY:function(c){var d=this.scroller;d.scrollTo(d.getPosition().x,c)},scrollTo:function(e,f,d){this.scroller.scrollTo(e,f,d)},scrollBy:function(e,f,d){if(e.length){d=f;f=e[1];e=e[0]}else{if(!Ext.isNumber(e)){d=f;f=e.y;e=e.x}}this.scroller.scrollBy(e,f,d)},scrollIntoView:function(v,u,x){var o=this,p=o.containerEl,q=o.scroller,s=q.getPosition(),t=s.x,w=s.y,r=Ext.fly(v).getScrollIntoViewXY(p,t,w),y=r.x,n=r.y;if(u===false){y=t}if(y!==t||n!==w){q.scrollTo(y,n,x)}},toggleOthers:function(e){var h=Ext.scroll.Scroller.instances,f,g;for(g in h){f=h[g];if(f!==this.scroller){f.setDisabled(e)}}},preventDefault:function(b){if(b.touches.length===1){b.preventDefault()}}},1,0,0,0,0,0,[Ext.scroll,"Manager"],0));(Ext.cmd.derive("Ext.selection.CellModel",Ext.selection.DataViewModel,{isCellModel:true,enableKeyNav:true,preventWrap:false,bindComponent:function(e){var f=this,d=e.grid||e.ownerCt;Ext.selection.DataViewModel.prototype.bindComponent.call(this,e);if(d.optimizedColumnMove!==false){d.on("columnmove",f.onColumnMove,f)}},getViewListeners:function(){var b=this;return{refresh:b.onViewRefresh,scope:b}},getHeaderCt:function(){var c=this.navigationModel.getPosition(),d=c?c.view:this.primaryView;return d.headerCt},onNavigate:function(b){if(!b.record){return}this.setPosition(b.position)},selectWithEvent:function(d,c){this.select(d)},select:function(k,m,h){var n=this,l,o=n.getPosition(),j=n.view.store;if(k||k===0){if(k.isModel){l=j.indexOf(k);if(l!==-1){k={row:l,column:o?o.column:0}}else{k=null}}else{if(typeof k==="number"){k={row:k,column:0}}}}if(k){n.selectByPosition(k,h)}else{n.deselect()}},getCurrentPosition:function(){var b=this.selecting?this.nextSelection:this.selection;return b?{view:b.view,record:b.record,row:b.rowIdx,columnHeader:b.column,column:b.view.getColumnManager().indexOf(b.column)}:b},getPosition:function(){return this.selecting?this.nextSelection:this.selection},setCurrentPosition:function(f,e,d){if(f&&!f.isCellContext){f=new Ext.grid.CellContext(this.view).setPosition({row:f.row,column:typeof f.column==="number"?this.view.getColumnManager().getColumns()[f.column]:f.column})}return this.setPosition(f,e,d)},setPosition:function(h,g,j){var k=this,f=k.selection;if(h){h=h.isCellContext?h.clone():new Ext.grid.CellContext(k.view).setPosition(h)}if(!j&&f){if(h&&(h.record===f.record&&h.column===f.column&&h.view===f.view)){h=null}else{k.onCellDeselect(k.selection,g)}}if(h){k.nextSelection=h;k.selecting=true;k.onCellSelect(k.nextSelection,g);k.selecting=false;return(k.selection=h)}},isCellSelected:function(h,k,m){var l=this,g,j=l.getPosition();if(j&&j.view===h){g=new Ext.grid.CellContext(h).setPosition({row:k,column:typeof m==="number"?h.getColumnManager().getColumns()[m]:m});return(g.record===j.record)&&(g.column===j.column)}},onStoreRemove:function(f,g,j){var k=this,h=k.getPosition();Ext.selection.DataViewModel.prototype.onStoreRemove.apply(this,arguments);if(h&&f.getCount()&&f.indexOf(h.record)!==-1){h.setRow(h.record)}else{k.selection=null}},onStoreClear:function(){Ext.selection.DataViewModel.prototype.onStoreClear.apply(this,arguments);this.selection=null},onStoreAdd:function(){var d=this,c=d.getPosition();Ext.selection.DataViewModel.prototype.onStoreAdd.apply(this,arguments);if(c){c.setRow(c.record)}else{d.selection=null}},onCellClick:function(o,j,m,e,k,n,l){if(n!==-1){this.setPosition(l.position)}},onCellSelect:function(d,c){if(d&&d.rowIdx!==undefined&&d.rowIdx>-1){this.doSelect(d.record,false,c)}},onCellDeselect:function(d,c){if(d&&d.rowIdx!==undefined){this.doDeselect(d.record,c)}},onSelectChange:function(q,r,l,s){var o=this,n,p,m,k;if(r){n=o.nextSelection;p="select"}else{n=o.selection;p="deselect"}m=n.view||o.primaryView;if((l||o.fireEvent("before"+p,o,q,n.rowIdx,n.colIdx))!==false&&s()!==false){if(r){if(!o.preventFocus){k=m.getNavigationModel();if(!n.isEqual(k.getPosition())){k.setPosition(n,null,null,null,true)}}m.onCellSelect(n)}else{m.onCellDeselect(n);delete o.selection}if(!l){o.fireEvent(p,o,q,n.rowIdx,n.colIdx)}}},onEditorTab:function(e,k){var m=this,l=k.shiftKey?"left":"right",j=e.context,h=j.view.walkCells(j,l,k,m.preventWrap);if(h){if(e.startEdit(h.record,h.column)){m.wasEditing=false}else{h.view.getNavigationModel().setPosition(h,null,k);m.wasEditing=true}}},refresh:function(){var c=this.getPosition(),d;if(c&&(d=this.store.indexOf(this.selected.last()))!==-1){c.rowIdx=d}},onColumnMove:function(j,h,f,k){var g=j.up("tablepanel");if(g){this.onViewRefresh(g.view)}},onUpdate:function(e){var d=this,f;if(d.isSelected(e)){f=d.selecting?d.nextSelection:d.selection;d.view.onCellSelect(f)}},onViewRefresh:function(h){var m=this,k=m.getPosition(),o,l=h.headerCt,j,n;if(k&&k.view===h){j=k.record;n=k.column;if(!n.isDescendantOf(l)){n=l.queryById(n.id)||l.down('[text="'+n.text+'"]')||l.down('[dataIndex="'+n.dataIndex+'"]')}if(k.record){if(n&&(h.store.indexOfId(j.getId())!==-1)){o=new Ext.grid.CellContext(h).setPosition({row:j,column:n});m.setPosition(o)}}else{m.selection=null}}},selectByPosition:function(d,c){this.setPosition(d,c)}},0,0,0,0,["selection.cellmodel"],0,[Ext.selection,"CellModel"],0));(Ext.cmd.derive("Ext.selection.CheckboxModel",Ext.selection.RowModel,{mode:"MULTI",injectCheckbox:0,checkOnly:false,showHeaderCheckbox:undefined,checkSelector:"."+Ext.baseCSSPrefix+"grid-row-checker",headerWidth:24,checkerOnCls:Ext.baseCSSPrefix+"grid-hd-checker-on",tdCls:Ext.baseCSSPrefix+"grid-cell-special "+Ext.baseCSSPrefix+"grid-cell-row-checker",constructor:function(){var b=this;Ext.selection.RowModel.prototype.constructor.apply(this,arguments);if(b.mode==="SINGLE"&&b.showHeaderCheckbox!==true){b.showHeaderCheckbox=false}},beforeViewRender:function(d){var f=this,e;Ext.selection.RowModel.prototype.beforeViewRender.apply(this,arguments);if(!f.hasLockedHeader()||d.headerCt.lockedCt){if(f.showHeaderCheckbox!==false){d.headerCt.on("headerclick",f.onHeaderClick,f)}f.addCheckbox(d,true);e=d.ownerCt;if(d.headerCt.lockedCt){e=e.ownerCt}f.mon(e,"reconfigure",f.onReconfigure,f)}},bindComponent:function(d){var c=this;c.sortable=false;Ext.selection.RowModel.prototype.bindComponent.apply(this,arguments)},hasLockedHeader:function(){var e=this.views,f=e.length,d;for(d=0;d '},onSelectChange:function(){Ext.selection.RowModel.prototype.onSelectChange.apply(this,arguments);if(!this.suspendChange){this.updateHeaderState()}},onStoreLoad:function(){Ext.selection.RowModel.prototype.onStoreLoad.apply(this,arguments);this.updateHeaderState()},onStoreAdd:function(){Ext.selection.RowModel.prototype.onStoreAdd.apply(this,arguments);this.updateHeaderState()},onStoreRemove:function(){Ext.selection.RowModel.prototype.onStoreRemove.apply(this,arguments);this.updateHeaderState()},onStoreRefresh:function(){Ext.selection.RowModel.prototype.onStoreRefresh.apply(this,arguments);this.updateHeaderState()},maybeFireSelectionChange:function(b){if(b&&!this.suspendChange){this.updateHeaderState()}Ext.selection.RowModel.prototype.maybeFireSelectionChange.apply(this,arguments)},resumeChanges:function(){Ext.selection.RowModel.prototype.resumeChanges.call(this);if(!this.suspendChange){this.updateHeaderState()}},updateHeaderState:function(){var n=this,m=n.store,o=m.getCount(),l=n.views,k=false,s=0,r,p,q;if(!m.isBufferedStore&&o>0){r=n.selected;k=true;for(q=0,p=r.getCount();q2)?k[2]:null,m=(l>3)?k[3]:"/",p=(l>4)?k[4]:null,n=(l>5)?k[5]:false;document.cookie=q+"="+escape(o)+((j===null)?"":("; expires="+j.toUTCString()))+((m===null)?"":("; path="+m))+((p===null)?"":("; domain="+p))+((n===true)?"; secure":"")},get:function(m){var j=document.cookie.split("; "),h=j.length,k,l,g;for(l=0;lShow All above.",user_no_roles:"No roles are assigned to this user. Select Show All for a list of available roles",user_no_perm:"No permissions are assigned to this user. Select Show All for a list of available permissions",user_role_list:"User roles",user_role_list_for:"User roles for",user_role_add:"Add user to role",user_role_remove:"Remove user from role",user_perm_list:"Application permissions",user_perm_list_for:"Application permissions for",user_perm_add:"Grant user permission",user_perm_remove:"Revoke user permission",user_role_view_all:"Show all roles",user_role_view_selected:"Show only roles for the selected user",user_perm_view_all:"Show all permissions",user_perm_view_selected:"Show only permissions for the selected user",granted_to:"Granted to",grant_role:"Role",grant_user:"User",user_perm_granted_role:"permission granted through role",user_perm_granted_user:"permission granted to user",role_add:"Add role",role_edit:"Edit role",role_delete:"Delete role",role_delete_confirm:"Are you sure you want to delete this role?",role_perm_view_all:"Show all permissions",role_perm_view_selected:"Show only permissions for the selected role",role_perm_for:"Permissions for",role_select:"Select a Role or select Show All above.",role_perm_add:"Add permission to role",role_perm_remove:"Remove permission from role",perm_internal_name:"Internal Name",perm_add:"Add permission",perm_edit:"Edit permission",perm_delete:"Delete permission",perm_delete_confirm:"Are you sure you want to delete this permission?",path_tab_controllers:"Controllers",path_tab_paths:"Paths",controller_methods:"methods",controller_public:"public",controller_private:"private",path_verify:"Verifing application paths",path_refreshing:"Refreshing paths",path_public:"Public",path_private:"Private",path_method:"Method",path_path:"Path",path_access:"Access",path_permission:"Permission",path_permissions:"Permissions",path_set_public:"Make path public",path_set_private:"Make path private",path_set_permission:"Set Permission",path_remove_permission:"Remove Permission",path_delete:"Delete Path",path_not_found_1:"This method was not found in the Controller but a record of it exists in the database.",path_not_found_2:"You may delete the record of this path.",session_username:"Username",session_last_activity:"Last Activity",session_last_page:"Last Page",session_ip_address:"IP Address",session_last_page:"Last Page",session_user_agent:"User Agent",session_view_all:"Show all sessions",session_view_logged_in:"Show only logged in sessions",session_delete:"Delete Session",session_delete_confirm:"Are you sure you want to delete this session?",session_delete_user:"user",dummy:""},1,0,0,0,0,0,[AppuntoAuth.lib.lang,"Default",0,"Lang"],0));(Ext.cmd.derive("AppuntoAuth.lib.util.CustomVTypes",Ext.Base,{singleton:true,constructor:function(){Ext.apply(Ext.form.field.VTypes,{passformat:function(c){var d=new RegExp(pw_regex);return d.test(c)},passformatText:Lang.localize("password_format"),passconfirm:function(f,d){if(d.passField){var e=d.up("form").down("#"+d.passField);return(f==e.getValue())}return false;return true},passconfirmText:Lang.localize("password_match")})}},1,0,0,0,0,0,[AppuntoAuth.lib.util,"CustomVTypes"],0));(Ext.cmd.derive("AppuntoAuth.lib.util.SearchField",Ext.form.field.Text,{triggers:{clear:{weight:0,cls:Ext.baseCSSPrefix+"form-clear-trigger",hidden:true,handler:"onClearClick",scope:"this"},search:{weight:1,cls:Ext.baseCSSPrefix+"form-search-trigger",handler:"onSearchClick",scope:"this"}},hasSearch:false,paramName:"search",initComponent:function(){var f=this,e=f.store,d;Ext.form.field.Text.prototype.initComponent.apply(this,arguments);f.on("specialkey",function(b,a){if(a.getKey()==a.ENTER){f.onSearchClick()}});if(!e||!e.isStore){e=f.store=Ext.data.StoreManager.lookup(e)}e.setRemoteFilter(true);d=f.store.getProxy();d.setFilterParam(f.paramName);d.encodeFilters=function(a){return a[0].getValue()}},onClearClick:function(){var c=this,d=c.activeFilter;if(d){c.setValue("");c.store.getFilters().remove(d);c.activeFilter=null;c.getTrigger("clear").hide();c.updateLayout()}},onSearchClick:function(){var d=this,c=d.getValue();if(c.length>0){d.activeFilter=new Ext.util.Filter({property:d.paramName,value:c});d.store.getFilters().add(d.activeFilter);d.getTrigger("clear").show();d.updateLayout()}}},0,["appunto-searchfield"],["appunto-searchfield","box","component","field","textfield"],{"appunto-searchfield":true,box:true,component:true,field:true,textfield:true},["widget.appunto-searchfield"],0,[AppuntoAuth.lib.util,"SearchField"],0));(Ext.cmd.derive("AppuntoAuth.lib.util.KeepAlive",Ext.Base,{singleton:true,interval:4*60*1000,constructor:function(){if(typeof(admin_keepalive)!="undefined"&&Ext.isNumber(admin_keepalive)&&admin_keepalive>0){this.interval=admin_keepalive*1000}setTimeout(Ext.bind(this.touch),this.interval)},touch:function(){var b=AppuntoAuth.lib.util.KeepAlive;Ext.Ajax.request({url:ci_site_url+"appunto-auth/ui/keep-alive"});setTimeout(Ext.bind(b.touch),b.interval)}},1,0,0,0,0,0,[AppuntoAuth.lib.util,"KeepAlive"],0));(Ext.cmd.derive("AppuntoAuth.view.main.Main",Ext.container.Container,{controller:"main",viewModel:{type:"main"},layout:{type:"border"},items:[{xtype:"container",cls:"app-header",region:"north",height:64,border:0,layout:{type:"hbox",pack:"end"},items:{xtype:"button",text:"logout",action:"logout",cls:"admin-logout-button"}},{xtype:"panel",cls:"app-main",region:"center",layout:"fit",flex:5,border:0,items:[{xtype:"appa-main-frame"}]}]},0,["appa-main"],["appa-main","box","component","container"],{"appa-main":true,box:true,component:true,container:true},["widget.appa-main"],0,[AppuntoAuth.view.main,"Main"],0));(Ext.cmd.derive("AppuntoAuth.view.main.Frame",Ext.tab.Panel,{initComponent:function(){this.items=[{title:Lang.localize("tab_status"),iconCls:"transmit",itemId:"tab-status",xtype:"appa_status_view"},{title:Lang.localize("tab_users"),iconCls:"user",itemId:"tab-users",xtype:"appa_user_frame"},{title:Lang.localize("tab_user_roles"),iconCls:"shield",itemId:"tab-roles",xtype:"appa_role_frame"},{title:Lang.localize("tab_permissions"),iconCls:"lock",itemId:"tab-permissions",xtype:"appa_permission_list"},{title:Lang.localize("tab_paths"),iconCls:"map",itemId:"tab-paths",xtype:"appa_path_frame"},{title:Lang.localize("tab_sessions"),iconCls:"monitor",itemId:"tab-sessions",xtype:"appa_session_list"}];Ext.tab.Panel.prototype.initComponent.apply(this,arguments)}},0,["appa-main-frame"],["appa-main-frame","box","component","container","panel","tabpanel"],{"appa-main-frame":true,box:true,component:true,container:true,panel:true,tabpanel:true},["widget.appa-main-frame"],0,[AppuntoAuth.view.main,"Frame"],0));(Ext.cmd.derive("AppuntoAuth.controller.Navigation",Ext.app.Controller,{views:["main.Main","main.Frame"],refs:[{ref:"tabs",selector:"appa-main-frame"}],config:{routes:{status:"redirStatus",users:"redirUsers",roles:"redirRoles",permissions:"redirPermissions",paths:"redirPaths",sessions:"redirSessions"}},init:function(){this.control({"appa-main-frame":{beforetabchange:this.redirTabClick},'appa-main button[action="logout"]':{click:this.logout}})},logout:function(){location.href=ci_site_url+ci_logout_url},redirTabClick:function(c,d){this.getTabs().clearListeners();this.redirectTo(d.itemId.substr(4));this.getTabs().on("beforetabchange",this.redirTabClick,this)},changeCardSuppressEvent:function(b){this.getTabs().setActiveTab(b)},redirStatus:function(){this.getTabs().setActiveTab("tab-status")},redirUsers:function(){this.getTabs().setActiveTab("tab-users")},redirRoles:function(){this.getTabs().setActiveTab("tab-roles")},redirPermissions:function(){this.getTabs().setActiveTab("tab-permissions")},redirPaths:function(){this.getTabs().setActiveTab("tab-paths")},redirSessions:function(){this.getTabs().setActiveTab("tab-sessions")}},0,0,0,0,0,0,[AppuntoAuth.controller,"Navigation"],0));(Ext.cmd.derive("AppuntoAuth.lib.proxy.CiReader",Ext.data.reader.Json,{getResponseData:function(d){var c=Ext.decode(d.responseText,true);if(c!=null){return c}return this.createReadError("You're trying to decode an invalid JSON String: "+d.responseText)}},0,0,0,0,["reader.ci"],0,[AppuntoAuth.lib.proxy,"CiReader"],0));(Ext.cmd.derive("AppuntoAuth.lib.proxy.CiWriter",Ext.data.writer.Json,{writeRecords:function(h){var f=h.getRecords()[0],e=f.getChanges(),g;h.setParam("id",f.get("id"));for(g in e){h.setParam(g,e[g])}return h}},0,0,0,0,["writer.ci"],0,[AppuntoAuth.lib.proxy,"CiWriter"],0));(Ext.cmd.derive("AppuntoAuth.lib.proxy.Codeigniter",Ext.data.proxy.Ajax,{siteurl:ci_site_url,loginurl:ci_site_url+ci_login_url,csrf_token_name:ci_token,csrf_cookie_name:ci_cookie,config:{ci_class:"",ci_method:""},timeout:30*1000,actionMethods:{create:"POST",read:"POST",update:"POST",destroy:"POST"},reader:{type:"ci",rootProperty:"rows",messageProperty:"msg"},writer:"ci",errors:{server_error_title:"Server error",server_error_unknown:"Unknown error: The server did not send any information about the error.",server_error_no_response:"Unknown error: Server did not send a response.",server_error_decode:"Error decoding the response sent by the server.",server_error_undefined:"Undefined Server Error"},httpError:{400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",408:"Request Timeout",414:"Request-URI Too Long",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",509:"Bandwidth Limit Exceeded",511:"Network Authentication Required"},setCi_methodString:function(b){this.setCi_method(b.getOperation().config.ci_method||b.config.action)},buildUrl:function(b){this.setCi_methodString(b);return this.getSiteurl()+this.getCi_class()+"/"+this.getCi_method()},doRequest:function(b){this.setCSRFParam();Ext.data.proxy.Ajax.prototype.doRequest.apply(this,arguments)},setCSRFParam:function(){var e=this.csrf_token_name,f=this.csrf_cookie_name,d=Ext.util.Cookies.get(f);if(d!=null){this.setExtraParam(e,d)}},listeners:{exception:function(m,k,h){var j,g,l=false;if(k.responseText!=undefined){responseObj=Ext.decode(k.responseText,true);if(responseObj!=null&&responseObj.msg!=undefined){j=(responseObj.errors!=undefined)?"
    "+responseObj.errors+"
":"";g="

"+responseObj.msg+"

"+j;l=(responseObj.err!=undefined)&&(responseObj.err=="LOGIN")?true:false;this.alertError(this.getErrorMsg("server_error_title"),g,l)}else{g=this.getCodeigniterError(k);if((g==null)&&(k.status!=undefined&&this.httpError[k.status]!=undefined)){g='

'+k.status+"

"+this.httpError[k.status]+"

";this.alertError(this.getErrorMsg("server_error_title"),g)}if(g==null){g=this.getErrorMsg("server_error_decode")}this.alertError(this.getErrorMsg("server_error_title"),g)}}else{this.alertError(this.getErrorMsg("server_error_title"),this.getErrorMsg("server_error_no_response"))}}},getCodeigniterError:function(d){var f,e;if(d!=undefined&&d.responseText!=undefined){f=document.createElement("div");f.innerHTML=d.responseText;e=f.getElementsByTagName("div")[0];if(e!=undefined){return e.innerHTML}}return null},alertError:function(h,j,k){var g=this.loginurl,f=function(a){a.up("window").close()};if(k==true){f=function(a){a.up("window").close();location.href=g}}Ext.create("Ext.window.Window",{title:h,iconCls:"exclamation",layout:"fit",modal:true,items:{xtype:"container",style:"padding: 8px",autoScroll:true,html:j,border:0},buttons:[{text:"Ok",handler:f}]}).show()},getErrorMsg:function(b){if((typeof Lang!=="undefined")&&(typeof Lang.localize=="function")&&(Lang.localize(b)!=undefined)){return Lang.localize(b)}else{return this.errors[b]}},getSiteurl:function(){return this.siteurl}},0,0,0,0,["proxy.ci"],0,[AppuntoAuth.lib.proxy,"Codeigniter"],0));(Ext.cmd.derive("AppuntoAuth.model.StatusInfo",Ext.data.Model,{fields:[{name:"info_item",type:"string"},{name:"info_val",type:"string"},{name:"info_note",type:"string"}],proxy:{type:"ci",ci_class:"appunto-auth/ui/statusinfo"}},0,0,0,0,0,0,[AppuntoAuth.model,"StatusInfo"],0));(Ext.cmd.derive("AppuntoAuth.view.status.View",Ext.panel.Panel,{items:[{xtype:"dataview",store:"StatusInfos",viewConfig:{loadMask:{msg:Lang.localize("loading")}},tpl:new Ext.XTemplate('','','',"","",'','',"","","","
{info_item}{info_val}{info_note}
",{noteExists:function(b){return b!=""}}),itemSelector:"div.info-item"}],bbar:[{xtype:"button",text:Lang.localize("refresh"),action:"refresh",iconCls:"x-tbar-loading"}]},0,["appa_status_view"],["appa_status_view","box","component","container","panel"],{appa_status_view:true,box:true,component:true,container:true,panel:true},["widget.appa_status_view"],0,[AppuntoAuth.view.status,"View"],0));Ext.require("Ext.data.Store");Ext.require("AppuntoAuth.model.StatusInfo");(Ext.cmd.derive("AppuntoAuth.store.StatusInfos",Ext.data.Store,{model:"AppuntoAuth.model.StatusInfo",pageSize:0,autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"StatusInfos"],0));(Ext.cmd.derive("AppuntoAuth.controller.Status",Ext.app.Controller,{models:["StatusInfo"],stores:["StatusInfos"],views:["status.View"],refs:[{ref:"statusInfo",selector:"appa_status_view dataview"}],init:function(){this.control({appa_status_view:{activate:this.refreshView},'appa_status_view button[action="refresh"]':{click:this.refreshView}})},refreshView:function(b){this.getStatusInfo().getStore().load()}},0,0,0,0,0,0,[AppuntoAuth.controller,"Status"],0));(Ext.cmd.derive("AppuntoAuth.view.user.PermissionContextMenu",Ext.menu.Menu,{config:{record:null},items:[{text:Lang.localize("user_perm_add"),action:"add",iconCls:"lock-add"},{text:Lang.localize("user_perm_remove"),action:"remove",iconCls:"lock-delete"}]},0,["appa_user_permission_contextmenu"],["appa_user_permission_contextmenu","box","component","container","menu","panel"],{appa_user_permission_contextmenu:true,box:true,component:true,container:true,menu:true,panel:true},["widget.appa_user_permission_contextmenu"],0,[AppuntoAuth.view.user,"PermissionContextMenu"],0));(Ext.cmd.derive("AppuntoAuth.view.user.Add",Ext.window.Window,{title:Lang.localize("user_add"),iconCls:"user-add",layout:"fit",autoShow:true,modal:true,items:[{xtype:"form",baseCls:"x-plain",border:false,bodyStyle:{padding:"10px"},defaults:{width:460,labelWidth:180,blankText:Lang.localize("field_required"),msgTarget:"under"},items:[{name:"username",fieldLabel:Lang.localize("username"),xtype:"textfield",value:"",allowBlank:false},{name:"email",fieldLabel:Lang.localize("email"),xtype:"textfield",value:"",vtype:"email",vtypeText:Lang.localize("email_format"),allowBlank:false},{name:"name",fieldLabel:Lang.localize("name"),xtype:"textfield",value:"",allowBlank:true},{name:"surname",fieldLabel:Lang.localize("surname"),xtype:"textfield",value:"",allowBlank:true},{id:"pass",name:"password",fieldLabel:Lang.localize("password"),xtype:"textfield",value:"",inputType:"password",vtype:"passformat",style:{marginTop:"18px"},allowBlank:false},{name:"password2",fieldLabel:Lang.localize("password_confirm"),xtype:"textfield",value:"",inputType:"password",vtype:"passconfirm",passField:"pass",allowBlank:false},{name:"active",fieldLabel:Lang.localize("user_set_active"),inputValue:"1",uncheckedValue:"0",style:{marginTop:"18px"},xtype:"checkbox",checked:true}]}],buttons:[{text:Lang.localize("save"),action:"save"},{text:Lang.localize("cancel"),handler:function(){this.up(".window").close()}}]},0,["appa_user_add"],["appa_user_add","box","component","container","panel","window"],{appa_user_add:true,box:true,component:true,container:true,panel:true,window:true},["widget.appa_user_add"],0,[AppuntoAuth.view.user,"Add"],0));(Ext.cmd.derive("AppuntoAuth.view.user.RoleContextMenu",Ext.menu.Menu,{config:{record:null},items:[{text:Lang.localize("user_role_add"),action:"add",iconCls:"shield-add"},{text:Lang.localize("user_role_remove"),action:"remove",iconCls:"shield-delete"}]},0,["appa_user_role_contextmenu"],["appa_user_role_contextmenu","box","component","container","menu","panel"],{appa_user_role_contextmenu:true,box:true,component:true,container:true,menu:true,panel:true},["widget.appa_user_role_contextmenu"],0,[AppuntoAuth.view.user,"RoleContextMenu"],0));(Ext.cmd.derive("AppuntoAuth.model.User",Ext.data.Model,{fields:[{name:"id",type:"int"},{name:"username",type:"string"},{name:"name",type:"string"},{name:"surname",type:"string"},{name:"email",type:"string"},{name:"active",type:"int"},{name:"last_login",type:"string"},{name:"created",type:"string"},{name:"modified",type:"string"}],proxy:{type:"ci",ci_class:"appunto-auth/ui/user"}},0,0,0,0,0,0,[AppuntoAuth.model,"User"],0));(Ext.cmd.derive("AppuntoAuth.model.UserRole",Ext.data.Model,{fields:[{name:"id",type:"int"},{name:"hasRole",type:"int"},{name:"name",type:"string"},{name:"description",type:"string"}],proxy:{type:"ci",ci_class:"appunto-auth/ui/user"}},0,0,0,0,0,0,[AppuntoAuth.model,"UserRole"],0));(Ext.cmd.derive("AppuntoAuth.model.UserPermission",Ext.data.Model,{fields:[{name:"id",type:"int"},{name:"hasPermission",type:"int"},{name:"userRoleHasPermission",type:"int"},{name:"userHasPermission",type:"int"},{name:"name",type:"string"},{name:"description",type:"string"}],proxy:{type:"ci",ci_class:"appunto-auth/ui/user"}},0,0,0,0,0,0,[AppuntoAuth.model,"UserPermission"],0));(Ext.cmd.derive("AppuntoAuth.model.Login",Ext.data.Model,{fields:[{name:"id",type:"int"},{name:"attempt_time",type:"date",format:"Y-m-d H:i:s"},{name:"username",type:"string"},{name:"ip_address",type:"string"},{name:"user_agent",type:"string"},{name:"success",type:"int"},{name:"note",type:"string"}],proxy:{type:"ci",ci_class:"appunto-auth/user/login_attempts"}},0,0,0,0,0,0,[AppuntoAuth.model,"Login"],0));(Ext.cmd.derive("AppuntoAuth.view.user.ChangePassword",Ext.window.Window,{title:Lang.localize("password_change"),iconCls:"key",layout:"fit",autoShow:true,modal:true,initComponent:function(){this.items=[{xtype:"form",baseCls:"x-plain",border:false,bodyStyle:{padding:"10px"},defaults:{width:460,labelWidth:160,blankText:Lang.localize("field_required"),msgTarget:"under"},items:[{name:"username",fieldLabel:Lang.localize("username"),xtype:"displayfield"},{name:"email",fieldLabel:Lang.localize("email"),xtype:"displayfield"},{id:"pass",name:"password",fieldLabel:Lang.localize("password"),xtype:"textfield",inputType:"password",vtype:"passformat",style:{marginTop:"18px"},allowBlank:false},{name:"password2",fieldLabel:Lang.localize("password_confirm"),xtype:"textfield",inputType:"password",vtype:"passconfirm",passField:"pass",allowBlank:false}]}];this.buttons=[{text:Lang.localize("save"),action:"save"},{text:Lang.localize("cancel"),handler:function(){this.up(".window").close()}}];Ext.window.Window.prototype.initComponent.apply(this,arguments);this.down("form").getForm().trackResetOnLoad=true}},0,["appa_user_changepassword"],["appa_user_changepassword","box","component","container","panel","window"],{appa_user_changepassword:true,box:true,component:true,container:true,panel:true,window:true},["widget.appa_user_changepassword"],0,[AppuntoAuth.view.user,"ChangePassword"],0));Ext.require("Ext.data.Store");Ext.require("AppuntoAuth.model.User");(Ext.cmd.derive("AppuntoAuth.store.Users",Ext.data.Store,{model:"AppuntoAuth.model.User",pageSize:20,remoteSort:true,remoteFilter:true,autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"Users"],0));(Ext.cmd.derive("AppuntoAuth.store.UserRoles",Ext.data.Store,{model:"AppuntoAuth.model.UserRole",pageSize:9999,remoteSort:false,remoteFilter:false,autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"UserRoles"],0));(Ext.cmd.derive("AppuntoAuth.store.UserPermissions",Ext.data.Store,{model:"AppuntoAuth.model.UserPermission",pageSize:9999,remoteSort:false,remoteFilter:false,autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"UserPermissions"],0));(Ext.cmd.derive("AppuntoAuth.store.Logins",Ext.data.Store,{model:"AppuntoAuth.model.Login",pageSize:9999,remoteSort:true,remoteFilter:true,autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"Logins"],0));(Ext.cmd.derive("AppuntoAuth.view.user.Edit",Ext.window.Window,{title:Lang.localize("user_edit"),iconCls:"user-edit",layout:"fit",autoShow:false,modal:true,initComponent:function(){this.items=[{xtype:"form",baseCls:"x-plain",border:false,bodyStyle:{padding:"10px"},defaults:{width:460,labelWidth:120,blankText:Lang.localize("field_required"),msgTarget:"under"},items:[{name:"username",fieldLabel:Lang.localize("username"),xtype:"textfield",value:"",allowBlank:false},{name:"email",fieldLabel:Lang.localize("email"),xtype:"textfield",value:"",vtype:"email",vtypeText:Lang.localize("email_format"),allowBlank:false},{name:"name",fieldLabel:Lang.localize("name"),xtype:"textfield",value:"",allowBlank:true},{name:"surname",fieldLabel:Lang.localize("surname"),xtype:"textfield",value:"",allowBlank:true},{name:"active",fieldLabel:Lang.localize("active"),labelAlign:"left",inputValue:"1",uncheckedValue:"0",style:{marginTop:"18px"},xtype:"checkbox",checked:true}]}];this.buttons=[{text:Lang.localize("save"),action:"save"},{text:Lang.localize("cancel"),handler:function(){this.up(".window").close()}}];Ext.window.Window.prototype.initComponent.apply(this,arguments);this.down("form").getForm().trackResetOnLoad=true}},0,["appa_user_edit"],["appa_user_edit","box","component","container","panel","window"],{appa_user_edit:true,box:true,component:true,container:true,panel:true,window:true},["widget.appa_user_edit"],0,[AppuntoAuth.view.user,"Edit"],0));(Ext.cmd.derive("AppuntoAuth.view.user.ContextMenu",Ext.menu.Menu,{config:{record:null},items:[{text:Lang.localize("user_add"),action:"add",iconCls:"user-add"},{text:Lang.localize("user_edit"),action:"edit",iconCls:"user-edit"},{text:Lang.localize("user_delete"),action:"delete",iconCls:"user-delete"},{text:Lang.localize("password_change"),action:"change_password",iconCls:"key"},{text:Lang.localize("user_activate"),action:"activate",iconCls:"accept"},{text:Lang.localize("user_deactivate"),action:"deactivate",iconCls:"delete"}]},0,["appa_user_contextmenu"],["appa_user_contextmenu","box","component","container","menu","panel"],{appa_user_contextmenu:true,box:true,component:true,container:true,menu:true,panel:true},["widget.appa_user_contextmenu"],0,[AppuntoAuth.view.user,"ContextMenu"],0));(Ext.cmd.derive("AppuntoAuth.view.user.Frame",Ext.container.Container,{layout:{type:"border"},bodyBorder:false,defaults:{collapsible:false},border:0,createMenuItem:true,items:[{xtype:"appa_user_list",region:"center",flex:1},{xtype:"panel",title:Lang.localize("user_role_list"),itemId:"role-permission-frame",hideCollapseTool:true,iconCls:"shield",region:"east",collapsible:true,flex:1,border:"1px 0 0 1px",layout:{type:"vbox",align:"stretch"},items:[{xtype:"appa_user_role_list",flex:1},{title:"Permission List",xtype:"appa_user_permission_list",flex:1}]}]},0,["appa_user_frame"],["appa_user_frame","box","component","container"],{appa_user_frame:true,box:true,component:true,container:true},["widget.appa_user_frame"],0,[AppuntoAuth.view.user,"Frame"],0));(Ext.cmd.derive("AppuntoAuth.view.user.List",Ext.grid.Panel,{store:"Users",autoScroll:true,border:0,viewConfig:{emptyText:"No results found",loadMask:{msg:Lang.localize("loading")}},columns:[{header:Lang.localize("username"),dataIndex:"username",menuDisabled:true,flex:4},{header:Lang.localize("name"),dataIndex:"name",menuDisabled:true,flex:3},{header:Lang.localize("surname"),dataIndex:"surname",menuDisabled:true,flex:3},{header:Lang.localize("email"),dataIndex:"email",menuDisabled:true,flex:6},{header:Lang.localize("active"),dataIndex:"active",width:48,sortable:true,align:"center",menuDisabled:true,renderer:function(f,e,d){e.tdCls=(d.get("active")==0)?"user-inactive":"user-active";return""}},{header:Lang.localize("last_ip"),dataIndex:"last_ip",hidden:true,flex:3},{header:Lang.localize("last_login"),dataIndex:"last_login",menuDisabled:true,hidden:true,flex:4,renderer:function(b){if(b=="0000-00-00 00:00:00"){return Lang.localize("never")}return Ext.util.Format.date(b,datetime_format)}},{header:Lang.localize("created"),dataIndex:"created",menuDisabled:true,hidden:true,flex:4,renderer:function(b){return Ext.util.Format.date(b,datetime_format)}},{header:Lang.localize("modified"),dataIndex:"modified",menuDisabled:true,hidden:true,flex:4,renderer:function(b){return Ext.util.Format.date(b,datetime_format)}}],tbar:[{xtype:"button",text:Lang.localize("user_add"),action:"add",cls:"view-selection-button",iconCls:"user-add"},{xtype:"tbspacer",width:24},{xtype:"appunto-searchfield",store:"Users"},{xtype:"tbfill"},{xtype:"tool",type:"next"}],bbar:[{xtype:"pagingtoolbar",store:"Users",displayInfo:true,displayMsg:Lang.localize("paging_message")}]},0,["appa_user_list"],["appa_user_list","box","component","container","grid","gridpanel","panel","tablepanel"],{appa_user_list:true,box:true,component:true,container:true,grid:true,gridpanel:true,panel:true,tablepanel:true},["widget.appa_user_list"],0,[AppuntoAuth.view.user,"List"],0));(Ext.cmd.derive("AppuntoAuth.view.user.RoleList",Ext.grid.Panel,{store:"UserRoles",cls:"appunto-list",autoScroll:true,border:0,viewConfig:{emptyText:'

'+Lang.localize("user_select_or")+"

",deferEmptyText:false,loadMask:{msg:Lang.localize("loading")}},initComponent:function(){this.columns=[{header:"",dataIndex:"hasRole",width:24,sortable:true,menuDisabled:true,align:"center",renderer:function(f,e,d){if(d.get("hasRole")==1){e.tdCls="user-has-role"}return""}},{header:Lang.localize("name"),dataIndex:"name",menuDisabled:true,flex:1},{header:Lang.localize("description"),dataIndex:"description",menuDisabled:true,flex:2}];this.tbar=[{xtype:"button",itemId:"role-view-toggle",text:Lang.localize("user_role_view_all"),cls:"view-selection-button",menu:[{text:Lang.localize("user_role_view_all"),value:"1",checked:true,group:"role-view"},{text:Lang.localize("user_role_view_selected"),value:"0",checked:false,group:"role-view"}]}];Ext.grid.Panel.prototype.initComponent.apply(this,arguments)}},0,["appa_user_role_list"],["appa_user_role_list","box","component","container","grid","gridpanel","panel","tablepanel"],{appa_user_role_list:true,box:true,component:true,container:true,grid:true,gridpanel:true,panel:true,tablepanel:true},["widget.appa_user_role_list"],0,[AppuntoAuth.view.user,"RoleList"],0));(Ext.cmd.derive("AppuntoAuth.view.user.PermissionList",Ext.grid.Panel,{store:"UserPermissions",title:Lang.localize("user_perm_list"),iconCls:"lock",cls:"appunto-list",autoScroll:true,border:0,viewConfig:{emptyText:'

'+Lang.localize("user_select_or")+"

",deferEmptyText:false,loadMask:{msg:Lang.localize("loading")}},initComponent:function(){this.columns=[{header:"",dataIndex:"hasPermission",hideable:false,width:24,sortable:true,menuDisabled:true,align:"center",renderer:function(f,e,d){if(f==1){e.tdCls="has-permission"}return""}},{header:Lang.localize("name"),dataIndex:"name",menuDisabled:true,flex:1},{text:Lang.localize("granted_to"),menuDisabled:true,id:"permission-granted-to-header",columns:[{header:Lang.localize("grant_role"),dataIndex:"userRoleHasPermission",width:60,sortable:true,menuDisabled:true,align:"center",renderer:function(f,e,d){if(f==1){e.tdCls="user-role-has-permission";e.tdAttr='data-qtip="'+Lang.localize("user_perm_granted_role")+'"'}return""}},{header:Lang.localize("grant_user"),dataIndex:"userHasPermission",width:60,sortable:true,menuDisabled:true,align:"center",renderer:function(f,e,d){if(f==1){e.tdCls="user-has-permission";e.tdAttr='data-qtip="'+Lang.localize("user_perm_granted_user")+'"'}return""}}]},{header:Lang.localize("description"),dataIndex:"description",menuDisabled:true,flex:2}];this.tbar=[{xtype:"button",itemId:"permission-view-toggle",text:Lang.localize("user_perm_view_all"),cls:"view-selection-button",menu:[{text:Lang.localize("user_perm_view_all"),value:"1",checked:true,group:"permission-view"},{text:Lang.localize("user_perm_view_selected"),value:"0",checked:false,group:"permission-view"}]}];Ext.grid.Panel.prototype.initComponent.apply(this,arguments)}},0,["appa_user_permission_list"],["appa_user_permission_list","box","component","container","grid","gridpanel","panel","tablepanel"],{appa_user_permission_list:true,box:true,component:true,container:true,grid:true,gridpanel:true,panel:true,tablepanel:true},["widget.appa_user_permission_list"],0,[AppuntoAuth.view.user,"PermissionList"],0));(Ext.cmd.derive("AppuntoAuth.view.user.LoginsWidget",Ext.grid.Panel,{store:"AppuntoAuth.store.Logins",title:"Recent Login Attempts",iconCls:"shield",autoScroll:true,viewConfig:{emptyText:'

no recent login attempts found

',deferEmptyText:false},initComponent:function(){this.columns=[{header:"",dataIndex:"success",width:24,sortable:true,menuDisabled:true,align:"center",renderer:function(f,e,d){if(d.get("success")==1){e.tdCls="login-success";e.tdAttr='data-qtip="'+d.get("note")+'"'}else{if(d.get("success")==0){e.tdCls="login-fail";e.tdAttr='data-qtip="'+d.get("note")+'"'}else{e.tdCls="login-failure";e.tdAttr='data-qtip="'+d.get("note")+'"'}}return""}},{header:"Date",dataIndex:"attempt_time",width:80,align:"right",xtype:"datecolumn",format:"m/d/Y"},{header:"Time",dataIndex:"attempt_time",width:60,align:"right",xtype:"datecolumn",format:"H:i:s"},{header:"Username",dataIndex:"username",menuDisabled:true,flex:1},{header:"IP Address",dataIndex:"ip_address",menuDisabled:true,flex:1}];this.tools=[{type:"refresh",itemId:"refresh"}];Ext.grid.Panel.prototype.initComponent.apply(this,arguments)}},0,["appa_user_logins_widget"],["appa_user_logins_widget","box","component","container","grid","gridpanel","panel","tablepanel"],{appa_user_logins_widget:true,box:true,component:true,container:true,grid:true,gridpanel:true,panel:true,tablepanel:true},["widget.appa_user_logins_widget"],0,[AppuntoAuth.view.user,"LoginsWidget"],0));(Ext.cmd.derive("AppuntoAuth.controller.Users",Ext.app.Controller,{models:["User","UserRole","UserPermission","Login"],stores:["Users","UserRoles","UserPermissions","Logins"],views:["user.Frame","user.List","user.ContextMenu","user.Add","user.Edit","user.ChangePassword","user.RoleList","user.RoleContextMenu","user.PermissionList","user.PermissionContextMenu","user.LoginsWidget"],refs:[{ref:"list",selector:"appa_user_list"},{ref:"rolePermissionFrame",selector:"#role-permission-frame"},{ref:"roleList",selector:"appa_user_role_list"},{ref:"permissionList",selector:"appa_user_permission_list"},{ref:"loginsWidget",selector:"appa_user_logins_widget"}],init:function(){this.control({appa_user_frame:{activate:this.loadStore},appa_user_list:{render:this.defineStoreEventHandlers,select:this.userSelected,deselect:this.userDeselected,itemdblclick:this.editUser,itemcontextmenu:this.showContextMenu,containercontextmenu:function(d,c){c.preventDefault()},contextmenu:function(b){b.preventDefault()}},"appa_user_list tool":{click:this.resizeUserList},appa_user_role_list:{itemcontextmenu:this.showRoleContextMenu,containercontextmenu:function(d,c){c.preventDefault()},contextmenu:function(b){b.preventDefault()}},appa_user_permission_list:{itemcontextmenu:this.showPermissionContextMenu,containercontextmenu:function(d,c){c.preventDefault()},contextmenu:function(b){b.preventDefault()}},'appa_user_list button[action="add"]':{click:this.addUser},'appa_user_contextmenu menuitem[action="add"]':{click:this.addUser},"appa_user_add button[action=save]":{click:this.createUser},'appa_user_contextmenu menuitem[action="edit"]':{click:this.editUser},"appa_user_edit button[action=save]":{click:this.updateUser},'appa_user_contextmenu menuitem[action="delete"]':{click:this.confirmUserDeletion},'appa_user_contextmenu menuitem[action="change_password"]':{click:this.changePassword},"appa_user_changepassword button[action=save]":{click:this.updatePassword},'appa_user_contextmenu menuitem[action="activate"]':{click:this.activateUser},'appa_user_contextmenu menuitem[action="deactivate"]':{click:this.deactivateUser},'appa_user_role_list menuitem[group="role-view"]':{click:this.toggleRoleView},'appa_user_role_contextmenu menuitem[action="add"]':{click:this.addRole},'appa_user_role_contextmenu menuitem[action="remove"]':{click:this.removeRole},'appa_user_permission_list menuitem[group="permission-view"]':{click:this.togglePermissionView},'appa_user_permission_contextmenu menuitem[action="add"]':{click:this.addPermission},'appa_user_permission_contextmenu menuitem[action="remove"]':{click:this.removePermission}})},loadStore:function(){var d=this.getList(),f=d.getSelectionModel(),e;e=function(){if(f.hasSelection()){rec=f.getSelection()[0];f.deselectAll();f.select(rec)}};d.getStore().load({callback:e})},defineStoreEventHandlers:function(b){this.getList().getStore().on({scope:this,load:this.storeLoad})},resizeUserList:function(e){var d=this.getList(),f=this.getRolePermissionFrame();if(f.collapsed){f.expand();f.setIconCls("shield");this.setRoleTitle();e.setType("next");d.columns[5].hide();d.columns[6].hide();d.columns[7].hide();d.columns[8].hide()}else{f.collapse();f.setIconCls("");this.setRoleTitle();e.setType("prev");d.columns[5].show();d.columns[6].show();d.columns[7].show();d.columns[8].show()}},storeLoad:function(){var c=this.getRoleList(),d=this.getPermissionList();this.getRoleList().getStore().removeAll();this.setEmptyMessageRole();this.setRoleTitle();this.getPermissionList().getStore().removeAll();this.setEmptyMessagePerm();this.setPermissionTitle()},setEmptyMessageRole:function(){var d=this.getList().getSelectionModel().hasSelection(),c=this.getRoleList();if(d){c.getView().emptyText='

'+Lang.localize("user_no_roles")+"

"}else{c.getView().emptyText='

'+Lang.localize("user_select")+"

"}c.getView().refresh()},setEmptyMessagePerm:function(){var d=this.getList().getSelectionModel().hasSelection(),c=this.getPermissionList();if(d){c.getView().emptyText='

'+Lang.localize("user_no_perm")+"

"}else{c.getView().emptyText='

'+Lang.localize("user_select")+"

"}c.getView().refresh()},setRoleTitle:function(c){var d=this.getRolePermissionFrame();if(d.collapsed){d.setTitle(Lang.localize("user_role_list")+" / "+Lang.localize("user_perm_list"))}else{if(c!=undefined){d.setTitle(Lang.localize("user_role_list_for")+" "+c)}else{d.setTitle(Lang.localize("user_role_list"))}}},setPermissionTitle:function(c){var d=this.getPermissionList();if(c!=undefined){d.setTitle(Lang.localize("user_perm_list_for")+" "+c)}else{d.setTitle(Lang.localize("user_perm_list"))}},userSelected:function(m,g){var k=this.getRoleList(),l=this.getPermissionList(),j=k.getStore(),h=l.getStore();this.setEmptyMessageRole();this.setEmptyMessagePerm();this.setRoleTitle(g.get("username"));this.setPermissionTitle(g.get("username"));j.load({id:g.get("id"),ci_method:"roles"});h.load({id:g.get("id"),ci_method:"permissions"})},userDeselected:function(m,g){var k=this.getRoleList(),l=this.getPermissionList(),j=k.getStore(),h=l.getStore();this.setEmptyMessageRole();this.setEmptyMessagePerm();if(!this.getList().getSelectionModel().hasSelection()){this.setRoleTitle(undefined);this.setPermissionTitle(undefined);j.removeAll();h.removeAll()}},showContextMenu:function(e,j,m,h,l){l.preventDefault();var k=Ext.widget("appa_user_contextmenu");k.setRecord(j);e.getSelectionModel().select(j,false,true);if(j.data.active==1){k.down('menuitem[action="activate"]').hide()}if(j.data.active==0){k.down('menuitem[action="deactivate"]').hide()}k.showAt(l.getXY())},addUser:function(e,g){var h=Ext.widget("appa_user_add"),f=h.down("form");f.getForm().findField("username").focus(false,100);h.show()},createUser:function(m){var k=m.up("window"),l=k.down("form"),n=l.getValues(),h=Ext.create("AppuntoAuth.model.User"),o=this.getList().getStore(),j;j=function(a,b){if(b.success==true){o.insert(0,a);k.close()}else{o.remove(h)}};if(l.getForm().isValid()){h.set(n);h.save({callback:j})}},editUser:function(j,k){var h=j.up("menu").getRecord(),e=Ext.widget("appa_user_edit"),g=e.down("form");g.loadRecord(h);g.getForm().findField("username").focus(false,100);e.show()},updateUser:function(l){var j=l.up("window"),k=j.down("form").form,g=k.getRecord(),m=k.getValues(),h;h=function(a,b){if(b.success==true){a.commit();j.close()}else{g.reject()}};if(k.isDirty()){if(k.isValid()){g.set(m);g.save({callback:h})}}else{j.close()}},confirmUserDeletion:function(e){var g=e.up("menu").getRecord(),f=this.getList().getStore(),h=Lang.localize("user_delete")+" "+g.data.username+" ("+g.data.email+")";Ext.MessageBox.confirm(h,Lang.localize("user_delete_confirm"),Ext.bind(this.deleteUser,this,[g,f],true))},deleteUser:function(k,h,j,g,f){if(k=="yes"){g.erase({success:function(){f.remove(g)}})}},changePassword:function(h){var g=h.up("menu").getRecord(),f=Ext.widget("appa_user_changepassword"),e=f.down("form");e.loadRecord(g);e.getForm().findField("password").focus(false,100);f.show()},updatePassword:function(l){var j=l.up("window"),k=j.down("form").form,g=k.getRecord(),m=k.getValues(),h;h=function(a,b){j.close()};if(k.isValid()){g.set(m);g.save({ci_method:"update_pass",success:h});g.data.password="";g.data.password2=""}},activateUser:function(d){var e=d.up("menu").getRecord(),f;f=function(){e.reject()};e.set({active:1});e.save({failure:f})},deactivateUser:function(d){var e=d.up("menu").getRecord(),f;f=function(){e.reject()};e.set({active:0});e.save({failure:f})},toggleRoleView:function(b){this.showAllRoles(b.value==1)},showAllRoles:function(g){var h=this.getRoleList(),f=h.getStore(),e=h.down("#role-view-toggle");if(g==true){f.clearFilter();e.setText(Lang.localize("user_role_view_all"))}else{f.filter("hasRole",1);e.setText(Lang.localize("user_role_view_selected"))}},showRoleContextMenu:function(e,j,m,h,l){l.preventDefault();var k=Ext.widget("appa_user_role_contextmenu");k.setRecord(j);e.getSelectionModel().select(j,false,true);if(j.data.hasRole==1){k.down('menuitem[action="add"]').hide()}else{if(j.data.hasRole==0){k.down('menuitem[action="remove"]').hide()}}k.showAt(l.getXY())},addRole:function(k){var m=k.up("menu").getRecord(),j=this.getList(),l=j.getSelectionModel().getSelection()[0],g=this.getPermissionList().getStore(),h;h=function(a,b){if(b.success==true){g.load({id:l.get("id"),ci_method:"permissions"})}else{m.reject()}};m.set({hasRole:1});m.save({ci_method:"add_role",params:{user_id:l.get("id")},callback:h})},removeRole:function(k){var m=k.up("menu").getRecord(),j=this.getList(),l=j.getSelectionModel().getSelection()[0],g=this.getPermissionList().getStore(),h;h=function(a,b){if(b.success==true){g.load({id:l.get("id"),ci_method:"permissions"})}else{m.reject()}};m.set({hasRole:0});m.save({ci_method:"remove_role",params:{user_id:l.get("id")},callback:h})},togglePermissionView:function(b){this.showAllPermissions(b.value==1)},showAllPermissions:function(g){var h=this.getPermissionList(),f=h.getStore(),e=h.down("#permission-view-toggle");if(g==true){f.clearFilter();e.setText(Lang.localize("user_perm_view_all"))}else{f.filter("hasPermission",1);e.setText(Lang.localize("user_perm_view_selected"))}},showPermissionContextMenu:function(e,j,m,h,l){l.preventDefault();var k=Ext.widget("appa_user_permission_contextmenu");k.setRecord(j);e.getSelectionModel().select(j,false,true);if(j.data.userHasPermission==1){k.down('menuitem[action="add"]').hide()}else{if(j.data.userHasPermission==0){k.down('menuitem[action="remove"]').hide()}}k.showAt(l.getXY())},addPermission:function(k){var g=k.up("menu").getRecord(),h=this.getList(),f=h.getSelectionModel().getSelection()[0],j;j=function(){g.reject()};g.set({userHasPermission:1});g.save({ci_method:"add_permission",params:{user_id:f.get("id")},failure:j})},removePermission:function(k){var g=k.up("menu").getRecord(),h=this.getList(),f=h.getSelectionModel().getSelection()[0],j;j=function(){g.reject()};g.set({userHasPermission:0});g.save({ci_method:"remove_permission",params:{user_id:f.get("id")},failure:j})}},0,0,0,0,0,0,[AppuntoAuth.controller,"Users"],0));(Ext.cmd.derive("AppuntoAuth.view.role.PermissionContextMenu",Ext.menu.Menu,{config:{record:null},items:[{text:Lang.localize("role_perm_add"),action:"add",iconCls:"lock-add"},{text:Lang.localize("role_perm_remove"),action:"remove",iconCls:"lock-delete"}]},0,["appa_role_permission_contextmenu"],["appa_role_permission_contextmenu","box","component","container","menu","panel"],{appa_role_permission_contextmenu:true,box:true,component:true,container:true,menu:true,panel:true},["widget.appa_role_permission_contextmenu"],0,[AppuntoAuth.view.role,"PermissionContextMenu"],0));(Ext.cmd.derive("AppuntoAuth.view.role.Edit",Ext.window.Window,{title:Lang.localize("role_edit"),iconCls:"shield-edit",layout:"fit",autoShow:false,modal:true,initComponent:function(){this.items=[{xtype:"form",baseCls:"x-plain",border:false,bodyStyle:{padding:"10px"},defaults:{width:320,labelWidth:90,blankText:Lang.localize("field_required"),msgTarget:"under"},items:[{name:"id",width:0,type:"hidden"},{name:"name",fieldLabel:Lang.localize("name"),xtype:"textfield",value:"",allowBlank:false},{name:"description",fieldLabel:Lang.localize("description"),xtype:"textfield",value:"",allowBlank:true}]}];this.buttons=[{text:Lang.localize("save"),action:"save"},{text:Lang.localize("cancel"),scope:this,handler:this.close}];Ext.window.Window.prototype.initComponent.apply(this,arguments);this.down("form").getForm().trackResetOnLoad=true}},0,["appa_role_edit"],["appa_role_edit","box","component","container","panel","window"],{appa_role_edit:true,box:true,component:true,container:true,panel:true,window:true},["widget.appa_role_edit"],0,[AppuntoAuth.view.role,"Edit"],0));(Ext.cmd.derive("AppuntoAuth.model.Role",Ext.data.Model,{fields:[{name:"id",type:"int"},{name:"name",type:"string"},{name:"internal_name",type:"string"},{name:"description",type:"string"}],proxy:{type:"ci",ci_class:"appunto-auth/ui/role"}},0,0,0,0,0,0,[AppuntoAuth.model,"Role"],0));(Ext.cmd.derive("AppuntoAuth.model.RolePermission",Ext.data.Model,{fields:[{name:"id",type:"int"},{name:"name",type:"string"},{name:"inRole",type:"int"},{name:"description",type:"string"}],proxy:{type:"ci",ci_class:"appunto-auth/ui/role"}},0,0,0,0,0,0,[AppuntoAuth.model,"RolePermission"],0));(Ext.cmd.derive("AppuntoAuth.view.role.ContextMenu",Ext.menu.Menu,{config:{record:null},items:[{text:Lang.localize("role_add"),action:"add",iconCls:"shield-add"},{text:Lang.localize("role_edit"),action:"edit",iconCls:"shield-go"},{text:Lang.localize("role_delete"),action:"delete",iconCls:"shield-delete"}]},0,["appa_role_contextmenu"],["appa_role_contextmenu","box","component","container","menu","panel"],{appa_role_contextmenu:true,box:true,component:true,container:true,menu:true,panel:true},["widget.appa_role_contextmenu"],0,[AppuntoAuth.view.role,"ContextMenu"],0));(Ext.cmd.derive("AppuntoAuth.view.role.Add",Ext.window.Window,{title:Lang.localize("role_add"),iconCls:"shield-add",layout:"fit",autoShow:true,modal:true,initComponent:function(){this.items=[{xtype:"form",baseCls:"x-plain",border:false,bodyStyle:{padding:"10px"},defaults:{width:460,labelWidth:120,blankText:Lang.localize("field_required"),msgTarget:"under"},items:[{name:"name",fieldLabel:Lang.localize("name"),xtype:"textfield",value:"",minLength:3,maxLength:32,allowBlank:false},{name:"description",fieldLabel:Lang.localize("description"),xtype:"textfield",value:"",maxLength:64,allowBlank:true}]}];this.buttons=[{text:Lang.localize("save"),action:"save"},{text:Lang.localize("cancel"),scope:this,handler:this.close}];Ext.window.Window.prototype.initComponent.apply(this,arguments)}},0,["appa_role_add"],["appa_role_add","box","component","container","panel","window"],{appa_role_add:true,box:true,component:true,container:true,panel:true,window:true},["widget.appa_role_add"],0,[AppuntoAuth.view.role,"Add"],0));(Ext.cmd.derive("AppuntoAuth.view.role.Frame",Ext.container.Container,{layout:{type:"hbox",align:"stretch"},defaults:{collapsible:false},border:0,items:[{xtype:"appa_role_list",flex:1,border:"0 1px 0 0",minWidth:120},{xtype:"appa_role_permission_list",border:"1px 0 0 1px",flex:1}]},0,["appa_role_frame"],["appa_role_frame","box","component","container"],{appa_role_frame:true,box:true,component:true,container:true},["widget.appa_role_frame"],0,[AppuntoAuth.view.role,"Frame"],0));(Ext.cmd.derive("AppuntoAuth.view.role.List",Ext.grid.Panel,{store:"Roles",title:Lang.localize("tab_user_roles"),iconCls:"shield",viewConfig:{loadMask:{msg:Lang.localize("loading")}},autoScroll:true,columns:[{header:Lang.localize("name"),dataIndex:"name",hideable:false,flex:2},{header:Lang.localize("description"),dataIndex:"description",hideable:false,flex:3}],tbar:[{xtype:"button",text:Lang.localize("role_add"),action:"add",cls:"view-selection-button",iconCls:"shield-add"}],bbar:[{xtype:"button",text:Lang.localize("refresh"),action:"refresh",iconCls:"x-tbar-loading"}]},0,["appa_role_list"],["appa_role_list","box","component","container","grid","gridpanel","panel","tablepanel"],{appa_role_list:true,box:true,component:true,container:true,grid:true,gridpanel:true,panel:true,tablepanel:true},["widget.appa_role_list"],0,[AppuntoAuth.view.role,"List"],0));(Ext.cmd.derive("AppuntoAuth.view.role.PermissionList",Ext.grid.Panel,{store:"RolePermissions",title:Lang.localize("tab_permissions"),iconCls:"lock",cls:"appunto-list",autoScroll:true,viewConfig:{emptyText:'

'+Lang.localize("role_select")+"

",deferEmptyText:false,loadMask:{msg:Lang.localize("loading")}},columns:[{header:"",dataIndex:"hasRolePermission",hideable:false,width:24,sortable:true,align:"center",renderer:function(f,e,d){if(d.get("inRole")==1){e.tdCls="permission-in-role"}return""}},{header:Lang.localize("name"),dataIndex:"name",hideable:false,flex:1},{header:Lang.localize("description"),dataIndex:"description",hideable:false,flex:2}],tbar:[{xtype:"button",itemId:"permission-view-toggle",text:Lang.localize("role_perm_view_all"),cls:"view-selection-button",menu:[{text:Lang.localize("role_perm_view_all"),value:"1",checked:true,group:"permission-view"},{text:Lang.localize("role_perm_view_selected"),value:"0",checked:false,group:"permission-view"}]}]},0,["appa_role_permission_list"],["appa_role_permission_list","box","component","container","grid","gridpanel","panel","tablepanel"],{appa_role_permission_list:true,box:true,component:true,container:true,grid:true,gridpanel:true,panel:true,tablepanel:true},["widget.appa_role_permission_list"],0,[AppuntoAuth.view.role,"PermissionList"],0));Ext.require("Ext.data.Store");Ext.require("AppuntoAuth.model.Role");(Ext.cmd.derive("AppuntoAuth.store.Roles",Ext.data.Store,{model:"AppuntoAuth.model.Role",pageSize:0,remoteSort:true,remoteFilter:true,autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"Roles"],0));Ext.require("Ext.data.Store");Ext.require("AppuntoAuth.model.RolePermission");(Ext.cmd.derive("AppuntoAuth.store.RolePermissions",Ext.data.Store,{model:"AppuntoAuth.model.RolePermission",pageSize:0,remoteSort:false,remoteFilter:false,autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"RolePermissions"],0));(Ext.cmd.derive("AppuntoAuth.controller.Roles",Ext.app.Controller,{models:["Role","RolePermission"],stores:["Roles","RolePermissions"],views:["role.Frame","role.List","role.ContextMenu","role.Add","role.Edit","role.PermissionList","role.PermissionContextMenu"],refs:[{ref:"list",selector:"appa_role_list"},{ref:"permissionsList",selector:"appa_role_permission_list"}],init:function(){this.control({appa_role_frame:{activate:this.refreshList},appa_role_list:{render:this.defineStoreEventHandlers,select:this.roleSelected,itemdblclick:this.editRole,itemcontextmenu:this.showContextMenu,containercontextmenu:function(d,c){c.preventDefault()},contextmenu:function(b){b.preventDefault()}},appa_role_permission_list:{itemcontextmenu:this.showPermissionContextMenu,containercontextmenu:function(d,c){c.preventDefault()},contextmenu:function(b){b.preventDefault()}},'appa_role_list button[action="add"]':{click:this.addRole},'appa_role_frame button[action="refresh"]':{click:this.refreshList},'appa_role_contextmenu menuitem[action="add"]':{click:this.addRole},"appa_role_add button[action=save]":{click:this.createRole},'appa_role_contextmenu menuitem[action="edit"]':{click:this.editRole},"appa_role_edit button[action=save]":{click:this.updateRole},'appa_role_contextmenu menuitem[action="delete"]':{click:this.confirmRoleDeletion},'appa_role_permission_list menuitem[group="permission-view"]':{click:this.togglePermissionView},'appa_role_permission_contextmenu menuitem[action="add"]':{click:this.addPermission},'appa_role_permission_contextmenu menuitem[action="remove"]':{click:this.removePermission}})},refreshList:function(h){var e=this.getList(),g=e.getSelectionModel(),f;f=function(){if(g.hasSelection()){rec=g.getSelection()[0];g.deselectAll();g.select(rec)}};e.getStore().load({callback:f})},defineStoreEventHandlers:function(b){this.getList().getStore().on({scope:this,load:this.storeLoad})},storeLoad:function(){var c=this.getPermissionsList(),d=c.getStore();c.setTitle(Lang.localize("tab_permissions"));d.removeAll()},showContextMenu:function(e,j,m,h,l){l.preventDefault();var k=Ext.widget("appa_role_contextmenu");k.setRecord(j);e.getSelectionModel().select(j,false,true);k.showAt(l.getXY())},roleSelected:function(h,e){var g=this.getPermissionsList(),f=g.getStore();g.setTitle(Lang.localize("role_perm_for")+" "+e.get("name"));f.load({id:e.get("id"),ci_method:"permissions"})},addRole:function(e,g){var h=Ext.widget("appa_role_add"),f=h.down("form");f.getForm().findField("name").focus(false,100);h.showAt(g.getXY())},createRole:function(n){var l=n.up("window"),m=l.down("form"),o=m.getValues(),q=Ext.create("AppuntoAuth.model.Role"),j=this.getList(),p=j.getStore(),k;k=function(a,b){p.insert(0,a);j.getSelectionModel().select(a);l.close()};if(m.getForm().isValid()){q.set(o);q.save({success:k})}},editRole:function(j,k){var h=j.up("menu").getRecord(),e=Ext.widget("appa_role_edit"),g=e.down("form");g.loadRecord(h);g.getForm().findField("name").focus(false,100);e.showAt(k.getXY())},updateRole:function(l){var j=l.up("window"),k=j.down("form").form,g=k.getRecord(),m=k.getValues(),h;h=function(a,b){if(b.success==true){j.close()}else{g.reject()}};if(k.isDirty()){if(k.isValid()){g.set(m);g.save({callback:h})}}else{j.close()}},confirmRoleDeletion:function(e){var g=e.up("menu").getRecord(),f=this.getList().getStore(),h=Lang.localize("role_delete")+": "+g.data.name;Ext.MessageBox.confirm(h,Lang.localize("role_delete_confirm"),Ext.bind(this.deleteRole,this,[g,f],true))},deleteRole:function(m,k,l,o,n){var h=this.getList(),j;j=function(a,b){if(b.success==true){n.remove(o)}else{n.load({callback:function(){h.getSelectionModel().select(o)}})}};if(m=="yes"){o.erase({callback:j})}},togglePermissionView:function(b){this.showAllPermissions(b.value==1)},showAllPermissions:function(g){var h=this.getPermissionsList(),f=h.getStore(),e=h.down("#permission-view-toggle");if(g==true){f.clearFilter();e.setText(Lang.localize("role_perm_view_all"))}else{f.filter("inRole",1);e.setText(Lang.localize("role_perm_view_selected"))}},showPermissionContextMenu:function(e,j,m,h,l){l.preventDefault();var k=Ext.widget("appa_role_permission_contextmenu");k.setRecord(j);e.getSelectionModel().select(j,false,true);if(j.get("inRole")==1){k.down('menuitem[action="add"]').hide()}if(j.data.inRole==0){k.down('menuitem[action="remove"]').hide()}k.showAt(l.getXY())},addPermission:function(k){var g=k.up("menu").getRecord(),f=this.getList(),h=f.getSelectionModel().getSelection()[0],j;j=function(){g.reject()};g.set({hasPermission:1});g.save({ci_method:"add_permission",params:{role_id:h.get("id")},failure:j})},removePermission:function(k){var g=k.up("menu").getRecord(),f=this.getList(),h=f.getSelectionModel().getSelection()[0],j;j=function(){g.reject()};g.set({hasPermission:0});g.save({ci_method:"remove_permission",params:{role_id:h.get("id")},failure:j})}},0,0,0,0,0,0,[AppuntoAuth.controller,"Roles"],0));(Ext.cmd.derive("AppuntoAuth.view.permission.Edit",Ext.window.Window,{title:Lang.localize("perm_edit"),iconCls:"lock-edit",layout:"fit",autoShow:false,modal:true,items:[{xtype:"form",baseCls:"x-plain",border:false,bodyStyle:{padding:"10px"},defaults:{width:320,labelWidth:90,blankText:Lang.localize("field_required"),msgTarget:"under"},items:[{name:"id",width:0,type:"hidden"},{name:"name",fieldLabel:Lang.localize("name"),xtype:"textfield",value:"",allowBlank:false},{name:"internal_name",fieldLabel:Lang.localize("perm_internal_name"),xtype:"textfield",value:"",allowBlank:false},{name:"description",fieldLabel:Lang.localize("description"),xtype:"textfield",value:"",allowBlank:true}]}],buttons:[{text:"Save",action:"save"},{text:"Cancel",handler:function(){this.up(".window").close()}}],initComponent:function(){Ext.window.Window.prototype.initComponent.apply(this,arguments);this.down("form").getForm().trackResetOnLoad=true}},0,["appa_permission_edit"],["appa_permission_edit","box","component","container","panel","window"],{appa_permission_edit:true,box:true,component:true,container:true,panel:true,window:true},["widget.appa_permission_edit"],0,[AppuntoAuth.view.permission,"Edit"],0));(Ext.cmd.derive("AppuntoAuth.model.Permission",Ext.data.Model,{fields:[{name:"id",type:"int"},{name:"hasPermission",type:"int"},{name:"name",type:"string"},{name:"internal_name",type:"string"},{name:"description",type:"string"}],proxy:{type:"ci",ci_class:"appunto-auth/ui/permission"}},0,0,0,0,0,0,[AppuntoAuth.model,"Permission"],0));(Ext.cmd.derive("AppuntoAuth.view.permission.Add",Ext.window.Window,{autoScroll:true,title:Lang.localize("perm_add"),iconCls:"lock-add",layout:"fit",autoShow:true,modal:true,items:[{xtype:"form",baseCls:"x-plain",border:false,bodyStyle:{padding:"10px"},defaults:{width:320,labelWidth:90,blankText:Lang.localize("field_required"),msgTarget:"under"},items:[{name:"name",fieldLabel:Lang.localize("name"),xtype:"textfield",value:"",minLength:3,maxLength:32,allowBlank:false},{name:"description",fieldLabel:Lang.localize("description"),xtype:"textfield",value:"",maxLength:64,allowBlank:true}]}],buttons:[{text:Lang.localize("save"),action:"save"},{text:Lang.localize("cancel"),handler:function(){this.up(".window").close()}}]},0,["appa_permission_add"],["appa_permission_add","box","component","container","panel","window"],{appa_permission_add:true,box:true,component:true,container:true,panel:true,window:true},["widget.appa_permission_add"],0,[AppuntoAuth.view.permission,"Add"],0));(Ext.cmd.derive("AppuntoAuth.view.permission.ContextMenu",Ext.menu.Menu,{config:{record:null},items:[{text:Lang.localize("perm_add"),action:"add",iconCls:"lock-add"},{text:Lang.localize("perm_edit"),action:"edit",iconCls:"lock-edit"},{text:Lang.localize("perm_delete"),action:"delete",iconCls:"lock-delete"}]},0,["appa_permission_contextmenu"],["appa_permission_contextmenu","box","component","container","menu","panel"],{appa_permission_contextmenu:true,box:true,component:true,container:true,menu:true,panel:true},["widget.appa_permission_contextmenu"],0,[AppuntoAuth.view.permission,"ContextMenu"],0));(Ext.cmd.derive("AppuntoAuth.view.permission.List",Ext.grid.Panel,{store:"Permissions",autoScroll:true,viewConfig:{loadMask:{msg:Lang.localize("loading")}},columns:[{header:Lang.localize("name"),dataIndex:"name",flex:1},{header:Lang.localize("perm_internal_name"),dataIndex:"internal_name",flex:1},{header:Lang.localize("name"),dataIndex:"description",flex:2}],tbar:[{xtype:"button",text:Lang.localize("perm_add"),action:"add",cls:"view-selection-button",iconCls:"lock-add"}],bbar:[{type:"button",text:Lang.localize("refresh"),action:"refresh",iconCls:"x-tbar-loading"}]},0,["appa_permission_list"],["appa_permission_list","box","component","container","grid","gridpanel","panel","tablepanel"],{appa_permission_list:true,box:true,component:true,container:true,grid:true,gridpanel:true,panel:true,tablepanel:true},["widget.appa_permission_list"],0,[AppuntoAuth.view.permission,"List"],0));Ext.require("Ext.data.Store");Ext.require("AppuntoAuth.model.Permission");(Ext.cmd.derive("AppuntoAuth.store.Permissions",Ext.data.Store,{model:"AppuntoAuth.model.Permission",pageSize:0,remoteSort:true,remoteFilter:true,autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"Permissions"],0));(Ext.cmd.derive("AppuntoAuth.controller.Permissions",Ext.app.Controller,{models:["Permission"],stores:["Permissions"],views:["permission.List","permission.ContextMenu","permission.Add","permission.Edit"],refs:[{ref:"list",selector:"appa_permission_list"}],init:function(){this.control({appa_permission_list:{activate:this.refreshList,itemdblclick:this.editPermission,itemcontextmenu:this.showContextMenu,containercontextmenu:function(d,c){c.preventDefault()},contextmenu:function(b){b.preventDefault()}},'appa_permission_list button[action="add"]':{click:this.addPermission},'appa_permission_list button[action="refresh"]':{click:this.refreshList},'appa_permission_contextmenu menuitem[action="add"]':{click:this.addPermission},"appa_permission_add button[action=save]":{click:this.createPermission},'appa_permission_contextmenu menuitem[action="edit"]':{click:this.editPermission},"appa_permission_edit button[action=save]":{click:this.updatePermission},'appa_permission_contextmenu menuitem[action="delete"]':{click:this.confirmPermissionDeletion}})},showContextMenu:function(e,j,m,h,l){l.preventDefault();var k=Ext.widget("appa_permission_contextmenu");k.setRecord(j);e.getSelectionModel().select(j,false,true);if(j.data.active==1){k.down('menuitem[action="activate"]').hide()}if(j.data.active==0){k.down('menuitem[action="deactivate"]').hide()}k.showAt(l.getXY())},refreshList:function(c){var d=function(b,f,a){if(!a){this.getList().getStore().removeAll()}};this.getList().getStore().load()},addPermission:function(e,g){var h=Ext.widget("appa_permission_add"),f=h.down("form");f.getForm().findField("name").focus(false,100);h.showAt(g.getXY())},createPermission:function(m){var k=m.up("window"),l=k.down("form"),n=l.getValues(),h=Ext.create("AppuntoAuth.model.Permission"),o=this.getList().getStore(),j;j=function(a,b){o.insert(0,a);k.close()};if(l.getForm().isValid()){h.set(n);h.save({success:j})}},editPermission:function(j,k){var h=j.up("menu").getRecord(),e=Ext.widget("appa_permission_edit"),g=e.down("form");g.loadRecord(h);g.getForm().findField("name").focus(false,100);e.showAt(k.getXY())},updatePermission:function(l){var j=l.up("window"),k=j.down("form").form,g=k.getRecord(),m=k.getValues(),h;h=function(a,b){if(b.success==true){j.close()}else{g.reject()}};if(k.isDirty()){if(k.isValid()){g.set(m);g.save({callback:h})}}else{j.close()}},confirmPermissionDeletion:function(e){var g=e.up("menu").getRecord(),f=this.getList().getStore(),h=Lang.localize("role_delete")+": "+g.data.name;Ext.MessageBox.confirm(h,Lang.localize("perm_delete_confirm"),Ext.bind(this.deletePermission,this,[g,f],true))},deletePermission:function(m,k,l,o,n){var h=this.getList(),j;j=function(a,b){if(b.success==true){n.remove(o)}else{n.load({callback:function(){h.getSelectionModel().select(o)}})}};if(m=="yes"){o.erase({callback:j})}}},0,0,0,0,0,0,[AppuntoAuth.controller,"Permissions"],0));(Ext.cmd.derive("AppuntoAuth.model.Path",Ext.data.Model,{fields:[{name:"id",type:"int"},{name:"found",type:"int"},{name:"dir",type:"string"},{name:"full_path",type:"string"},{name:"ci_controller",type:"string"},{name:"ci_method",type:"string"},{name:"public_flag",type:"int"},{name:"permission_id",type:"int"},{name:"permission_name",type:"string"},{name:"note",type:"string"}],proxy:{type:"ci",ci_class:"appunto-auth/ui/path"}},0,0,0,0,0,0,[AppuntoAuth.model,"Path"],0));Ext.require("Ext.data.Store");Ext.require("AppuntoAuth.model.Path");(Ext.cmd.derive("AppuntoAuth.store.Paths",Ext.data.Store,{model:"AppuntoAuth.model.Path",pageSize:9999,remoteSort:false,remoteFilter:false,groupField:"ci_controller",autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"Paths"],0));(Ext.cmd.derive("AppuntoAuth.store.Controllers",Ext.data.Store,{fields:[{name:"ci_controller",type:"string"},{name:"dir",type:"string"},{name:"full_path",type:"string"},{name:"methods",type:"int"},{name:"public_methods",type:"int"},{name:"private_methods",type:"int"}]},0,0,0,0,0,0,[AppuntoAuth.store,"Controllers"],0));(Ext.cmd.derive("AppuntoAuth.store.PathItems",Ext.data.Store,{fields:[{name:"id",type:"int"},{name:"found",type:"int"},{name:"dir",type:"string"},{name:"full_path",type:"string"},{name:"ci_controller",type:"string"},{name:"ci_method",type:"string"},{name:"public_flag",type:"int"},{name:"permission_id",type:"int"},{name:"permission_name",type:"string"},{name:"note",type:"string"}]},0,0,0,0,0,0,[AppuntoAuth.store,"PathItems"],0));(Ext.cmd.derive("AppuntoAuth.store.PermissionsSelection",Ext.data.Store,{model:"AppuntoAuth.model.Permission",pageSize:9999,remoteSort:true,remoteFilter:true,autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"PermissionsSelection"],0));(Ext.cmd.derive("AppuntoAuth.view.path.ContextMenu",Ext.menu.Menu,{config:{record:null},items:[{text:Lang.localize("path_set_private"),action:"set_private",iconCls:"page-delete"},{text:Lang.localize("path_set_public"),action:"set_public",iconCls:"world-link"},{text:Lang.localize("path_set_permission"),action:"set_permission",itemId:"permission-options",iconCls:"lock",menu:[''+Lang.localize("path_permissions")+""]},{text:Lang.localize("path_remove_permission"),action:"remove_permission",iconCls:"lock-delete"},{text:Lang.localize("path_delete"),action:"delete",iconCls:"delete"}]},0,["appa_path_contextmenu"],["appa_path_contextmenu","box","component","container","menu","panel"],{appa_path_contextmenu:true,box:true,component:true,container:true,menu:true,panel:true},["widget.appa_path_contextmenu"],0,[AppuntoAuth.view.path,"ContextMenu"],0));(Ext.cmd.derive("AppuntoAuth.view.path.Frame",Ext.panel.Panel,{layout:{type:"hbox",align:"stretch"},defaults:{collapsible:false},border:0,createMenuItem:true,items:[{xtype:"panel",title:Lang.localize("path_tab_controllers"),cls:"controller-frame",autoScroll:true,items:[{xtype:"appa_path_controller_view"}],border:0,flex:6},{xtype:"panel",title:Lang.localize("path_tab_paths"),layout:"fit",items:[{xtype:"appa_path_path_view"}],border:0,flex:10}],bbar:[{type:"button",text:Lang.localize("refresh"),action:"verify-paths",iconCls:"x-tbar-loading"}],initComponent:function(){Ext.panel.Panel.prototype.initComponent.apply(this,arguments)}},0,["appa_path_frame"],["appa_path_frame","box","component","container","panel"],{appa_path_frame:true,box:true,component:true,container:true,panel:true},["widget.appa_path_frame"],0,[AppuntoAuth.view.path,"Frame"],0));(Ext.cmd.derive("AppuntoAuth.view.path.ControllerView",Ext.view.View,{store:"Controllers",cls:"controller-view",itemSelector:"div.ci-controller",selectedItemCls:"controller-selected",overItemCls:"controller-rollover",initComponent:function(){this.tpl=new Ext.XTemplate('','
','
',"
",'
',"","',"',"',"
"+Lang.localize("controller_methods")+' : {methods}
"+Lang.localize("controller_public")+' : {public_methods}
"+Lang.localize("controller_private")+' : {private_methods}
","
",'
','{ci_controller}','{full_path}',"
","
","
");Ext.view.View.prototype.initComponent.apply(this,arguments)}},0,["appa_path_controller_view"],["appa_path_controller_view","box","component","dataview"],{appa_path_controller_view:true,box:true,component:true,dataview:true},["widget.appa_path_controller_view"],0,[AppuntoAuth.view.path,"ControllerView"],0));(Ext.cmd.derive("AppuntoAuth.view.path.PathView",Ext.grid.Panel,{store:"PathItems",autoScroll:true,border:0,columns:[{header:"",dataIndex:"found",width:24,sortable:false,menuDisabled:true,align:"center",renderer:function(g,e,h){var f;if(g==0){f="

"+Lang.localize("path_not_found_1")+"

";f+="

"+Lang.localize("path_not_found_2")+"

";e.tdCls="path-not-found";e.tdAttr='data-qtip="'+f+'"'}return""}},{header:"Method",dataIndex:"ci_method",flex:1},{header:Lang.localize("path_path"),dataIndex:"ci_method",sortable:true,menuDisabled:true,flex:2,renderer:function(g,e,h){var f=h.get("dir");path=Ext.util.Format.lowercase(h.get("ci_controller")+"/"+h.get("ci_method"));if(f!="."){path=f+"/"+path}return path}},{header:Lang.localize("path_access"),dataIndex:"public_flag",width:90,renderer:function(f,e,d){if(f==0){e.tdCls="path-private";return Lang.localize("path_private")}else{if(f==1){e.tdCls="path-public";return Lang.localize("path_public")}}return"unknown"}},{header:Lang.localize("path_permission"),dataIndex:"permission_name",flex:2}]},0,["appa_path_path_view"],["appa_path_path_view","box","component","container","grid","gridpanel","panel","tablepanel"],{appa_path_path_view:true,box:true,component:true,container:true,grid:true,gridpanel:true,panel:true,tablepanel:true},["widget.appa_path_path_view"],0,[AppuntoAuth.view.path,"PathView"],0));(Ext.cmd.derive("AppuntoAuth.controller.Paths",Ext.app.Controller,{models:["Path","Permission"],stores:["Paths","Controllers","PathItems","PermissionsSelection"],views:["path.Frame","path.ControllerView","path.PathView","path.ContextMenu"],refs:[{ref:"list",selector:"appa_path_list"},{ref:"delete_unfound_button",selector:'appa_path_list button[action="delete_not_found"]'},{ref:"frame",selector:"appa_path_frame"},{ref:"controllers",selector:"appa_path_controller_view"}],init:function(){this.lastSelected=null;this.control({appa_path_frame:{activate:this.pathsActivate},appa_path_path_view:{itemcontextmenu:this.showContextMenu,containercontextmenu:function(d,c){c.preventDefault()},contextmenu:function(b){b.preventDefault()}},'appa_path_contextmenu menuitem[action="set_public"]':{click:this.setPublic},'appa_path_contextmenu menuitem[action="set_private"]':{click:this.setPrivate},'appa_path_contextmenu menuitem[group="permission"]':{click:this.setPermission},'appa_path_contextmenu menuitem[action="remove_permission"]':{click:this.removePermission},'appa_path_contextmenu menuitem[action="delete"]':{click:this.deletePath},'appa_path_frame button[action="verify-paths"]':{click:this.verifyPaths},appa_path_controller_view:{select:this.controllerSelected}})},pathsActivate:function(){Ext.getStore("PermissionsSelection").load();this.verifyPaths()},verifyPaths:function(){var h=this.getFrame().up("container").getEl(),e=Ext.getStore("Paths"),g=this,f;f=function(b,c,a){h.unmask();if(a&&c.getResultSet().total>0){Ext.Msg.alert(Lang.localize("result"),c.getResultSet().message,g.refreshView,g)}else{g.refreshView()}};h.mask(Lang.localize("path_verify"));e.load({ci_method:"verify_paths",callback:f})},refreshView:function(f,h){var j=this,k=this.getFrame().up("container").getEl(),g;g=function(b,c,a){if(a){j.loadControllers();k.unmask()}else{Ext.getStore("Paths").removeAll()}};this.setLastSelected();k.mask(Lang.localize("path_refreshing"));Ext.getStore("Paths").load({callback:g})},setLastSelected:function(){this.lastSelected=this.getControllers().getSelectionModel().getLastSelected()},restoreSelection:function(){var c=Ext.getStore("Controllers"),d=this.getControllers();if(this.lastSelected!=null&&this.lastSelected!=undefined){idx=c.findExact("ci_controller",this.lastSelected.get("ci_controller"));d.getSelectionModel().select(idx)}},loadControllers:function(){var o=Ext.getStore("Paths"),q=this.getControllers(),j=Ext.getStore("Controllers"),p=o.getRange(),m=[],l=[],n={},k;Ext.Array.each(p,function(a){k=a.get("ci_controller");if(Ext.Array.indexOf(m,k)==-1){Ext.Array.push(m,k)}});Ext.Array.each(m,function(a){n[a]={ci_controller:a,dir:"",full_path:"",methods:0,public_methods:0,private_methods:0}});Ext.Array.each(p,function(a){ci_class=a.get("ci_controller");n[ci_class].dir=a.get("dir");n[ci_class].full_path=a.get("full_path");n[ci_class].methods+=1;if(a.get("public_flag")==1){n[ci_class].public_methods+=1}else{n[ci_class].private_methods+=1}});Ext.Array.each(m,function(a){Ext.Array.push(l,n[a])});j.loadData(l);this.restoreSelection()},controllerSelected:function(d,c){this.loadPaths(c.get("ci_controller"));this.lastSelected=c},loadPaths:function(f){var h=Ext.getStore("Paths"),g=Ext.getStore("PathItems"),e=h.getRange();filtered=[];Ext.Array.each(e,function(a){if(a.get("ci_controller")==f){Ext.Array.push(filtered,a)}});g.loadData(filtered)},expandAllGroups:function(){this.getList().getView().getFeature("grouping").expandAll()},collapseAllGroups:function(){this.getList().getView().getFeature("grouping").collapseAll()},groupingChanged:function(e,f){var g=this.getList(),h=f.items[0].property;g.features[0].groupHeaderTpl=g.getGroupHeader(h)},showContextMenu:function(e,l,o,k,n){n.preventDefault();var m=Ext.widget("appa_path_contextmenu"),q=Ext.getStore("PermissionsSelection"),p=q.getRange();m.setRecord(l);e.getSelectionModel().select(l,false,true);Ext.Array.each(p,function(a){perm_menu_item={text:a.get("name"),value:a.get("id"),checked:l.get("permission_id")==a.get("id"),group:"permission"};m.down('menuitem[action="set_permission"]').menu.add(perm_menu_item)});m.down('menuitem[action="set_private"]').setVisible(l.data.public_flag!=0);m.down('menuitem[action="set_public"]').setVisible(l.data.public_flag!=1);m.down('menuitem[action="set_permission"]').setDisabled(l.data.public_flag==1);m.down('menuitem[action="remove_permission"]').setDisabled(l.data.public_flag==1||l.get("permission_id")==0);m.down('menuitem[action="delete"]').setDisabled(l.data.found!=0);m.showAt(n.getXY())},findPaths:function(){var h=this,g=this.getList(),e=g.getStore(),f;f=function(b,c,a){if(a){if(c.getResultSet().total>0){Ext.Msg.alert("Result",c.getResultSet().message,h.refreshList,h)}else{h.refreshList()}}};e.load({ci_method:"verify_paths",callback:f})},refreshList:function(){var k=this,j=this.getList(),f=j.getStore(),g,h;g=function(b,c,a){if(a){h=f.findBy(function(d){if(d.get("found")==0){return true}});k.getDelete_unfound_button().setDisabled(h==-1)}};f.load({callback:g})},setPublic:function(h){var f=h.up("menu").getRecord(),k=Ext.getStore("Paths"),j=this,g;g=function(a,b){b.success?j.loadControllers():f.reject()};rec=k.getRange(k.findExact("id",f.get("id")))[0];rec.set({public_flag:1});rec.save({callback:g})},setPrivate:function(h){var f=h.up("menu").getRecord(),k=Ext.getStore("Paths"),j=this,g;g=function(a,b){b.success?j.loadControllers():f.reject()};rec=k.getRange(k.findExact("id",f.get("id")))[0];rec.set({public_flag:0});rec.save({callback:g})},denyPermissionChangeForPublic:function(b){return true},updatePath:function(e,d){var f=function(a,b){d.record.reject()};if(d.field=="permission_name"){d.record.set("permission_id",d.value)}if(d.value!=d.originalValue){d.record.save({failure:f})}},setPermission:function(h){var f=h.up("menu").up("menu").getRecord(),k=Ext.getStore("Paths"),j=this,g;g=function(a,b){b.success?j.loadControllers():f.reject()};rec=k.getRange(k.findExact("id",f.get("id")))[0];rec.set({permission_id:h.value});rec.save({callback:g})},removePermission:function(d){var e=d.up("menu").getRecord(),f=function(a,b){e.reject()};e.save({failure:f,ci_method:"remove_permission"})},deletePath:function(k){var g=k.up("menu").getRecord(),m=Ext.getStore("Paths"),l=this,j,h;h=function(a,b){if(b.success){l.refreshView(true)}else{g.reject()}};j=m.getRange(m.findExact("id",g.get("id")))[0];j.erase({callback:h})},deleteNotFound:function(){var h=this,g=this.getList(),e=g.getStore(),f;f=function(b,c,a){if(a){h.findPaths()}};e.load({ci_method:"delete_not_found",callback:f})},filterAuthPaths:function(d){var f=this.getList(),e=f.getStore();if(d.pressed){e.filter({filterFn:function(a){return a.get("dir")!="appunto-auth"}})}else{e.clearFilter()}}},0,0,0,0,0,0,[AppuntoAuth.controller,"Paths"],0));(Ext.cmd.derive("AppuntoAuth.model.Session",Ext.data.Model,{fields:[{name:"id",type:"string"},{name:"username",type:"string"},{name:"last_activity",type:"date",dateFormat:"Y-m-d H:i:s"},{name:"last_page",type:"string"},{name:"ip_address",type:"string"},{name:"user_agent",type:"string"}],proxy:{type:"ci",ci_class:"appunto-auth/ui/session"}},0,0,0,0,0,0,[AppuntoAuth.model,"Session"],0));(Ext.cmd.derive("AppuntoAuth.view.session.ListController",Ext.app.ViewController,{showContextMenu:function(e,j,m,h,l){l.preventDefault();var k=Ext.widget("appa_session_contextmenu");k.setRecord(j);e.getSelectionModel().select(j,false,true);k.showAt(l.getXY())},refreshList:function(b){Ext.getStore("Sessions").load()},confirmSessionDeletion:function(e){var g=e.up("menu").getRecord(),f=Ext.getStore("Sessions"),h="Delete session";if(g.data.username!=""){h=h+" ("+Lang.localize("session_delete_user")+": "+g.data.username+")"}Ext.MessageBox.confirm(h,Lang.localize("session_delete_confirm"),Ext.bind(this.deleteSession,this,[g,f],true))},deleteSession:function(k,h,j,g,f){if(k=="yes"){g.erase({success:function(){f.remove(g)}})}},toggleView:function(d){var f=d.up("appa_session_list"),e=f.getStore();button=f.down("#session-view-toggle");if(d.value==1){e.clearFilter();button.setText(Lang.localize("session_view_all"))}else{e.filter("show_all",0);button.setText(Lang.localize("session_view_logged_in"))}}},0,0,0,0,["controller.session-list"],0,[AppuntoAuth.view.session,"ListController"],0));(Ext.cmd.derive("AppuntoAuth.view.session.List",Ext.grid.Panel,{store:"Sessions",controller:"session-list",autoScroll:true,viewConfig:{loadMask:{msg:Lang.localize("loading")}},columns:[{header:Lang.localize("session_username"),flex:3,sortable:true,dataIndex:"username"},{header:Lang.localize("session_last_activity"),flex:3,sortable:true,renderer:function(f,d,e){return(Ext.util.Format.date(f,"y"))?Ext.util.Format.date(f,"M d, Y h:i:s A"):"unknown"},dataIndex:"last_activity"},{header:Lang.localize("session_last_page"),flex:3,sortable:true,dataIndex:"last_page"},{header:Lang.localize("session_ip_address"),flex:2,sortable:true,dataIndex:"ip_address"},{header:Lang.localize("session_user_agent"),flex:8,sortable:true,dataIndex:"user_agent"}],tbar:[{xtype:"button",itemId:"session-view-toggle",text:Lang.localize("session_view_all"),cls:"view-selection-button",menu:[{text:Lang.localize("session_view_all"),value:"1",checked:true,handler:"toggleView",group:"session-view"},{text:Lang.localize("session_view_logged_in"),value:"0",checked:false,handler:"toggleView",group:"session-view"}]}],bbar:[{xtype:"button",text:Lang.localize("refresh"),iconCls:"x-tbar-loading",handler:"refreshList"}],initComponent:function(){Ext.grid.Panel.prototype.initComponent.apply(this,arguments);this.addListener("activate",this.getController().refreshList);this.addListener("itemcontextmenu",this.getController().showContextMenu);this.addListener("containercontextmenu",function(d,c){c.preventDefault()});this.addListener("contextmenu",function(d,c){c.preventDefault()})}},0,["appa_session_list"],["appa_session_list","box","component","container","grid","gridpanel","panel","tablepanel"],{appa_session_list:true,box:true,component:true,container:true,grid:true,gridpanel:true,panel:true,tablepanel:true},["widget.appa_session_list"],0,[AppuntoAuth.view.session,"List"],0));(Ext.cmd.derive("AppuntoAuth.view.session.ContextMenu",Ext.menu.Menu,{controller:"session-list",config:{record:null},items:[{text:Lang.localize("session_delete"),handler:"confirmSessionDeletion",iconCls:"monitor-delete"}]},0,["appa_session_contextmenu"],["appa_session_contextmenu","box","component","container","menu","panel"],{appa_session_contextmenu:true,box:true,component:true,container:true,menu:true,panel:true},["widget.appa_session_contextmenu"],0,[AppuntoAuth.view.session,"ContextMenu"],0));Ext.require("Ext.data.Store");Ext.require("AppuntoAuth.model.Session");(Ext.cmd.derive("AppuntoAuth.store.Sessions",Ext.data.Store,{model:"AppuntoAuth.model.Session",pageSize:0,remoteSort:false,remoteFilter:true,autoLoad:false},0,0,0,0,0,0,[AppuntoAuth.store,"Sessions"],0));(Ext.cmd.derive("AppuntoAuth.controller.Sessions",Ext.app.Controller,{models:["Session"],stores:["Sessions"],views:["session.List","session.ContextMenu"]},0,0,0,0,0,0,[AppuntoAuth.controller,"Sessions"],0));(Ext.cmd.derive("AppuntoAuth.Application",Ext.app.Application,{name:"AppuntoAuth",enableQuickTips:true,controllers:["Navigation","Status","Users","Roles","Permissions","Paths","Sessions"]},0,0,0,0,0,0,[AppuntoAuth,"Application"],0));(Ext.cmd.derive("AppuntoAuth.view.main.MainController",Ext.app.ViewController,{onClickButton:function(){Ext.Msg.confirm("Confirm","Are you sure?","onConfirm",this)},onConfirm:function(b){if(b==="yes"){}}},0,0,0,0,["controller.main"],0,[AppuntoAuth.view.main,"MainController"],0));(Ext.cmd.derive("AppuntoAuth.view.main.MainModel",Ext.app.ViewModel,{data:{name:"AppuntoAuth"}},0,0,0,0,["viewmodel.main"],0,[AppuntoAuth.view.main,"MainModel"],0));Ext.application({name:"AppuntoAuth",extend:"AppuntoAuth.Application",autoCreateViewport:"AppuntoAuth.view.main.Main"}); \ No newline at end of file diff --git a/app/resources/appunto-auth/lang/english.js b/app/resources/appunto-auth/lang/english.js deleted file mode 100644 index aa2c922b..00000000 --- a/app/resources/appunto-auth/lang/english.js +++ /dev/null @@ -1,140 +0,0 @@ -var Language = -{ - override: - { - // Global - name : 'Name', //used in headers for various entities - description : 'Description', //used in headers for various entities - refresh : 'Refresh', // reload the data - result : 'Result', - save : 'Save', - cancel : 'Cancel', - yes : 'Yes', - no : 'No', - ok : 'Ok', - loading : 'Loading...', - field_required : 'This field is required', - paging_message : 'Displaying {0} - {1} of {2}', - - // Proxy errors - server_error_title : 'Server error', - server_error_unknown : 'Unknown error: The server did not send any information about the error.', - server_error_no_response: 'Unknown error: Server did not send a response.', - server_error_decode : 'Error decoding the response sent by the server.', - server_error_undefined : 'Undefined Server Error', - - // Application tabs - tab_status : 'Status', - tab_users : 'Users', - tab_user_roles : 'User Roles', - tab_permissions : 'Permissions', - tab_paths : 'Paths', - tab_sessions : 'Sessions', - - // User list - username : 'Username', - name : 'Name', - surname : 'Last name', - email : 'Email', - email_format : 'This field should be an e-mail address in the format "user@example.com"', - password : 'Password', - password_confirm : 'Confirm password', - password_change : 'Change password', - password_match : 'Passwords do not match', - password_format : 'Password must be at least 6 characters, no more than 16 characters, and must include at least one upper case letter, one lower case letter, and one numeric digit.', - user_set_active : 'Set user as active', - active : 'Active', // Whether or not this user has been activated or deactivated - user_add : 'Add user', - user_edit : 'Edit user', - user_delete : 'Delete user', - user_delete_confirm : 'Are you sure you want to delete this user?', - user_activate : 'Activate user', - user_deactivate : 'Deactivate user', - last_ip : 'Last IP', - last_login : 'Last Login', - created : 'Created', - modified : 'Modified', - never : 'Never', - user_select : 'Select a user', - user_select_or : 'Select a User or select Show All above.', - user_no_roles : 'No roles are assigned to this user. Select Show All for a list of available roles', - user_no_perm : 'No permissions are assigned to this user. Select Show All for a list of available permissions', - user_role_list : 'User roles', - user_role_list_for : 'User roles for', //will be followed by username - user_role_add : 'Add user to role', - user_role_remove : 'Remove user from role', - user_perm_list : 'Application permissions', - user_perm_list_for : 'Application permissions for', //wilbe followed by username - user_perm_add : 'Grant user permission', - user_perm_remove : 'Revoke user permission', - user_role_view_all : 'Show all roles', - user_role_view_selected : 'Show only roles for the selected user', - user_perm_view_all : 'Show all permissions', - user_perm_view_selected : 'Show only permissions for the selected user', - granted_to : 'Granted to', // permission is granted to user or to the user's role - grant_role : 'Role', - grant_user : 'User', - user_perm_granted_role : 'permission granted through role', - user_perm_granted_user : 'permission granted to user', - - - // Role list - role_add : 'Add role', - role_edit : 'Edit role', - role_delete : 'Delete role', - role_delete_confirm : 'Are you sure you want to delete this role?', - role_perm_view_all : 'Show all permissions', - role_perm_view_selected : 'Show only permissions for the selected role', - role_perm_for : 'Permissions for', - role_select : 'Select a Role or select Show All above.', - role_perm_add : 'Add permission to role', - role_perm_remove : 'Remove permission from role', - - // Permission list - perm_internal_name : 'Internal Name', - perm_add : 'Add permission', - perm_edit : 'Edit permission', - perm_delete : 'Delete permission', - perm_delete_confirm : 'Are you sure you want to delete this permission?', - - - // Path list - path_tab_controllers : 'Controllers', - path_tab_paths : 'Paths', - controller_methods : 'methods', - controller_public : 'public', - controller_private : 'private', - path_verify : 'Verifing application paths', - path_refreshing : 'Refreshing paths', - path_public : 'Public', - path_private : 'Private', - path_method : 'Method', // A Codeigniter function inside a controller - path_path : 'Path', - path_access : 'Access', // Header for public/private column - path_permission : 'Permission', - path_permissions : 'Permissions', - path_set_public : 'Make path public', - path_set_private : 'Make path private', - path_set_permission : 'Set Permission', - path_remove_permission : 'Remove Permission', - path_delete : 'Delete Path', - path_not_found_1 : 'This method was not found in the Controller but a record of it exists in the database.', - path_not_found_2 : 'You may delete the record of this path.', - - // Session List - session_username : 'Username', - session_last_activity : 'Last Activity', - session_ip_address : 'IP Address', - session_last_page : 'Last Page', - session_user_agent : 'User Agent', // User-Agent string returned by user's browser - session_view_all : 'Show all sessions', - session_view_logged_in : 'Show only logged in sessions', - session_delete : 'Delete Session', - session_delete_confirm : 'Are you sure you want to delete this session?', - session_delete_user : 'user', // used in delete confirmation window title eg: "user: Bob Jones" - - - // dummy val so I don't forget to remove trailing comma - dummy : '' - } -}; diff --git a/app/resources/appunto-auth/lang/portuguese-br.js b/app/resources/appunto-auth/lang/portuguese-br.js deleted file mode 100644 index f10f6f60..00000000 --- a/app/resources/appunto-auth/lang/portuguese-br.js +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Translation by Loanda Drew and Ricardo Silva - */ -var Language = -{ - override: - { - // Global - name : 'Nome', //used in headers for various entities - description : 'Descrição', //used in headers for various entities - refresh : 'Atualizar', // reload the data - result : 'Resultado', - save : 'Salvar', - cancel : 'Cancelar', - yes : 'Sim', - no : 'Não', - ok : 'Ok', - loading : 'Carregando...', - field_required : 'Este campo é obrigatório', - paging_message : 'Exibindo {0} - {1} de {2}', - - // Proxy errors - server_error_title : 'Erro de servidor', - server_error_unknown : 'Erro desconhecido: O servidor não enviou qualquer informação sobre o erro.', - server_error_no_response: 'Erro desconhecido: O servidor não enviou nenhuma resposta.', - server_error_decode : 'Erro na decodificação da resposta enviada pelo servidor.', - server_error_undefined : 'Erro de servidor indefinido', - - - // Application tabs - tab_status : 'Status', - tab_users : 'Usuários', - tab_user_roles : 'Funções do usuário', - tab_permissions : 'Permissões', - tab_paths : 'Caminhos', - tab_sessions : 'Sessões', - - // usuário list - username : 'Usuário', - name : 'Nome', - surname : 'Sobrenome', - email : 'Email', - email_format : 'Este campo deve ser um endereço de email no formato "nome@exemplo.com"', - password : 'Senha', - password_confirm : 'Confirmar senha', - password_change : 'Alterar senha', - password_match : 'As senhas usadas não são iguais', - password_format : 'Senhas devem ter entre 6 e 16 caracteres, e incluir no mínimo uma letra maiúscula, uma letra minúscula e um dígito numérico', - user_set_active : 'Configurar usuário como ativo', - active : 'Ativo', // Whether or not this User has been activated or deactivated - user_add : 'Adicionar usuário', - user_edit : 'Editar usuário', - user_delete : 'Apagar usuário', - user_delete_confirm : 'Tem certeza que deseja apagar este usuário?', - user_activate : 'Ativar usuário', - user_deactivate : 'Desativar usuário', - last_ip : 'Último IP', - last_login : 'Último Login', - created : 'Criado', - modified : 'Modificado', - never : 'Nunca', - user_select : 'Selecione um usuário', - user_select_or : 'Selecione um usuário ou Mostre Todos acima.', - user_no_roles : 'Nenhuma função está associada a este usuário. Selecione Mostrar Todos para ver as funções disponíveis.', - user_no_perm : 'Nenhuma permissão está associada a este usuário. Selecione Mostrar Todos para ver as permissões disponíveis.', - user_role_list : 'Funções do usuário', - user_role_list_for : 'Funções do usuário para', //will be followed by username - user_role_add : 'Adicionar usuário a função', - user_role_remove : 'Remover usuário da função', - user_perm_list : 'Permissões do aplicativo', - user_perm_list_for : 'Permissões do aplicativo para', //will be followed by username - user_perm_add : 'Conceder permissão ao usuário', - user_perm_remove : 'Remover permissão do usuário', - user_role_view_all : 'Mostrar todas as funções', - user_role_view_selected : 'Mostrar apenas as funções do usuário selecionado', - user_perm_view_all : 'Mostrar todas as permissões', - user_perm_view_selected : 'Mostrar apenas as permissões do usuário selecionado', - granted_to : 'Concedido a', // permission is granted to user or to the user's role - grant_role : 'Função', - grant_user : 'Usuário', - user_perm_granted_role : 'permissão concedida via função', - user_perm_granted_user : 'permissão concedida ao usuário', - - - // Role list - role_add : 'Adicionar função', - role_edit : 'Editar função', - role_delete : 'Apagar função', - role_delete_confirm : 'Tem certeza que deseja apagar esta função?', - role_perm_view_all : 'Mostrar todas as permissões', - role_perm_view_selected : 'Mostrar apenas as permisões da função selecionada', - role_perm_for : 'Permissões para', - role_select : 'Selecionar uma Função ou Mostrar Todas acima.', - role_perm_add : 'Adicionar permissão à função', - role_perm_remove : 'Remover perissão da função', - - // Permission list - perm_internal_name : 'Nome Interno', - perm_add : 'Adicionar permissão', - perm_edit : 'Editar permissão', - perm_delete : 'Apagar permissão', - perm_delete_confirm : 'Tem certeza que deseja apagar esta permissão?', - - // Path list - path_tab_controllers : 'Controladores', - path_tab_paths : 'Caminhos', - controller_methods : 'métodos', - controller_public : 'público', - controller_private : 'privado', - path_verify : 'Verificando caminhos do aplicativo', - path_refreshing : 'Atualizando caminhos', - path_public : 'Público', - path_private : 'Privado', - path_method : 'Método', // A Codeigniter function inside a controller - path_path : 'Caminho', - path_access : 'Acesso', // Header for public/private column - path_permission : 'Permissão', - path_permissions : 'Permissões', - path_set_public : 'Tornar caminho público', - path_set_private : 'Tornar caminho privado', - path_set_permission : 'Configurar permissão', - path_remove_permission : 'Remover Permissão', - path_delete : 'Apagar caminho', - path_not_found_1 : 'Este método não foi encontrado no controlador, mas existe um registro dele no banco de dados.', - path_not_found_2 : 'Você pode apagar o registro deste caminho.', - - // Session List - session_username : 'usuário', - session_last_activity : 'Última Atividade', - session_ip_address : 'Endereço de IP', - session_last_page : 'Última Página', - session_user_agent : 'User Agent', // User Agent string returned by usuário's browser - session_view_all : 'Mostrar todas as sessões', - session_view_logged_in : 'Mostrar apenas as sessões ativas', - session_delete : 'Apagar sessão', - session_delete_confirm : 'Tem certeza que deseja apagar esta sessão?', - session_delete_user : 'usuário', // used in delete confirmation window title eg: "user: Bob Jones" - - - // dummy val so I don't forget to remove trailing comma - dummy : '' - } -}; diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/boundlist/trigger-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/boundlist/trigger-arrow.png deleted file mode 100644 index 11daac3d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/boundlist/trigger-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/box/corners-blue.gif b/app/resources/appunto-auth/theme/appunto-auth/images/box/corners-blue.gif deleted file mode 100644 index fa419b50..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/box/corners-blue.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/box/corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/box/corners.gif deleted file mode 100644 index 8aa8cae5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/box/corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/box/l.gif b/app/resources/appunto-auth/theme/appunto-auth/images/box/l.gif deleted file mode 100644 index 0160f97f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/box/l.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/box/r-blue.gif b/app/resources/appunto-auth/theme/appunto-auth/images/box/r-blue.gif deleted file mode 100644 index 3ea5cae3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/box/r-blue.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/box/r.gif b/app/resources/appunto-auth/theme/appunto-auth/images/box/r.gif deleted file mode 100644 index 34237f62..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/box/r.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/box/tb-blue.gif b/app/resources/appunto-auth/theme/appunto-auth/images/box/tb-blue.gif deleted file mode 100644 index 562fecca..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/box/tb-blue.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/box/tb.gif b/app/resources/appunto-auth/theme/appunto-auth/images/box/tb.gif deleted file mode 100644 index 435889bf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/box/tb.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open-rtl.gif deleted file mode 100644 index b8c55c37..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open-rtl.png deleted file mode 100644 index d9968ae6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open.gif deleted file mode 100644 index 3ab4f71a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open.png deleted file mode 100644 index 04b11322..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-open.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-rtl.gif deleted file mode 100644 index e54eacbe..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-rtl.png deleted file mode 100644 index 90f717b4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow.gif deleted file mode 100644 index b0221875..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow.png deleted file mode 100644 index 51d28613..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-left.gif deleted file mode 100644 index 2db8cf5c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-left.png deleted file mode 100644 index 5ff969ee..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-right.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-right.gif deleted file mode 100644 index 5d5a7ab5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-right.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-right.png deleted file mode 100644 index 6fed21a5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-scroll-right.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open-rtl.gif deleted file mode 100644 index 8593bb78..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open-rtl.png deleted file mode 100644 index a8801dfb..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open.gif deleted file mode 100644 index 23c70b3f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open.png deleted file mode 100644 index 19a66732..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-open.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over-rtl.gif deleted file mode 100644 index 05790c35..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over-rtl.png deleted file mode 100644 index db04b9d2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over.gif deleted file mode 100644 index 3f9bd609..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over.png deleted file mode 100644 index 5106cdf1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-over.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-rtl.gif deleted file mode 100644 index 67cbf4b6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-rtl.png deleted file mode 100644 index 658194be..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow.gif b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow.gif deleted file mode 100644 index 6b50863a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow.png deleted file mode 100644 index d3d375c2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/breadcrumb/default-split-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-corners.gif deleted file mode 100644 index 0f06da96..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-notitle-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-notitle-corners.gif deleted file mode 100644 index 0f06da96..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-notitle-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-notitle-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-notitle-sides.gif deleted file mode 100644 index be39f8ae..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-notitle-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-sides.gif deleted file mode 100644 index 92b3123b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn-group/btn-group-default-framed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-corners.gif deleted file mode 100644 index fe8d6f8c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-disabled-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-disabled-corners.gif deleted file mode 100644 index 6a7fdd24..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-disabled-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-disabled-fbg.gif deleted file mode 100644 index 940b3a6e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-disabled-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-disabled-sides.gif deleted file mode 100644 index 476747cd..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-fbg.gif deleted file mode 100644 index d8e7405a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-corners.gif deleted file mode 100644 index 8046f4ce..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-fbg.gif deleted file mode 100644 index d8e7405a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-over-corners.gif deleted file mode 100644 index 8e313b9d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-over-fbg.gif deleted file mode 100644 index 47605ec8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-over-sides.gif deleted file mode 100644 index 426563d9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-pressed-corners.gif deleted file mode 100644 index 73862353..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-pressed-fbg.gif deleted file mode 100644 index 2fb9e196..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-pressed-sides.gif deleted file mode 100644 index b3c452ad..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-sides.gif deleted file mode 100644 index f534e6f4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-over-corners.gif deleted file mode 100644 index d423d99e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-over-fbg.gif deleted file mode 100644 index 47605ec8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-over-sides.gif deleted file mode 100644 index b0ba4e3c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-pressed-corners.gif deleted file mode 100644 index 46027315..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-pressed-fbg.gif deleted file mode 100644 index 2fb9e196..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-pressed-sides.gif deleted file mode 100644 index 0987d81b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-sides.gif deleted file mode 100644 index 55c9229d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-large-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-corners.gif deleted file mode 100644 index 4846ef4f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-disabled-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-disabled-corners.gif deleted file mode 100644 index 6125a3c9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-disabled-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-disabled-fbg.gif deleted file mode 100644 index 33ed9e11..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-disabled-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-disabled-sides.gif deleted file mode 100644 index 53f68a38..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-fbg.gif deleted file mode 100644 index 71489743..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-corners.gif deleted file mode 100644 index 84b29d28..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-fbg.gif deleted file mode 100644 index 71489743..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-over-corners.gif deleted file mode 100644 index a4e59979..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-over-fbg.gif deleted file mode 100644 index 0649fc87..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-over-sides.gif deleted file mode 100644 index c81eea47..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-pressed-corners.gif deleted file mode 100644 index 918f97da..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-pressed-fbg.gif deleted file mode 100644 index 22ae35d3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-pressed-sides.gif deleted file mode 100644 index 7dc4dfb9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-sides.gif deleted file mode 100644 index 6743cd36..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-over-corners.gif deleted file mode 100644 index fef2bda4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-over-fbg.gif deleted file mode 100644 index 0649fc87..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-over-sides.gif deleted file mode 100644 index b08be609..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-pressed-corners.gif deleted file mode 100644 index 12be2626..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-pressed-fbg.gif deleted file mode 100644 index 22ae35d3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-pressed-sides.gif deleted file mode 100644 index 1c0b2271..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-sides.gif deleted file mode 100644 index fddd0c9d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-medium-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-corners.gif deleted file mode 100644 index fb5eff3c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-disabled-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-disabled-corners.gif deleted file mode 100644 index 0c67496b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-disabled-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-disabled-fbg.gif deleted file mode 100644 index 1ed5328c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-disabled-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-disabled-sides.gif deleted file mode 100644 index e6988aca..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-fbg.gif deleted file mode 100644 index 2d8c6d8d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-corners.gif deleted file mode 100644 index 8ff9b323..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-fbg.gif deleted file mode 100644 index 2d8c6d8d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-over-corners.gif deleted file mode 100644 index ada01e9a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-over-fbg.gif deleted file mode 100644 index 562389b9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-over-sides.gif deleted file mode 100644 index 22905938..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-pressed-corners.gif deleted file mode 100644 index 988aff1e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-pressed-fbg.gif deleted file mode 100644 index 80659002..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-pressed-sides.gif deleted file mode 100644 index 8f094692..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-sides.gif deleted file mode 100644 index e5122060..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-over-corners.gif deleted file mode 100644 index dac27ef5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-over-fbg.gif deleted file mode 100644 index 562389b9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-over-sides.gif deleted file mode 100644 index eced76ec..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-pressed-corners.gif deleted file mode 100644 index 6896811a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-pressed-fbg.gif deleted file mode 100644 index 80659002..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-pressed-sides.gif deleted file mode 100644 index c46ddc8c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-sides.gif deleted file mode 100644 index beac7f81..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-small-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-corners.gif deleted file mode 100644 index 6e6dd298..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-disabled-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-disabled-corners.gif deleted file mode 100644 index 601a8a8b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-disabled-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-disabled-fbg.gif deleted file mode 100644 index ca489cd9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-disabled-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-disabled-sides.gif deleted file mode 100644 index a0de586e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-fbg.gif deleted file mode 100644 index fe34b622..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-corners.gif deleted file mode 100644 index 142dd29b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-fbg.gif deleted file mode 100644 index fe34b622..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-over-corners.gif deleted file mode 100644 index a2e12b49..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-over-fbg.gif deleted file mode 100644 index 577568f3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-over-sides.gif deleted file mode 100644 index cbdf676d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-pressed-corners.gif deleted file mode 100644 index 65a7d2c9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-pressed-fbg.gif deleted file mode 100644 index badff7db..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-pressed-sides.gif deleted file mode 100644 index 982f1b5c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-sides.gif deleted file mode 100644 index 024f634b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-over-corners.gif deleted file mode 100644 index e343533f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-over-fbg.gif deleted file mode 100644 index 577568f3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-over-sides.gif deleted file mode 100644 index a248c322..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-pressed-corners.gif deleted file mode 100644 index 0fef573a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-pressed-fbg.gif deleted file mode 100644 index badff7db..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-pressed-sides.gif deleted file mode 100644 index a84dc228..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-sides.gif deleted file mode 100644 index 29f443b7..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-large-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-corners.gif deleted file mode 100644 index 6e6dd298..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-disabled-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-disabled-corners.gif deleted file mode 100644 index 601a8a8b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-disabled-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-disabled-fbg.gif deleted file mode 100644 index 7707aa1d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-disabled-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-disabled-sides.gif deleted file mode 100644 index 55de8a69..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-fbg.gif deleted file mode 100644 index 804354b2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-corners.gif deleted file mode 100644 index 142dd29b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-fbg.gif deleted file mode 100644 index 804354b2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-over-corners.gif deleted file mode 100644 index 59a99e33..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-over-fbg.gif deleted file mode 100644 index 3aae9757..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-over-sides.gif deleted file mode 100644 index b529903c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-pressed-corners.gif deleted file mode 100644 index 92267ece..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-pressed-fbg.gif deleted file mode 100644 index c5d4e673..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-pressed-sides.gif deleted file mode 100644 index 34c16dc8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-sides.gif deleted file mode 100644 index b521c99c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-over-corners.gif deleted file mode 100644 index f8711fad..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-over-fbg.gif deleted file mode 100644 index 3aae9757..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-over-sides.gif deleted file mode 100644 index 0bda741a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-pressed-corners.gif deleted file mode 100644 index 74f4c0bc..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-pressed-fbg.gif deleted file mode 100644 index c5d4e673..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-pressed-sides.gif deleted file mode 100644 index 0d9f0913..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-sides.gif deleted file mode 100644 index efeaf838..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-medium-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-corners.gif deleted file mode 100644 index 6e6dd298..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-disabled-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-disabled-corners.gif deleted file mode 100644 index 601a8a8b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-disabled-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-disabled-fbg.gif deleted file mode 100644 index 9a3cdf11..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-disabled-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-disabled-sides.gif deleted file mode 100644 index 5295a3ee..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-fbg.gif deleted file mode 100644 index b362e826..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-corners.gif deleted file mode 100644 index 142dd29b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-fbg.gif deleted file mode 100644 index b362e826..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-over-corners.gif deleted file mode 100644 index 59a99e33..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-over-fbg.gif deleted file mode 100644 index 108a3ddf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-over-sides.gif deleted file mode 100644 index a3a4e139..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-pressed-corners.gif deleted file mode 100644 index 92267ece..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-pressed-fbg.gif deleted file mode 100644 index ed016e18..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-pressed-sides.gif deleted file mode 100644 index 097bbe04..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-sides.gif deleted file mode 100644 index 744e0269..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-over-corners.gif deleted file mode 100644 index f8711fad..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-over-fbg.gif deleted file mode 100644 index 108a3ddf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-over-sides.gif deleted file mode 100644 index 538d37f1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-pressed-corners.gif deleted file mode 100644 index 74f4c0bc..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-pressed-fbg.gif deleted file mode 100644 index ed016e18..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-pressed-sides.gif deleted file mode 100644 index bd48a04b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-sides.gif deleted file mode 100644 index 97109aa7..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-default-toolbar-small-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-over-corners.gif deleted file mode 100644 index 2a55edda..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-over-fbg.gif deleted file mode 100644 index 577568f3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-over-sides.gif deleted file mode 100644 index cbdf676d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-pressed-corners.gif deleted file mode 100644 index ddd5e91b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-pressed-fbg.gif deleted file mode 100644 index badff7db..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-pressed-sides.gif deleted file mode 100644 index 982f1b5c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-over-corners.gif deleted file mode 100644 index 477ef72d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-over-fbg.gif deleted file mode 100644 index 577568f3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-over-sides.gif deleted file mode 100644 index a248c322..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-pressed-corners.gif deleted file mode 100644 index cbdd93bd..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-pressed-fbg.gif deleted file mode 100644 index badff7db..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-pressed-sides.gif deleted file mode 100644 index a84dc228..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-large-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-over-corners.gif deleted file mode 100644 index a049a008..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-over-fbg.gif deleted file mode 100644 index 3aae9757..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-over-sides.gif deleted file mode 100644 index b529903c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-pressed-corners.gif deleted file mode 100644 index faa26129..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-pressed-fbg.gif deleted file mode 100644 index c5d4e673..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-pressed-sides.gif deleted file mode 100644 index 34c16dc8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-over-corners.gif deleted file mode 100644 index f8711fad..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-over-fbg.gif deleted file mode 100644 index 3aae9757..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-over-sides.gif deleted file mode 100644 index 0bda741a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-pressed-corners.gif deleted file mode 100644 index d2605c30..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-pressed-fbg.gif deleted file mode 100644 index c5d4e673..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-pressed-sides.gif deleted file mode 100644 index 0d9f0913..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-medium-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-over-corners.gif deleted file mode 100644 index 59a99e33..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-over-fbg.gif deleted file mode 100644 index 108a3ddf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-over-sides.gif deleted file mode 100644 index a3a4e139..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-pressed-corners.gif deleted file mode 100644 index 92267ece..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-pressed-fbg.gif deleted file mode 100644 index ed016e18..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-pressed-sides.gif deleted file mode 100644 index 097bbe04..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-over-corners.gif deleted file mode 100644 index f8711fad..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-over-fbg.gif deleted file mode 100644 index 108a3ddf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-over-sides.gif deleted file mode 100644 index 538d37f1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-pressed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-pressed-corners.gif deleted file mode 100644 index 74f4c0bc..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-pressed-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-pressed-fbg.gif deleted file mode 100644 index ed016e18..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-pressed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-pressed-sides.gif deleted file mode 100644 index bd48a04b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/btn/btn-plain-toolbar-small-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/arrow-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/arrow-rtl.gif deleted file mode 100644 index b8c55c37..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/arrow-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/arrow.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/arrow.gif deleted file mode 100644 index 3ab4f71a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/arrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/btn-arrow.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/btn-arrow.gif deleted file mode 100644 index f90d5df4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/btn-arrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/btn-sprite.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/btn-sprite.gif deleted file mode 100644 index 834ff978..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/btn-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/btn.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/btn.gif deleted file mode 100644 index 96ea61ab..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/btn.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-arrow-rtl.png deleted file mode 100644 index 76beeabd..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-arrow.png deleted file mode 100644 index 32674e43..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow-b-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow-b-rtl.png deleted file mode 100644 index 79677a4e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow-b-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow-b.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow-b.png deleted file mode 100644 index 9f3928a2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow-b.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow-rtl.png deleted file mode 100644 index 79850507..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow.png deleted file mode 100644 index 06ad27b1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-large-s-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-arrow-rtl.png deleted file mode 100644 index d54d3a0d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-arrow.png deleted file mode 100644 index e565db49..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow-b-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow-b-rtl.png deleted file mode 100644 index f2fb53be..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow-b-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow-b.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow-b.png deleted file mode 100644 index ee39ae27..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow-b.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow-rtl.png deleted file mode 100644 index fb111406..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow.png deleted file mode 100644 index c1d18755..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-medium-s-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-arrow-rtl.png deleted file mode 100644 index 35384457..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-arrow.png deleted file mode 100644 index 17a9beb1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow-b-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow-b-rtl.png deleted file mode 100644 index 2f8b2e57..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow-b-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow-b.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow-b.png deleted file mode 100644 index afd13fbb..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow-b.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow-rtl.png deleted file mode 100644 index f59b7922..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow.png deleted file mode 100644 index eaffbdcb..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-small-s-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-arrow-rtl.png deleted file mode 100644 index d8f0151d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-arrow.png deleted file mode 100644 index 31fc36e6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow-b-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow-b-rtl.png deleted file mode 100644 index 379d2d9f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow-b-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow-b.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow-b.png deleted file mode 100644 index dcfe8eab..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow-b.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow-rtl.png deleted file mode 100644 index 612a6b16..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow.png deleted file mode 100644 index 731b207e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-large-s-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-arrow-rtl.png deleted file mode 100644 index 1648e51c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-arrow.png deleted file mode 100644 index 65fdd036..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow-b-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow-b-rtl.png deleted file mode 100644 index 8d2232b1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow-b-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow-b.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow-b.png deleted file mode 100644 index 2489479f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow-b.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow-rtl.png deleted file mode 100644 index c81c5f2e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow.png deleted file mode 100644 index 0a6857aa..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-medium-s-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-arrow-rtl.png deleted file mode 100644 index 89191385..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-arrow.png deleted file mode 100644 index b56c2a65..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow-b-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow-b-rtl.png deleted file mode 100644 index 11423517..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow-b-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow-b.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow-b.png deleted file mode 100644 index bb1b08e9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow-b.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow-rtl.png deleted file mode 100644 index 9e9e16b0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow.png deleted file mode 100644 index 9a728579..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/default-toolbar-small-s-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-arrow-rtl.png deleted file mode 100644 index 3d68e7e2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-arrow.png deleted file mode 100644 index 17a9beb1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-s-arrow-b.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-s-arrow-b.png deleted file mode 100644 index afd13fbb..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-s-arrow-b.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-s-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-s-arrow-rtl.png deleted file mode 100644 index f59b7922..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-s-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-s-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-s-arrow.png deleted file mode 100644 index eaffbdcb..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/grid-cell-small-s-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/group-cs.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/group-cs.gif deleted file mode 100644 index 7059e2b0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/group-cs.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/group-lr.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/group-lr.gif deleted file mode 100644 index 3f41fbd8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/group-lr.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/group-tb.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/group-tb.gif deleted file mode 100644 index c5ea8cab..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/group-tb.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-arrow-rtl.png deleted file mode 100644 index d8f0151d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-arrow.png deleted file mode 100644 index 31fc36e6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow-b-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow-b-rtl.png deleted file mode 100644 index 379d2d9f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow-b-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow-b.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow-b.png deleted file mode 100644 index dcfe8eab..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow-b.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow-rtl.png deleted file mode 100644 index 612a6b16..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow.png deleted file mode 100644 index 731b207e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-large-s-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-arrow-rtl.png deleted file mode 100644 index 1648e51c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-arrow.png deleted file mode 100644 index 65fdd036..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow-b-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow-b-rtl.png deleted file mode 100644 index 8d2232b1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow-b-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow-b.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow-b.png deleted file mode 100644 index 2489479f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow-b.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow-rtl.png deleted file mode 100644 index c81c5f2e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow.png deleted file mode 100644 index 0a6857aa..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-medium-s-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-arrow-rtl.png deleted file mode 100644 index 89191385..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-arrow.png deleted file mode 100644 index b56c2a65..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow-b-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow-b-rtl.png deleted file mode 100644 index 11423517..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow-b-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow-b.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow-b.png deleted file mode 100644 index bb1b08e9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow-b.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow-rtl.png deleted file mode 100644 index 9e9e16b0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow.png deleted file mode 100644 index 9a728579..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/plain-toolbar-small-s-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-b-noline.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-b-noline.gif deleted file mode 100644 index a4220ee9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-b-noline.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-b.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-b.gif deleted file mode 100644 index 5b46305b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-b.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-bo.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-bo.gif deleted file mode 100644 index ed6eeca0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-bo.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-light-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-light-rtl.gif deleted file mode 100644 index cfa5ca3b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-light-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-light.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-light.gif deleted file mode 100644 index 08783c9d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-light.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-noline-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-noline-rtl.gif deleted file mode 100644 index c242ef2f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-noline-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-noline.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-noline.gif deleted file mode 100644 index 0953eab5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-noline.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-o-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-o-rtl.gif deleted file mode 100644 index badb3f89..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-o-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-o.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-o.gif deleted file mode 100644 index b6ca4688..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-o.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-rtl.gif deleted file mode 100644 index da278f51..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow.gif b/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow.gif deleted file mode 100644 index 5692b8ac..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/button/s-arrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/arrow-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/arrow-left.png deleted file mode 100644 index fc09f9a6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/arrow-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/arrow-right.png b/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/arrow-right.png deleted file mode 100644 index a22b876f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/arrow-right.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/datepicker-footer-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/datepicker-footer-bg.gif deleted file mode 100644 index 2d8439ac..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/datepicker-footer-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/datepicker-header-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/datepicker-header-bg.gif deleted file mode 100644 index 9ab1df39..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/datepicker-header-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/month-arrow.png b/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/month-arrow.png deleted file mode 100644 index f0b572f6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/datepicker/month-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-add.gif b/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-add.gif deleted file mode 100644 index b22cd144..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-add.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-add.png b/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-add.png deleted file mode 100644 index a7b8f28d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-add.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-no.gif b/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-no.gif deleted file mode 100644 index 08d08335..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-no.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-no.png b/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-no.png deleted file mode 100644 index 02e219a1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-no.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-yes.gif b/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-yes.gif deleted file mode 100644 index 8aacb307..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-yes.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-yes.png b/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-yes.png deleted file mode 100644 index a7b8f28d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/dd/drop-yes.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/editor/tb-sprite.gif b/app/resources/appunto-auth/theme/appunto-auth/images/editor/tb-sprite.gif deleted file mode 100644 index fb705776..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/editor/tb-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/editor/tb-sprite.png b/app/resources/appunto-auth/theme/appunto-auth/images/editor/tb-sprite.png deleted file mode 100644 index 98861180..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/editor/tb-sprite.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/fieldset/collapse-tool.png b/app/resources/appunto-auth/theme/appunto-auth/images/fieldset/collapse-tool.png deleted file mode 100644 index 97eb83f5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/fieldset/collapse-tool.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/box-select-item-close.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/box-select-item-close.gif deleted file mode 100644 index 98d5da95..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/box-select-item-close.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/checkbox.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/checkbox.gif deleted file mode 100644 index 835b346c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/checkbox.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/checkbox.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/checkbox.png deleted file mode 100644 index fc2709ca..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/checkbox.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger-rtl.gif deleted file mode 100644 index 940399aa..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger-rtl.png deleted file mode 100644 index 73e1dbe9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger.gif deleted file mode 100644 index be3ff587..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger.png deleted file mode 100644 index 73e1dbe9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/clear-trigger.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger-rtl.gif deleted file mode 100644 index 63597658..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger-rtl.png deleted file mode 100644 index 94894936..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger.gif deleted file mode 100644 index e0537cbc..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger.png deleted file mode 100644 index 94894936..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/date-trigger.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/error-tip-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/error-tip-corners.gif deleted file mode 100644 index 6ea4c383..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/error-tip-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/exclamation.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/exclamation.gif deleted file mode 100644 index ea31a306..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/exclamation.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/exclamation.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/exclamation.png deleted file mode 100644 index 3e6e3d08..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/exclamation.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/radio.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/radio.gif deleted file mode 100644 index db3a5305..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/radio.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/radio.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/radio.png deleted file mode 100644 index 86644bb8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/radio.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger-rtl.gif deleted file mode 100644 index 3ff38462..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger-rtl.png deleted file mode 100644 index 15e15f5f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger.gif deleted file mode 100644 index 0cc4f596..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger.png deleted file mode 100644 index 15e15f5f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/search-trigger.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-rtl.gif deleted file mode 100644 index ff14c066..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-rtl.png deleted file mode 100644 index 28d140f3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-small-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-small-rtl.gif deleted file mode 100644 index 70c536e6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-small-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-small.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-small.gif deleted file mode 100644 index e70f8d80..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner-small.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner.gif deleted file mode 100644 index 1e323bf0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner.png deleted file mode 100644 index 28d140f3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/spinner.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/tag-field-item-close.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/tag-field-item-close.gif deleted file mode 100644 index 63b022ba..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/tag-field-item-close.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/tag-field-item-close.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/tag-field-item-close.png deleted file mode 100644 index bcb2834d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/tag-field-item-close.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/text-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/text-bg.gif deleted file mode 100644 index 4179607c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/text-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-rtl.gif deleted file mode 100644 index 33e73752..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-rtl.png deleted file mode 100644 index b4e2d5c3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-square-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-square-rtl.gif deleted file mode 100644 index a86f6ce2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-square-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-square.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-square.gif deleted file mode 100644 index 7a0f585c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-square.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-tpl-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-tpl-rtl.gif deleted file mode 100644 index 1e766e47..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-tpl-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-tpl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-tpl.gif deleted file mode 100644 index e3701a38..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger-tpl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger.gif b/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger.gif deleted file mode 100644 index d7be2f31..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger.png b/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger.png deleted file mode 100644 index b4e2d5c3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/form/trigger.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-corners.gif deleted file mode 100644 index 5da7277a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-sides.gif deleted file mode 100644 index 2b76e68e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-corners.gif deleted file mode 100644 index 4c455e59..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-sides.gif deleted file mode 100644 index 2b76e68e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/arrow-left-white.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/arrow-left-white.gif deleted file mode 100644 index 63088f56..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/arrow-left-white.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/arrow-right-white.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/arrow-right-white.gif deleted file mode 100644 index e9e06789..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/arrow-right-white.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-bg.gif deleted file mode 100644 index d76ffbcc..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-bg.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-bg.png deleted file mode 100644 index 0bcc2367..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-bg.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-selected-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-selected-bg.gif deleted file mode 100644 index f1da867d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-selected-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-selected-bg.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-selected-bg.png deleted file mode 100644 index 500c3bdd..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/cell-special-selected-bg.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-bottom.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-bottom.gif deleted file mode 100644 index c525f7eb..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-bottom.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-bottom.png deleted file mode 100644 index 97822194..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-bottom.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-top.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-top.gif deleted file mode 100644 index ccc92b6b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-top.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-top.png deleted file mode 100644 index 6e28535a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/col-move-top.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/column-header-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/column-header-bg.gif deleted file mode 100644 index dec6733f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/column-header-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/column-header-over-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/column-header-over-bg.gif deleted file mode 100644 index bd0c1e0f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/column-header-over-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/columns.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/columns.gif deleted file mode 100644 index 2d3a8239..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/columns.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/columns.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/columns.png deleted file mode 100644 index 70a5c873..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/columns.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-left.gif deleted file mode 100644 index 5d923b28..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-left.png deleted file mode 100644 index e8177d05..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-right.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-right.gif deleted file mode 100644 index 8d154db7..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-right.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-right.png deleted file mode 100644 index d610f9d5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dd-insert-arrow-right.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty-rtl.gif deleted file mode 100644 index 22fa12a1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty-rtl.png deleted file mode 100644 index 5f841228..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty.gif deleted file mode 100644 index 4f217a47..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty.png deleted file mode 100644 index fc06fdde..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/dirty.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/done.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/done.gif deleted file mode 100644 index a937cb22..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/done.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-no.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-no.gif deleted file mode 100644 index 31a332bf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-no.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-no.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-no.png deleted file mode 100644 index 02e219a1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-no.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-yes.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-yes.gif deleted file mode 100644 index 926010e1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-yes.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-yes.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-yes.png deleted file mode 100644 index a7b8f28d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/drop-yes.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/equals.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/equals.png deleted file mode 100644 index c1060cae..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/equals.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/find.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/find.png deleted file mode 100644 index dbfbc16d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/find.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/greater_than.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/greater_than.png deleted file mode 100644 index be41c9a8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/greater_than.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/less_than.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/less_than.png deleted file mode 100644 index 80aacddf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/filters/less_than.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/footer-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/footer-bg.gif deleted file mode 100644 index 126120f7..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/footer-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-blue-hd.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-blue-hd.gif deleted file mode 100644 index 862094e6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-blue-hd.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-blue-split.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-blue-split.gif deleted file mode 100644 index 5286f58f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-blue-split.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-hrow.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-hrow.gif deleted file mode 100644 index 63741042..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-hrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-loading.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-loading.gif deleted file mode 100644 index d112c540..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-split.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-split.gif deleted file mode 100644 index c76a16e9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-split.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-vista-hd.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-vista-hd.gif deleted file mode 100644 index d0972638..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid-vista-hd.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hd-btn-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hd-btn-left.gif deleted file mode 100644 index 78927053..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hd-btn-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hd-btn.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hd-btn.gif deleted file mode 100644 index daf1ef2b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hd-btn.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hrow-over.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hrow-over.gif deleted file mode 100644 index f9c07af1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hrow-over.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hrow.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hrow.gif deleted file mode 100644 index 8d459a30..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-hrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-rowheader.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-rowheader.gif deleted file mode 100644 index 2799b45c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/grid3-rowheader.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-by.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-by.gif deleted file mode 100644 index d6075bba..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-by.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-by.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-by.png deleted file mode 100644 index 8508adeb..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-by.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-collapse.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-collapse.gif deleted file mode 100644 index ec980038..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-collapse.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-collapse.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-collapse.png deleted file mode 100644 index 49fcc4fd..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-collapse.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-expand-sprite.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-expand-sprite.gif deleted file mode 100644 index d24891de..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-expand-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-expand.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-expand.gif deleted file mode 100644 index 71c8ac43..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-expand.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-expand.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-expand.png deleted file mode 100644 index d65a7df0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/group-expand.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hd-pop.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/hd-pop.gif deleted file mode 100644 index eb8ba796..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hd-pop.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hd-pop.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/hd-pop.png deleted file mode 100644 index 3ad96ef6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hd-pop.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-asc.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-asc.gif deleted file mode 100644 index 15058ff6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-asc.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-asc.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-asc.png deleted file mode 100644 index a206d35f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-asc.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-desc.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-desc.png deleted file mode 100644 index 55a714e1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-desc.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-lock.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-lock.gif deleted file mode 100644 index 15961261..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-lock.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-lock.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-lock.png deleted file mode 100644 index b293e10d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-lock.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-unlock.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-unlock.gif deleted file mode 100644 index af59cf92..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-unlock.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-unlock.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-unlock.png deleted file mode 100644 index e9e9df59..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-unlock.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/invalid_line.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/invalid_line.gif deleted file mode 100644 index fb7e0f34..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/invalid_line.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/loading.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/loading.gif deleted file mode 100644 index 81b0f125..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/mso-hd.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/mso-hd.gif deleted file mode 100644 index 669f3cf0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/mso-hd.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/nowait.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/nowait.gif deleted file mode 100644 index 4c5862cd..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/nowait.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-first-disabled.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-first-disabled.gif deleted file mode 100644 index 1e02c419..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-first-disabled.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-first.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-first.gif deleted file mode 100644 index 60be4bcd..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-first.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-first.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-first.png deleted file mode 100644 index 7691f320..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-first.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-last-disabled.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-last-disabled.gif deleted file mode 100644 index 86970677..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-last-disabled.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-last.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-last.gif deleted file mode 100644 index beb4a830..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-last.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-last.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-last.png deleted file mode 100644 index 49b13d7e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-last.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-next-disabled.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-next-disabled.gif deleted file mode 100644 index 90a7756f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-next-disabled.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-next.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-next.gif deleted file mode 100644 index 97db1c22..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-next.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-next.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-next.png deleted file mode 100644 index c3e72bab..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-next.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-prev-disabled.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-prev-disabled.gif deleted file mode 100644 index 37154d62..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-prev-disabled.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-prev.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-prev.gif deleted file mode 100644 index d07e61c3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-prev.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-prev.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-prev.png deleted file mode 100644 index cace90be..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/page-prev.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/pick-button.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/pick-button.gif deleted file mode 100644 index 6957924a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/pick-button.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/pick-button.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/pick-button.png deleted file mode 100644 index acafacef..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/pick-button.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/property-cell-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/property-cell-bg.gif deleted file mode 100644 index 7890cf9f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/property-cell-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/property-cell-selected-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/property-cell-selected-bg.gif deleted file mode 100644 index 1dfe9a69..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/property-cell-selected-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/refresh-disabled.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/refresh-disabled.gif deleted file mode 100644 index 607800b8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/refresh-disabled.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/refresh.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/refresh.gif deleted file mode 100644 index 868b2dc5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/refresh.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/refresh.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/refresh.png deleted file mode 100644 index 5320ddde..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/refresh.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-check-sprite.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-check-sprite.gif deleted file mode 100644 index 61011646..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-check-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-expand-sprite.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-expand-sprite.gif deleted file mode 100644 index 09c00a66..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-expand-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-over.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-over.gif deleted file mode 100644 index b288e387..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-over.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-sel.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-sel.gif deleted file mode 100644 index 98209e6e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/row-sel.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort-hd.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort-hd.gif deleted file mode 100644 index 4cf483d2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort-hd.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_asc.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_asc.gif deleted file mode 100644 index 7e562e20..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_asc.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_asc.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_asc.png deleted file mode 100644 index a206d35f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_asc.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_desc.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_desc.gif deleted file mode 100644 index 9b7a871b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_desc.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_desc.png b/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_desc.png deleted file mode 100644 index 55a714e1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/sort_desc.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/wait.gif b/app/resources/appunto-auth/theme/appunto-auth/images/grid/wait.gif deleted file mode 100644 index 471c1a4f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/wait.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-bottom.gif b/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-bottom.gif deleted file mode 100644 index c18f9e34..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-left.gif deleted file mode 100644 index 99f7993f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-right.gif b/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-right.gif deleted file mode 100644 index 5b13c5a8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-top.gif b/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-top.gif deleted file mode 100644 index a4ca2bb2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/layout/mini-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/loadmask/loading.gif b/app/resources/appunto-auth/theme/appunto-auth/images/loadmask/loading.gif deleted file mode 100644 index 8471b4f0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/loadmask/loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/magnify.png b/app/resources/appunto-auth/theme/appunto-auth/images/magnify.png deleted file mode 100644 index b807c42a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/magnify.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-checked.gif b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-checked.gif deleted file mode 100644 index fad58937..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-checked.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-checked.png b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-checked.png deleted file mode 100644 index 4f5157d8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-checked.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-group-checked.gif b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-group-checked.gif deleted file mode 100644 index c8824887..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-group-checked.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-group-checked.png b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-group-checked.png deleted file mode 100644 index a9f0b80f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-group-checked.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent-left.gif deleted file mode 100644 index 1ce2ccb4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent-left.png deleted file mode 100644 index d4575644..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent.gif b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent.gif deleted file mode 100644 index 5461a8bf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent.png b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent.png deleted file mode 100644 index 2d2331ed..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-menu-parent.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-bottom.gif b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-bottom.gif deleted file mode 100644 index 845f9e52..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-bottom.png b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-bottom.png deleted file mode 100644 index d89a459a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-bottom.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-top.gif b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-top.gif deleted file mode 100644 index 4bfa1541..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-top.png b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-top.png deleted file mode 100644 index bbbf4af7..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-scroll-top.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-unchecked.gif b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-unchecked.gif deleted file mode 100644 index 43823e52..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-unchecked.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-unchecked.png b/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-unchecked.png deleted file mode 100644 index bce8817b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/menu/default-unchecked.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-bottom-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-bottom-bg.gif deleted file mode 100644 index 344a10ee..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-bottom-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-bottom-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-bottom-corners.gif deleted file mode 100644 index a1db0d2b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-bottom-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-bottom-fbg.gif deleted file mode 100644 index b4e13fb6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-bottom-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-bottom-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-bottom-sides.gif deleted file mode 100644 index edbf0d53..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif deleted file mode 100644 index c58ff41d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-bottom-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-bottom-fbg.gif deleted file mode 100644 index b4e13fb6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-bottom-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif deleted file mode 100644 index edbf0d53..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-corners-rtl.gif deleted file mode 100644 index ccad4632..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-corners.gif deleted file mode 100644 index c58ff41d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-fbg-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-fbg-rtl.gif deleted file mode 100644 index 2494e614..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-fbg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-fbg.gif deleted file mode 100644 index 44df2cc2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-sides-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-sides-rtl.gif deleted file mode 100644 index 99adc2b9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-sides-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-sides.gif deleted file mode 100644 index e44d3491..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-corners-rtl.gif deleted file mode 100644 index ccad4632..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-corners.gif deleted file mode 100644 index c58ff41d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-fbg-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-fbg-rtl.gif deleted file mode 100644 index c61da305..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-fbg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-fbg.gif deleted file mode 100644 index cc6098a6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-sides-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-sides-rtl.gif deleted file mode 100644 index a5bf6580..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-sides-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-sides.gif deleted file mode 100644 index e44d3491..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-top-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-top-corners.gif deleted file mode 100644 index c58ff41d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-top-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-top-fbg.gif deleted file mode 100644 index a41bdc3e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-top-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-top-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-top-sides.gif deleted file mode 100644 index edbf0d53..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-collapsed-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-corners-rtl.gif deleted file mode 100644 index 9e7bd913..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-corners.gif deleted file mode 100644 index 50034b74..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-fbg-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-fbg-rtl.gif deleted file mode 100644 index 2494e614..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-fbg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-fbg.gif deleted file mode 100644 index 44df2cc2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-sides-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-sides-rtl.gif deleted file mode 100644 index 99adc2b9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-sides-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-sides.gif deleted file mode 100644 index e44d3491..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-corners-rtl.gif deleted file mode 100644 index d09896dc..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-corners.gif deleted file mode 100644 index 989f8ae5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-fbg-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-fbg-rtl.gif deleted file mode 100644 index c61da305..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-fbg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-fbg.gif deleted file mode 100644 index cc6098a6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-sides-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-sides-rtl.gif deleted file mode 100644 index a5bf6580..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-sides-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-sides.gif deleted file mode 100644 index e44d3491..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-top-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-top-corners.gif deleted file mode 100644 index 76bd8355..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-top-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-top-fbg.gif deleted file mode 100644 index a41bdc3e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-top-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-top-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-top-sides.gif deleted file mode 100644 index edbf0d53..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-framed-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-left-bg-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-left-bg-rtl.gif deleted file mode 100644 index 99f01c70..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-left-bg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-left-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-left-bg.gif deleted file mode 100644 index 03818c3d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-left-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-right-bg-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-right-bg-rtl.gif deleted file mode 100644 index d7482f09..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-right-bg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-right-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-right-bg.gif deleted file mode 100644 index 37dc9795..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-right-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-top-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-top-bg.gif deleted file mode 100644 index 0c6edc3b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-default-top-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-bottom-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-bottom-corners.gif deleted file mode 100644 index c1102d76..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-bottom-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-bottom-sides.gif deleted file mode 100644 index 8d1096a5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-bottom-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-bottom-corners.gif deleted file mode 100644 index 1db31411..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-bottom-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-bottom-sides.gif deleted file mode 100644 index 8d1096a5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-left-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-left-corners-rtl.gif deleted file mode 100644 index c2f7a6c0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-left-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-left-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-left-corners.gif deleted file mode 100644 index 8bfada9e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-left-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-left-sides.gif deleted file mode 100644 index 6ced6cf1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-right-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-right-corners-rtl.gif deleted file mode 100644 index c2f7a6c0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-right-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-right-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-right-corners.gif deleted file mode 100644 index 8bfada9e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-right-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-right-sides.gif deleted file mode 100644 index 6ced6cf1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-top-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-top-corners.gif deleted file mode 100644 index 1db31411..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-top-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-top-sides.gif deleted file mode 100644 index 8d1096a5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-collapsed-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-left-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-left-corners-rtl.gif deleted file mode 100644 index f4050cc2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-left-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-left-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-left-corners.gif deleted file mode 100644 index ef9898f8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-left-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-left-sides.gif deleted file mode 100644 index 6ced6cf1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-right-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-right-corners-rtl.gif deleted file mode 100644 index c6be544b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-right-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-right-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-right-corners.gif deleted file mode 100644 index a4dec6f0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-right-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-right-sides.gif deleted file mode 100644 index 6ced6cf1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-top-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-top-corners.gif deleted file mode 100644 index 1b713d09..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-top-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-top-sides.gif deleted file mode 100644 index 8d1096a5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel-header/panel-header-light-framed-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-default-framed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-default-framed-corners.gif deleted file mode 100644 index c58ff41d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-default-framed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-default-framed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-default-framed-sides.gif deleted file mode 100644 index e44d3491..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-default-framed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-light-framed-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-light-framed-corners.gif deleted file mode 100644 index 1db31411..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-light-framed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-light-framed-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-light-framed-sides.gif deleted file mode 100644 index 6ced6cf1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/panel/panel-light-framed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/progress/progress-default-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/progress/progress-default-bg.gif deleted file mode 100644 index 7c170371..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/progress/progress-default-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/blue-loading.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/blue-loading.gif deleted file mode 100644 index 3bbf639e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/blue-loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/calendar.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/calendar.gif deleted file mode 100644 index 133cf232..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/calendar.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/glass-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/glass-bg.gif deleted file mode 100644 index 26fbbae3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/glass-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/hd-sprite.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/hd-sprite.gif deleted file mode 100644 index 42da1ea1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/hd-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-error.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-error.gif deleted file mode 100644 index 397b655a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-error.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-error.png b/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-error.png deleted file mode 100644 index 458c0989..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-error.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-info.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-info.gif deleted file mode 100644 index 58281c30..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-info.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-info.png b/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-info.png deleted file mode 100644 index cbccd11c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-info.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-question.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-question.gif deleted file mode 100644 index 08abd82a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-question.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-question.png b/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-question.png deleted file mode 100644 index cac922e0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-question.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-warning.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-warning.gif deleted file mode 100644 index 27ff98b4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-warning.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-warning.png b/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-warning.png deleted file mode 100644 index 042ca05c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/icon-warning.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/large-loading.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/large-loading.gif deleted file mode 100644 index b36b555b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/large-loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/left-btn.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/left-btn.gif deleted file mode 100644 index 3301054f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/left-btn.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/loading-balls.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/loading-balls.gif deleted file mode 100644 index 9ce214be..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/loading-balls.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/right-btn.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/right-btn.gif deleted file mode 100644 index c529110f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/right-btn.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/shadow-c.png b/app/resources/appunto-auth/theme/appunto-auth/images/shared/shadow-c.png deleted file mode 100644 index d435f80a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/shadow-c.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/shadow-lr.png b/app/resources/appunto-auth/theme/appunto-auth/images/shared/shadow-lr.png deleted file mode 100644 index bb88b6f2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/shadow-lr.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/shadow.png b/app/resources/appunto-auth/theme/appunto-auth/images/shared/shadow.png deleted file mode 100644 index 75c0eba3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/shadow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/shared/warning.gif b/app/resources/appunto-auth/theme/appunto-auth/images/shared/warning.gif deleted file mode 100644 index 806d4bc0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/shared/warning.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/e-handle-dark.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/e-handle-dark.gif deleted file mode 100644 index b5486c1a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/e-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/e-handle.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/e-handle.gif deleted file mode 100644 index a8ed0ede..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/e-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/e-handle.png b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/e-handle.png deleted file mode 100644 index 2fe5cb15..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/e-handle.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/ne-handle-dark.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/ne-handle-dark.gif deleted file mode 100644 index 04e5ecf7..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/ne-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/ne-handle.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/ne-handle.gif deleted file mode 100644 index 6f7b0c29..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/ne-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/ne-handle.png b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/ne-handle.png deleted file mode 100644 index 8d8eb638..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/ne-handle.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/nw-handle-dark.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/nw-handle-dark.gif deleted file mode 100644 index 6e49d696..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/nw-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/nw-handle.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/nw-handle.gif deleted file mode 100644 index 92ad82cf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/nw-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/nw-handle.png b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/nw-handle.png deleted file mode 100644 index 9835bea8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/nw-handle.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/s-handle-dark.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/s-handle-dark.gif deleted file mode 100644 index 4eb5f0fc..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/s-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/s-handle.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/s-handle.gif deleted file mode 100644 index d7eeae27..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/s-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/s-handle.png b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/s-handle.png deleted file mode 100644 index 06f914e7..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/s-handle.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/se-handle-dark.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/se-handle-dark.gif deleted file mode 100644 index c4c10878..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/se-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/se-handle.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/se-handle.gif deleted file mode 100644 index f011a3bb..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/se-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/se-handle.png b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/se-handle.png deleted file mode 100644 index 5a2c695c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/se-handle.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/square.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/square.gif deleted file mode 100644 index 7751d5e1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/square.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/sw-handle-dark.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/sw-handle-dark.gif deleted file mode 100644 index 77224b0c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/sw-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/sw-handle.gif b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/sw-handle.gif deleted file mode 100644 index aa903dd0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/sw-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/sw-handle.png b/app/resources/appunto-auth/theme/appunto-auth/images/sizer/sw-handle.png deleted file mode 100644 index 7f68f406..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/sizer/sw-handle.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-bg.png b/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-bg.png deleted file mode 100644 index 1ade2925..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-bg.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-thumb.png b/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-thumb.png deleted file mode 100644 index d8a03de9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-thumb.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-v-bg.png b/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-v-bg.png deleted file mode 100644 index c24663e5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-v-bg.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-v-thumb.png b/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-v-thumb.png deleted file mode 100644 index d8a03de9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/slider/slider-v-thumb.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-bottom.png b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-bottom.png deleted file mode 100644 index 813a4d54..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-bottom.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-left.png deleted file mode 100644 index 9120ea42..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-right.png b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-right.png deleted file mode 100644 index 67fd5a4b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-right.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-top.png b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-top.png deleted file mode 100644 index 01ad4ee9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-plain-scroll-top.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-bottom-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-bottom-left.gif deleted file mode 100644 index e6525b97..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-bottom-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-bottom-right.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-bottom-right.gif deleted file mode 100644 index be657af4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-bottom-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-bottom.png b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-bottom.png deleted file mode 100644 index ffff826e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-bottom.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-left-bottom.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-left-bottom.gif deleted file mode 100644 index ecc3116e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-left-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-left-top.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-left-top.gif deleted file mode 100644 index 4610705b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-left-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-left.png deleted file mode 100644 index 2c352941..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-right-bottom.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-right-bottom.gif deleted file mode 100644 index 737cc3ff..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-right-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-right-top.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-right-top.gif deleted file mode 100644 index 49bc1bf7..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-right-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-right.png b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-right.png deleted file mode 100644 index 82dfe01f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-right.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-top-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-top-left.gif deleted file mode 100644 index 35048040..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-top-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-top-right.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-top-right.gif deleted file mode 100644 index eee6080d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-top-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-top.png b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-top.png deleted file mode 100644 index b2fabfc3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/default-scroll-top.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-bottom-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-bottom-bg.gif deleted file mode 100644 index e8208676..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-bottom-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-left-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-left-bg.gif deleted file mode 100644 index 55832036..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-left-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-right-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-right-bg.gif deleted file mode 100644 index d55ba065..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-right-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-top-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-top-bg.gif deleted file mode 100644 index 89a116fd..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab-bar/tab-bar-default-top-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-active-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-active-corners.gif deleted file mode 100644 index 3923610a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-active-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-active-fbg.gif deleted file mode 100644 index 15c66cee..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-active-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-active-sides.gif deleted file mode 100644 index 66031de3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-corners.gif deleted file mode 100644 index e8b9dea0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-disabled-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-disabled-corners.gif deleted file mode 100644 index e8b9dea0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-disabled-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-disabled-fbg.gif deleted file mode 100644 index 05a1237b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-disabled-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-disabled-sides.gif deleted file mode 100644 index d9dc49de..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-fbg.gif deleted file mode 100644 index f003f4d2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-active-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-active-corners.gif deleted file mode 100644 index 3923610a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-active-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-active-fbg.gif deleted file mode 100644 index 15c66cee..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-active-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-active-sides.gif deleted file mode 100644 index 66031de3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-corners.gif deleted file mode 100644 index 488b48e4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-fbg.gif deleted file mode 100644 index 05a1237b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-over-corners.gif deleted file mode 100644 index 79d73f02..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-over-fbg.gif deleted file mode 100644 index 05303d2f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-over-sides.gif deleted file mode 100644 index d156bd21..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-sides.gif deleted file mode 100644 index 4e17e833..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-over-corners.gif deleted file mode 100644 index a47582c5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-over-fbg.gif deleted file mode 100644 index 05303d2f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-over-sides.gif deleted file mode 100644 index 7fb92aff..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-sides.gif deleted file mode 100644 index a438ab1e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-close.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-close.gif deleted file mode 100644 index 98d5da95..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-close.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-close.png b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-close.png deleted file mode 100644 index 46cc89f5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-close.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-active-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-active-corners.gif deleted file mode 100644 index db836931..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-active-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-active-fbg.gif deleted file mode 100644 index 60b17a20..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-active-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-active-sides.gif deleted file mode 100644 index 3b7b3cd9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-corners.gif deleted file mode 100644 index 07db6ca5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-disabled-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-disabled-corners.gif deleted file mode 100644 index 3e04cb37..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-disabled-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-disabled-fbg.gif deleted file mode 100644 index 5df23d72..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-disabled-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-disabled-sides.gif deleted file mode 100644 index a438ab1e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-fbg.gif deleted file mode 100644 index 41843484..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-active-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-active-corners.gif deleted file mode 100644 index db836931..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-active-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-active-fbg.gif deleted file mode 100644 index 60b17a20..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-active-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-active-sides.gif deleted file mode 100644 index 3b7b3cd9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-corners.gif deleted file mode 100644 index 6d3222ff..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-fbg.gif deleted file mode 100644 index 5df23d72..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-over-corners.gif deleted file mode 100644 index 91a0a361..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-over-fbg.gif deleted file mode 100644 index d55618b8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-over-sides.gif deleted file mode 100644 index ef2ca9b2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-sides.gif deleted file mode 100644 index f8b810a6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-over-corners.gif deleted file mode 100644 index 9b095183..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-over-fbg.gif deleted file mode 100644 index d55618b8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-over-sides.gif deleted file mode 100644 index 9c93b282..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-sides.gif deleted file mode 100644 index a438ab1e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-active-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-active-corners.gif deleted file mode 100644 index d1182767..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-active-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-active-fbg.gif deleted file mode 100644 index 60b17a20..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-active-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-active-sides.gif deleted file mode 100644 index 3b7b3cd9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-corners.gif deleted file mode 100644 index 63e4308d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-disabled-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-disabled-corners.gif deleted file mode 100644 index 63e4308d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-disabled-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-disabled-fbg.gif deleted file mode 100644 index 5df23d72..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-disabled-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-disabled-sides.gif deleted file mode 100644 index a438ab1e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-fbg.gif deleted file mode 100644 index 41843484..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-active-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-active-corners.gif deleted file mode 100644 index d1182767..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-active-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-active-fbg.gif deleted file mode 100644 index 60b17a20..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-active-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-active-sides.gif deleted file mode 100644 index 3b7b3cd9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-corners.gif deleted file mode 100644 index 294eda8d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-fbg.gif deleted file mode 100644 index 5df23d72..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-over-corners.gif deleted file mode 100644 index 740a940a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-over-fbg.gif deleted file mode 100644 index d55618b8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-over-sides.gif deleted file mode 100644 index ef2ca9b2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-sides.gif deleted file mode 100644 index f8b810a6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-over-corners.gif deleted file mode 100644 index 397714fb..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-over-fbg.gif deleted file mode 100644 index d55618b8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-over-sides.gif deleted file mode 100644 index 9c93b282..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-sides.gif deleted file mode 100644 index a438ab1e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-active-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-active-corners.gif deleted file mode 100644 index 3c68591f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-active-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-active-fbg.gif deleted file mode 100644 index 15c66cee..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-active-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-active-sides.gif deleted file mode 100644 index 66031de3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-corners.gif deleted file mode 100644 index fd5c84b4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-disabled-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-disabled-corners.gif deleted file mode 100644 index fd5c84b4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-disabled-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-disabled-fbg.gif deleted file mode 100644 index 05a1237b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-disabled-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-disabled-sides.gif deleted file mode 100644 index d9dc49de..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-fbg.gif deleted file mode 100644 index 1ed53562..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-active-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-active-corners.gif deleted file mode 100644 index 3c68591f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-active-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-active-fbg.gif deleted file mode 100644 index 15c66cee..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-active-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-active-sides.gif deleted file mode 100644 index 66031de3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-corners.gif deleted file mode 100644 index 876edd83..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-fbg.gif deleted file mode 100644 index 05a1237b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-over-corners.gif deleted file mode 100644 index c26e433c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-over-fbg.gif deleted file mode 100644 index 05303d2f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-over-sides.gif deleted file mode 100644 index d156bd21..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-sides.gif deleted file mode 100644 index 4e17e833..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-over-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-over-corners.gif deleted file mode 100644 index 63d7d186..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-over-fbg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-over-fbg.gif deleted file mode 100644 index 05303d2f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-over-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-over-sides.gif deleted file mode 100644 index 7fb92aff..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-sides.gif deleted file mode 100644 index a438ab1e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tab/tab-default-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-default-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-default-corners.gif deleted file mode 100644 index db531540..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-default-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-default-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-default-sides.gif deleted file mode 100644 index ae67edbf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-default-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-form-invalid-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-form-invalid-corners.gif deleted file mode 100644 index db531540..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-form-invalid-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-form-invalid-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-form-invalid-sides.gif deleted file mode 100644 index ae67edbf..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tip/tip-form-invalid-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more-left.gif deleted file mode 100644 index 8f8cbd42..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more-left.png deleted file mode 100644 index b6756e6a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more.gif deleted file mode 100644 index 82beafda..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more.png b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more.png deleted file mode 100644 index b6756e6a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-more.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-bottom.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-bottom.gif deleted file mode 100644 index 1296e22d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-bottom.png b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-bottom.png deleted file mode 100644 index 6741161e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-bottom.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-left.gif deleted file mode 100644 index 2db8cf5c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-left.png deleted file mode 100644 index 5ff969ee..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-right.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-right.gif deleted file mode 100644 index 5d5a7ab5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-right.png b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-right.png deleted file mode 100644 index 6fed21a5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-right.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-top.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-top.gif deleted file mode 100644 index 6545b437..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-top.png b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-top.png deleted file mode 100644 index 2a26ba95..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/default-scroll-top.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more-left.gif deleted file mode 100644 index 8f8cbd42..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more-left.png deleted file mode 100644 index b6756e6a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more.gif deleted file mode 100644 index 82beafda..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more.png b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more.png deleted file mode 100644 index b6756e6a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-more.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-left.gif deleted file mode 100644 index 2db8cf5c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-left.png deleted file mode 100644 index 5ff969ee..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-right.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-right.gif deleted file mode 100644 index 5d5a7ab5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-right.png b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-right.png deleted file mode 100644 index 6fed21a5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/footer-scroll-right.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/toolbar-default-bg.gif b/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/toolbar-default-bg.gif deleted file mode 100644 index f010d334..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/toolbar/toolbar-default-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprite-tpl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprite-tpl.gif deleted file mode 100644 index 18277a3d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprite-tpl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprites-dark.png b/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprites-dark.png deleted file mode 100644 index 474088b6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprites-dark.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprites.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprites.gif deleted file mode 100644 index 36b6b675..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprites.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprites.png b/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprites.png deleted file mode 100644 index 17fbc0f1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tools/tool-sprites.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tools/tools-sprites-trans.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tools/tools-sprites-trans.gif deleted file mode 100644 index b6d7ba36..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tools/tools-sprites-trans.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows-rtl.gif deleted file mode 100644 index 7083d77d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows-rtl.png deleted file mode 100644 index 4aae887d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows.gif deleted file mode 100644 index f7b8b1ca..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows.png deleted file mode 100644 index de10dd6f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/arrows.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-above.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-above.gif deleted file mode 100644 index 30d1ca71..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-above.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-above.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-above.png deleted file mode 100644 index 57825318..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-above.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-add.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-add.gif deleted file mode 100644 index b22cd144..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-add.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-add.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-add.png deleted file mode 100644 index c9d24fd8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-add.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-append.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-append.gif deleted file mode 100644 index b22cd144..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-append.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-append.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-append.png deleted file mode 100644 index 57825318..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-append.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-below.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-below.gif deleted file mode 100644 index 85f66b1e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-below.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-below.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-below.png deleted file mode 100644 index 57825318..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-below.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-between.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-between.gif deleted file mode 100644 index f5a042d7..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-between.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-between.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-between.png deleted file mode 100644 index 57825318..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-between.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-no.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-no.gif deleted file mode 100644 index 9d9c6a9c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-no.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-no.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-no.png deleted file mode 100644 index bb89cfc1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-no.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-over.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-over.gif deleted file mode 100644 index 2e514e7e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-over.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-over.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-over.png deleted file mode 100644 index 70d1807f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-over.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-under.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-under.gif deleted file mode 100644 index 8535ef46..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-under.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-under.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-under.png deleted file mode 100644 index 3ba23b37..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-under.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-yes.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-yes.gif deleted file mode 100644 index 8aacb307..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-yes.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-yes.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-yes.png deleted file mode 100644 index 83d0dbc2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/drop-yes.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus-rtl.gif deleted file mode 100644 index 10227e60..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus-rtl.png deleted file mode 100644 index 2ffe7b2d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus.gif deleted file mode 100644 index 55d8a0fa..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus.png deleted file mode 100644 index b39a71df..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-minus.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus-rtl.gif deleted file mode 100644 index f4eef893..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus-rtl.png deleted file mode 100644 index bea9892c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus.gif deleted file mode 100644 index a5c62fab..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus.png deleted file mode 100644 index 630438f2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-plus.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-rtl.gif deleted file mode 100644 index a5e7248c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-rtl.png deleted file mode 100644 index 1d0821b6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end.gif deleted file mode 100644 index 406a88df..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end.png deleted file mode 100644 index 2eb0ed0c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-end.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line-rtl.gif deleted file mode 100644 index 6e5b8b44..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line-rtl.png deleted file mode 100644 index e26b7685..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line.gif deleted file mode 100644 index e25ed03f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line.png deleted file mode 100644 index ac374247..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-line.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl-rtl.gif deleted file mode 100644 index 2d8dd984..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl-rtl.png deleted file mode 100644 index 1008a544..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl.gif deleted file mode 100644 index f50bd40a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl.png deleted file mode 100644 index f2a805de..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-nl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-rtl.gif deleted file mode 100644 index ed3e5a0d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-rtl.png deleted file mode 100644 index cefb7045..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus.gif deleted file mode 100644 index a7287961..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus.png deleted file mode 100644 index a256b48b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-minus.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl-rtl.gif deleted file mode 100644 index 2d1e9174..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl-rtl.png deleted file mode 100644 index e1e6ece6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl.gif deleted file mode 100644 index 96f8d723..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl.png deleted file mode 100644 index 3a401eaa..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-nl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-rtl.gif deleted file mode 100644 index cb0cb492..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-rtl.png deleted file mode 100644 index 487f27a6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus.gif deleted file mode 100644 index ae41983c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus.png deleted file mode 100644 index 03e202af..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-plus.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-rtl.gif deleted file mode 100644 index 1139cb02..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-rtl.png deleted file mode 100644 index 166e163d..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow.gif deleted file mode 100644 index 201c413e..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow.png deleted file mode 100644 index 4bf9ae5c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/elbow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open-rtl.gif deleted file mode 100644 index a34c546c..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open-rtl.png deleted file mode 100644 index bb896d84..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open.gif deleted file mode 100644 index 361e1be3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open.png deleted file mode 100644 index 50397daa..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-open.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-rtl.gif deleted file mode 100644 index 4fab30f8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-rtl.png deleted file mode 100644 index 3b176721..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder.gif deleted file mode 100644 index b2fd81a1..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder.png deleted file mode 100644 index 4b020540..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/folder.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf-rtl.gif deleted file mode 100644 index ab0979a3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf-rtl.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf-rtl.png deleted file mode 100644 index b2e6f6e5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf-rtl.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf.gif deleted file mode 100644 index 445769d3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf.png b/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf.png deleted file mode 100644 index 6acb6358..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/leaf.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/loading.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/loading.gif deleted file mode 100644 index 81b0f125..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/tree/s.gif b/app/resources/appunto-auth/theme/appunto-auth/images/tree/s.gif deleted file mode 100644 index 1d11fa9a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/tree/s.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-bottom.gif b/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-bottom.gif deleted file mode 100644 index c18f9e34..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-bottom.png b/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-bottom.png deleted file mode 100644 index 241209e9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-bottom.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-left.gif b/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-left.gif deleted file mode 100644 index 99f7993f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-left.png b/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-left.png deleted file mode 100644 index 1c40b787..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-right.gif b/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-right.gif deleted file mode 100644 index 5b13c5a8..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-right.png b/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-right.png deleted file mode 100644 index 505c3295..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-right.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-top.gif b/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-top.gif deleted file mode 100644 index a4ca2bb2..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-top.png b/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-top.png deleted file mode 100644 index 4a378a39..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/util/splitter/mini-top.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/ux/dashboard/magnify.png b/app/resources/appunto-auth/theme/appunto-auth/images/ux/dashboard/magnify.png deleted file mode 100644 index 0efc4470..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/ux/dashboard/magnify.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-bottom-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-bottom-corners.gif deleted file mode 100644 index ca57ffb3..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-bottom-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-bottom-sides.gif deleted file mode 100644 index aa1d0228..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-bottom-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-bottom-corners.gif deleted file mode 100644 index 8910f05f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-bottom-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-bottom-sides.gif deleted file mode 100644 index aa1d0228..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-left-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-left-corners-rtl.gif deleted file mode 100644 index 3b2b0a4b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-left-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-left-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-left-corners.gif deleted file mode 100644 index 8910f05f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-left-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-left-sides.gif deleted file mode 100644 index f4d7c750..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-right-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-right-corners-rtl.gif deleted file mode 100644 index 3b2b0a4b..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-right-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-right-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-right-corners.gif deleted file mode 100644 index 8910f05f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-right-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-right-sides.gif deleted file mode 100644 index f4d7c750..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-top-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-top-corners.gif deleted file mode 100644 index 8910f05f..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-top-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-top-sides.gif deleted file mode 100644 index aa1d0228..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-collapsed-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-left-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-left-corners-rtl.gif deleted file mode 100644 index c9d696c9..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-left-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-left-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-left-corners.gif deleted file mode 100644 index cde22112..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-left-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-left-sides.gif deleted file mode 100644 index f4d7c750..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-right-corners-rtl.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-right-corners-rtl.gif deleted file mode 100644 index d8e0b9ba..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-right-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-right-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-right-corners.gif deleted file mode 100644 index c7eaa9d5..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-right-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-right-sides.gif deleted file mode 100644 index f4d7c750..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-top-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-top-corners.gif deleted file mode 100644 index 58f46af0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-top-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-top-sides.gif deleted file mode 100644 index aa1d0228..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window-header/window-header-default-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-error.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-error.gif deleted file mode 100644 index 397b655a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-error.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-info.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-info.gif deleted file mode 100644 index 58281c30..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-info.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-question.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-question.gif deleted file mode 100644 index 08abd82a..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-question.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-warning.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-warning.gif deleted file mode 100644 index 27ff98b4..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window/icon-warning.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/fade-blue.png b/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/fade-blue.png deleted file mode 100644 index 4dbf08b0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/fade-blue.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/fader.png b/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/fader.png deleted file mode 100644 index be8c27fa..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/fader.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/icon16_error.png b/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/icon16_error.png deleted file mode 100644 index 5f168d32..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/icon16_error.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/icon16_info.png b/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/icon16_info.png deleted file mode 100644 index 6c6b32d0..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window/toast/icon16_info.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window/window-default-corners.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window/window-default-corners.gif deleted file mode 100644 index 4cbfe1e6..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window/window-default-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/window/window-default-sides.gif b/app/resources/appunto-auth/theme/appunto-auth/images/window/window-default-sides.gif deleted file mode 100644 index f4d7c750..00000000 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/window/window-default-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/theme.css b/app/resources/appunto-auth/theme/appunto-auth/theme.css deleted file mode 100644 index 980afbbd..00000000 --- a/app/resources/appunto-auth/theme/appunto-auth/theme.css +++ /dev/null @@ -1 +0,0 @@ -.x-body{margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.x-no-touch-scroll{touch-action:none;-ms-touch-action:none}@-ms-viewport{width:device-width}img{border:0}.x-border-box,.x-border-box *{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x-ltr{direction:ltr}.x-clear{overflow:hidden;clear:both;font-size:0;line-height:0;display:table}.x-layer{position:absolute!important;overflow:hidden}.x-fixed-layer{position:fixed!important;overflow:hidden}.x-shim{position:absolute;left:0;top:0;overflow:hidden;filter:alpha(opacity=0);opacity:0}.x-hidden-display{display:none!important}.x-hidden-visibility{visibility:hidden!important}.x-hidden,.x-hidden-offsets{display:block!important;visibility:hidden!important;position:absolute!important;top:-10000px!important}.x-hidden-clip{position:absolute!important;clip:rect(0,0,0,0)}.x-masked-relative{position:relative}.x-ie-shadow{background-color:#777;display:none;position:absolute;overflow:hidden}.x-unselectable{user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-drag:none;cursor:default}.x-selectable{cursor:auto;-moz-user-select:text;-webkit-user-select:text;-ms-user-select:text;user-select:text;-o-user-select:text}.x-list-plain{list-style-type:none;margin:0;padding:0}.x-table-plain{border-collapse:collapse;border-spacing:0;font-size:1em}.x-frame-tl,.x-frame-tr,.x-frame-tc,.x-frame-bl,.x-frame-br,.x-frame-bc{overflow:hidden;background-repeat:no-repeat}.x-frame-tc,.x-frame-bc{background-repeat:repeat-x}td.x-frame-tl,td.x-frame-tr,td.x-frame-bl,td.x-frame-br{width:1px}.x-frame-mc{background-repeat:repeat-x;overflow:hidden}.x-proxy-el{position:absolute;background:#b4b4b4;filter:alpha(opacity=80);opacity:.8}.x-css-shadow{position:absolute;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px}.x-item-disabled,.x-item-disabled *{cursor:default}.x-component,.x-container{position:relative}.x-webkit *:focus{outline:0}.x-touch-scroller{display:table;min-width:100%}.x-box-item{position:absolute!important;left:0;top:0}.x-autocontainer-outerCt{display:table}.x-autocontainer-innerCt{display:table-cell;height:100%;vertical-align:top}.x-mask{z-index:100;position:absolute;top:0;left:0;width:100%;height:100%}.x-mask-fixed{position:fixed}.x-mask-shim{z-index:100;position:absolute;top:0;left:0;width:100%;height:100%}.x-mask-msg{z-index:101;position:absolute}.x-progress{position:relative;border-style:solid;overflow:hidden}.x-progress-bar{overflow:hidden;position:absolute;width:0;height:100%}.x-progress-text{overflow:hidden;position:absolute}.x-title-icon{background-repeat:no-repeat;background-position:0 0;vertical-align:middle;text-align:center}.x-title{display:table;table-layout:fixed}.x-title-text{display:table-cell;overflow:hidden;white-space:nowrap;-o-text-overflow:ellipsis;text-overflow:ellipsis;vertical-align:middle}.x-title-align-left{text-align:left}.x-title-align-center{text-align:center}.x-title-align-right{text-align:right}.x-title-rotate-right{-webkit-transform:rotate(90deg);-webkit-transform-origin:0 0;-moz-transform:rotate(90deg);-moz-transform-origin:0 0;-o-transform:rotate(90deg);-o-transform-origin:0 0;-ms-transform:rotate(90deg);-ms-transform-origin:0 0;transform:rotate(90deg);transform-origin:0 0}.x-ie8 .x-title-rotate-right{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1)}.x-title-rotate-left{-webkit-transform:rotate(270deg);-webkit-transform-origin:100% 0;-moz-transform:rotate(270deg);-moz-transform-origin:100% 0;-o-transform:rotate(270deg);-o-transform-origin:100% 0;-ms-transform:rotate(270deg);-ms-transform-origin:100% 0;transform:rotate(270deg);transform-origin:100% 0}.x-ie8 .x-title-rotate-left{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.x-horizontal.x-header .x-title-rotate-right.x-title-align-left>.x-title-item{vertical-align:bottom}.x-horizontal.x-header .x-title-rotate-right.x-title-align-center>.x-title-item{vertical-align:middle}.x-horizontal.x-header .x-title-rotate-right.x-title-align-right>.x-title-item{vertical-align:top}.x-horizontal.x-header .x-title-rotate-left.x-title-align-left>.x-title-item{vertical-align:top}.x-horizontal.x-header .x-title-rotate-left.x-title-align-center>.x-title-item{vertical-align:middle}.x-horizontal.x-header .x-title-rotate-left.x-title-align-right>.x-title-item{vertical-align:bottom}.x-vertical.x-header .x-title-rotate-none.x-title-align-left>.x-title-item{vertical-align:top}.x-vertical.x-header .x-title-rotate-none.x-title-align-center>.x-title-item{vertical-align:middle}.x-vertical.x-header .x-title-rotate-none.x-title-align-right>.x-title-item{vertical-align:bottom}.x-title-icon-wrap{display:table-cell;text-align:center;vertical-align:middle;line-height:0}.x-title-icon-wrap.x-title-icon-top,.x-title-icon-wrap.x-title-icon-bottom{display:table-row}.x-title-icon{display:inline-block;vertical-align:middle;background-position:center;background-repeat:no-repeat}.x-tool{font-size:0;line-height:0}.x-header>.x-box-inner{overflow:visible}.x-btn{display:inline-block;outline:0;cursor:pointer;white-space:nowrap;text-decoration:none;overflow:hidden;position:relative}.x-btn>.x-frame{height:100%;width:100%}.x-btn-wrap{display:table;height:100%;width:100%}.x-btn-button{vertical-align:middle;display:table-cell;white-space:nowrap;line-height:0}.x-btn-inner{display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.x-btn-icon.x-btn-no-text>.x-btn-inner{display:none}.x-btn-icon-el{display:none;vertical-align:middle;background-position:center center;background-repeat:no-repeat}.x-btn-icon>.x-btn-icon-el{display:inline-block}.x-btn-icon-top>.x-btn-icon-el,.x-btn-icon-bottom>.x-btn-icon-el{display:block}.x-btn-button-center{text-align:center}.x-btn-button-left{text-align:left}.x-btn-button-right{text-align:right}.x-opera12m-btn-arrow-right{display:table}.x-opera12m-btn-arrow-right>.x-btn-arrow-right,.x-opera12m-btn-arrow-right>.x-btn-split-right{display:table-row}.x-btn-arrow:after,.x-btn-split:after{background-repeat:no-repeat;content:'';box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x-btn-arrow-right:after,.x-btn-split-right:after{display:table-cell;background-position:right center}.x-btn-arrow-bottom:after,.x-btn-split-bottom:after{display:table-row;background-position:center bottom;content:'\00a0';line-height:0}.x-btn-mc{overflow:visible}.x-splitter{font-size:1px}.x-splitter-horizontal{cursor:e-resize;cursor:row-resize}.x-splitter-vertical{cursor:e-resize;cursor:col-resize}.x-splitter-collapsed,.x-splitter-horizontal-noresize,.x-splitter-vertical-noresize{cursor:default}.x-splitter-active{z-index:4}.x-collapse-el{position:absolute;background-repeat:no-repeat}.x-box-layout-ct{overflow:hidden;position:relative}.x-box-target{position:absolute;width:20000px;top:0;left:0;height:1px}.x-box-inner{overflow:hidden;position:relative;left:0;top:0}.x-box-scroller{position:absolute;background-repeat:no-repeat;background-position:center;line-height:0;font-size:0}.x-box-scroller-top{top:0}.x-box-scroller-right{right:0}.x-box-scroller-bottom{bottom:0}.x-box-scroller-left{left:0}.x-box-menu-body-horizontal{float:left}.x-box-menu-after{position:relative;float:left}.x-toolbar-text{white-space:nowrap}.x-toolbar-separator{display:block;font-size:1px;overflow:hidden;cursor:default;border:0;width:0;height:0;line-height:0}.x-toolbar-scroller{padding-left:0}.x-toolbar-plain{border:0}.x-dd-drag-proxy,.x-dd-drag-current{z-index:1000000!important;pointer-events:none}.x-dd-drag-repair .x-dd-drag-ghost{filter:alpha(opacity=60);opacity:.6}.x-dd-drag-repair .x-dd-drop-icon{display:none}.x-dd-drag-ghost{filter:alpha(opacity=85);opacity:.85;padding:5px;padding-left:20px;white-space:nowrap;color:#000;font:normal 10px helvetica,arial,verdana,sans-serif;border:1px solid;border-color:#ddd #bbb #bbb #ddd;background-color:#fff}.x-dd-drop-icon{position:absolute;top:3px;left:3px;display:block;width:16px;height:16px;background-color:transparent;background-position:center;background-repeat:no-repeat;z-index:1}.x-dd-drop-ok .x-dd-drop-icon{background-image:url(images/dd/drop-yes.png)}.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url(images/dd/drop-add.png)}.x-dd-drop-nodrop div.x-dd-drop-icon{background-image:url(images/dd/drop-no.png)}.x-docked{position:absolute!important;z-index:1}.x-docked-vertical{position:static}.x-docked-top{border-bottom-width:0!important}.x-docked-bottom{border-top-width:0!important}.x-docked-left{border-right-width:0!important}.x-docked-right{border-left-width:0!important}.x-docked-noborder-top{border-top-width:0!important}.x-docked-noborder-right{border-right-width:0!important}.x-docked-noborder-bottom{border-bottom-width:0!important}.x-docked-noborder-left{border-left-width:0!important}.x-noborder-l{border-left-width:0!important}.x-noborder-b{border-bottom-width:0!important}.x-noborder-bl{border-bottom-width:0!important;border-left-width:0!important}.x-noborder-r{border-right-width:0!important}.x-noborder-rl{border-right-width:0!important;border-left-width:0!important}.x-noborder-rb{border-right-width:0!important;border-bottom-width:0!important}.x-noborder-rbl{border-right-width:0!important;border-bottom-width:0!important;border-left-width:0!important}.x-noborder-t{border-top-width:0!important}.x-noborder-tl{border-top-width:0!important;border-left-width:0!important}.x-noborder-tb{border-top-width:0!important;border-bottom-width:0!important}.x-noborder-tbl{border-top-width:0!important;border-bottom-width:0!important;border-left-width:0!important}.x-noborder-tr{border-top-width:0!important;border-right-width:0!important}.x-noborder-trl{border-top-width:0!important;border-right-width:0!important;border-left-width:0!important}.x-noborder-trb{border-top-width:0!important;border-right-width:0!important;border-bottom-width:0!important}.x-noborder-trbl{border-width:0!important}.x-panel,.x-plain{overflow:hidden;position:relative}.x-panel{outline:0}td.x-frame-mc{vertical-align:top}.x-panel-body{overflow:hidden;position:relative}.x-panel-header-plain,.x-panel-body-plain{border:0;padding:0}.x-tip{position:absolute;overflow:visible}.x-tip-body{overflow:hidden;position:relative}.x-tip-anchor{position:absolute;overflow:hidden;border-style:solid}.x-form-item{display:table;table-layout:fixed;border-spacing:0;border-collapse:separate}.x-form-item-label{overflow:hidden}.x-form-item-label,.x-form-item-body{display:table-cell}.x-form-item-body{vertical-align:middle;height:100%}.x-form-item-label-inner{display:inline-block}.x-form-item-label-top{display:table-row;height:1px}.x-form-item-label-top>.x-form-item-label-inner{display:table-cell}.x-form-item-label-top-side-error:after{display:table-cell;content:''}.x-form-item-label-right{text-align:right}.x-form-error-wrap-side{display:table-cell;vertical-align:middle}.x-form-error-wrap-under{display:table-row;height:1px}.x-form-error-wrap-under>.x-form-error-msg{display:table-cell}.x-form-error-wrap-under-side-label:before{display:table-cell;content:''}.x-form-invalid-icon{overflow:hidden}.x-form-invalid-icon ul{display:none}.x-form-display-field-body{vertical-align:top}.x-fit-item{position:relative}.x-grid-view{overflow:hidden;position:relative}.x-grid-row-table{width:0;table-layout:fixed;border:0 none;border-collapse:separate;border-spacing:0}.x-grid-item{table-layout:fixed;outline:0}.x-grid-row{outline:0}.x-grid-td{overflow:hidden;border-width:0;vertical-align:top}.x-grid-cell-inner{overflow:hidden;white-space:nowrap}.x-wrap-cell .x-grid-cell-inner{white-space:normal}.x-grid-resize-marker{position:absolute;z-index:5;top:0}.x-view-item-focused{outline:1px dashed #4f0101!important;outline-offset:-1px}.x-form-cb-wrap{vertical-align:top}.x-form-cb-wrap-inner{position:relative}.x-form-cb{position:absolute;left:0;right:auto;vertical-align:top;overflow:hidden;padding:0;border:0}.x-form-cb::-moz-focus-inner{padding:0;border:0}.x-form-cb-after{left:auto;right:0}.x-form-cb-label{display:inline-block}.x-form-cb-wrap-inner-no-box-label>.x-form-cb{position:static}.x-col-move-top,.x-col-move-bottom{position:absolute;top:0;line-height:0;font-size:0;overflow:hidden;z-index:20000;background:no-repeat center top transparent}.x-grid-header-ct{cursor:default}.x-column-header{position:absolute;overflow:hidden;background-repeat:repeat-x}.x-column-header-inner{white-space:nowrap;position:relative;overflow:hidden}.x-column-header-text{white-space:nowrap;background-repeat:no-repeat}.x-column-header-trigger{display:none;height:100%;background-repeat:no-repeat;position:absolute;right:0;top:0;z-index:2}.x-column-header-over .x-column-header-trigger,.x-column-header-open .x-column-header-trigger{display:block}.x-column-header-align-right{text-align:right}.x-column-header-align-left{text-align:left}.x-column-header-align-center{text-align:center}.x-form-trigger-wrap{display:table;width:100%;height:100%}.x-gecko .x-form-trigger-wrap{display:-moz-inline-box;display:inline-flex;vertical-align:top}.x-form-text-wrap{display:table-cell;overflow:hidden;height:100%}.x-gecko .x-form-text-wrap{display:block;-moz-box-flex:1;flex:1}.x-form-item-body.x-form-text-grow{min-width:inherit;max-width:inherit}.x-form-text{border:0;margin:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;display:block;background:repeat-x 0 0;width:100%;height:100%}.x-webkit .x-form-text{height:calc(100%+3px)}.x-form-trigger{display:table-cell;vertical-align:top;cursor:pointer;overflow:hidden;background-repeat:no-repeat;line-height:0;white-space:nowrap}.x-item-disabled .x-form-trigger{cursor:default}.x-form-trigger.x-form-trigger-cmp{background:0;border:0}.x-gecko .x-form-trigger{display:block}.x-border-layout-ct{overflow:hidden}.x-border-layout-ct{position:relative}.x-border-region-slide-in{z-index:5}.x-region-collapsed-placeholder{z-index:4}.x-tab{display:block;outline:0;cursor:pointer;white-space:nowrap;text-decoration:none;overflow:hidden;position:relative}.x-tab>.x-frame{height:100%;width:100%}.x-tab-wrap{display:table;height:100%;width:100%}.x-tab-button{vertical-align:middle;display:table-cell;white-space:nowrap;line-height:0}.x-tab-inner{display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.x-tab-icon.x-tab-no-text>.x-tab-inner{display:none}.x-tab-icon-el{display:none;vertical-align:middle;background-position:center center;background-repeat:no-repeat}.x-tab-icon>.x-tab-icon-el{display:inline-block}.x-tab-icon-top>.x-tab-icon-el,.x-tab-icon-bottom>.x-tab-icon-el{display:block}.x-tab-button-center{text-align:center}.x-tab-button-left{text-align:left}.x-tab-button-right{text-align:right}.x-tab-mc{overflow:visible}.x-tab{z-index:1}.x-tab-active{z-index:3}.x-tab-button{position:relative}.x-tab-close-btn{display:block;position:absolute;font-size:0;line-height:0}.x-tab-rotate-left{-webkit-transform:rotate(270deg);-webkit-transform-origin:100% 0;-moz-transform:rotate(270deg);-moz-transform-origin:100% 0;-o-transform:rotate(270deg);-o-transform-origin:100% 0;-ms-transform:rotate(270deg);-ms-transform-origin:100% 0;transform:rotate(270deg);transform-origin:100% 0}.x-ie8 .x-tab-rotate-left{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.x-tab-rotate-right{-webkit-transform:rotate(90deg);-webkit-transform-origin:0 0;-moz-transform:rotate(90deg);-moz-transform-origin:0 0;-o-transform:rotate(90deg);-o-transform-origin:0 0;-ms-transform:rotate(90deg);-ms-transform-origin:0 0;transform:rotate(90deg);transform-origin:0 0}.x-ie8 .x-tab-rotate-right{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1)}.x-tab-tr,.x-tab-br,.x-tab-mr,.x-tab-tl,.x-tab-bl,.x-tab-ml{width:1px}.x-tab-bar{z-index:0;position:relative}.x-tab-bar-body{position:relative}.x-tab-bar-strip{position:absolute;line-height:0;font-size:0;z-index:2}.x-tab-bar-top>.x-tab-bar-strip{bottom:0}.x-tab-bar-bottom>.x-tab-bar-strip{top:0}.x-tab-bar-left>.x-tab-bar-strip{right:0}.x-tab-bar-right>.x-tab-bar-strip{left:0}.x-tab-bar-horizontal .x-tab-bar-strip{width:100%;left:0}.x-tab-bar-vertical{display:table-cell}.x-tab-bar-vertical .x-tab-bar-strip{height:100%;top:0}.x-tab-bar-plain{background:transparent!important}.x-box-scroller-plain{background-color:transparent!important}.x-window{outline:0;overflow:hidden}.x-window .x-window-wrap{position:relative}.x-window-body{position:relative;overflow:hidden}.x-resizable-overlay{position:absolute;left:0;top:0;width:100%;height:100%;display:none;z-index:200000;background-color:#fff;filter:alpha(opacity=0);opacity:0}.x-form-textarea{overflow:auto;resize:none}div.x-form-text-grow .x-form-textarea{min-height:inherit}.x-message-box .x-form-display-field{height:auto}.x-menu{outline:0}.x-menu-item{white-space:nowrap;overflow:hidden;border-color:transparent;border-style:solid}.x-menu-item-cmp{margin:2px}.x-menu-item-cmp .x-field-label-cell{vertical-align:middle}.x-menu-icon-separator{position:absolute;top:0;z-index:0;height:100%;overflow:hidden}.x-menu-plain .x-menu-icon-separator{display:none}.x-menu-item-link{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;text-decoration:none;outline:0;display:block}.x-menu-item-link-href{-webkit-touch-callout:default}.x-menu-item-text{display:inline-block}.x-menu-item-icon,.x-menu-item-icon-right,.x-menu-item-arrow{font-size:0;position:absolute;text-align:center;background-repeat:no-repeat}.x-resizable-wrapped{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x-column-header-checkbox .x-column-header-text{display:block;background-repeat:no-repeat;font-size:0}.x-grid-cell-row-checker{vertical-align:middle;background-repeat:no-repeat;font-size:0}.x-body{color:black;font-size:11px;line-height:17px;font-family:helvetica,arial,verdana,sans-serif;background:#f5f5f5}.x-animating-size,.x-collapsed{overflow:hidden!important}.x-mask{filter:alpha(opacity=70);opacity:.7;background:white;cursor:default}.x-mask-msg{padding:8px;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;background:#e5e5e5}.x-mask-msg-inner{padding:0;background-color:transparent;color:#666;font:normal 11px helvetica,arial,verdana,sans-serif}.x-mask-msg-text{padding:21px 0 0;background-image:url(images/loadmask/loading.gif);background-repeat:no-repeat;background-position:center 0}.x-progress-default{background-color:#f5f5f5;border-width:0;height:20px;border-color:#4f0101}.x-progress-default .x-progress-bar-default{background-image:none;background-color:#d0bcbc}.x-progress-default .x-progress-text{color:#666;font-weight:bold;font-size:11px;font-family:helvetica,arial,verdana,sans-serif;text-align:center;line-height:20px}.x-progress-default .x-progress-text-back{color:#666;line-height:20px}.x-progressbar-default-cell>.x-grid-cell-inner,.x-progressbarwidget-default-cell>.x-grid-cell-inner{padding-top:1px;padding-bottom:1px}.x-progressbar-default-cell>.x-grid-cell-inner .x-progress-default,.x-progressbarwidget-default-cell>.x-grid-cell-inner .x-progress-default{height:20px}.x-tool{cursor:pointer}.x-tool-img{overflow:hidden;width:16px;height:16px;background-image:url(images/tools/tool-sprites.png);margin:0;filter:alpha(opacity=50);opacity:.5}.x-tool-over .x-tool-img{filter:alpha(opacity=60);opacity:.6}.x-tool-pressed .x-tool-img{filter:alpha(opacity=70);opacity:.7}.x-tool-placeholder{visibility:hidden}.x-tool-close{background-position:0 0}.x-tool-minimize{background-position:0 -16px}.x-tool-maximize{background-position:0 -32px}.x-tool-restore{background-position:0 -48px}.x-tool-toggle{background-position:0 -64px}.x-panel-collapsed .x-tool-toggle{background-position:0 -80px}.x-tool-gear{background-position:0 -96px}.x-tool-prev{background-position:0 -112px}.x-tool-next{background-position:0 -128px}.x-tool-pin{background-position:0 -144px}.x-tool-unpin{background-position:0 -160px}.x-tool-right{background-position:0 -176px}.x-tool-left{background-position:0 -192px}.x-tool-down{background-position:0 -208px}.x-tool-up{background-position:0 -224px}.x-tool-refresh{background-position:0 -240px}.x-tool-plus{background-position:0 -256px}.x-tool-minus{background-position:0 -272px}.x-tool-search{background-position:0 -288px}.x-tool-save{background-position:0 -304px}.x-tool-help{background-position:0 -320px}.x-tool-print{background-position:0 -336px}.x-tool-expand{background-position:0 -352px}.x-tool-collapse{background-position:0 -368px}.x-tool-resize{background-position:0 -384px}.x-tool-move{background-position:0 -400px}.x-tool-expand-bottom,.x-tool-collapse-bottom{background-position:0 -208px}.x-tool-expand-top,.x-tool-collapse-top{background-position:0 -224px}.x-tool-expand-left,.x-tool-collapse-left{background-position:0 -192px}.x-tool-expand-right,.x-tool-collapse-right{background-position:0 -176px}.x-header-draggable .x-header-body,.x-header-ghost{cursor:move}.x-header-text{white-space:nowrap}.x-btn-default-small{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#692727;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#783c3c),color-stop(50%,#692727),color-stop(51%,#632525),color-stop(100%,#692727));background-image:-webkit-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-moz-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-o-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-ms-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727)}.x-btn-default-small-mc{background-image:url(images/btn/btn-default-small-fbg.gif);background-position:0 top;background-color:#692727}.x-nbr .x-btn-default-small{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-default-small-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-default-small-tl{background-position:0 -6px}.x-btn-default-small-tr{background-position:right -9px}.x-btn-default-small-bl{background-position:0 -12px}.x-btn-default-small-br{background-position:right -15px}.x-btn-default-small-ml{background-position:0 top}.x-btn-default-small-mr{background-position:right top}.x-btn-default-small-tc{background-position:0 0}.x-btn-default-small-bc{background-position:0 -3px}.x-btn-default-small-tr,.x-btn-default-small-br,.x-btn-default-small-mr{padding-right:3px}.x-btn-default-small-tl,.x-btn-default-small-bl,.x-btn-default-small-ml{padding-left:3px}.x-btn-default-small-tc{height:3px}.x-btn-default-small-bc{height:3px}.x-btn-default-small-tl,.x-btn-default-small-bl,.x-btn-default-small-tr,.x-btn-default-small-br,.x-btn-default-small-tc,.x-btn-default-small-bc,.x-btn-default-small-ml,.x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-corners.gif)}.x-btn-default-small-ml,.x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-sides.gif)}.x-btn-default-small-mc{padding:1px 1px 1px 1px}.x-btn-default-small{border-color:#430000}.x-btn-button-default-small{height:16px}.x-btn-inner-default-small{font:bold 12px/16px helvetica,arial,verdana,sans-serif;color:white;padding:0 5px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-small,.x-btn-icon-left>.x-btn-inner-default-small{max-width:calc(100% - 16px)}.x-btn-icon-el-default-small{height:16px}.x-btn-icon-left>.x-btn-icon-el-default-small,.x-btn-icon-right>.x-btn-icon-el-default-small{width:16px}.x-btn-icon-top>.x-btn-icon-el-default-small,.x-btn-icon-bottom>.x-btn-icon-el-default-small{min-width:16px}.x-btn-icon-el-default-small.x-btn-glyph{font-size:16px;line-height:16px;color:white;opacity:.5}.x-ie8 .x-btn-icon-el-default-small.x-btn-glyph{color:#b49393}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-small{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-small{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-small{margin-bottom:5px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-small{margin-top:5px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-small{padding-right:5px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-small{margin-right:5px}.x-btn-arrow-bottom>.x-btn-button-default-small,.x-btn-split-bottom>.x-btn-button-default-small{padding-bottom:3px}.x-btn-wrap-default-small.x-btn-arrow-right:after{width:16px;padding-right:16px;background-image:url(images/button/default-small-arrow.png)}.x-btn-wrap-default-small.x-btn-arrow-bottom:after{height:13px;background-image:url(images/button/default-small-arrow.png)}.x-btn-wrap-default-small.x-btn-split-right:after{width:20px;padding-right:20px;background-image:url(images/button/default-small-s-arrow.png)}.x-btn-wrap-default-small.x-btn-split-bottom:after{height:15px;background-image:url(images/button/default-small-s-arrow-b.png)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-small{padding-right:5px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-small{margin-right:5px}.x-btn-focus.x-btn-default-small{background-image:none;background-color:#692727;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#783c3c),color-stop(50%,#692727),color-stop(51%,#632525),color-stop(100%,#692727));background-image:-webkit-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-moz-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-o-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-ms-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);-webkit-box-shadow:#e1d3d3 0 1px 0 0 inset,#e1d3d3 0 -1px 0 0 inset,#e1d3d3 -1px 0 0 0 inset,#e1d3d3 1px 0 0 0 inset;-moz-box-shadow:#e1d3d3 0 1px 0 0 inset,#e1d3d3 0 -1px 0 0 inset,#e1d3d3 -1px 0 0 0 inset,#e1d3d3 1px 0 0 0 inset;box-shadow:#e1d3d3 0 1px 0 0 inset,#e1d3d3 0 -1px 0 0 inset,#e1d3d3 -1px 0 0 0 inset,#e1d3d3 1px 0 0 0 inset}.x-btn-over.x-btn-default-small{border-color:#3d0000;background-image:none;background-color:#602323;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#6f3838),color-stop(50%,#602323),color-stop(51%,#5b2121),color-stop(100%,#602323));background-image:-webkit-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:-moz-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:-o-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:-ms-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323)}.x-btn-focus.x-btn-over.x-btn-default-small{-webkit-box-shadow:#dfd3d3 0 1px 0 0 inset,#dfd3d3 0 -1px 0 0 inset,#dfd3d3 -1px 0 0 0 inset,#dfd3d3 1px 0 0 0 inset;-moz-box-shadow:#dfd3d3 0 1px 0 0 inset,#dfd3d3 0 -1px 0 0 inset,#dfd3d3 -1px 0 0 0 inset,#dfd3d3 1px 0 0 0 inset;box-shadow:#dfd3d3 0 1px 0 0 inset,#dfd3d3 0 -1px 0 0 inset,#dfd3d3 -1px 0 0 0 inset,#dfd3d3 1px 0 0 0 inset}.x-btn.x-btn-menu-active.x-btn-default-small,.x-btn.x-btn-pressed.x-btn-default-small{border-color:#320000;background-image:none;background-color:#4e1d1d;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#4e1d1d),color-stop(50%,#4a1b1b),color-stop(51%,#4e1d1d),color-stop(100%,#5f3333));background-image:-webkit-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:-moz-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:-o-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:-ms-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333)}.x-btn-focus.x-btn-menu-active.x-btn-default-small,.x-btn-focus.x-btn-pressed.x-btn-default-small{-webkit-box-shadow:#dbd1d1 0 1px 0 0 inset,#dbd1d1 0 -1px 0 0 inset,#dbd1d1 -1px 0 0 0 inset,#dbd1d1 1px 0 0 0 inset;-moz-box-shadow:#dbd1d1 0 1px 0 0 inset,#dbd1d1 0 -1px 0 0 inset,#dbd1d1 -1px 0 0 0 inset,#dbd1d1 1px 0 0 0 inset;box-shadow:#dbd1d1 0 1px 0 0 inset,#dbd1d1 0 -1px 0 0 inset,#dbd1d1 -1px 0 0 0 inset,#dbd1d1 1px 0 0 0 inset}.x-btn.x-btn-disabled.x-btn-default-small{background-image:none;background-color:#692727;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#783c3c),color-stop(50%,#692727),color-stop(51%,#632525),color-stop(100%,#692727));background-image:-webkit-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-moz-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-o-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-ms-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727)}.x-btn-focus .x-btn-default-small-tl,.x-btn-focus .x-btn-default-small-bl,.x-btn-focus .x-btn-default-small-tr,.x-btn-focus .x-btn-default-small-br,.x-btn-focus .x-btn-default-small-tc,.x-btn-focus .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-focus-corners.gif)}.x-btn-focus .x-btn-default-small-ml,.x-btn-focus .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-focus-sides.gif)}.x-btn-focus .x-btn-default-small-mc{background-color:#692727;background-image:url(images/btn/btn-default-small-focus-fbg.gif)}.x-btn-over .x-btn-default-small-tl,.x-btn-over .x-btn-default-small-bl,.x-btn-over .x-btn-default-small-tr,.x-btn-over .x-btn-default-small-br,.x-btn-over .x-btn-default-small-tc,.x-btn-over .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-over-corners.gif)}.x-btn-over .x-btn-default-small-ml,.x-btn-over .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-over-sides.gif)}.x-btn-over .x-btn-default-small-mc{background-color:#602323;background-image:url(images/btn/btn-default-small-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-small-tl,.x-btn-focus.x-btn-over .x-btn-default-small-bl,.x-btn-focus.x-btn-over .x-btn-default-small-tr,.x-btn-focus.x-btn-over .x-btn-default-small-br,.x-btn-focus.x-btn-over .x-btn-default-small-tc,.x-btn-focus.x-btn-over .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-small-ml,.x-btn-focus.x-btn-over .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-small-mc{background-color:#602323;background-image:url(images/btn/btn-default-small-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-small-tl,.x-btn.x-btn-menu-active .x-btn-default-small-bl,.x-btn.x-btn-menu-active .x-btn-default-small-tr,.x-btn.x-btn-menu-active .x-btn-default-small-br,.x-btn.x-btn-menu-active .x-btn-default-small-tc,.x-btn.x-btn-menu-active .x-btn-default-small-bc,.x-btn.x-btn-pressed .x-btn-default-small-tl,.x-btn.x-btn-pressed .x-btn-default-small-bl,.x-btn.x-btn-pressed .x-btn-default-small-tr,.x-btn.x-btn-pressed .x-btn-default-small-br,.x-btn.x-btn-pressed .x-btn-default-small-tc,.x-btn.x-btn-pressed .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-small-ml,.x-btn.x-btn-menu-active .x-btn-default-small-mr,.x-btn.x-btn-pressed .x-btn-default-small-ml,.x-btn.x-btn-pressed .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-small-mc,.x-btn.x-btn-pressed .x-btn-default-small-mc{background-color:#4e1d1d;background-image:url(images/btn/btn-default-small-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-small-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-small-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-small-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-small-br,.x-btn-focus.x-btn-menu-active .x-btn-default-small-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-small-bc,.x-btn-focus.x-btn-pressed .x-btn-default-small-tl,.x-btn-focus.x-btn-pressed .x-btn-default-small-bl,.x-btn-focus.x-btn-pressed .x-btn-default-small-tr,.x-btn-focus.x-btn-pressed .x-btn-default-small-br,.x-btn-focus.x-btn-pressed .x-btn-default-small-tc,.x-btn-focus.x-btn-pressed .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-small-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-small-mr,.x-btn-focus.x-btn-pressed .x-btn-default-small-ml,.x-btn-focus.x-btn-pressed .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-small-mc,.x-btn-focus.x-btn-pressed .x-btn-default-small-mc{background-color:#4e1d1d;background-image:url(images/btn/btn-default-small-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-small-tl,.x-btn.x-btn-disabled .x-btn-default-small-bl,.x-btn.x-btn-disabled .x-btn-default-small-tr,.x-btn.x-btn-disabled .x-btn-default-small-br,.x-btn.x-btn-disabled .x-btn-default-small-tc,.x-btn.x-btn-disabled .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-small-ml,.x-btn.x-btn-disabled .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-small-mc{background-color:#692727;background-image:url(images/btn/btn-default-small-disabled-fbg.gif)}.x-nbr .x-btn-default-small{background-image:none}.x-btn-disabled.x-btn-default-small{filter:alpha(opacity=50);opacity:.5}.x-btn-default-medium{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#692727;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#783c3c),color-stop(50%,#692727),color-stop(51%,#632525),color-stop(100%,#692727));background-image:-webkit-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-moz-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-o-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-ms-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727)}.x-btn-default-medium-mc{background-image:url(images/btn/btn-default-medium-fbg.gif);background-position:0 top;background-color:#692727}.x-nbr .x-btn-default-medium{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-default-medium-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-default-medium-tl{background-position:0 -6px}.x-btn-default-medium-tr{background-position:right -9px}.x-btn-default-medium-bl{background-position:0 -12px}.x-btn-default-medium-br{background-position:right -15px}.x-btn-default-medium-ml{background-position:0 top}.x-btn-default-medium-mr{background-position:right top}.x-btn-default-medium-tc{background-position:0 0}.x-btn-default-medium-bc{background-position:0 -3px}.x-btn-default-medium-tr,.x-btn-default-medium-br,.x-btn-default-medium-mr{padding-right:3px}.x-btn-default-medium-tl,.x-btn-default-medium-bl,.x-btn-default-medium-ml{padding-left:3px}.x-btn-default-medium-tc{height:3px}.x-btn-default-medium-bc{height:3px}.x-btn-default-medium-tl,.x-btn-default-medium-bl,.x-btn-default-medium-tr,.x-btn-default-medium-br,.x-btn-default-medium-tc,.x-btn-default-medium-bc,.x-btn-default-medium-ml,.x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-corners.gif)}.x-btn-default-medium-ml,.x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-sides.gif)}.x-btn-default-medium-mc{padding:1px 1px 1px 1px}.x-btn-default-medium{border-color:#430000}.x-btn-button-default-medium{height:24px}.x-btn-inner-default-medium{font:bold 14px/18px helvetica,arial,verdana,sans-serif;color:white;padding:0 8px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-medium,.x-btn-icon-left>.x-btn-inner-default-medium{max-width:calc(100% - 24px)}.x-btn-icon-el-default-medium{height:24px}.x-btn-icon-left>.x-btn-icon-el-default-medium,.x-btn-icon-right>.x-btn-icon-el-default-medium{width:24px}.x-btn-icon-top>.x-btn-icon-el-default-medium,.x-btn-icon-bottom>.x-btn-icon-el-default-medium{min-width:24px}.x-btn-icon-el-default-medium.x-btn-glyph{font-size:24px;line-height:24px;color:white;opacity:.5}.x-ie8 .x-btn-icon-el-default-medium.x-btn-glyph{color:#b49393}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-medium{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-medium{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-medium{margin-bottom:5px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-medium{margin-top:5px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-medium{padding-right:8px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-medium{margin-right:8px}.x-btn-arrow-bottom>.x-btn-button-default-medium,.x-btn-split-bottom>.x-btn-button-default-medium{padding-bottom:3px}.x-btn-wrap-default-medium.x-btn-arrow-right:after{width:24px;padding-right:24px;background-image:url(images/button/default-medium-arrow.png)}.x-btn-wrap-default-medium.x-btn-arrow-bottom:after{height:18px;background-image:url(images/button/default-medium-arrow.png)}.x-btn-wrap-default-medium.x-btn-split-right:after{width:28px;padding-right:28px;background-image:url(images/button/default-medium-s-arrow.png)}.x-btn-wrap-default-medium.x-btn-split-bottom:after{height:24px;background-image:url(images/button/default-medium-s-arrow-b.png)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-medium{padding-right:8px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-medium{margin-right:8px}.x-btn-focus.x-btn-default-medium{background-image:none;background-color:#692727;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#783c3c),color-stop(50%,#692727),color-stop(51%,#632525),color-stop(100%,#692727));background-image:-webkit-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-moz-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-o-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-ms-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);-webkit-box-shadow:#e1d3d3 0 1px 0 0 inset,#e1d3d3 0 -1px 0 0 inset,#e1d3d3 -1px 0 0 0 inset,#e1d3d3 1px 0 0 0 inset;-moz-box-shadow:#e1d3d3 0 1px 0 0 inset,#e1d3d3 0 -1px 0 0 inset,#e1d3d3 -1px 0 0 0 inset,#e1d3d3 1px 0 0 0 inset;box-shadow:#e1d3d3 0 1px 0 0 inset,#e1d3d3 0 -1px 0 0 inset,#e1d3d3 -1px 0 0 0 inset,#e1d3d3 1px 0 0 0 inset}.x-btn-over.x-btn-default-medium{border-color:#3d0000;background-image:none;background-color:#602323;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#6f3838),color-stop(50%,#602323),color-stop(51%,#5b2121),color-stop(100%,#602323));background-image:-webkit-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:-moz-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:-o-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:-ms-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323)}.x-btn-focus.x-btn-over.x-btn-default-medium{-webkit-box-shadow:#dfd3d3 0 1px 0 0 inset,#dfd3d3 0 -1px 0 0 inset,#dfd3d3 -1px 0 0 0 inset,#dfd3d3 1px 0 0 0 inset;-moz-box-shadow:#dfd3d3 0 1px 0 0 inset,#dfd3d3 0 -1px 0 0 inset,#dfd3d3 -1px 0 0 0 inset,#dfd3d3 1px 0 0 0 inset;box-shadow:#dfd3d3 0 1px 0 0 inset,#dfd3d3 0 -1px 0 0 inset,#dfd3d3 -1px 0 0 0 inset,#dfd3d3 1px 0 0 0 inset}.x-btn.x-btn-menu-active.x-btn-default-medium,.x-btn.x-btn-pressed.x-btn-default-medium{border-color:#320000;background-image:none;background-color:#4e1d1d;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#4e1d1d),color-stop(50%,#4a1b1b),color-stop(51%,#4e1d1d),color-stop(100%,#5f3333));background-image:-webkit-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:-moz-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:-o-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:-ms-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333)}.x-btn-focus.x-btn-menu-active.x-btn-default-medium,.x-btn-focus.x-btn-pressed.x-btn-default-medium{-webkit-box-shadow:#dbd1d1 0 1px 0 0 inset,#dbd1d1 0 -1px 0 0 inset,#dbd1d1 -1px 0 0 0 inset,#dbd1d1 1px 0 0 0 inset;-moz-box-shadow:#dbd1d1 0 1px 0 0 inset,#dbd1d1 0 -1px 0 0 inset,#dbd1d1 -1px 0 0 0 inset,#dbd1d1 1px 0 0 0 inset;box-shadow:#dbd1d1 0 1px 0 0 inset,#dbd1d1 0 -1px 0 0 inset,#dbd1d1 -1px 0 0 0 inset,#dbd1d1 1px 0 0 0 inset}.x-btn.x-btn-disabled.x-btn-default-medium{background-image:none;background-color:#692727;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#783c3c),color-stop(50%,#692727),color-stop(51%,#632525),color-stop(100%,#692727));background-image:-webkit-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-moz-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-o-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-ms-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727)}.x-btn-focus .x-btn-default-medium-tl,.x-btn-focus .x-btn-default-medium-bl,.x-btn-focus .x-btn-default-medium-tr,.x-btn-focus .x-btn-default-medium-br,.x-btn-focus .x-btn-default-medium-tc,.x-btn-focus .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-focus-corners.gif)}.x-btn-focus .x-btn-default-medium-ml,.x-btn-focus .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-focus-sides.gif)}.x-btn-focus .x-btn-default-medium-mc{background-color:#692727;background-image:url(images/btn/btn-default-medium-focus-fbg.gif)}.x-btn-over .x-btn-default-medium-tl,.x-btn-over .x-btn-default-medium-bl,.x-btn-over .x-btn-default-medium-tr,.x-btn-over .x-btn-default-medium-br,.x-btn-over .x-btn-default-medium-tc,.x-btn-over .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-over-corners.gif)}.x-btn-over .x-btn-default-medium-ml,.x-btn-over .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-over-sides.gif)}.x-btn-over .x-btn-default-medium-mc{background-color:#602323;background-image:url(images/btn/btn-default-medium-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-medium-tl,.x-btn-focus.x-btn-over .x-btn-default-medium-bl,.x-btn-focus.x-btn-over .x-btn-default-medium-tr,.x-btn-focus.x-btn-over .x-btn-default-medium-br,.x-btn-focus.x-btn-over .x-btn-default-medium-tc,.x-btn-focus.x-btn-over .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-medium-ml,.x-btn-focus.x-btn-over .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-medium-mc{background-color:#602323;background-image:url(images/btn/btn-default-medium-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-medium-tl,.x-btn.x-btn-menu-active .x-btn-default-medium-bl,.x-btn.x-btn-menu-active .x-btn-default-medium-tr,.x-btn.x-btn-menu-active .x-btn-default-medium-br,.x-btn.x-btn-menu-active .x-btn-default-medium-tc,.x-btn.x-btn-menu-active .x-btn-default-medium-bc,.x-btn.x-btn-pressed .x-btn-default-medium-tl,.x-btn.x-btn-pressed .x-btn-default-medium-bl,.x-btn.x-btn-pressed .x-btn-default-medium-tr,.x-btn.x-btn-pressed .x-btn-default-medium-br,.x-btn.x-btn-pressed .x-btn-default-medium-tc,.x-btn.x-btn-pressed .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-medium-ml,.x-btn.x-btn-menu-active .x-btn-default-medium-mr,.x-btn.x-btn-pressed .x-btn-default-medium-ml,.x-btn.x-btn-pressed .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-medium-mc,.x-btn.x-btn-pressed .x-btn-default-medium-mc{background-color:#4e1d1d;background-image:url(images/btn/btn-default-medium-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-medium-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-br,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-bc,.x-btn-focus.x-btn-pressed .x-btn-default-medium-tl,.x-btn-focus.x-btn-pressed .x-btn-default-medium-bl,.x-btn-focus.x-btn-pressed .x-btn-default-medium-tr,.x-btn-focus.x-btn-pressed .x-btn-default-medium-br,.x-btn-focus.x-btn-pressed .x-btn-default-medium-tc,.x-btn-focus.x-btn-pressed .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-medium-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-mr,.x-btn-focus.x-btn-pressed .x-btn-default-medium-ml,.x-btn-focus.x-btn-pressed .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-medium-mc,.x-btn-focus.x-btn-pressed .x-btn-default-medium-mc{background-color:#4e1d1d;background-image:url(images/btn/btn-default-medium-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-medium-tl,.x-btn.x-btn-disabled .x-btn-default-medium-bl,.x-btn.x-btn-disabled .x-btn-default-medium-tr,.x-btn.x-btn-disabled .x-btn-default-medium-br,.x-btn.x-btn-disabled .x-btn-default-medium-tc,.x-btn.x-btn-disabled .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-medium-ml,.x-btn.x-btn-disabled .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-medium-mc{background-color:#692727;background-image:url(images/btn/btn-default-medium-disabled-fbg.gif)}.x-nbr .x-btn-default-medium{background-image:none}.x-btn-disabled.x-btn-default-medium{filter:alpha(opacity=50);opacity:.5}.x-btn-default-large{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#692727;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#783c3c),color-stop(50%,#692727),color-stop(51%,#632525),color-stop(100%,#692727));background-image:-webkit-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-moz-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-o-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-ms-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727)}.x-btn-default-large-mc{background-image:url(images/btn/btn-default-large-fbg.gif);background-position:0 top;background-color:#692727}.x-nbr .x-btn-default-large{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-default-large-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-default-large-tl{background-position:0 -6px}.x-btn-default-large-tr{background-position:right -9px}.x-btn-default-large-bl{background-position:0 -12px}.x-btn-default-large-br{background-position:right -15px}.x-btn-default-large-ml{background-position:0 top}.x-btn-default-large-mr{background-position:right top}.x-btn-default-large-tc{background-position:0 0}.x-btn-default-large-bc{background-position:0 -3px}.x-btn-default-large-tr,.x-btn-default-large-br,.x-btn-default-large-mr{padding-right:3px}.x-btn-default-large-tl,.x-btn-default-large-bl,.x-btn-default-large-ml{padding-left:3px}.x-btn-default-large-tc{height:3px}.x-btn-default-large-bc{height:3px}.x-btn-default-large-tl,.x-btn-default-large-bl,.x-btn-default-large-tr,.x-btn-default-large-br,.x-btn-default-large-tc,.x-btn-default-large-bc,.x-btn-default-large-ml,.x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-corners.gif)}.x-btn-default-large-ml,.x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-sides.gif)}.x-btn-default-large-mc{padding:1px 1px 1px 1px}.x-btn-default-large{border-color:#430000}.x-btn-button-default-large{height:32px}.x-btn-inner-default-large{font:bold 16px/20px helvetica,arial,verdana,sans-serif;color:white;padding:0 10px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-large,.x-btn-icon-left>.x-btn-inner-default-large{max-width:calc(100% - 32px)}.x-btn-icon-el-default-large{height:32px}.x-btn-icon-left>.x-btn-icon-el-default-large,.x-btn-icon-right>.x-btn-icon-el-default-large{width:32px}.x-btn-icon-top>.x-btn-icon-el-default-large,.x-btn-icon-bottom>.x-btn-icon-el-default-large{min-width:32px}.x-btn-icon-el-default-large.x-btn-glyph{font-size:32px;line-height:32px;color:white;opacity:.5}.x-ie8 .x-btn-icon-el-default-large.x-btn-glyph{color:#b49393}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-large{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-large{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-large{margin-bottom:5px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-large{margin-top:5px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-large{padding-right:10px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-large{margin-right:10px}.x-btn-arrow-bottom>.x-btn-button-default-large,.x-btn-split-bottom>.x-btn-button-default-large{padding-bottom:3px}.x-btn-wrap-default-large.x-btn-arrow-right:after{width:28px;padding-right:28px;background-image:url(images/button/default-large-arrow.png)}.x-btn-wrap-default-large.x-btn-arrow-bottom:after{height:20px;background-image:url(images/button/default-large-arrow.png)}.x-btn-wrap-default-large.x-btn-split-right:after{width:35px;padding-right:35px;background-image:url(images/button/default-large-s-arrow.png)}.x-btn-wrap-default-large.x-btn-split-bottom:after{height:29px;background-image:url(images/button/default-large-s-arrow-b.png)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-large{padding-right:10px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-large{margin-right:10px}.x-btn-focus.x-btn-default-large{background-image:none;background-color:#692727;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#783c3c),color-stop(50%,#692727),color-stop(51%,#632525),color-stop(100%,#692727));background-image:-webkit-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-moz-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-o-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-ms-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);-webkit-box-shadow:#e1d3d3 0 1px 0 0 inset,#e1d3d3 0 -1px 0 0 inset,#e1d3d3 -1px 0 0 0 inset,#e1d3d3 1px 0 0 0 inset;-moz-box-shadow:#e1d3d3 0 1px 0 0 inset,#e1d3d3 0 -1px 0 0 inset,#e1d3d3 -1px 0 0 0 inset,#e1d3d3 1px 0 0 0 inset;box-shadow:#e1d3d3 0 1px 0 0 inset,#e1d3d3 0 -1px 0 0 inset,#e1d3d3 -1px 0 0 0 inset,#e1d3d3 1px 0 0 0 inset}.x-btn-over.x-btn-default-large{border-color:#3d0000;background-image:none;background-color:#602323;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#6f3838),color-stop(50%,#602323),color-stop(51%,#5b2121),color-stop(100%,#602323));background-image:-webkit-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:-moz-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:-o-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:-ms-linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323);background-image:linear-gradient(top,#6f3838,#602323 50%,#5b2121 51%,#602323)}.x-btn-focus.x-btn-over.x-btn-default-large{-webkit-box-shadow:#dfd3d3 0 1px 0 0 inset,#dfd3d3 0 -1px 0 0 inset,#dfd3d3 -1px 0 0 0 inset,#dfd3d3 1px 0 0 0 inset;-moz-box-shadow:#dfd3d3 0 1px 0 0 inset,#dfd3d3 0 -1px 0 0 inset,#dfd3d3 -1px 0 0 0 inset,#dfd3d3 1px 0 0 0 inset;box-shadow:#dfd3d3 0 1px 0 0 inset,#dfd3d3 0 -1px 0 0 inset,#dfd3d3 -1px 0 0 0 inset,#dfd3d3 1px 0 0 0 inset}.x-btn.x-btn-menu-active.x-btn-default-large,.x-btn.x-btn-pressed.x-btn-default-large{border-color:#320000;background-image:none;background-color:#4e1d1d;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#4e1d1d),color-stop(50%,#4a1b1b),color-stop(51%,#4e1d1d),color-stop(100%,#5f3333));background-image:-webkit-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:-moz-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:-o-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:-ms-linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333);background-image:linear-gradient(top,#4e1d1d,#4a1b1b 50%,#4e1d1d 51%,#5f3333)}.x-btn-focus.x-btn-menu-active.x-btn-default-large,.x-btn-focus.x-btn-pressed.x-btn-default-large{-webkit-box-shadow:#dbd1d1 0 1px 0 0 inset,#dbd1d1 0 -1px 0 0 inset,#dbd1d1 -1px 0 0 0 inset,#dbd1d1 1px 0 0 0 inset;-moz-box-shadow:#dbd1d1 0 1px 0 0 inset,#dbd1d1 0 -1px 0 0 inset,#dbd1d1 -1px 0 0 0 inset,#dbd1d1 1px 0 0 0 inset;box-shadow:#dbd1d1 0 1px 0 0 inset,#dbd1d1 0 -1px 0 0 inset,#dbd1d1 -1px 0 0 0 inset,#dbd1d1 1px 0 0 0 inset}.x-btn.x-btn-disabled.x-btn-default-large{background-image:none;background-color:#692727;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#783c3c),color-stop(50%,#692727),color-stop(51%,#632525),color-stop(100%,#692727));background-image:-webkit-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-moz-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-o-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:-ms-linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727);background-image:linear-gradient(top,#783c3c,#692727 50%,#632525 51%,#692727)}.x-btn-focus .x-btn-default-large-tl,.x-btn-focus .x-btn-default-large-bl,.x-btn-focus .x-btn-default-large-tr,.x-btn-focus .x-btn-default-large-br,.x-btn-focus .x-btn-default-large-tc,.x-btn-focus .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-focus-corners.gif)}.x-btn-focus .x-btn-default-large-ml,.x-btn-focus .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-focus-sides.gif)}.x-btn-focus .x-btn-default-large-mc{background-color:#692727;background-image:url(images/btn/btn-default-large-focus-fbg.gif)}.x-btn-over .x-btn-default-large-tl,.x-btn-over .x-btn-default-large-bl,.x-btn-over .x-btn-default-large-tr,.x-btn-over .x-btn-default-large-br,.x-btn-over .x-btn-default-large-tc,.x-btn-over .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-over-corners.gif)}.x-btn-over .x-btn-default-large-ml,.x-btn-over .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-over-sides.gif)}.x-btn-over .x-btn-default-large-mc{background-color:#602323;background-image:url(images/btn/btn-default-large-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-large-tl,.x-btn-focus.x-btn-over .x-btn-default-large-bl,.x-btn-focus.x-btn-over .x-btn-default-large-tr,.x-btn-focus.x-btn-over .x-btn-default-large-br,.x-btn-focus.x-btn-over .x-btn-default-large-tc,.x-btn-focus.x-btn-over .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-large-ml,.x-btn-focus.x-btn-over .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-large-mc{background-color:#602323;background-image:url(images/btn/btn-default-large-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-large-tl,.x-btn.x-btn-menu-active .x-btn-default-large-bl,.x-btn.x-btn-menu-active .x-btn-default-large-tr,.x-btn.x-btn-menu-active .x-btn-default-large-br,.x-btn.x-btn-menu-active .x-btn-default-large-tc,.x-btn.x-btn-menu-active .x-btn-default-large-bc,.x-btn.x-btn-pressed .x-btn-default-large-tl,.x-btn.x-btn-pressed .x-btn-default-large-bl,.x-btn.x-btn-pressed .x-btn-default-large-tr,.x-btn.x-btn-pressed .x-btn-default-large-br,.x-btn.x-btn-pressed .x-btn-default-large-tc,.x-btn.x-btn-pressed .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-large-ml,.x-btn.x-btn-menu-active .x-btn-default-large-mr,.x-btn.x-btn-pressed .x-btn-default-large-ml,.x-btn.x-btn-pressed .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-large-mc,.x-btn.x-btn-pressed .x-btn-default-large-mc{background-color:#4e1d1d;background-image:url(images/btn/btn-default-large-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-large-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-large-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-large-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-large-br,.x-btn-focus.x-btn-menu-active .x-btn-default-large-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-large-bc,.x-btn-focus.x-btn-pressed .x-btn-default-large-tl,.x-btn-focus.x-btn-pressed .x-btn-default-large-bl,.x-btn-focus.x-btn-pressed .x-btn-default-large-tr,.x-btn-focus.x-btn-pressed .x-btn-default-large-br,.x-btn-focus.x-btn-pressed .x-btn-default-large-tc,.x-btn-focus.x-btn-pressed .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-large-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-large-mr,.x-btn-focus.x-btn-pressed .x-btn-default-large-ml,.x-btn-focus.x-btn-pressed .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-large-mc,.x-btn-focus.x-btn-pressed .x-btn-default-large-mc{background-color:#4e1d1d;background-image:url(images/btn/btn-default-large-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-large-tl,.x-btn.x-btn-disabled .x-btn-default-large-bl,.x-btn.x-btn-disabled .x-btn-default-large-tr,.x-btn.x-btn-disabled .x-btn-default-large-br,.x-btn.x-btn-disabled .x-btn-default-large-tc,.x-btn.x-btn-disabled .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-large-ml,.x-btn.x-btn-disabled .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-large-mc{background-color:#692727;background-image:url(images/btn/btn-default-large-disabled-fbg.gif)}.x-nbr .x-btn-default-large{background-image:none}.x-btn-disabled.x-btn-default-large{filter:alpha(opacity=50);opacity:.5}.x-btn-default-toolbar-small{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#f5f5f5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f6f6f6),color-stop(50%,#f5f5f5),color-stop(51%,#e8e8e8),color-stop(100%,#f5f5f5));background-image:-webkit-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-moz-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-o-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-ms-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5)}.x-btn-default-toolbar-small-mc{background-image:url(images/btn/btn-default-toolbar-small-fbg.gif);background-position:0 top;background-color:#f5f5f5}.x-nbr .x-btn-default-toolbar-small{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-default-toolbar-small-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-default-toolbar-small-tl{background-position:0 -6px}.x-btn-default-toolbar-small-tr{background-position:right -9px}.x-btn-default-toolbar-small-bl{background-position:0 -12px}.x-btn-default-toolbar-small-br{background-position:right -15px}.x-btn-default-toolbar-small-ml{background-position:0 top}.x-btn-default-toolbar-small-mr{background-position:right top}.x-btn-default-toolbar-small-tc{background-position:0 0}.x-btn-default-toolbar-small-bc{background-position:0 -3px}.x-btn-default-toolbar-small-tr,.x-btn-default-toolbar-small-br,.x-btn-default-toolbar-small-mr{padding-right:3px}.x-btn-default-toolbar-small-tl,.x-btn-default-toolbar-small-bl,.x-btn-default-toolbar-small-ml{padding-left:3px}.x-btn-default-toolbar-small-tc{height:3px}.x-btn-default-toolbar-small-bc{height:3px}.x-btn-default-toolbar-small-tl,.x-btn-default-toolbar-small-bl,.x-btn-default-toolbar-small-tr,.x-btn-default-toolbar-small-br,.x-btn-default-toolbar-small-tc,.x-btn-default-toolbar-small-bc,.x-btn-default-toolbar-small-ml,.x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-corners.gif)}.x-btn-default-toolbar-small-ml,.x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-sides.gif)}.x-btn-default-toolbar-small-mc{padding:1px 1px 1px 1px}.x-btn-default-toolbar-small{border-color:#e1e1e1}.x-btn-button-default-toolbar-small{height:16px}.x-btn-inner-default-toolbar-small{font:bold 12px/16px helvetica,arial,verdana,sans-serif;color:#666;padding:0 5px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-toolbar-small,.x-btn-icon-left>.x-btn-inner-default-toolbar-small{max-width:calc(100% - 16px)}.x-btn-icon-el-default-toolbar-small{height:16px}.x-btn-icon-left>.x-btn-icon-el-default-toolbar-small,.x-btn-icon-right>.x-btn-icon-el-default-toolbar-small{width:16px}.x-btn-icon-top>.x-btn-icon-el-default-toolbar-small,.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-small{min-width:16px}.x-btn-icon-el-default-toolbar-small.x-btn-glyph{font-size:16px;line-height:16px;color:#666;opacity:.5}.x-ie8 .x-btn-icon-el-default-toolbar-small.x-btn-glyph{color:#adadad}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-toolbar-small{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-small{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-toolbar-small{margin-bottom:5px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-small{margin-top:5px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-small{padding-right:5px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-small{margin-right:5px}.x-btn-arrow-bottom>.x-btn-button-default-toolbar-small,.x-btn-split-bottom>.x-btn-button-default-toolbar-small{padding-bottom:3px}.x-btn-wrap-default-toolbar-small.x-btn-arrow-right:after{width:16px;padding-right:16px;background-image:url(images/button/default-toolbar-small-arrow.png)}.x-btn-wrap-default-toolbar-small.x-btn-arrow-bottom:after{height:13px;background-image:url(images/button/default-toolbar-small-arrow.png)}.x-btn-wrap-default-toolbar-small.x-btn-split-right:after{width:20px;padding-right:20px;background-image:url(images/button/default-toolbar-small-s-arrow.png)}.x-btn-wrap-default-toolbar-small.x-btn-split-bottom:after{height:15px;background-image:url(images/button/default-toolbar-small-s-arrow-b.png)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-small{padding-right:5px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-small{margin-right:5px}.x-btn-focus.x-btn-default-toolbar-small{background-image:none;background-color:#f5f5f5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f6f6f6),color-stop(50%,#f5f5f5),color-stop(51%,#e8e8e8),color-stop(100%,#f5f5f5));background-image:-webkit-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-moz-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-o-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-ms-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn-over.x-btn-default-toolbar-small{border-color:#d8d8d8;background-image:none;background-color:#ebebeb;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#ededed),color-stop(50%,#ebebeb),color-stop(51%,#dfdfdf),color-stop(100%,#ebebeb));background-image:-webkit-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-moz-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-o-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-ms-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb)}.x-btn-focus.x-btn-over.x-btn-default-toolbar-small{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-menu-active.x-btn-default-toolbar-small,.x-btn.x-btn-pressed.x-btn-default-toolbar-small{border-color:#cecece;background-image:none;background-color:#e1e1e1;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#e1e1e1),color-stop(50%,#d5d5d5),color-stop(51%,#e1e1e1),color-stop(100%,#e4e4e4));background-image:-webkit-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-moz-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-o-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-ms-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4)}.x-btn-focus.x-btn-menu-active.x-btn-default-toolbar-small,.x-btn-focus.x-btn-pressed.x-btn-default-toolbar-small{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-disabled.x-btn-default-toolbar-small{background-image:none;background-color:#f5f5f5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f6f6f6),color-stop(50%,#f5f5f5),color-stop(51%,#e8e8e8),color-stop(100%,#f5f5f5));background-image:-webkit-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-moz-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-o-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-ms-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5)}.x-btn-focus .x-btn-default-toolbar-small-tl,.x-btn-focus .x-btn-default-toolbar-small-bl,.x-btn-focus .x-btn-default-toolbar-small-tr,.x-btn-focus .x-btn-default-toolbar-small-br,.x-btn-focus .x-btn-default-toolbar-small-tc,.x-btn-focus .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-focus-corners.gif)}.x-btn-focus .x-btn-default-toolbar-small-ml,.x-btn-focus .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-focus-sides.gif)}.x-btn-focus .x-btn-default-toolbar-small-mc{background-color:#f5f5f5;background-image:url(images/btn/btn-default-toolbar-small-focus-fbg.gif)}.x-btn-over .x-btn-default-toolbar-small-tl,.x-btn-over .x-btn-default-toolbar-small-bl,.x-btn-over .x-btn-default-toolbar-small-tr,.x-btn-over .x-btn-default-toolbar-small-br,.x-btn-over .x-btn-default-toolbar-small-tc,.x-btn-over .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-over-corners.gif)}.x-btn-over .x-btn-default-toolbar-small-ml,.x-btn-over .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-over-sides.gif)}.x-btn-over .x-btn-default-toolbar-small-mc{background-color:#ebebeb;background-image:url(images/btn/btn-default-toolbar-small-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-tl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-bl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-tr,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-br,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-tc,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-ml,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-mc{background-color:#ebebeb;background-image:url(images/btn/btn-default-toolbar-small-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-tl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-bl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-tr,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-br,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-tc,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-bc,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-tl,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-bl,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-tr,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-br,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-tc,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-ml,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-mr,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-ml,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-mc,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-default-toolbar-small-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-br,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-bc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-tl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-bl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-tr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-br,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-tc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-mr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-ml,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-mc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-default-toolbar-small-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-small-tl,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-bl,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-tr,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-br,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-tc,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-small-ml,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-small-mc{background-color:#f5f5f5;background-image:url(images/btn/btn-default-toolbar-small-disabled-fbg.gif)}.x-nbr .x-btn-default-toolbar-small{background-image:none}.x-btn-disabled.x-btn-default-toolbar-small{filter:alpha(opacity=50);opacity:.5}.x-btn-default-toolbar-medium{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#f5f5f5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f6f6f6),color-stop(50%,#f5f5f5),color-stop(51%,#e8e8e8),color-stop(100%,#f5f5f5));background-image:-webkit-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-moz-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-o-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-ms-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5)}.x-btn-default-toolbar-medium-mc{background-image:url(images/btn/btn-default-toolbar-medium-fbg.gif);background-position:0 top;background-color:#f5f5f5}.x-nbr .x-btn-default-toolbar-medium{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-default-toolbar-medium-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-default-toolbar-medium-tl{background-position:0 -6px}.x-btn-default-toolbar-medium-tr{background-position:right -9px}.x-btn-default-toolbar-medium-bl{background-position:0 -12px}.x-btn-default-toolbar-medium-br{background-position:right -15px}.x-btn-default-toolbar-medium-ml{background-position:0 top}.x-btn-default-toolbar-medium-mr{background-position:right top}.x-btn-default-toolbar-medium-tc{background-position:0 0}.x-btn-default-toolbar-medium-bc{background-position:0 -3px}.x-btn-default-toolbar-medium-tr,.x-btn-default-toolbar-medium-br,.x-btn-default-toolbar-medium-mr{padding-right:3px}.x-btn-default-toolbar-medium-tl,.x-btn-default-toolbar-medium-bl,.x-btn-default-toolbar-medium-ml{padding-left:3px}.x-btn-default-toolbar-medium-tc{height:3px}.x-btn-default-toolbar-medium-bc{height:3px}.x-btn-default-toolbar-medium-tl,.x-btn-default-toolbar-medium-bl,.x-btn-default-toolbar-medium-tr,.x-btn-default-toolbar-medium-br,.x-btn-default-toolbar-medium-tc,.x-btn-default-toolbar-medium-bc,.x-btn-default-toolbar-medium-ml,.x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-corners.gif)}.x-btn-default-toolbar-medium-ml,.x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-sides.gif)}.x-btn-default-toolbar-medium-mc{padding:1px 1px 1px 1px}.x-btn-default-toolbar-medium{border-color:#e1e1e1}.x-btn-button-default-toolbar-medium{height:24px}.x-btn-inner-default-toolbar-medium{font:bold 14px/18px helvetica,arial,verdana,sans-serif;color:#666;padding:0 8px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-toolbar-medium,.x-btn-icon-left>.x-btn-inner-default-toolbar-medium{max-width:calc(100% - 24px)}.x-btn-icon-el-default-toolbar-medium{height:24px}.x-btn-icon-left>.x-btn-icon-el-default-toolbar-medium,.x-btn-icon-right>.x-btn-icon-el-default-toolbar-medium{width:24px}.x-btn-icon-top>.x-btn-icon-el-default-toolbar-medium,.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-medium{min-width:24px}.x-btn-icon-el-default-toolbar-medium.x-btn-glyph{font-size:24px;line-height:24px;color:#666;opacity:.5}.x-ie8 .x-btn-icon-el-default-toolbar-medium.x-btn-glyph{color:#adadad}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-toolbar-medium{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-medium{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-toolbar-medium{margin-bottom:5px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-medium{margin-top:5px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-medium{padding-right:8px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-medium{margin-right:8px}.x-btn-arrow-bottom>.x-btn-button-default-toolbar-medium,.x-btn-split-bottom>.x-btn-button-default-toolbar-medium{padding-bottom:3px}.x-btn-wrap-default-toolbar-medium.x-btn-arrow-right:after{width:24px;padding-right:24px;background-image:url(images/button/default-toolbar-medium-arrow.png)}.x-btn-wrap-default-toolbar-medium.x-btn-arrow-bottom:after{height:18px;background-image:url(images/button/default-toolbar-medium-arrow.png)}.x-btn-wrap-default-toolbar-medium.x-btn-split-right:after{width:28px;padding-right:28px;background-image:url(images/button/default-toolbar-medium-s-arrow.png)}.x-btn-wrap-default-toolbar-medium.x-btn-split-bottom:after{height:24px;background-image:url(images/button/default-toolbar-medium-s-arrow-b.png)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-medium{padding-right:8px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-medium{margin-right:8px}.x-btn-focus.x-btn-default-toolbar-medium{background-image:none;background-color:#f5f5f5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f6f6f6),color-stop(50%,#f5f5f5),color-stop(51%,#e8e8e8),color-stop(100%,#f5f5f5));background-image:-webkit-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-moz-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-o-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-ms-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn-over.x-btn-default-toolbar-medium{border-color:#d8d8d8;background-image:none;background-color:#ebebeb;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#ededed),color-stop(50%,#ebebeb),color-stop(51%,#dfdfdf),color-stop(100%,#ebebeb));background-image:-webkit-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-moz-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-o-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-ms-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb)}.x-btn-focus.x-btn-over.x-btn-default-toolbar-medium{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-menu-active.x-btn-default-toolbar-medium,.x-btn.x-btn-pressed.x-btn-default-toolbar-medium{border-color:#cecece;background-image:none;background-color:#e1e1e1;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#e1e1e1),color-stop(50%,#d5d5d5),color-stop(51%,#e1e1e1),color-stop(100%,#e4e4e4));background-image:-webkit-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-moz-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-o-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-ms-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4)}.x-btn-focus.x-btn-menu-active.x-btn-default-toolbar-medium,.x-btn-focus.x-btn-pressed.x-btn-default-toolbar-medium{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-disabled.x-btn-default-toolbar-medium{background-image:none;background-color:#f5f5f5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f6f6f6),color-stop(50%,#f5f5f5),color-stop(51%,#e8e8e8),color-stop(100%,#f5f5f5));background-image:-webkit-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-moz-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-o-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-ms-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5)}.x-btn-focus .x-btn-default-toolbar-medium-tl,.x-btn-focus .x-btn-default-toolbar-medium-bl,.x-btn-focus .x-btn-default-toolbar-medium-tr,.x-btn-focus .x-btn-default-toolbar-medium-br,.x-btn-focus .x-btn-default-toolbar-medium-tc,.x-btn-focus .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-focus-corners.gif)}.x-btn-focus .x-btn-default-toolbar-medium-ml,.x-btn-focus .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-focus-sides.gif)}.x-btn-focus .x-btn-default-toolbar-medium-mc{background-color:#f5f5f5;background-image:url(images/btn/btn-default-toolbar-medium-focus-fbg.gif)}.x-btn-over .x-btn-default-toolbar-medium-tl,.x-btn-over .x-btn-default-toolbar-medium-bl,.x-btn-over .x-btn-default-toolbar-medium-tr,.x-btn-over .x-btn-default-toolbar-medium-br,.x-btn-over .x-btn-default-toolbar-medium-tc,.x-btn-over .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-over-corners.gif)}.x-btn-over .x-btn-default-toolbar-medium-ml,.x-btn-over .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-over-sides.gif)}.x-btn-over .x-btn-default-toolbar-medium-mc{background-color:#ebebeb;background-image:url(images/btn/btn-default-toolbar-medium-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-tl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-bl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-tr,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-br,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-tc,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-ml,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-mc{background-color:#ebebeb;background-image:url(images/btn/btn-default-toolbar-medium-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-tl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-bl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-tr,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-br,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-tc,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-bc,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-tl,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-bl,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-tr,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-br,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-tc,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-ml,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-mr,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-ml,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-mc,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-default-toolbar-medium-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-br,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-bc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-tl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-bl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-tr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-br,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-tc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-mr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-ml,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-mc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-default-toolbar-medium-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-tl,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-bl,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-tr,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-br,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-tc,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-ml,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-mc{background-color:#f5f5f5;background-image:url(images/btn/btn-default-toolbar-medium-disabled-fbg.gif)}.x-nbr .x-btn-default-toolbar-medium{background-image:none}.x-btn-disabled.x-btn-default-toolbar-medium{filter:alpha(opacity=50);opacity:.5}.x-btn-default-toolbar-large{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#f5f5f5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f6f6f6),color-stop(50%,#f5f5f5),color-stop(51%,#e8e8e8),color-stop(100%,#f5f5f5));background-image:-webkit-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-moz-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-o-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-ms-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5)}.x-btn-default-toolbar-large-mc{background-image:url(images/btn/btn-default-toolbar-large-fbg.gif);background-position:0 top;background-color:#f5f5f5}.x-nbr .x-btn-default-toolbar-large{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-default-toolbar-large-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-default-toolbar-large-tl{background-position:0 -6px}.x-btn-default-toolbar-large-tr{background-position:right -9px}.x-btn-default-toolbar-large-bl{background-position:0 -12px}.x-btn-default-toolbar-large-br{background-position:right -15px}.x-btn-default-toolbar-large-ml{background-position:0 top}.x-btn-default-toolbar-large-mr{background-position:right top}.x-btn-default-toolbar-large-tc{background-position:0 0}.x-btn-default-toolbar-large-bc{background-position:0 -3px}.x-btn-default-toolbar-large-tr,.x-btn-default-toolbar-large-br,.x-btn-default-toolbar-large-mr{padding-right:3px}.x-btn-default-toolbar-large-tl,.x-btn-default-toolbar-large-bl,.x-btn-default-toolbar-large-ml{padding-left:3px}.x-btn-default-toolbar-large-tc{height:3px}.x-btn-default-toolbar-large-bc{height:3px}.x-btn-default-toolbar-large-tl,.x-btn-default-toolbar-large-bl,.x-btn-default-toolbar-large-tr,.x-btn-default-toolbar-large-br,.x-btn-default-toolbar-large-tc,.x-btn-default-toolbar-large-bc,.x-btn-default-toolbar-large-ml,.x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-corners.gif)}.x-btn-default-toolbar-large-ml,.x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-sides.gif)}.x-btn-default-toolbar-large-mc{padding:1px 1px 1px 1px}.x-btn-default-toolbar-large{border-color:#e1e1e1}.x-btn-button-default-toolbar-large{height:32px}.x-btn-inner-default-toolbar-large{font:bold 16px/20px helvetica,arial,verdana,sans-serif;color:#666;padding:0 10px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-toolbar-large,.x-btn-icon-left>.x-btn-inner-default-toolbar-large{max-width:calc(100% - 32px)}.x-btn-icon-el-default-toolbar-large{height:32px}.x-btn-icon-left>.x-btn-icon-el-default-toolbar-large,.x-btn-icon-right>.x-btn-icon-el-default-toolbar-large{width:32px}.x-btn-icon-top>.x-btn-icon-el-default-toolbar-large,.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-large{min-width:32px}.x-btn-icon-el-default-toolbar-large.x-btn-glyph{font-size:32px;line-height:32px;color:#666;opacity:.5}.x-ie8 .x-btn-icon-el-default-toolbar-large.x-btn-glyph{color:#adadad}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-toolbar-large{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-large{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-toolbar-large{margin-bottom:5px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-large{margin-top:5px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-large{padding-right:10px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-large{margin-right:10px}.x-btn-arrow-bottom>.x-btn-button-default-toolbar-large,.x-btn-split-bottom>.x-btn-button-default-toolbar-large{padding-bottom:3px}.x-btn-wrap-default-toolbar-large.x-btn-arrow-right:after{width:28px;padding-right:28px;background-image:url(images/button/default-toolbar-large-arrow.png)}.x-btn-wrap-default-toolbar-large.x-btn-arrow-bottom:after{height:20px;background-image:url(images/button/default-toolbar-large-arrow.png)}.x-btn-wrap-default-toolbar-large.x-btn-split-right:after{width:35px;padding-right:35px;background-image:url(images/button/default-toolbar-large-s-arrow.png)}.x-btn-wrap-default-toolbar-large.x-btn-split-bottom:after{height:29px;background-image:url(images/button/default-toolbar-large-s-arrow-b.png)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-large{padding-right:10px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-large{margin-right:10px}.x-btn-focus.x-btn-default-toolbar-large{background-image:none;background-color:#f5f5f5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f6f6f6),color-stop(50%,#f5f5f5),color-stop(51%,#e8e8e8),color-stop(100%,#f5f5f5));background-image:-webkit-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-moz-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-o-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-ms-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn-over.x-btn-default-toolbar-large{border-color:#d8d8d8;background-image:none;background-color:#ebebeb;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#ededed),color-stop(50%,#ebebeb),color-stop(51%,#dfdfdf),color-stop(100%,#ebebeb));background-image:-webkit-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-moz-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-o-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-ms-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb)}.x-btn-focus.x-btn-over.x-btn-default-toolbar-large{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-menu-active.x-btn-default-toolbar-large,.x-btn.x-btn-pressed.x-btn-default-toolbar-large{border-color:#cecece;background-image:none;background-color:#e1e1e1;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#e1e1e1),color-stop(50%,#d5d5d5),color-stop(51%,#e1e1e1),color-stop(100%,#e4e4e4));background-image:-webkit-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-moz-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-o-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-ms-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4)}.x-btn-focus.x-btn-menu-active.x-btn-default-toolbar-large,.x-btn-focus.x-btn-pressed.x-btn-default-toolbar-large{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-disabled.x-btn-default-toolbar-large{background-image:none;background-color:#f5f5f5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f6f6f6),color-stop(50%,#f5f5f5),color-stop(51%,#e8e8e8),color-stop(100%,#f5f5f5));background-image:-webkit-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-moz-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-o-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:-ms-linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5);background-image:linear-gradient(top,#f6f6f6,#f5f5f5 50%,#e8e8e8 51%,#f5f5f5)}.x-btn-focus .x-btn-default-toolbar-large-tl,.x-btn-focus .x-btn-default-toolbar-large-bl,.x-btn-focus .x-btn-default-toolbar-large-tr,.x-btn-focus .x-btn-default-toolbar-large-br,.x-btn-focus .x-btn-default-toolbar-large-tc,.x-btn-focus .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-focus-corners.gif)}.x-btn-focus .x-btn-default-toolbar-large-ml,.x-btn-focus .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-focus-sides.gif)}.x-btn-focus .x-btn-default-toolbar-large-mc{background-color:#f5f5f5;background-image:url(images/btn/btn-default-toolbar-large-focus-fbg.gif)}.x-btn-over .x-btn-default-toolbar-large-tl,.x-btn-over .x-btn-default-toolbar-large-bl,.x-btn-over .x-btn-default-toolbar-large-tr,.x-btn-over .x-btn-default-toolbar-large-br,.x-btn-over .x-btn-default-toolbar-large-tc,.x-btn-over .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-over-corners.gif)}.x-btn-over .x-btn-default-toolbar-large-ml,.x-btn-over .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-over-sides.gif)}.x-btn-over .x-btn-default-toolbar-large-mc{background-color:#ebebeb;background-image:url(images/btn/btn-default-toolbar-large-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-tl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-bl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-tr,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-br,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-tc,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-ml,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-mc{background-color:#ebebeb;background-image:url(images/btn/btn-default-toolbar-large-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-tl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-bl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-tr,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-br,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-tc,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-bc,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-tl,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-bl,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-tr,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-br,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-tc,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-ml,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-mr,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-ml,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-mc,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-default-toolbar-large-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-br,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-bc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-tl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-bl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-tr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-br,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-tc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-mr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-ml,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-mc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-default-toolbar-large-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-large-tl,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-bl,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-tr,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-br,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-tc,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-large-ml,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-large-mc{background-color:#f5f5f5;background-image:url(images/btn/btn-default-toolbar-large-disabled-fbg.gif)}.x-nbr .x-btn-default-toolbar-large{background-image:none}.x-btn-disabled.x-btn-default-toolbar-large{filter:alpha(opacity=50);opacity:.5}.x-collapse-el{cursor:pointer}.x-layout-split-left,.x-layout-split-right{top:50%;margin-top:-24px;width:8px;height:48px}.x-layout-split-top,.x-layout-split-bottom{left:50%;width:48px;height:8px;margin-left:-24px}.x-layout-split-left{background-image:url(images/util/splitter/mini-left.png)}.x-layout-split-right{background-image:url(images/util/splitter/mini-right.png)}.x-layout-split-top{background-image:url(images/util/splitter/mini-top.png)}.x-layout-split-bottom{background-image:url(images/util/splitter/mini-bottom.png)}.x-splitter-collapsed .x-layout-split-left{background-image:url(images/util/splitter/mini-right.png)}.x-splitter-collapsed .x-layout-split-right{background-image:url(images/util/splitter/mini-left.png)}.x-splitter-collapsed .x-layout-split-top{background-image:url(images/util/splitter/mini-bottom.png)}.x-splitter-collapsed .x-layout-split-bottom{background-image:url(images/util/splitter/mini-top.png)}.x-splitter-active{background-color:#b4b4b4;filter:alpha(opacity=80);opacity:.8}.x-splitter-active .x-collapse-el{filter:alpha(opacity=30);opacity:.3}.x-toolbar-default{padding:6px 0 6px 8px;border-style:solid;border-color:#c1c1c1;border-width:1px;background-image:none;background-color:white}.x-toolbar-default .x-tool-img{background-image:url(images/tools/tool-sprites-dark.png);background-color:white}.x-toolbar-default .x-toolbar-item{margin:0 8px 0 0}.x-toolbar-default .x-toolbar-separator-horizontal{margin:0 8px 0 0;height:14px;border-style:solid;border-width:0 0 0 1px;border-left-color:#e1e1e1;border-right-color:white}.x-toolbar-default .x-box-menu-after{margin:0 8px}.x-toolbar-default-vertical{padding:6px 8px 0}.x-toolbar-default-vertical .x-toolbar-item{margin:0 0 6px 0}.x-toolbar-default-vertical .x-toolbar-separator-vertical{margin:0 5px 6px;border-style:solid none;border-width:1px 0 0;border-top-color:#e1e1e1;border-bottom-color:white}.x-toolbar-default-vertical .x-box-menu-after{margin:6px 0}.x-toolbar-text-default{padding:0 4px;color:#490606;font:normal 11px/16px helvetica,arial,verdana,sans-serif}.x-toolbar-spacer-default{width:2px}.x-toolbar-default-scroller .x-box-scroller-body-horizontal{margin-left:16px}.x-toolbar-default-vertical-scroller .x-box-scroller-body-vertical{margin-top:18px}.x-box-scroller-toolbar-default{cursor:pointer;filter:alpha(opacity=60);opacity:.6}.x-box-scroller-toolbar-default.x-box-scroller-hover{filter:alpha(opacity=80);opacity:.8}.x-box-scroller-toolbar-default.x-box-scroller-pressed{filter:alpha(opacity=100);opacity:1}.x-box-scroller-toolbar-default.x-box-scroller-disabled{filter:alpha(opacity=25);opacity:.25;cursor:default}.x-box-scroller-toolbar-default.x-box-scroller-left,.x-box-scroller-toolbar-default.x-box-scroller-right{width:16px;height:16px;top:50%;margin-top:-8px}.x-box-scroller-toolbar-default.x-box-scroller-left{margin-left:4px;margin-right:4px;margin-bottom:0;background-image:url(images/toolbar/default-scroll-left.png)}.x-box-scroller-toolbar-default.x-box-scroller-right{margin-left:4px;margin-right:4px;margin-bottom:0;background-image:url(images/toolbar/default-scroll-right.png)}.x-box-scroller-toolbar-default.x-box-scroller-top,.x-box-scroller-toolbar-default.x-box-scroller-bottom{height:16px;width:16px;left:50%;margin-left:-8px}.x-box-scroller-toolbar-default.x-box-scroller-top{margin-top:4px;margin-right:0;margin-bottom:4px;background-image:url(images/toolbar/default-scroll-top.png)}.x-box-scroller-toolbar-default.x-box-scroller-bottom{margin-top:4px;margin-right:0;margin-bottom:4px;background-image:url(images/toolbar/default-scroll-bottom.png)}.x-ie8 .x-box-scroller-toolbar-default{background-color:white}.x-toolbar-more-icon{background-image:url(images/toolbar/default-more.png)}.x-toolbar-footer{padding:6px 0 6px 6px;border-style:solid;border-color:#c1c1c1;border-width:0;background-image:none;background-color:#e5dddd}.x-toolbar-footer .x-tool-img{background-image:url(images/tools/tool-sprites-dark.png);background-color:#e5dddd}.x-toolbar-footer .x-toolbar-item{margin:0 6px 0 0}.x-toolbar-footer .x-toolbar-separator-horizontal{margin:0 8px 0 0;height:14px;border-style:solid;border-width:0 0 0 1px;border-left-color:#e1e1e1;border-right-color:white}.x-toolbar-footer .x-box-menu-after{margin:0 6px}.x-toolbar-footer-vertical{padding:6px 6px 0}.x-toolbar-footer-vertical .x-toolbar-item{margin:0 0 6px 0}.x-toolbar-footer-vertical .x-toolbar-separator-vertical{margin:0 5px 6px;border-style:solid none;border-width:1px 0 0;border-top-color:#e1e1e1;border-bottom-color:white}.x-toolbar-footer-vertical .x-box-menu-after{margin:6px 0}.x-toolbar-text-footer{padding:0 4px;color:#490606;font:normal 11px/16px helvetica,arial,verdana,sans-serif}.x-toolbar-spacer-footer{width:2px}.x-toolbar-footer-scroller .x-box-scroller-body-horizontal{margin-left:18px}.x-toolbar-footer-vertical-scroller .x-box-scroller-body-vertical{margin-top:18px}.x-box-scroller-toolbar-footer{cursor:pointer;filter:alpha(opacity=60);opacity:.6}.x-box-scroller-toolbar-footer.x-box-scroller-hover{filter:alpha(opacity=80);opacity:.8}.x-box-scroller-toolbar-footer.x-box-scroller-pressed{filter:alpha(opacity=100);opacity:1}.x-box-scroller-toolbar-footer.x-box-scroller-disabled{filter:alpha(opacity=25);opacity:.25;cursor:default}.x-box-scroller-toolbar-footer.x-box-scroller-left,.x-box-scroller-toolbar-footer.x-box-scroller-right{width:16px;height:16px;top:50%;margin-top:-8px}.x-box-scroller-toolbar-footer.x-box-scroller-left{margin-left:4px;margin-right:4px;margin-bottom:0;background-image:url(images/toolbar/footer-scroll-left.png)}.x-box-scroller-toolbar-footer.x-box-scroller-right{margin-left:4px;margin-right:4px;margin-bottom:0;background-image:url(images/toolbar/footer-scroll-right.png)}.x-ie8 .x-box-scroller-toolbar-footer{background-color:#e5dddd}.x-toolbar-more-icon{background-image:url(images/toolbar/footer-more.png)}.x-panel-ghost{filter:alpha(opacity=50);opacity:.5}.x-panel-default{border-color:#4f0101;padding:0}.x-panel-header-default{font-size:13px;border:1px solid #4f0101}.x-panel-header-default .x-tool-img{background-color:#4f0101}.x-panel-header-default-horizontal{padding:9px 9px 10px 9px}.x-panel-header-default-horizontal .x-panel-header-default-tab-bar{margin-top:-9px;margin-bottom:-10px}.x-panel-header-default-horizontal.x-header-noborder{padding:10px 10px 10px 10px}.x-panel-header-default-horizontal.x-header-noborder .x-panel-header-default-tab-bar{margin-top:-10px;margin-bottom:-10px}.x-panel-header-default-vertical{padding:9px 9px 9px 10px}.x-panel-header-default-vertical .x-panel-header-default-tab-bar{margin-right:-9px;margin-left:-10px}.x-panel-header-default-vertical.x-header-noborder{padding:10px 10px 10px 10px}.x-panel-header-default-vertical.x-header-noborder .x-panel-header-default-tab-bar{margin-right:-10px;margin-left:-10px}.x-panel-header-title-default{color:white;font-size:13px;font-weight:bold;font-family:helvetica,arial,verdana,sans-serif;line-height:16px}.x-panel-header-title-default>.x-title-text-default{text-transform:none;padding:0}.x-panel-header-title-default>.x-title-icon-wrap-default.x-title-icon-top{height:22px;padding-bottom:6px}.x-panel-header-title-default>.x-title-icon-wrap-default.x-title-icon-right{width:22px;padding-left:6px}.x-panel-header-title-default>.x-title-icon-wrap-default.x-title-icon-bottom{height:22px;padding-top:6px}.x-panel-header-title-default>.x-title-icon-wrap-default.x-title-icon-left{width:22px;padding-right:6px}.x-panel-header-title-default>.x-title-icon-wrap-default>.x-title-icon-default{width:16px;height:16px;background-position:center center}.x-panel-header-title-default>.x-title-icon-wrap-default>.x-title-glyph{color:white;font-size:16px;line-height:16px;opacity:.5}.x-ie8 .x-panel-header-title-default>.x-title-icon-wrap-default>.x-title-glyph{color:#a78080}.x-panel-body-default{background:white;border-color:#c1c1c1;color:black;font-size:11px;font-weight:normal;font-family:helvetica,arial,verdana,sans-serif;border-width:1px;border-style:solid}.x-panel-header-default{background-image:none;background-color:#4f0101}.x-panel-header-default-vertical{background-image:none;background-color:#4f0101}.x-panel .x-panel-header-default-collapsed-border-top{border-bottom-width:1px!important}.x-panel .x-panel-header-default-collapsed-border-right{border-left-width:1px!important}.x-panel .x-panel-header-default-collapsed-border-bottom{border-top-width:1px!important}.x-panel .x-panel-header-default-collapsed-border-left{border-right-width:1px!important}.x-panel-header-default-horizontal .x-tool-after-title{margin:0 0 0 6px}.x-panel-header-default-horizontal .x-tool-before-title{margin:0 6px 0 0}.x-panel-header-default-vertical .x-tool-after-title{margin:6px 0 0 0}.x-panel-header-default-vertical .x-tool-before-title{margin:0 0 6px 0}.x-panel-default-resizable .x-panel-handle{filter:alpha(opacity=0);opacity:0}.x-panel-default-outer-border-l{border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-outer-border-b{border-bottom-color:#4f0101!important;border-bottom-width:1px!important}.x-panel-default-outer-border-bl{border-bottom-color:#4f0101!important;border-bottom-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-outer-border-r{border-right-color:#4f0101!important;border-right-width:1px!important}.x-panel-default-outer-border-rl{border-right-color:#4f0101!important;border-right-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-outer-border-rb{border-right-color:#4f0101!important;border-right-width:1px!important;border-bottom-color:#4f0101!important;border-bottom-width:1px!important}.x-panel-default-outer-border-rbl{border-right-color:#4f0101!important;border-right-width:1px!important;border-bottom-color:#4f0101!important;border-bottom-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-outer-border-t{border-top-color:#4f0101!important;border-top-width:1px!important}.x-panel-default-outer-border-tl{border-top-color:#4f0101!important;border-top-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-outer-border-tb{border-top-color:#4f0101!important;border-top-width:1px!important;border-bottom-color:#4f0101!important;border-bottom-width:1px!important}.x-panel-default-outer-border-tbl{border-top-color:#4f0101!important;border-top-width:1px!important;border-bottom-color:#4f0101!important;border-bottom-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-outer-border-tr{border-top-color:#4f0101!important;border-top-width:1px!important;border-right-color:#4f0101!important;border-right-width:1px!important}.x-panel-default-outer-border-trl{border-top-color:#4f0101!important;border-top-width:1px!important;border-right-color:#4f0101!important;border-right-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-outer-border-trb{border-top-color:#4f0101!important;border-top-width:1px!important;border-right-color:#4f0101!important;border-right-width:1px!important;border-bottom-color:#4f0101!important;border-bottom-width:1px!important}.x-panel-default-outer-border-trbl{border-color:#4f0101!important;border-width:1px!important}.x-panel-default-framed{border-color:#4f0101;padding:0}.x-panel-header-default-framed{font-size:13px;border:5px solid #4f0101}.x-panel-header-default-framed .x-tool-img{background-color:#4f0101}.x-panel-header-default-framed-horizontal{padding:5px 5px 5px 5px}.x-panel-header-default-framed-horizontal .x-panel-header-default-framed-tab-bar{margin-top:-5px;margin-bottom:-5px}.x-panel-header-default-framed-horizontal.x-header-noborder{padding:10px 10px 5px 10px}.x-panel-header-default-framed-horizontal.x-header-noborder .x-panel-header-default-framed-tab-bar{margin-top:-10px;margin-bottom:-5px}.x-panel-header-default-framed-vertical{padding:5px 5px 5px 5px}.x-panel-header-default-framed-vertical .x-panel-header-default-framed-tab-bar{margin-right:-5px;margin-left:-5px}.x-panel-header-default-framed-vertical.x-header-noborder{padding:10px 10px 10px 5px}.x-panel-header-default-framed-vertical.x-header-noborder .x-panel-header-default-framed-tab-bar{margin-right:-10px;margin-left:-5px}.x-panel-header-title-default-framed{color:white;font-size:13px;font-weight:bold;font-family:helvetica,arial,verdana,sans-serif;line-height:16px}.x-panel-header-title-default-framed>.x-title-text-default-framed{text-transform:none;padding:0}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed.x-title-icon-top{height:22px;padding-bottom:6px}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed.x-title-icon-right{width:22px;padding-left:6px}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed.x-title-icon-bottom{height:22px;padding-top:6px}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed.x-title-icon-left{width:22px;padding-right:6px}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed>.x-title-icon-default-framed{width:16px;height:16px;background-position:center center}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed>.x-title-glyph{color:white;font-size:16px;line-height:16px;opacity:.5}.x-ie8 .x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed>.x-title-glyph{color:#a78080}.x-panel-body-default-framed{background:white;border-color:#c1c1c1;color:black;font-size:11px;font-weight:normal;font-family:helvetica,arial,verdana,sans-serif;border-width:1px;border-style:solid}.x-panel-default-framed{-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;padding:0;border-width:5px;border-style:solid;background-color:white}.x-panel-default-framed-mc{background-color:white}.x-nbr .x-panel-default-framed{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-default-framed-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-0-0-0-0}.x-panel-default-framed-tl{background-position:0 -10px}.x-panel-default-framed-tr{background-position:right -15px}.x-panel-default-framed-bl{background-position:0 -20px}.x-panel-default-framed-br{background-position:right -25px}.x-panel-default-framed-ml{background-position:0 top}.x-panel-default-framed-mr{background-position:right top}.x-panel-default-framed-tc{background-position:0 0}.x-panel-default-framed-bc{background-position:0 -5px}.x-panel-default-framed-tr,.x-panel-default-framed-br,.x-panel-default-framed-mr{padding-right:5px}.x-panel-default-framed-tl,.x-panel-default-framed-bl,.x-panel-default-framed-ml{padding-left:5px}.x-panel-default-framed-tc{height:5px}.x-panel-default-framed-bc{height:5px}.x-panel-default-framed-tl,.x-panel-default-framed-bl,.x-panel-default-framed-tr,.x-panel-default-framed-br,.x-panel-default-framed-tc,.x-panel-default-framed-bc,.x-panel-default-framed-ml,.x-panel-default-framed-mr{background-image:url(images/panel/panel-default-framed-corners.gif)}.x-panel-default-framed-ml,.x-panel-default-framed-mr{background-image:url(images/panel/panel-default-framed-sides.gif);background-repeat:repeat-y}.x-panel-default-framed-mc{padding:0}.x-panel-header-default-framed-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 5px 5px;border-width:5px 5px 0 5px;border-style:solid;background-color:#4f0101}.x-panel-header-default-framed-top-mc{background-color:#4f0101}.x-nbr .x-panel-header-default-framed-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-default-framed-top-frameInfo{font-family:dh-5-5-0-5-5-5-0-5-5-5-5-5}.x-panel-header-default-framed-top-tl{background-position:0 -10px}.x-panel-header-default-framed-top-tr{background-position:right -15px}.x-panel-header-default-framed-top-bl{background-position:0 -20px}.x-panel-header-default-framed-top-br{background-position:right -25px}.x-panel-header-default-framed-top-ml{background-position:0 top}.x-panel-header-default-framed-top-mr{background-position:right top}.x-panel-header-default-framed-top-tc{background-position:0 0}.x-panel-header-default-framed-top-bc{background-position:0 -5px}.x-panel-header-default-framed-top-tr,.x-panel-header-default-framed-top-br,.x-panel-header-default-framed-top-mr{padding-right:5px}.x-panel-header-default-framed-top-tl,.x-panel-header-default-framed-top-bl,.x-panel-header-default-framed-top-ml{padding-left:5px}.x-panel-header-default-framed-top-tc{height:5px}.x-panel-header-default-framed-top-bc{height:0}.x-panel-header-default-framed-top-tl,.x-panel-header-default-framed-top-bl,.x-panel-header-default-framed-top-tr,.x-panel-header-default-framed-top-br,.x-panel-header-default-framed-top-tc,.x-panel-header-default-framed-top-bc,.x-panel-header-default-framed-top-ml,.x-panel-header-default-framed-top-mr{background-image:url(images/panel-header/panel-header-default-framed-top-corners.gif)}.x-panel-header-default-framed-top-ml,.x-panel-header-default-framed-top-mr{background-image:url(images/panel-header/panel-header-default-framed-top-sides.gif);background-repeat:repeat-y}.x-panel-header-default-framed-top-mc{padding:5px 5px 5px 5px}.x-panel-header-default-framed-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 5px 5px;border-width:5px 5px 5px 0;border-style:solid;background-color:#4f0101}.x-panel-header-default-framed-right-mc{background-color:#4f0101}.x-nbr .x-panel-header-default-framed-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-default-framed-right-frameInfo{font-family:dh-5-5-5-0-5-5-5-0-5-5-5-5}.x-panel-header-default-framed-right-tl{background-position:0 -10px}.x-panel-header-default-framed-right-tr{background-position:right -15px}.x-panel-header-default-framed-right-bl{background-position:0 -20px}.x-panel-header-default-framed-right-br{background-position:right -25px}.x-panel-header-default-framed-right-ml{background-position:right 0}.x-panel-header-default-framed-right-mr{background-position:right 0}.x-panel-header-default-framed-right-tc{background-position:0 0}.x-panel-header-default-framed-right-bc{background-position:0 -5px}.x-panel-header-default-framed-right-tr,.x-panel-header-default-framed-right-br,.x-panel-header-default-framed-right-mr{padding-right:5px}.x-panel-header-default-framed-right-tl,.x-panel-header-default-framed-right-bl,.x-panel-header-default-framed-right-ml{padding-left:0}.x-panel-header-default-framed-right-tc{height:5px}.x-panel-header-default-framed-right-bc{height:5px}.x-panel-header-default-framed-right-tl,.x-panel-header-default-framed-right-bl,.x-panel-header-default-framed-right-tr,.x-panel-header-default-framed-right-br,.x-panel-header-default-framed-right-tc,.x-panel-header-default-framed-right-bc,.x-panel-header-default-framed-right-ml,.x-panel-header-default-framed-right-mr{background-image:url(images/panel-header/panel-header-default-framed-right-corners.gif)}.x-panel-header-default-framed-right-ml,.x-panel-header-default-framed-right-mr{background-image:url(images/panel-header/panel-header-default-framed-right-sides.gif);background-repeat:repeat-y}.x-panel-header-default-framed-right-mc{padding:5px 5px 5px 5px}.x-panel-header-default-framed-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:0 5px 5px 5px;border-style:solid;background-color:#4f0101}.x-panel-header-default-framed-bottom-mc{background-color:#4f0101}.x-nbr .x-panel-header-default-framed-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-default-framed-bottom-frameInfo{font-family:dh-0-5-5-5-0-5-5-5-5-5-5-5}.x-panel-header-default-framed-bottom-tl{background-position:0 -10px}.x-panel-header-default-framed-bottom-tr{background-position:right -15px}.x-panel-header-default-framed-bottom-bl{background-position:0 -20px}.x-panel-header-default-framed-bottom-br{background-position:right -25px}.x-panel-header-default-framed-bottom-ml{background-position:0 bottom}.x-panel-header-default-framed-bottom-mr{background-position:right bottom}.x-panel-header-default-framed-bottom-tc{background-position:0 0}.x-panel-header-default-framed-bottom-bc{background-position:0 -5px}.x-panel-header-default-framed-bottom-tr,.x-panel-header-default-framed-bottom-br,.x-panel-header-default-framed-bottom-mr{padding-right:5px}.x-panel-header-default-framed-bottom-tl,.x-panel-header-default-framed-bottom-bl,.x-panel-header-default-framed-bottom-ml{padding-left:5px}.x-panel-header-default-framed-bottom-tc{height:0}.x-panel-header-default-framed-bottom-bc{height:5px}.x-panel-header-default-framed-bottom-tl,.x-panel-header-default-framed-bottom-bl,.x-panel-header-default-framed-bottom-tr,.x-panel-header-default-framed-bottom-br,.x-panel-header-default-framed-bottom-tc,.x-panel-header-default-framed-bottom-bc,.x-panel-header-default-framed-bottom-ml,.x-panel-header-default-framed-bottom-mr{background-image:url(images/panel-header/panel-header-default-framed-bottom-corners.gif)}.x-panel-header-default-framed-bottom-ml,.x-panel-header-default-framed-bottom-mr{background-image:url(images/panel-header/panel-header-default-framed-bottom-sides.gif);background-repeat:repeat-y}.x-panel-header-default-framed-bottom-mc{padding:5px 5px 5px 5px}.x-panel-header-default-framed-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px 0 5px 5px;border-style:solid;background-color:#4f0101}.x-panel-header-default-framed-left-mc{background-color:#4f0101}.x-nbr .x-panel-header-default-framed-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-default-framed-left-frameInfo{font-family:dh-5-0-5-5-5-0-5-5-5-5-5-5}.x-panel-header-default-framed-left-tl{background-position:0 -10px}.x-panel-header-default-framed-left-tr{background-position:right -15px}.x-panel-header-default-framed-left-bl{background-position:0 -20px}.x-panel-header-default-framed-left-br{background-position:right -25px}.x-panel-header-default-framed-left-ml{background-position:left 0}.x-panel-header-default-framed-left-mr{background-position:left 0}.x-panel-header-default-framed-left-tc{background-position:0 0}.x-panel-header-default-framed-left-bc{background-position:0 -5px}.x-panel-header-default-framed-left-tr,.x-panel-header-default-framed-left-br,.x-panel-header-default-framed-left-mr{padding-right:0}.x-panel-header-default-framed-left-tl,.x-panel-header-default-framed-left-bl,.x-panel-header-default-framed-left-ml{padding-left:5px}.x-panel-header-default-framed-left-tc{height:5px}.x-panel-header-default-framed-left-bc{height:5px}.x-panel-header-default-framed-left-tl,.x-panel-header-default-framed-left-bl,.x-panel-header-default-framed-left-tr,.x-panel-header-default-framed-left-br,.x-panel-header-default-framed-left-tc,.x-panel-header-default-framed-left-bc,.x-panel-header-default-framed-left-ml,.x-panel-header-default-framed-left-mr{background-image:url(images/panel-header/panel-header-default-framed-left-corners.gif)}.x-panel-header-default-framed-left-ml,.x-panel-header-default-framed-left-mr{background-image:url(images/panel-header/panel-header-default-framed-left-sides.gif);background-repeat:repeat-y}.x-panel-header-default-framed-left-mc{padding:5px 5px 5px 5px}.x-panel-header-default-framed-collapsed-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#4f0101}.x-panel-header-default-framed-collapsed-top-mc{background-color:#4f0101}.x-nbr .x-panel-header-default-framed-collapsed-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-default-framed-collapsed-top-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-panel-header-default-framed-collapsed-top-tl{background-position:0 -10px}.x-panel-header-default-framed-collapsed-top-tr{background-position:right -15px}.x-panel-header-default-framed-collapsed-top-bl{background-position:0 -20px}.x-panel-header-default-framed-collapsed-top-br{background-position:right -25px}.x-panel-header-default-framed-collapsed-top-ml{background-position:0 top}.x-panel-header-default-framed-collapsed-top-mr{background-position:right top}.x-panel-header-default-framed-collapsed-top-tc{background-position:0 0}.x-panel-header-default-framed-collapsed-top-bc{background-position:0 -5px}.x-panel-header-default-framed-collapsed-top-tr,.x-panel-header-default-framed-collapsed-top-br,.x-panel-header-default-framed-collapsed-top-mr{padding-right:5px}.x-panel-header-default-framed-collapsed-top-tl,.x-panel-header-default-framed-collapsed-top-bl,.x-panel-header-default-framed-collapsed-top-ml{padding-left:5px}.x-panel-header-default-framed-collapsed-top-tc{height:5px}.x-panel-header-default-framed-collapsed-top-bc{height:5px}.x-panel-header-default-framed-collapsed-top-tl,.x-panel-header-default-framed-collapsed-top-bl,.x-panel-header-default-framed-collapsed-top-tr,.x-panel-header-default-framed-collapsed-top-br,.x-panel-header-default-framed-collapsed-top-tc,.x-panel-header-default-framed-collapsed-top-bc,.x-panel-header-default-framed-collapsed-top-ml,.x-panel-header-default-framed-collapsed-top-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-top-corners.gif)}.x-panel-header-default-framed-collapsed-top-ml,.x-panel-header-default-framed-collapsed-top-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-top-sides.gif);background-repeat:repeat-y}.x-panel-header-default-framed-collapsed-top-mc{padding:5px 5px 5px 5px}.x-panel-header-default-framed-collapsed-right{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#4f0101}.x-panel-header-default-framed-collapsed-right-mc{background-color:#4f0101}.x-nbr .x-panel-header-default-framed-collapsed-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-default-framed-collapsed-right-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-panel-header-default-framed-collapsed-right-tl{background-position:0 -10px}.x-panel-header-default-framed-collapsed-right-tr{background-position:right -15px}.x-panel-header-default-framed-collapsed-right-bl{background-position:0 -20px}.x-panel-header-default-framed-collapsed-right-br{background-position:right -25px}.x-panel-header-default-framed-collapsed-right-ml{background-position:right 0}.x-panel-header-default-framed-collapsed-right-mr{background-position:right 0}.x-panel-header-default-framed-collapsed-right-tc{background-position:0 0}.x-panel-header-default-framed-collapsed-right-bc{background-position:0 -5px}.x-panel-header-default-framed-collapsed-right-tr,.x-panel-header-default-framed-collapsed-right-br,.x-panel-header-default-framed-collapsed-right-mr{padding-right:5px}.x-panel-header-default-framed-collapsed-right-tl,.x-panel-header-default-framed-collapsed-right-bl,.x-panel-header-default-framed-collapsed-right-ml{padding-left:5px}.x-panel-header-default-framed-collapsed-right-tc{height:5px}.x-panel-header-default-framed-collapsed-right-bc{height:5px}.x-panel-header-default-framed-collapsed-right-tl,.x-panel-header-default-framed-collapsed-right-bl,.x-panel-header-default-framed-collapsed-right-tr,.x-panel-header-default-framed-collapsed-right-br,.x-panel-header-default-framed-collapsed-right-tc,.x-panel-header-default-framed-collapsed-right-bc,.x-panel-header-default-framed-collapsed-right-ml,.x-panel-header-default-framed-collapsed-right-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-right-corners.gif)}.x-panel-header-default-framed-collapsed-right-ml,.x-panel-header-default-framed-collapsed-right-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-right-sides.gif);background-repeat:repeat-y}.x-panel-header-default-framed-collapsed-right-mc{padding:5px 5px 5px 5px}.x-panel-header-default-framed-collapsed-bottom{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#4f0101}.x-panel-header-default-framed-collapsed-bottom-mc{background-color:#4f0101}.x-nbr .x-panel-header-default-framed-collapsed-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-default-framed-collapsed-bottom-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-panel-header-default-framed-collapsed-bottom-tl{background-position:0 -10px}.x-panel-header-default-framed-collapsed-bottom-tr{background-position:right -15px}.x-panel-header-default-framed-collapsed-bottom-bl{background-position:0 -20px}.x-panel-header-default-framed-collapsed-bottom-br{background-position:right -25px}.x-panel-header-default-framed-collapsed-bottom-ml{background-position:0 bottom}.x-panel-header-default-framed-collapsed-bottom-mr{background-position:right bottom}.x-panel-header-default-framed-collapsed-bottom-tc{background-position:0 0}.x-panel-header-default-framed-collapsed-bottom-bc{background-position:0 -5px}.x-panel-header-default-framed-collapsed-bottom-tr,.x-panel-header-default-framed-collapsed-bottom-br,.x-panel-header-default-framed-collapsed-bottom-mr{padding-right:5px}.x-panel-header-default-framed-collapsed-bottom-tl,.x-panel-header-default-framed-collapsed-bottom-bl,.x-panel-header-default-framed-collapsed-bottom-ml{padding-left:5px}.x-panel-header-default-framed-collapsed-bottom-tc{height:5px}.x-panel-header-default-framed-collapsed-bottom-bc{height:5px}.x-panel-header-default-framed-collapsed-bottom-tl,.x-panel-header-default-framed-collapsed-bottom-bl,.x-panel-header-default-framed-collapsed-bottom-tr,.x-panel-header-default-framed-collapsed-bottom-br,.x-panel-header-default-framed-collapsed-bottom-tc,.x-panel-header-default-framed-collapsed-bottom-bc,.x-panel-header-default-framed-collapsed-bottom-ml,.x-panel-header-default-framed-collapsed-bottom-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif)}.x-panel-header-default-framed-collapsed-bottom-ml,.x-panel-header-default-framed-collapsed-bottom-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif);background-repeat:repeat-y}.x-panel-header-default-framed-collapsed-bottom-mc{padding:5px 5px 5px 5px}.x-panel-header-default-framed-collapsed-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#4f0101}.x-panel-header-default-framed-collapsed-left-mc{background-color:#4f0101}.x-nbr .x-panel-header-default-framed-collapsed-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-default-framed-collapsed-left-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-panel-header-default-framed-collapsed-left-tl{background-position:0 -10px}.x-panel-header-default-framed-collapsed-left-tr{background-position:right -15px}.x-panel-header-default-framed-collapsed-left-bl{background-position:0 -20px}.x-panel-header-default-framed-collapsed-left-br{background-position:right -25px}.x-panel-header-default-framed-collapsed-left-ml{background-position:left 0}.x-panel-header-default-framed-collapsed-left-mr{background-position:left 0}.x-panel-header-default-framed-collapsed-left-tc{background-position:0 0}.x-panel-header-default-framed-collapsed-left-bc{background-position:0 -5px}.x-panel-header-default-framed-collapsed-left-tr,.x-panel-header-default-framed-collapsed-left-br,.x-panel-header-default-framed-collapsed-left-mr{padding-right:5px}.x-panel-header-default-framed-collapsed-left-tl,.x-panel-header-default-framed-collapsed-left-bl,.x-panel-header-default-framed-collapsed-left-ml{padding-left:5px}.x-panel-header-default-framed-collapsed-left-tc{height:5px}.x-panel-header-default-framed-collapsed-left-bc{height:5px}.x-panel-header-default-framed-collapsed-left-tl,.x-panel-header-default-framed-collapsed-left-bl,.x-panel-header-default-framed-collapsed-left-tr,.x-panel-header-default-framed-collapsed-left-br,.x-panel-header-default-framed-collapsed-left-tc,.x-panel-header-default-framed-collapsed-left-bc,.x-panel-header-default-framed-collapsed-left-ml,.x-panel-header-default-framed-collapsed-left-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-left-corners.gif)}.x-panel-header-default-framed-collapsed-left-ml,.x-panel-header-default-framed-collapsed-left-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-left-sides.gif);background-repeat:repeat-y}.x-panel-header-default-framed-collapsed-left-mc{padding:5px 5px 5px 5px}.x-panel .x-panel-header-default-framed-top{border-bottom-width:5px!important}.x-panel .x-panel-header-default-framed-right{border-left-width:5px!important}.x-panel .x-panel-header-default-framed-bottom{border-top-width:5px!important}.x-panel .x-panel-header-default-framed-left{border-right-width:5px!important}.x-nbr .x-panel-header-default-framed-collapsed-top{border-bottom-width:0!important}.x-nbr .x-panel-header-default-framed-collapsed-right{border-left-width:0!important}.x-nbr .x-panel-header-default-framed-collapsed-bottom{border-top-width:0!important}.x-nbr .x-panel-header-default-framed-collapsed-left{border-right-width:0!important}.x-panel-header-default-framed-horizontal .x-tool-after-title{margin:0 0 0 6px}.x-panel-header-default-framed-horizontal .x-tool-before-title{margin:0 6px 0 0}.x-panel-header-default-framed-vertical .x-tool-after-title{margin:6px 0 0 0}.x-panel-header-default-framed-vertical .x-tool-before-title{margin:0 0 6px 0}.x-panel-default-framed-resizable{overflow:visible}.x-panel-default-framed-resizable .x-panel-handle{filter:alpha(opacity=0);opacity:0}.x-panel-default-framed-resizable .x-panel-handle-north-br{top:-5px}.x-panel-default-framed-resizable .x-panel-handle-south-br{bottom:-5px}.x-panel-default-framed-resizable .x-panel-handle-east-br{right:-5px}.x-panel-default-framed-resizable .x-panel-handle-west-br{left:-5px}.x-panel-default-framed-resizable .x-panel-handle-northwest-br{left:-5px;top:-5px}.x-panel-default-framed-resizable .x-panel-handle-northeast-br{right:-5px;top:-5px}.x-panel-default-framed-resizable .x-panel-handle-southeast-br{right:-5px;bottom:-5px}.x-panel-default-framed-resizable .x-panel-handle-southwest-br{left:-5px;bottom:-5px}.x-panel-default-framed-outer-border-l{border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-framed-outer-border-b{border-bottom-color:#4f0101!important;border-bottom-width:1px!important}.x-panel-default-framed-outer-border-bl{border-bottom-color:#4f0101!important;border-bottom-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-framed-outer-border-r{border-right-color:#4f0101!important;border-right-width:1px!important}.x-panel-default-framed-outer-border-rl{border-right-color:#4f0101!important;border-right-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-framed-outer-border-rb{border-right-color:#4f0101!important;border-right-width:1px!important;border-bottom-color:#4f0101!important;border-bottom-width:1px!important}.x-panel-default-framed-outer-border-rbl{border-right-color:#4f0101!important;border-right-width:1px!important;border-bottom-color:#4f0101!important;border-bottom-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-framed-outer-border-t{border-top-color:#4f0101!important;border-top-width:1px!important}.x-panel-default-framed-outer-border-tl{border-top-color:#4f0101!important;border-top-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-framed-outer-border-tb{border-top-color:#4f0101!important;border-top-width:1px!important;border-bottom-color:#4f0101!important;border-bottom-width:1px!important}.x-panel-default-framed-outer-border-tbl{border-top-color:#4f0101!important;border-top-width:1px!important;border-bottom-color:#4f0101!important;border-bottom-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-framed-outer-border-tr{border-top-color:#4f0101!important;border-top-width:1px!important;border-right-color:#4f0101!important;border-right-width:1px!important}.x-panel-default-framed-outer-border-trl{border-top-color:#4f0101!important;border-top-width:1px!important;border-right-color:#4f0101!important;border-right-width:1px!important;border-left-color:#4f0101!important;border-left-width:1px!important}.x-panel-default-framed-outer-border-trb{border-top-color:#4f0101!important;border-top-width:1px!important;border-right-color:#4f0101!important;border-right-width:1px!important;border-bottom-color:#4f0101!important;border-bottom-width:1px!important}.x-panel-default-framed-outer-border-trbl{border-color:#4f0101!important;border-width:1px!important}.x-tip-anchor{position:absolute;overflow:hidden;height:10px;width:10px;border-style:solid;border-width:5px;border-color:#e1e1e1}.x-tip-anchor-top{border-top-color:transparent;border-left-color:transparent;border-right-color:transparent;_border-top-color:pink;_border-left-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.x-tip-anchor-bottom{border-bottom-color:transparent;border-left-color:transparent;border-right-color:transparent;_border-bottom-color:pink;_border-left-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.x-tip-anchor-left{border-top-color:transparent;border-bottom-color:transparent;border-left-color:transparent;_border-top-color:pink;_border-bottom-color:pink;_border-left-color:pink;_filter:chroma(color=pink)}.x-tip-anchor-right{border-top-color:transparent;border-bottom-color:transparent;border-right-color:transparent;_border-top-color:pink;_border-bottom-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.x-tip-default{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:2px 2px 2px 2px;border-width:1px;border-style:solid;background-color:#efe8e8}.x-tip-default-mc{background-color:#efe8e8}.x-nbr .x-tip-default{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-tip-default-frameInfo{font-family:th-3-3-3-3-1-1-1-1-2-2-2-2}.x-tip-default-tl{background-position:0 -6px}.x-tip-default-tr{background-position:right -9px}.x-tip-default-bl{background-position:0 -12px}.x-tip-default-br{background-position:right -15px}.x-tip-default-ml{background-position:0 top}.x-tip-default-mr{background-position:right top}.x-tip-default-tc{background-position:0 0}.x-tip-default-bc{background-position:0 -3px}.x-tip-default-tr,.x-tip-default-br,.x-tip-default-mr{padding-right:3px}.x-tip-default-tl,.x-tip-default-bl,.x-tip-default-ml{padding-left:3px}.x-tip-default-tc{height:3px}.x-tip-default-bc{height:3px}.x-tip-default-tl,.x-tip-default-bl,.x-tip-default-tr,.x-tip-default-br,.x-tip-default-tc,.x-tip-default-bc,.x-tip-default-ml,.x-tip-default-mr{background-image:url(images/tip/tip-default-corners.gif)}.x-tip-default-ml,.x-tip-default-mr{background-image:url(images/tip/tip-default-sides.gif);background-repeat:repeat-y}.x-tip-default-mc{padding:0}.x-tip-default{border-color:#e1e1e1}.x-tip-default .x-tool-img{background-image:url(images/tools/tool-sprites-dark.png);background-color:#efe8e8}.x-tip-header-default .x-tool-after-title{margin:0 0 0 6px}.x-tip-header-default .x-tool-before-title{margin:0 6px 0 0}.x-tip-header-default{padding:3px 3px 0 3px}.x-tip-header-title-default{color:black;font-size:11px;font-weight:bold}.x-tip-body-default{padding:3px;color:black;font-size:11px;font-weight:normal}.x-tip-body-default a{color:black}.x-tip-form-invalid{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:2px 2px 2px 2px;border-width:1px;border-style:solid;background-color:#efe8e8}.x-tip-form-invalid-mc{background-color:#efe8e8}.x-nbr .x-tip-form-invalid{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-tip-form-invalid-frameInfo{font-family:th-3-3-3-3-1-1-1-1-2-2-2-2}.x-tip-form-invalid-tl{background-position:0 -6px}.x-tip-form-invalid-tr{background-position:right -9px}.x-tip-form-invalid-bl{background-position:0 -12px}.x-tip-form-invalid-br{background-position:right -15px}.x-tip-form-invalid-ml{background-position:0 top}.x-tip-form-invalid-mr{background-position:right top}.x-tip-form-invalid-tc{background-position:0 0}.x-tip-form-invalid-bc{background-position:0 -3px}.x-tip-form-invalid-tr,.x-tip-form-invalid-br,.x-tip-form-invalid-mr{padding-right:3px}.x-tip-form-invalid-tl,.x-tip-form-invalid-bl,.x-tip-form-invalid-ml{padding-left:3px}.x-tip-form-invalid-tc{height:3px}.x-tip-form-invalid-bc{height:3px}.x-tip-form-invalid-tl,.x-tip-form-invalid-bl,.x-tip-form-invalid-tr,.x-tip-form-invalid-br,.x-tip-form-invalid-tc,.x-tip-form-invalid-bc,.x-tip-form-invalid-ml,.x-tip-form-invalid-mr{background-image:url(images/tip/tip-form-invalid-corners.gif)}.x-tip-form-invalid-ml,.x-tip-form-invalid-mr{background-image:url(images/tip/tip-form-invalid-sides.gif);background-repeat:repeat-y}.x-tip-form-invalid-mc{padding:0}.x-tip-form-invalid{border-color:#e1e1e1}.x-tip-form-invalid .x-tool-img{background-image:url(images/tools/tool-sprites-dark.png);background-color:#efe8e8}.x-tip-header-form-invalid .x-tool-after-title{margin:0 0 0 6px}.x-tip-header-form-invalid .x-tool-before-title{margin:0 6px 0 0}.x-tip-header-form-invalid{padding:3px 3px 0 3px}.x-tip-header-title-form-invalid{color:black;font-size:11px;font-weight:bold}.x-tip-body-form-invalid{padding:3px 3px 3px 22px;color:black;font-size:11px;font-weight:normal}.x-tip-body-form-invalid a{color:black}.x-tip-body-form-invalid{background:1px 1px no-repeat;background-image:url(images/form/exclamation.png)}.x-tip-body-form-invalid li{margin-bottom:4px}.x-tip-body-form-invalid li.last{margin-bottom:0}.x-form-item-label-default{color:black;font:normal 11px/17px helvetica,arial,verdana,sans-serif;min-height:24px;padding-top:4px;padding-right:5px}.x-ie8 .x-form-item-label-default{min-height:20px}.x-form-item-label-default.x-form-item-label-top{height:1px}.x-form-item-label-default.x-form-item-label-top>.x-form-item-label-inner{padding-top:4px;padding-bottom:5px}.x-form-item-label-default.x-form-item-label-top-side-error:after{width:26px}.x-form-item-body-default{min-height:24px}.x-form-invalid-icon-default{width:16px;height:16px;margin:0 5px 0 5px;background:url(images/form/exclamation.png) no-repeat}.x-form-invalid-under-default{padding:2px 2px 2px 20px;color:#cf4c35;font:normal 11px/16px helvetica,arial,verdana,sans-serif;background:no-repeat 0 2px;background-image:url(images/form/exclamation.png)}.x-form-error-wrap-default.x-form-error-wrap-side{width:26px}.x-form-item-default.x-item-disabled{filter:alpha(opacity=30);opacity:.3}.x-autocontainer-form-item,.x-anchor-form-item,.x-vbox-form-item,.x-table-form-item{margin-bottom:5px}.x-form-display-field-default{height:24px;font:normal 11px/17px helvetica,arial,verdana,sans-serif;color:black;margin-top:4px}.x-grid-body{background:white;border-width:1px;border-style:solid;border-color:#c1c1c1}.x-grid-item-container{min-height:1px}.x-grid-empty{padding:10px;color:gray;background-color:white;font:normal 11px helvetica,arial,verdana,sans-serif}.x-grid-item{color:black;font:normal 11px/13px helvetica,arial,verdana,sans-serif;background-color:white}.x-grid-item-alt{background-color:#fafafa}.x-grid-item-over{color:black;background-color:#e9dfdf}.x-grid-item-focused{outline:0;color:black}.x-grid-item-focused .x-grid-cell-inner{z-index:1}.x-grid-item-focused .x-grid-cell-inner:before{content:"";position:absolute;z-index:-1;top:0;right:0;bottom:0;left:0;border:1px solid #6b2d2d}.x-grid-item-selected{color:black;background-color:#d0bcbc}.x-grid-with-row-lines .x-grid-item{border-style:solid;border-width:1px 0 0;border-color:#ededed}.x-grid-with-row-lines .x-grid-item:first-child{border-top-color:white}.x-grid-with-row-lines .x-grid-item.x-grid-item-over{border-style:solid;border-color:#e9dfdf}.x-grid-with-row-lines .x-grid-item-over+.x-grid-item{border-top-style:solid;border-top-color:#e9dfdf}.x-grid-with-row-lines .x-grid-item.x-grid-item-selected{border-style:solid;border-color:#d0bcbc}.x-grid-with-row-lines .x-grid-item-selected+.x-grid-item{border-top-style:solid;border-top-color:#d0bcbc}.x-grid-with-row-lines .x-grid-item:last-child{border-bottom-width:1px}.x-ie8 .x-grid-with-row-lines .x-grid-item{border-width:1px 0;margin-top:-1px}.x-ie8 .x-grid-with-row-lines .x-grid-item:first-child{margin-top:0}.x-grid-cell-inner{position:relative;text-overflow:ellipsis;padding:5px 10px 4px 10px}.x-grid-cell-special{border-color:#ededed;border-style:solid;border-right-width:1px 0}.x-grid-dirty-cell{background:url(images/grid/dirty.png) no-repeat 0 0}.x-grid-row .x-grid-cell-selected{color:black;background-color:#d0bcbc}.x-grid-with-col-lines .x-grid-cell{border-right:1px solid #ededed}.x-grid-resize-marker{width:1px;background-color:#0f0f0f}.x-form-cb-wrap-default{height:24px}.x-form-cb-default{margin-top:5px}.x-form-checkbox-default,.x-form-radio-default{width:15px;height:15px}.x-form-radio-default{background:url(images/form/radio.png) no-repeat}.x-form-cb-checked .x-form-radio-default{background-position:0 -15px}.x-form-checkbox-default{background:url(images/form/checkbox.png) no-repeat}.x-form-cb-checked .x-form-checkbox-default{background-position:0 -15px}.x-field-default-form-checkbox-focus{background-position:-15px 0}.x-form-cb-checked .x-field-default-form-checkbox-focus{background-position:-15px -15px}.x-form-cb-label-default{margin-top:4px;font:normal helvetica,arial,verdana,sans-serif/17px helvetica,arial,verdana,sans-serif}.x-form-cb-label-default.x-form-cb-label-before{padding-right:19px}.x-form-cb-label-default.x-form-cb-label-after{padding-left:19px}.x-col-move-top,.x-col-move-bottom{width:9px;height:9px}.x-col-move-top{background-image:url(images/grid/col-move-top.png)}.x-col-move-bottom{background-image:url(images/grid/col-move-bottom.png)}.x-grid-header-ct{border:1px solid #c1c1c1;border-bottom-color:#f5f5f5;background-color:#f5f5f5}.x-grid-header-ct-hidden{border:0!important}.x-grid-body{border-top-color:#c1c1c1}.x-hmenu-sort-asc{background-image:url(images/grid/hmenu-asc.png)}.x-hmenu-sort-desc{background-image:url(images/grid/hmenu-desc.png)}.x-cols-icon{background-image:url(images/grid/columns.png)}.x-column-header{border-right:1px solid #c1c1c1;color:#666;font:bold 10px/13px helvetica,arial,verdana,sans-serif;outline:0;background-color:#f5f5f5}.x-group-sub-header{background:transparent;border-top:1px solid #c1c1c1}.x-group-sub-header .x-column-header-inner{padding:6px 10px 7px 10px}.x-column-header-inner{position:relative;padding:7px 10px 7px 10px;text-overflow:ellipsis}.x-column-header-inner-empty{text-overflow:clip}.x-column-header.x-column-header-focus{color:black}.x-column-header.x-column-header-focus .x-column-header-inner:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border:1px solid #703131}.x-column-header.x-column-header-focus.x-group-sub-header .x-column-header-inner:before{bottom:0}.x-column-header-over,.x-column-header-sort-ASC,.x-column-header-sort-DESC{background-image:none;background-color:#f2eded}.x-column-header-open{background-color:#f2eded}.x-column-header-open .x-column-header-trigger{background-color:#e5dddd}.x-column-header-trigger{width:18px;cursor:pointer;background-color:transparent;background-position:center center}.x-column-header-align-right .x-column-header-text{margin-right:12px}.x-column-header-sort-ASC .x-column-header-text,.x-column-header-sort-DESC .x-column-header-text{padding-right:17px;background-position:right center}.x-column-header-sort-ASC .x-column-header-text{background-image:url(images/grid/sort_asc.png)}.x-column-header-sort-DESC .x-column-header-text{background-image:url(images/grid/sort_desc.png)}.x-form-text-field-body-default{min-width:170px;max-width:170px}.x-form-trigger-wrap-default{border-width:1px;border-style:solid;border-color:#c1c1c1 #d9d9d9 #d9d9d9}.x-form-trigger-wrap-default.x-form-trigger-wrap-focus{border-color:#3892d3}.x-form-trigger-wrap-default.x-form-trigger-wrap-invalid{border-color:#cf4c35}.x-form-text-default{color:black;padding:4px 6px 3px 6px;background-color:white;font:normal 11px/15px helvetica,arial,verdana,sans-serif;min-height:22px}.x-ie8 .x-form-text-default{min-height:15px}.x-form-text-default.x-form-textarea{line-height:13px;min-height:52px}.x-ie8 .x-form-text-default.x-form-textarea{min-height:45px}.x-form-text-default.x-form-text-file{color:gray}.x-form-empty-field-default{color:gray}.x-form-invalid-field-default{background-color:white}.x-form-trigger-default{background:white url(images/form/trigger.png) no-repeat;background-position:0 center;width:22px}.x-form-trigger-default.x-form-trigger-over{background-position:-22px center}.x-form-trigger-default.x-form-trigger-over.x-form-trigger-focus{background-position:-88px center}.x-form-trigger-default.x-form-trigger-focus{background-position:-66px center}.x-form-trigger.x-form-trigger-default.x-form-trigger-click{background-position:-44px center}.x-form-clear-trigger{background-image:url(images/form/clear-trigger.png)}.x-form-search-trigger{background-image:url(images/form/search-trigger.png)}body.x-border-layout-ct,div.x-border-layout-ct{background-color:#692727}.x-tab-default-top{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:7px 12px 6px 12px;border-width:1px;border-style:solid;background-color:#4f0101}.x-tab-default-top-mc{background-color:#4f0101}.x-nbr .x-tab-default-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-tab-default-top-frameInfo{font-family:th-3-3-3-3-1-1-1-1-7-12-6-12}.x-tab-default-top-tl{background-position:0 -6px}.x-tab-default-top-tr{background-position:right -9px}.x-tab-default-top-bl{background-position:0 -12px}.x-tab-default-top-br{background-position:right -15px}.x-tab-default-top-ml{background-position:0 top}.x-tab-default-top-mr{background-position:right top}.x-tab-default-top-tc{background-position:0 0}.x-tab-default-top-bc{background-position:0 -3px}.x-tab-default-top-tr,.x-tab-default-top-br,.x-tab-default-top-mr{padding-right:3px}.x-tab-default-top-tl,.x-tab-default-top-bl,.x-tab-default-top-ml{padding-left:3px}.x-tab-default-top-tc{height:3px}.x-tab-default-top-bc{height:3px}.x-tab-default-top-tl,.x-tab-default-top-bl,.x-tab-default-top-tr,.x-tab-default-top-br,.x-tab-default-top-tc,.x-tab-default-top-bc,.x-tab-default-top-ml,.x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-corners.gif)}.x-tab-default-top-ml,.x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-sides.gif);background-repeat:repeat-y}.x-tab-default-top-mc{padding:5px 10px 4px 10px}.x-tab-default-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;padding:6px 12px 7px 12px;border-width:1px 1px 1px 1px;border-style:solid;background-color:#4f0101}.x-tab-default-bottom-mc{background-color:#4f0101}.x-nbr .x-tab-default-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-tab-default-bottom-frameInfo{font-family:th-3-3-3-3-1-1-1-1-6-12-7-12}.x-tab-default-bottom-tl{background-position:0 -6px}.x-tab-default-bottom-tr{background-position:right -9px}.x-tab-default-bottom-bl{background-position:0 -12px}.x-tab-default-bottom-br{background-position:right -15px}.x-tab-default-bottom-ml{background-position:0 bottom}.x-tab-default-bottom-mr{background-position:right bottom}.x-tab-default-bottom-tc{background-position:0 0}.x-tab-default-bottom-bc{background-position:0 -3px}.x-tab-default-bottom-tr,.x-tab-default-bottom-br,.x-tab-default-bottom-mr{padding-right:3px}.x-tab-default-bottom-tl,.x-tab-default-bottom-bl,.x-tab-default-bottom-ml{padding-left:3px}.x-tab-default-bottom-tc{height:3px}.x-tab-default-bottom-bc{height:3px}.x-tab-default-bottom-tl,.x-tab-default-bottom-bl,.x-tab-default-bottom-tr,.x-tab-default-bottom-br,.x-tab-default-bottom-tc,.x-tab-default-bottom-bc,.x-tab-default-bottom-ml,.x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-corners.gif)}.x-tab-default-bottom-ml,.x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-sides.gif);background-repeat:repeat-y}.x-tab-default-bottom-mc{padding:4px 10px 5px 10px}.x-tab-default-left{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;padding:7px 12px 6px 12px;border-width:1px 1px 1px 1px;border-style:solid;background-color:#4f0101}.x-tab-default-left-mc{background-color:#4f0101}.x-nbr .x-tab-default-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-tab-default-left-frameInfo{font-family:th-3-3-3-3-1-1-1-1-7-12-6-12}.x-tab-default-left-tl{background-position:0 -6px}.x-tab-default-left-tr{background-position:right -9px}.x-tab-default-left-bl{background-position:0 -12px}.x-tab-default-left-br{background-position:right -15px}.x-tab-default-left-ml{background-position:0 top}.x-tab-default-left-mr{background-position:right top}.x-tab-default-left-tc{background-position:0 0}.x-tab-default-left-bc{background-position:0 -3px}.x-tab-default-left-tr,.x-tab-default-left-br,.x-tab-default-left-mr{padding-right:3px}.x-tab-default-left-tl,.x-tab-default-left-bl,.x-tab-default-left-ml{padding-left:3px}.x-tab-default-left-tc{height:3px}.x-tab-default-left-bc{height:3px}.x-tab-default-left-tl,.x-tab-default-left-bl,.x-tab-default-left-tr,.x-tab-default-left-br,.x-tab-default-left-tc,.x-tab-default-left-bc,.x-tab-default-left-ml,.x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-corners.gif)}.x-tab-default-left-ml,.x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-sides.gif);background-repeat:repeat-y}.x-tab-default-left-mc{padding:5px 10px 4px 10px}.x-tab-default-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:7px 12px 6px 12px;border-width:1px 1px 1px 1px;border-style:solid;background-color:#4f0101}.x-tab-default-right-mc{background-color:#4f0101}.x-nbr .x-tab-default-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-tab-default-right-frameInfo{font-family:th-3-3-3-3-1-1-1-1-7-12-6-12}.x-tab-default-right-tl{background-position:0 -6px}.x-tab-default-right-tr{background-position:right -9px}.x-tab-default-right-bl{background-position:0 -12px}.x-tab-default-right-br{background-position:right -15px}.x-tab-default-right-ml{background-position:0 top}.x-tab-default-right-mr{background-position:right top}.x-tab-default-right-tc{background-position:0 0}.x-tab-default-right-bc{background-position:0 -3px}.x-tab-default-right-tr,.x-tab-default-right-br,.x-tab-default-right-mr{padding-right:3px}.x-tab-default-right-tl,.x-tab-default-right-bl,.x-tab-default-right-ml{padding-left:3px}.x-tab-default-right-tc{height:3px}.x-tab-default-right-bc{height:3px}.x-tab-default-right-tl,.x-tab-default-right-bl,.x-tab-default-right-tr,.x-tab-default-right-br,.x-tab-default-right-tc,.x-tab-default-right-bc,.x-tab-default-right-ml,.x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-corners.gif)}.x-tab-default-right-ml,.x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-sides.gif);background-repeat:repeat-y}.x-tab-default-right-mc{padding:5px 10px 4px 10px}.x-tab-default{border-color:#4f0101;cursor:pointer}.x-tab-default-top{margin:0 1px 0 0}.x-tab-default-top.x-tab-rotate-left{margin:0 0 0 1px}.x-tab-default-top.x-tab-focus{-webkit-box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset;-moz-box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset;box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset}.x-tab-default-top.x-tab-focus.x-tab-over{-webkit-box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset;-moz-box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset;box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset}.x-tab-default-top.x-tab-focus.x-tab-active{-webkit-box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset;-moz-box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset;box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset}.x-tab-default-right{margin:0 0 1px 0}.x-tab-default-right.x-tab-rotate-right{margin:1px 0 0 0}.x-tab-default-right.x-tab-focus{-webkit-box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset;-moz-box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset;box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset}.x-tab-default-right.x-tab-focus.x-tab-over{-webkit-box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset;-moz-box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset;box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset}.x-tab-default-right.x-tab-focus.x-tab-active{-webkit-box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset;-moz-box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset;box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset}.x-tab-default-bottom{margin:0 1px 0 0}.x-tab-default-bottom.x-tab-rotate-left{margin:0 0 0 1px}.x-tab-default-bottom.x-tab-focus{-webkit-box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset;-moz-box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset;box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset}.x-tab-default-bottom.x-tab-focus.x-tab-over{-webkit-box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset;-moz-box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset;box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset}.x-tab-default-bottom.x-tab-focus.x-tab-active{-webkit-box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset;-moz-box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset;box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset}.x-tab-default-left{margin:0 0 1px 0}.x-tab-default-left.x-tab-rotate-right{margin:1px 0 0 0}.x-tab-default-left.x-tab-focus{-webkit-box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset;-moz-box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset;box-shadow:#dbcccc 0 1px 0 0 inset,#dbcccc 0 -1px 0 0 inset,#dbcccc -1px 0 0 0 inset,#dbcccc 1px 0 0 0 inset}.x-tab-default-left.x-tab-focus.x-tab-over{-webkit-box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset;-moz-box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset;box-shadow:#e7dcdc 0 1px 0 0 inset,#e7dcdc 0 -1px 0 0 inset,#e7dcdc -1px 0 0 0 inset,#e7dcdc 1px 0 0 0 inset}.x-tab-default-left.x-tab-focus.x-tab-active{-webkit-box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset;-moz-box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset;box-shadow:#f88802 0 1px 0 0 inset,#f88802 0 -1px 0 0 inset,#f88802 -1px 0 0 0 inset,#f88802 1px 0 0 0 inset}.x-tab-button-default{height:16px}.x-tab-inner-default{font:bold 13px/16px helvetica,arial,verdana,sans-serif;color:white;max-width:100%}.x-tab-icon-right>.x-tab-inner-default,.x-tab-icon-left>.x-tab-inner-default{max-width:calc(100% - 16px)}.x-tab-icon-el-default{height:16px;line-height:16px;background-position:center center}.x-tab-icon-left>.x-tab-icon-el-default,.x-tab-icon-right>.x-tab-icon-el-default{width:16px}.x-tab-icon-top>.x-tab-icon-el-default,.x-tab-icon-bottom>.x-tab-icon-el-default{min-width:16px}.x-tab-icon-el-default.x-tab-glyph{font-size:16px;line-height:16px;color:white;opacity:.5}.x-ie8 .x-tab-icon-el-default.x-tab-glyph{color:#a78080}.x-tab-text.x-tab-icon-left>.x-tab-icon-el-default{margin-right:6px}.x-tab-text.x-tab-icon-right>.x-tab-icon-el-default{margin-left:6px}.x-tab-text.x-tab-icon-top>.x-tab-icon-el-default{margin-bottom:6px}.x-tab-text.x-tab-icon-bottom>.x-tab-icon-el-default{margin-top:6px}.x-tab-over.x-tab-default{border-color:#875252;background-color:#875252}.x-tab.x-tab-active.x-tab-default{border-color:#f88802;background-color:#f88802}.x-tab.x-tab-active.x-tab-default .x-tab-inner-default{color:#4f0101}.x-tab.x-tab-active.x-tab-default .x-tab-glyph{color:#4f0101}.x-ie8 .x-tab.x-tab-active.x-tab-default .x-tab-glyph{color:#a34401}.x-tab.x-tab-disabled.x-tab-default{cursor:default}.x-tab.x-tab-disabled.x-tab-default .x-tab-inner-default{filter:alpha(opacity=30);opacity:.3}.x-tab.x-tab-disabled.x-tab-default .x-tab-icon-el-default{filter:alpha(opacity=50);opacity:.5}.x-tab.x-tab-disabled.x-tab-default .x-tab-glyph{color:white;opacity:.3;filter:none}.x-ie8 .x-tab.x-tab-disabled.x-tab-default .x-tab-glyph{color:#834d4d}.x-nbr .x-tab-default{background-image:none}.x-tab-over .x-tab-default-top-tl,.x-tab-over .x-tab-default-top-bl,.x-tab-over .x-tab-default-top-tr,.x-tab-over .x-tab-default-top-br,.x-tab-over .x-tab-default-top-tc,.x-tab-over .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-over-corners.gif)}.x-tab-over .x-tab-default-top-ml,.x-tab-over .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-over-sides.gif)}.x-tab-over .x-tab-default-top-mc{background-color:#875252;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-over-fbg.gif)}.x-tab-focus .x-tab-default-top-tl,.x-tab-focus .x-tab-default-top-bl,.x-tab-focus .x-tab-default-top-tr,.x-tab-focus .x-tab-default-top-br,.x-tab-focus .x-tab-default-top-tc,.x-tab-focus .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-focus-corners.gif)}.x-tab-focus .x-tab-default-top-ml,.x-tab-focus .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-focus-sides.gif)}.x-tab-focus .x-tab-default-top-mc{background-color:#4f0101;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-focus-fbg.gif)}.x-tab-focus.x-tab-over .x-tab-default-top-tl,.x-tab-focus.x-tab-over .x-tab-default-top-bl,.x-tab-focus.x-tab-over .x-tab-default-top-tr,.x-tab-focus.x-tab-over .x-tab-default-top-br,.x-tab-focus.x-tab-over .x-tab-default-top-tc,.x-tab-focus.x-tab-over .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-focus-over-corners.gif)}.x-tab-focus.x-tab-over .x-tab-default-top-ml,.x-tab-focus.x-tab-over .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-focus-over-sides.gif)}.x-tab-focus.x-tab-over .x-tab-default-top-mc{background-color:#875252;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-focus-over-fbg.gif)}.x-tab.x-tab-active .x-tab-default-top-tl,.x-tab.x-tab-active .x-tab-default-top-bl,.x-tab.x-tab-active .x-tab-default-top-tr,.x-tab.x-tab-active .x-tab-default-top-br,.x-tab.x-tab-active .x-tab-default-top-tc,.x-tab.x-tab-active .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-active-corners.gif)}.x-tab.x-tab-active .x-tab-default-top-ml,.x-tab.x-tab-active .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-active-sides.gif)}.x-tab.x-tab-active .x-tab-default-top-mc{background-color:#f88802;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-active-fbg.gif)}.x-tab-focus.x-tab-active .x-tab-default-top-tl,.x-tab-focus.x-tab-active .x-tab-default-top-bl,.x-tab-focus.x-tab-active .x-tab-default-top-tr,.x-tab-focus.x-tab-active .x-tab-default-top-br,.x-tab-focus.x-tab-active .x-tab-default-top-tc,.x-tab-focus.x-tab-active .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-focus-active-corners.gif)}.x-tab-focus.x-tab-active .x-tab-default-top-ml,.x-tab-focus.x-tab-active .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-focus-active-sides.gif)}.x-tab-focus.x-tab-active .x-tab-default-top-mc{background-color:#f88802;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-focus-active-fbg.gif)}.x-tab.x-tab-disabled .x-tab-default-top-tl,.x-tab.x-tab-disabled .x-tab-default-top-bl,.x-tab.x-tab-disabled .x-tab-default-top-tr,.x-tab.x-tab-disabled .x-tab-default-top-br,.x-tab.x-tab-disabled .x-tab-default-top-tc,.x-tab.x-tab-disabled .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-disabled-corners.gif)}.x-tab.x-tab-disabled .x-tab-default-top-ml,.x-tab.x-tab-disabled .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-disabled-sides.gif)}.x-tab.x-tab-disabled .x-tab-default-top-mc{background-color:#4f0101;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-disabled-fbg.gif)}.x-tab-over .x-tab-default-right-tl,.x-tab-over .x-tab-default-right-bl,.x-tab-over .x-tab-default-right-tr,.x-tab-over .x-tab-default-right-br,.x-tab-over .x-tab-default-right-tc,.x-tab-over .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-over-corners.gif)}.x-tab-over .x-tab-default-right-ml,.x-tab-over .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-over-sides.gif)}.x-tab-over .x-tab-default-right-mc{background-color:#875252;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-over-fbg.gif)}.x-tab-focus .x-tab-default-right-tl,.x-tab-focus .x-tab-default-right-bl,.x-tab-focus .x-tab-default-right-tr,.x-tab-focus .x-tab-default-right-br,.x-tab-focus .x-tab-default-right-tc,.x-tab-focus .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-focus-corners.gif)}.x-tab-focus .x-tab-default-right-ml,.x-tab-focus .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-focus-sides.gif)}.x-tab-focus .x-tab-default-right-mc{background-color:#4f0101;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-focus-fbg.gif)}.x-tab-focus.x-tab-over .x-tab-default-right-tl,.x-tab-focus.x-tab-over .x-tab-default-right-bl,.x-tab-focus.x-tab-over .x-tab-default-right-tr,.x-tab-focus.x-tab-over .x-tab-default-right-br,.x-tab-focus.x-tab-over .x-tab-default-right-tc,.x-tab-focus.x-tab-over .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-focus-over-corners.gif)}.x-tab-focus.x-tab-over .x-tab-default-right-ml,.x-tab-focus.x-tab-over .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-focus-over-sides.gif)}.x-tab-focus.x-tab-over .x-tab-default-right-mc{background-color:#875252;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-focus-over-fbg.gif)}.x-tab.x-tab-active .x-tab-default-right-tl,.x-tab.x-tab-active .x-tab-default-right-bl,.x-tab.x-tab-active .x-tab-default-right-tr,.x-tab.x-tab-active .x-tab-default-right-br,.x-tab.x-tab-active .x-tab-default-right-tc,.x-tab.x-tab-active .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-active-corners.gif)}.x-tab.x-tab-active .x-tab-default-right-ml,.x-tab.x-tab-active .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-active-sides.gif)}.x-tab.x-tab-active .x-tab-default-right-mc{background-color:#f88802;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-active-fbg.gif)}.x-tab-focus.x-tab-active .x-tab-default-right-tl,.x-tab-focus.x-tab-active .x-tab-default-right-bl,.x-tab-focus.x-tab-active .x-tab-default-right-tr,.x-tab-focus.x-tab-active .x-tab-default-right-br,.x-tab-focus.x-tab-active .x-tab-default-right-tc,.x-tab-focus.x-tab-active .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-focus-active-corners.gif)}.x-tab-focus.x-tab-active .x-tab-default-right-ml,.x-tab-focus.x-tab-active .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-focus-active-sides.gif)}.x-tab-focus.x-tab-active .x-tab-default-right-mc{background-color:#f88802;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-focus-active-fbg.gif)}.x-tab.x-tab-disabled .x-tab-default-right-tl,.x-tab.x-tab-disabled .x-tab-default-right-bl,.x-tab.x-tab-disabled .x-tab-default-right-tr,.x-tab.x-tab-disabled .x-tab-default-right-br,.x-tab.x-tab-disabled .x-tab-default-right-tc,.x-tab.x-tab-disabled .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-disabled-corners.gif)}.x-tab.x-tab-disabled .x-tab-default-right-ml,.x-tab.x-tab-disabled .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-disabled-sides.gif)}.x-tab.x-tab-disabled .x-tab-default-right-mc{background-color:#4f0101;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-disabled-fbg.gif)}.x-tab-over .x-tab-default-bottom-tl,.x-tab-over .x-tab-default-bottom-bl,.x-tab-over .x-tab-default-bottom-tr,.x-tab-over .x-tab-default-bottom-br,.x-tab-over .x-tab-default-bottom-tc,.x-tab-over .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-over-corners.gif)}.x-tab-over .x-tab-default-bottom-ml,.x-tab-over .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-over-sides.gif)}.x-tab-over .x-tab-default-bottom-mc{background-color:#875252;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-over-fbg.gif)}.x-tab-focus .x-tab-default-bottom-tl,.x-tab-focus .x-tab-default-bottom-bl,.x-tab-focus .x-tab-default-bottom-tr,.x-tab-focus .x-tab-default-bottom-br,.x-tab-focus .x-tab-default-bottom-tc,.x-tab-focus .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-focus-corners.gif)}.x-tab-focus .x-tab-default-bottom-ml,.x-tab-focus .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-focus-sides.gif)}.x-tab-focus .x-tab-default-bottom-mc{background-color:#4f0101;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-focus-fbg.gif)}.x-tab-focus.x-tab-over .x-tab-default-bottom-tl,.x-tab-focus.x-tab-over .x-tab-default-bottom-bl,.x-tab-focus.x-tab-over .x-tab-default-bottom-tr,.x-tab-focus.x-tab-over .x-tab-default-bottom-br,.x-tab-focus.x-tab-over .x-tab-default-bottom-tc,.x-tab-focus.x-tab-over .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-focus-over-corners.gif)}.x-tab-focus.x-tab-over .x-tab-default-bottom-ml,.x-tab-focus.x-tab-over .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-focus-over-sides.gif)}.x-tab-focus.x-tab-over .x-tab-default-bottom-mc{background-color:#875252;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-focus-over-fbg.gif)}.x-tab.x-tab-active .x-tab-default-bottom-tl,.x-tab.x-tab-active .x-tab-default-bottom-bl,.x-tab.x-tab-active .x-tab-default-bottom-tr,.x-tab.x-tab-active .x-tab-default-bottom-br,.x-tab.x-tab-active .x-tab-default-bottom-tc,.x-tab.x-tab-active .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-active-corners.gif)}.x-tab.x-tab-active .x-tab-default-bottom-ml,.x-tab.x-tab-active .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-active-sides.gif)}.x-tab.x-tab-active .x-tab-default-bottom-mc{background-color:#f88802;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-active-fbg.gif)}.x-tab-focus.x-tab-active .x-tab-default-bottom-tl,.x-tab-focus.x-tab-active .x-tab-default-bottom-bl,.x-tab-focus.x-tab-active .x-tab-default-bottom-tr,.x-tab-focus.x-tab-active .x-tab-default-bottom-br,.x-tab-focus.x-tab-active .x-tab-default-bottom-tc,.x-tab-focus.x-tab-active .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-focus-active-corners.gif)}.x-tab-focus.x-tab-active .x-tab-default-bottom-ml,.x-tab-focus.x-tab-active .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-focus-active-sides.gif)}.x-tab-focus.x-tab-active .x-tab-default-bottom-mc{background-color:#f88802;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-focus-active-fbg.gif)}.x-tab.x-tab-disabled .x-tab-default-bottom-tl,.x-tab.x-tab-disabled .x-tab-default-bottom-bl,.x-tab.x-tab-disabled .x-tab-default-bottom-tr,.x-tab.x-tab-disabled .x-tab-default-bottom-br,.x-tab.x-tab-disabled .x-tab-default-bottom-tc,.x-tab.x-tab-disabled .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-disabled-corners.gif)}.x-tab.x-tab-disabled .x-tab-default-bottom-ml,.x-tab.x-tab-disabled .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-disabled-sides.gif)}.x-tab.x-tab-disabled .x-tab-default-bottom-mc{background-color:#4f0101;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-disabled-fbg.gif)}.x-tab-over .x-tab-default-left-tl,.x-tab-over .x-tab-default-left-bl,.x-tab-over .x-tab-default-left-tr,.x-tab-over .x-tab-default-left-br,.x-tab-over .x-tab-default-left-tc,.x-tab-over .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-over-corners.gif)}.x-tab-over .x-tab-default-left-ml,.x-tab-over .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-over-sides.gif)}.x-tab-over .x-tab-default-left-mc{background-color:#875252;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-over-fbg.gif)}.x-tab-focus .x-tab-default-left-tl,.x-tab-focus .x-tab-default-left-bl,.x-tab-focus .x-tab-default-left-tr,.x-tab-focus .x-tab-default-left-br,.x-tab-focus .x-tab-default-left-tc,.x-tab-focus .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-focus-corners.gif)}.x-tab-focus .x-tab-default-left-ml,.x-tab-focus .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-focus-sides.gif)}.x-tab-focus .x-tab-default-left-mc{background-color:#4f0101;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-focus-fbg.gif)}.x-tab-focus.x-tab-over .x-tab-default-left-tl,.x-tab-focus.x-tab-over .x-tab-default-left-bl,.x-tab-focus.x-tab-over .x-tab-default-left-tr,.x-tab-focus.x-tab-over .x-tab-default-left-br,.x-tab-focus.x-tab-over .x-tab-default-left-tc,.x-tab-focus.x-tab-over .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-focus-over-corners.gif)}.x-tab-focus.x-tab-over .x-tab-default-left-ml,.x-tab-focus.x-tab-over .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-focus-over-sides.gif)}.x-tab-focus.x-tab-over .x-tab-default-left-mc{background-color:#875252;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-focus-over-fbg.gif)}.x-tab.x-tab-active .x-tab-default-left-tl,.x-tab.x-tab-active .x-tab-default-left-bl,.x-tab.x-tab-active .x-tab-default-left-tr,.x-tab.x-tab-active .x-tab-default-left-br,.x-tab.x-tab-active .x-tab-default-left-tc,.x-tab.x-tab-active .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-active-corners.gif)}.x-tab.x-tab-active .x-tab-default-left-ml,.x-tab.x-tab-active .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-active-sides.gif)}.x-tab.x-tab-active .x-tab-default-left-mc{background-color:#f88802;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-active-fbg.gif)}.x-tab-focus.x-tab-active .x-tab-default-left-tl,.x-tab-focus.x-tab-active .x-tab-default-left-bl,.x-tab-focus.x-tab-active .x-tab-default-left-tr,.x-tab-focus.x-tab-active .x-tab-default-left-br,.x-tab-focus.x-tab-active .x-tab-default-left-tc,.x-tab-focus.x-tab-active .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-focus-active-corners.gif)}.x-tab-focus.x-tab-active .x-tab-default-left-ml,.x-tab-focus.x-tab-active .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-focus-active-sides.gif)}.x-tab-focus.x-tab-active .x-tab-default-left-mc{background-color:#f88802;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-focus-active-fbg.gif)}.x-tab.x-tab-disabled .x-tab-default-left-tl,.x-tab.x-tab-disabled .x-tab-default-left-bl,.x-tab.x-tab-disabled .x-tab-default-left-tr,.x-tab.x-tab-disabled .x-tab-default-left-br,.x-tab.x-tab-disabled .x-tab-default-left-tc,.x-tab.x-tab-disabled .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-disabled-corners.gif)}.x-tab.x-tab-disabled .x-tab-default-left-ml,.x-tab.x-tab-disabled .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-disabled-sides.gif)}.x-tab.x-tab-disabled .x-tab-default-left-mc{background-color:#4f0101;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-disabled-fbg.gif)}.x-tab-default-tl,.x-tab-default-bl,.x-tab-default-tr,.x-tab-default-br{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)}.x-tab-default .x-tab-close-btn{top:2px;right:2px;width:12px;height:12px;background:url(images/tab/tab-default-close.png) 0 0}.x-tab-default .x-tab-close-btn-over{background-position:-12px 0}.x-tab-default .x-tab-close-btn-pressed{background-position:-24px 0}.x-tab-default.x-tab-active .x-tab-close-btn{background-position:0 -12px}.x-tab-default.x-tab-active .x-tab-close-btn-over{background-position:-12px -12px}.x-tab-default.x-tab-active .x-tab-close-btn-pressed{background-position:-24px -12px}.x-tab-default.x-tab-disabled .x-tab-close-btn{filter:alpha(opacity=30);opacity:.3;background-position:0 0}.x-tab-closable.x-tab-default .x-tab-button{padding-right:15px}.x-tab-bar-default{background-color:#4f0101}.x-tab-bar-default-top>.x-tab-bar-body-default{padding:0}.x-tab-bar-default-bottom>.x-tab-bar-body-default{padding:0}.x-tab-bar-default-left>.x-tab-bar-body-default{padding:0}.x-tab-bar-default-right>.x-tab-bar-body-default{padding:0}.x-tab-bar-plain.x-tab-bar-default-horizontal{border-top-color:transparent;border-bottom-color:transparent;border-left-width:0;border-right-width:0}.x-tab-bar-plain.x-tab-bar-default-vertical{border-right-color:transparent;border-left-color:transparent;border-top-width:0;border-bottom-width:0}.x-tab-bar-top>.x-tab-bar-body-default{padding-bottom:5px}.x-tab-bar-bottom>.x-tab-bar-body-default{padding-top:5px}.x-tab-bar-left>.x-tab-bar-body-default{padding-right:5px}.x-tab-bar-right>.x-tab-bar-body-default{padding-left:5px}.x-tab-bar-strip-default{border-style:solid;border-color:#4f0101;background-color:#f88802}.x-tab-bar-top>.x-tab-bar-strip-default{border-width:0;height:5px}.x-tab-bar-top.x-tab-bar-plain>.x-tab-bar-strip-default{border-width:0}.x-tab-bar-bottom>.x-tab-bar-strip-default{border-width:0;height:5px}.x-tab-bar-bottom.x-tab-bar-plain>.x-tab-bar-strip-default{border-width:0}.x-tab-bar-left>.x-tab-bar-strip-default{border-width:0;width:5px}.x-tab-bar-left.x-tab-bar-plain>.x-tab-bar-strip-default{border-width:0}.x-tab-bar-right>.x-tab-bar-strip-default{border-width:0;width:5px}.x-tab-bar-right.x-tab-bar-plain>.x-tab-bar-strip-default{border-width:0}.x-tab-bar-horizontal>.x-tab-bar-body-default{min-height:34px}.x-ie9m .x-tab-bar-horizontal>.x-tab-bar-body-default{min-height:29px}.x-tab-bar-vertical>.x-tab-bar-body-default{min-width:34px}.x-ie9m .x-tab-bar-vertical>.x-tab-bar-body-default{min-width:29px}.x-tab-bar-default-scroller .x-box-scroller-body-horizontal{margin-left:24px}.x-tab-bar-default-vertical-scroller .x-box-scroller-body-vertical{margin-top:24px}.x-box-scroller-tab-bar-default{cursor:pointer;filter:alpha(opacity=50);opacity:.5}.x-box-scroller-tab-bar-default.x-box-scroller-hover{filter:alpha(opacity=60);opacity:.6}.x-box-scroller-tab-bar-default.x-box-scroller-pressed{filter:alpha(opacity=70);opacity:.7}.x-box-scroller-tab-bar-default.x-box-scroller-disabled{filter:alpha(opacity=25);opacity:.25;cursor:default}.x-box-scroller-tab-bar-default.x-box-scroller-left,.x-box-scroller-tab-bar-default.x-box-scroller-right{width:24px;height:24px;top:50%;margin-top:-12px}.x-box-scroller-tab-bar-default.x-box-scroller-left{margin-left:0;margin-right:0;margin-bottom:0;background-image:url(images/tab-bar/default-scroll-left.png)}.x-box-scroller-tab-bar-default.x-box-scroller-right{margin-left:0;margin-right:0;margin-bottom:0;background-image:url(images/tab-bar/default-scroll-right.png)}.x-box-scroller-tab-bar-default.x-box-scroller-top,.x-box-scroller-tab-bar-default.x-box-scroller-bottom{height:24px;width:24px;left:50%;margin-left:-12px}.x-box-scroller-tab-bar-default.x-box-scroller-top{margin-top:0;margin-right:0;margin-bottom:0;background-image:url(images/tab-bar/default-scroll-top.png)}.x-box-scroller-tab-bar-default.x-box-scroller-bottom{margin-top:0;margin-right:0;margin-bottom:0;background-image:url(images/tab-bar/default-scroll-bottom.png)}.x-tab-bar-default-top .x-box-scroller-tab-bar-default{margin-top:-14px}.x-tab-bar-default-right .x-box-scroller-tab-bar-default{margin-left:-10px}.x-tab-bar-default-bottom .x-box-scroller-tab-bar-default{margin-top:-10px}.x-tab-bar-default-left .x-box-scroller-tab-bar-default{margin-left:-14px}.x-box-scroller-tab-bar-default{background-color:#4f0101}.x-box-scroller-tab-bar-default .x-ie8 .x-box-scroller-plain{background-color:#fff}.x-box-scroller-plain.x-box-scroller-tab-bar-default.x-box-scroller-left{background-image:url(images/tab-bar/default-plain-scroll-left.png)}.x-box-scroller-plain.x-box-scroller-tab-bar-default.x-box-scroller-right{background-image:url(images/tab-bar/default-plain-scroll-right.png)}.x-box-scroller-plain.x-box-scroller-tab-bar-default.x-box-scroller-top{background-image:url(images/tab-bar/default-plain-scroll-top.png)}.x-box-scroller-plain.x-box-scroller-tab-bar-default.x-box-scroller-bottom{background-image:url(images/tab-bar/default-plain-scroll-bottom.png)}.x-window-ghost{filter:alpha(opacity=50);opacity:.5}.x-window-default{border-color:#692727;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px}.x-window-default{-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;padding:0;border-width:5px;border-style:solid;background-color:white}.x-window-default-mc{background-color:white}.x-nbr .x-window-default{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-default-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-0-0-0-0}.x-window-default-tl{background-position:0 -10px}.x-window-default-tr{background-position:right -15px}.x-window-default-bl{background-position:0 -20px}.x-window-default-br{background-position:right -25px}.x-window-default-ml{background-position:0 top}.x-window-default-mr{background-position:right top}.x-window-default-tc{background-position:0 0}.x-window-default-bc{background-position:0 -5px}.x-window-default-tr,.x-window-default-br,.x-window-default-mr{padding-right:5px}.x-window-default-tl,.x-window-default-bl,.x-window-default-ml{padding-left:5px}.x-window-default-tc{height:5px}.x-window-default-bc{height:5px}.x-window-default-tl,.x-window-default-bl,.x-window-default-tr,.x-window-default-br,.x-window-default-tc,.x-window-default-bc,.x-window-default-ml,.x-window-default-mr{background-image:url(images/window/window-default-corners.gif)}.x-window-default-ml,.x-window-default-mr{background-image:url(images/window/window-default-sides.gif);background-repeat:repeat-y}.x-window-default-mc{padding:0}.x-window-body-default{border-color:#692727;border-width:1px;border-style:solid;background:white;color:black;font-size:11px;font-weight:normal;font-family:helvetica,arial,verdana,sans-serif}.x-window-header-default{font-size:13px;border-color:#692727;background-color:#692727}.x-window-header-default .x-tool-img{background-color:#692727}.x-window-header-default-horizontal .x-window-header-default-tab-bar{margin-top:-5px;margin-bottom:-5px}.x-window-header-default-vertical .x-window-header-default-tab-bar{margin-right:-5px;margin-left:-5px}.x-window-header-title-default{color:white;font-size:13px;font-weight:bold;font-family:helvetica,arial,verdana,sans-serif;line-height:16px}.x-window-header-title-default>.x-title-text-default{padding:0;text-transform:none}.x-window-header-title-default>.x-title-icon-wrap-default.x-title-icon-top{height:22px;padding-bottom:6px}.x-window-header-title-default>.x-title-icon-wrap-default.x-title-icon-right{width:22px;padding-left:6px}.x-window-header-title-default>.x-title-icon-wrap-default.x-title-icon-bottom{height:22px;padding-top:6px}.x-window-header-title-default>.x-title-icon-wrap-default.x-title-icon-left{width:22px;padding-right:6px}.x-window-header-title-default>.x-title-icon-wrap-default>.x-title-icon-default{width:16px;height:16px;background-position:center center}.x-window-header-title-default>.x-title-icon-wrap-default>.x-title-glyph{color:white;font-size:16px;line-height:16px;opacity:.5}.x-ie8 .x-window-header-title-default>.x-title-icon-wrap-default>.x-title-glyph{color:#b49393}.x-window-header-default-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 5px 5px;border-width:5px 5px 5px 5px;border-style:solid;background-color:#692727}.x-window-header-default-top-mc{background-color:#692727}.x-nbr .x-window-header-default-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-top-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-window-header-default-top-tl{background-position:0 -10px}.x-window-header-default-top-tr{background-position:right -15px}.x-window-header-default-top-bl{background-position:0 -20px}.x-window-header-default-top-br{background-position:right -25px}.x-window-header-default-top-ml{background-position:0 top}.x-window-header-default-top-mr{background-position:right top}.x-window-header-default-top-tc{background-position:0 0}.x-window-header-default-top-bc{background-position:0 -5px}.x-window-header-default-top-tr,.x-window-header-default-top-br,.x-window-header-default-top-mr{padding-right:5px}.x-window-header-default-top-tl,.x-window-header-default-top-bl,.x-window-header-default-top-ml{padding-left:5px}.x-window-header-default-top-tc{height:5px}.x-window-header-default-top-bc{height:5px}.x-window-header-default-top-tl,.x-window-header-default-top-bl,.x-window-header-default-top-tr,.x-window-header-default-top-br,.x-window-header-default-top-tc,.x-window-header-default-top-bc,.x-window-header-default-top-ml,.x-window-header-default-top-mr{background-image:url(images/window-header/window-header-default-top-corners.gif)}.x-window-header-default-top-ml,.x-window-header-default-top-mr{background-image:url(images/window-header/window-header-default-top-sides.gif);background-repeat:repeat-y}.x-window-header-default-top-mc{padding:5px 5px 5px 5px}.x-window-header-default-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 5px 5px;border-width:5px 5px 5px 5px;border-style:solid;background-color:#692727}.x-window-header-default-right-mc{background-color:#692727}.x-nbr .x-window-header-default-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-right-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-window-header-default-right-tl{background-position:0 -10px}.x-window-header-default-right-tr{background-position:right -15px}.x-window-header-default-right-bl{background-position:0 -20px}.x-window-header-default-right-br{background-position:right -25px}.x-window-header-default-right-ml{background-position:0 top}.x-window-header-default-right-mr{background-position:right top}.x-window-header-default-right-tc{background-position:0 0}.x-window-header-default-right-bc{background-position:0 -5px}.x-window-header-default-right-tr,.x-window-header-default-right-br,.x-window-header-default-right-mr{padding-right:5px}.x-window-header-default-right-tl,.x-window-header-default-right-bl,.x-window-header-default-right-ml{padding-left:5px}.x-window-header-default-right-tc{height:5px}.x-window-header-default-right-bc{height:5px}.x-window-header-default-right-tl,.x-window-header-default-right-bl,.x-window-header-default-right-tr,.x-window-header-default-right-br,.x-window-header-default-right-tc,.x-window-header-default-right-bc,.x-window-header-default-right-ml,.x-window-header-default-right-mr{background-image:url(images/window-header/window-header-default-right-corners.gif)}.x-window-header-default-right-ml,.x-window-header-default-right-mr{background-image:url(images/window-header/window-header-default-right-sides.gif);background-repeat:repeat-y}.x-window-header-default-right-mc{padding:5px 5px 5px 5px}.x-window-header-default-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px 5px 5px 5px;border-style:solid;background-color:#692727}.x-window-header-default-bottom-mc{background-color:#692727}.x-nbr .x-window-header-default-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-bottom-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-window-header-default-bottom-tl{background-position:0 -10px}.x-window-header-default-bottom-tr{background-position:right -15px}.x-window-header-default-bottom-bl{background-position:0 -20px}.x-window-header-default-bottom-br{background-position:right -25px}.x-window-header-default-bottom-ml{background-position:0 top}.x-window-header-default-bottom-mr{background-position:right top}.x-window-header-default-bottom-tc{background-position:0 0}.x-window-header-default-bottom-bc{background-position:0 -5px}.x-window-header-default-bottom-tr,.x-window-header-default-bottom-br,.x-window-header-default-bottom-mr{padding-right:5px}.x-window-header-default-bottom-tl,.x-window-header-default-bottom-bl,.x-window-header-default-bottom-ml{padding-left:5px}.x-window-header-default-bottom-tc{height:5px}.x-window-header-default-bottom-bc{height:5px}.x-window-header-default-bottom-tl,.x-window-header-default-bottom-bl,.x-window-header-default-bottom-tr,.x-window-header-default-bottom-br,.x-window-header-default-bottom-tc,.x-window-header-default-bottom-bc,.x-window-header-default-bottom-ml,.x-window-header-default-bottom-mr{background-image:url(images/window-header/window-header-default-bottom-corners.gif)}.x-window-header-default-bottom-ml,.x-window-header-default-bottom-mr{background-image:url(images/window-header/window-header-default-bottom-sides.gif);background-repeat:repeat-y}.x-window-header-default-bottom-mc{padding:5px 5px 5px 5px}.x-window-header-default-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px 5px 5px 5px;border-style:solid;background-color:#692727}.x-window-header-default-left-mc{background-color:#692727}.x-nbr .x-window-header-default-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-left-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-window-header-default-left-tl{background-position:0 -10px}.x-window-header-default-left-tr{background-position:right -15px}.x-window-header-default-left-bl{background-position:0 -20px}.x-window-header-default-left-br{background-position:right -25px}.x-window-header-default-left-ml{background-position:0 top}.x-window-header-default-left-mr{background-position:right top}.x-window-header-default-left-tc{background-position:0 0}.x-window-header-default-left-bc{background-position:0 -5px}.x-window-header-default-left-tr,.x-window-header-default-left-br,.x-window-header-default-left-mr{padding-right:5px}.x-window-header-default-left-tl,.x-window-header-default-left-bl,.x-window-header-default-left-ml{padding-left:5px}.x-window-header-default-left-tc{height:5px}.x-window-header-default-left-bc{height:5px}.x-window-header-default-left-tl,.x-window-header-default-left-bl,.x-window-header-default-left-tr,.x-window-header-default-left-br,.x-window-header-default-left-tc,.x-window-header-default-left-bc,.x-window-header-default-left-ml,.x-window-header-default-left-mr{background-image:url(images/window-header/window-header-default-left-corners.gif)}.x-window-header-default-left-ml,.x-window-header-default-left-mr{background-image:url(images/window-header/window-header-default-left-sides.gif);background-repeat:repeat-y}.x-window-header-default-left-mc{padding:5px 5px 5px 5px}.x-window-header-default-collapsed-top{-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#692727}.x-window-header-default-collapsed-top-mc{background-color:#692727}.x-nbr .x-window-header-default-collapsed-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-collapsed-top-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-window-header-default-collapsed-top-tl{background-position:0 -10px}.x-window-header-default-collapsed-top-tr{background-position:right -15px}.x-window-header-default-collapsed-top-bl{background-position:0 -20px}.x-window-header-default-collapsed-top-br{background-position:right -25px}.x-window-header-default-collapsed-top-ml{background-position:0 top}.x-window-header-default-collapsed-top-mr{background-position:right top}.x-window-header-default-collapsed-top-tc{background-position:0 0}.x-window-header-default-collapsed-top-bc{background-position:0 -5px}.x-window-header-default-collapsed-top-tr,.x-window-header-default-collapsed-top-br,.x-window-header-default-collapsed-top-mr{padding-right:5px}.x-window-header-default-collapsed-top-tl,.x-window-header-default-collapsed-top-bl,.x-window-header-default-collapsed-top-ml{padding-left:5px}.x-window-header-default-collapsed-top-tc{height:5px}.x-window-header-default-collapsed-top-bc{height:5px}.x-window-header-default-collapsed-top-tl,.x-window-header-default-collapsed-top-bl,.x-window-header-default-collapsed-top-tr,.x-window-header-default-collapsed-top-br,.x-window-header-default-collapsed-top-tc,.x-window-header-default-collapsed-top-bc,.x-window-header-default-collapsed-top-ml,.x-window-header-default-collapsed-top-mr{background-image:url(images/window-header/window-header-default-collapsed-top-corners.gif)}.x-window-header-default-collapsed-top-ml,.x-window-header-default-collapsed-top-mr{background-image:url(images/window-header/window-header-default-collapsed-top-sides.gif);background-repeat:repeat-y}.x-window-header-default-collapsed-top-mc{padding:5px 5px 5px 5px}.x-window-header-default-collapsed-right{-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#692727}.x-window-header-default-collapsed-right-mc{background-color:#692727}.x-nbr .x-window-header-default-collapsed-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-collapsed-right-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-window-header-default-collapsed-right-tl{background-position:0 -10px}.x-window-header-default-collapsed-right-tr{background-position:right -15px}.x-window-header-default-collapsed-right-bl{background-position:0 -20px}.x-window-header-default-collapsed-right-br{background-position:right -25px}.x-window-header-default-collapsed-right-ml{background-position:0 top}.x-window-header-default-collapsed-right-mr{background-position:right top}.x-window-header-default-collapsed-right-tc{background-position:0 0}.x-window-header-default-collapsed-right-bc{background-position:0 -5px}.x-window-header-default-collapsed-right-tr,.x-window-header-default-collapsed-right-br,.x-window-header-default-collapsed-right-mr{padding-right:5px}.x-window-header-default-collapsed-right-tl,.x-window-header-default-collapsed-right-bl,.x-window-header-default-collapsed-right-ml{padding-left:5px}.x-window-header-default-collapsed-right-tc{height:5px}.x-window-header-default-collapsed-right-bc{height:5px}.x-window-header-default-collapsed-right-tl,.x-window-header-default-collapsed-right-bl,.x-window-header-default-collapsed-right-tr,.x-window-header-default-collapsed-right-br,.x-window-header-default-collapsed-right-tc,.x-window-header-default-collapsed-right-bc,.x-window-header-default-collapsed-right-ml,.x-window-header-default-collapsed-right-mr{background-image:url(images/window-header/window-header-default-collapsed-right-corners.gif)}.x-window-header-default-collapsed-right-ml,.x-window-header-default-collapsed-right-mr{background-image:url(images/window-header/window-header-default-collapsed-right-sides.gif);background-repeat:repeat-y}.x-window-header-default-collapsed-right-mc{padding:5px 5px 5px 5px}.x-window-header-default-collapsed-bottom{-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#692727}.x-window-header-default-collapsed-bottom-mc{background-color:#692727}.x-nbr .x-window-header-default-collapsed-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-collapsed-bottom-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-window-header-default-collapsed-bottom-tl{background-position:0 -10px}.x-window-header-default-collapsed-bottom-tr{background-position:right -15px}.x-window-header-default-collapsed-bottom-bl{background-position:0 -20px}.x-window-header-default-collapsed-bottom-br{background-position:right -25px}.x-window-header-default-collapsed-bottom-ml{background-position:0 top}.x-window-header-default-collapsed-bottom-mr{background-position:right top}.x-window-header-default-collapsed-bottom-tc{background-position:0 0}.x-window-header-default-collapsed-bottom-bc{background-position:0 -5px}.x-window-header-default-collapsed-bottom-tr,.x-window-header-default-collapsed-bottom-br,.x-window-header-default-collapsed-bottom-mr{padding-right:5px}.x-window-header-default-collapsed-bottom-tl,.x-window-header-default-collapsed-bottom-bl,.x-window-header-default-collapsed-bottom-ml{padding-left:5px}.x-window-header-default-collapsed-bottom-tc{height:5px}.x-window-header-default-collapsed-bottom-bc{height:5px}.x-window-header-default-collapsed-bottom-tl,.x-window-header-default-collapsed-bottom-bl,.x-window-header-default-collapsed-bottom-tr,.x-window-header-default-collapsed-bottom-br,.x-window-header-default-collapsed-bottom-tc,.x-window-header-default-collapsed-bottom-bc,.x-window-header-default-collapsed-bottom-ml,.x-window-header-default-collapsed-bottom-mr{background-image:url(images/window-header/window-header-default-collapsed-bottom-corners.gif)}.x-window-header-default-collapsed-bottom-ml,.x-window-header-default-collapsed-bottom-mr{background-image:url(images/window-header/window-header-default-collapsed-bottom-sides.gif);background-repeat:repeat-y}.x-window-header-default-collapsed-bottom-mc{padding:5px 5px 5px 5px}.x-window-header-default-collapsed-left{-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#692727}.x-window-header-default-collapsed-left-mc{background-color:#692727}.x-nbr .x-window-header-default-collapsed-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-collapsed-left-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-window-header-default-collapsed-left-tl{background-position:0 -10px}.x-window-header-default-collapsed-left-tr{background-position:right -15px}.x-window-header-default-collapsed-left-bl{background-position:0 -20px}.x-window-header-default-collapsed-left-br{background-position:right -25px}.x-window-header-default-collapsed-left-ml{background-position:0 top}.x-window-header-default-collapsed-left-mr{background-position:right top}.x-window-header-default-collapsed-left-tc{background-position:0 0}.x-window-header-default-collapsed-left-bc{background-position:0 -5px}.x-window-header-default-collapsed-left-tr,.x-window-header-default-collapsed-left-br,.x-window-header-default-collapsed-left-mr{padding-right:5px}.x-window-header-default-collapsed-left-tl,.x-window-header-default-collapsed-left-bl,.x-window-header-default-collapsed-left-ml{padding-left:5px}.x-window-header-default-collapsed-left-tc{height:5px}.x-window-header-default-collapsed-left-bc{height:5px}.x-window-header-default-collapsed-left-tl,.x-window-header-default-collapsed-left-bl,.x-window-header-default-collapsed-left-tr,.x-window-header-default-collapsed-left-br,.x-window-header-default-collapsed-left-tc,.x-window-header-default-collapsed-left-bc,.x-window-header-default-collapsed-left-ml,.x-window-header-default-collapsed-left-mr{background-image:url(images/window-header/window-header-default-collapsed-left-corners.gif)}.x-window-header-default-collapsed-left-ml,.x-window-header-default-collapsed-left-mr{background-image:url(images/window-header/window-header-default-collapsed-left-sides.gif);background-repeat:repeat-y}.x-window-header-default-collapsed-left-mc{padding:5px 5px 5px 5px}.x-window-header-default .x-window-header-icon{width:16px;height:16px;color:white;font-size:16px;line-height:16px;background-position:center center}.x-window-header-default .x-window-header-glyph{color:white;font-size:16px;line-height:16px;opacity:.5}.x-ie8 .x-window-header-default .x-window-header-glyph{color:#b49393}.x-window-header-default-horizontal .x-tool-after-title{margin:0 0 0 6px}.x-window-header-default-horizontal .x-tool-before-title{margin:0 6px 0 0}.x-window-header-default-vertical .x-tool-after-title{margin:6px 0 0 0}.x-window-header-default-vertical .x-tool-before-title{margin:0 0 6px 0}.x-window-header-default{border-width:5px!important}.x-nbr .x-window-default-collapsed .x-window-header{border-width:0!important}.x-window-default-resizable{overflow:visible}.x-window-default-resizable .x-window-handle-north-br{top:-5px}.x-window-default-resizable .x-window-handle-south-br{bottom:-5px}.x-window-default-resizable .x-window-handle-east-br{right:-5px}.x-window-default-resizable .x-window-handle-west-br{left:-5px}.x-window-default-resizable .x-window-handle-northwest-br{left:-5px;top:-5px}.x-window-default-resizable .x-window-handle-northeast-br{right:-5px;top:-5px}.x-window-default-resizable .x-window-handle-southeast-br{right:-5px;bottom:-5px}.x-window-default-resizable .x-window-handle-southwest-br{left:-5px;bottom:-5px}.x-window-default-outer-border-l{border-left-color:#692727!important;border-left-width:1px!important}.x-window-default-outer-border-b{border-bottom-color:#692727!important;border-bottom-width:1px!important}.x-window-default-outer-border-bl{border-bottom-color:#692727!important;border-bottom-width:1px!important;border-left-color:#692727!important;border-left-width:1px!important}.x-window-default-outer-border-r{border-right-color:#692727!important;border-right-width:1px!important}.x-window-default-outer-border-rl{border-right-color:#692727!important;border-right-width:1px!important;border-left-color:#692727!important;border-left-width:1px!important}.x-window-default-outer-border-rb{border-right-color:#692727!important;border-right-width:1px!important;border-bottom-color:#692727!important;border-bottom-width:1px!important}.x-window-default-outer-border-rbl{border-right-color:#692727!important;border-right-width:1px!important;border-bottom-color:#692727!important;border-bottom-width:1px!important;border-left-color:#692727!important;border-left-width:1px!important}.x-window-default-outer-border-t{border-top-color:#692727!important;border-top-width:1px!important}.x-window-default-outer-border-tl{border-top-color:#692727!important;border-top-width:1px!important;border-left-color:#692727!important;border-left-width:1px!important}.x-window-default-outer-border-tb{border-top-color:#692727!important;border-top-width:1px!important;border-bottom-color:#692727!important;border-bottom-width:1px!important}.x-window-default-outer-border-tbl{border-top-color:#692727!important;border-top-width:1px!important;border-bottom-color:#692727!important;border-bottom-width:1px!important;border-left-color:#692727!important;border-left-width:1px!important}.x-window-default-outer-border-tr{border-top-color:#692727!important;border-top-width:1px!important;border-right-color:#692727!important;border-right-width:1px!important}.x-window-default-outer-border-trl{border-top-color:#692727!important;border-top-width:1px!important;border-right-color:#692727!important;border-right-width:1px!important;border-left-color:#692727!important;border-left-width:1px!important}.x-window-default-outer-border-trb{border-top-color:#692727!important;border-top-width:1px!important;border-right-color:#692727!important;border-right-width:1px!important;border-bottom-color:#692727!important;border-bottom-width:1px!important}.x-window-default-outer-border-trbl{border-color:#692727!important;border-width:1px!important}.x-window-body-plain{background-color:transparent}.x-message-box .x-window-body{background-color:white;border-width:0}.x-message-box-info,.x-message-box-warning,.x-message-box-question,.x-message-box-error{background-position:left top;background-repeat:no-repeat}.x-message-box-icon{height:32px;width:32px;margin-right:10px}.x-message-box-info{background-image:url(images/shared/icon-info.png)}.x-message-box-warning{background-image:url(images/shared/icon-warning.png)}.x-message-box-question{background-image:url(images/shared/icon-question.png)}.x-message-box-error{background-image:url(images/shared/icon-error.png)}.x-form-trigger-spinner-default{width:22px}.x-form-spinner-default{background-image:url(images/form/spinner.png);background-color:white;width:22px;height:11px}.x-form-spinner-up-default{background-position:0 0}.x-form-spinner-up-default.x-form-spinner-over{background-position:-22px 0}.x-form-spinner-up-default.x-form-spinner-over.x-form-spinner-focus{background-position:-88px 0}.x-form-spinner-up-default.x-form-spinner-focus{background-position:-66px 0}.x-form-spinner-up-default.x-form-spinner.x-form-spinner-click{background-position:-44px 0}.x-form-spinner-down-default{background-position:0 -11px}.x-form-spinner-down-default.x-form-spinner-over{background-position:-22px -11px}.x-form-spinner-down-default.x-form-spinner-over.x-form-spinner-focus{background-position:-88px -11px}.x-form-spinner-down-default.x-form-spinner-focus{background-position:-66px -11px}.x-form-spinner-down-default.x-form-spinner.x-form-spinner-click{background-position:-44px -11px}.x-tbar-page-number{width:30px}.x-tbar-page-first{background-image:url(images/grid/page-first.png)}.x-tbar-page-prev{background-image:url(images/grid/page-prev.png)}.x-tbar-page-next{background-image:url(images/grid/page-next.png)}.x-tbar-page-last{background-image:url(images/grid/page-last.png)}.x-tbar-loading{background-image:url(images/grid/refresh.png)}.x-menu-default{border-style:solid;border-width:1px;border-color:#e1e1e1}.x-menu-body-default{background:white;padding:0}.x-menu-icon-separator-default{left:26px;border-left:solid 1px #e1e1e1;background-color:white;width:1px}.x-menu-item-default{border-width:0;cursor:pointer}.x-menu-item-default.x-menu-item-active{background-image:none;background-color:#e0d2d2}.x-nlg .x-menu-item-default.x-menu-item-active{background:#e0d2d2 repeat-x left top;background-image:url(images/menu/menu-item-default-active-bg.gif)}.x-menu-item-default.x-menu-item-separator{height:1px;border-top:solid 1px #e1e1e1;background-color:white;margin:2px 0;padding:0}.x-menu-item-default.x-menu-item-disabled{filter:alpha(opacity=50);opacity:.5}.x-ie9m .x-menu-item-default.x-menu-item-disabled .x-menu-item-icon-ui{filter:alpha(opacity=50);opacity:.5}.x-ie9m .x-menu-item-default.x-menu-item-disabled .x-menu-item-text-default{background-color:transparent}.x-menu-item-default .x-form-item-label{font-size:11px;color:black}.x-menu-item-text-default,.x-menu-item-cmp-default{margin:0 5px 0 5px}.x-menu-item-text-default{font:normal 11px helvetica,arial,verdana,sans-serif;line-height:23px;padding-top:1px;color:black;cursor:pointer}.x-menu-item-text-default.x-menu-item-indent{margin-left:32px}.x-menu-item-text-default.x-menu-item-indent-no-separator{margin-left:26px}.x-menu-item-text-default.x-menu-item-indent-right-icon{margin-right:31px}.x-menu-item-text-default.x-menu-item-indent-right-arrow{margin-right:22px}.x-menu-item-indent-default{margin-left:32px}.x-menu-item-icon-default{width:16px;height:16px;top:4px;left:5px;background-position:center center}.x-menu-item-icon-default.x-menu-item-glyph{font-size:16px;line-height:16px;color:gray;opacity:.5}.x-ie8 .x-menu-item-icon-default.x-menu-item-glyph{color:#bfbfbf}.x-menu-item-icon-default.x-menu-item-icon-right{width:16px;height:16px;top:4px;right:5px;left:auto;background-position:center center}.x-menu-item-checked .x-menu-item-icon-default.x-menu-item-checkbox{background-image:url(images/menu/default-checked.png)}.x-menu-item-unchecked .x-menu-item-icon-default.x-menu-item-checkbox{background-image:url(images/menu/default-unchecked.png)}.x-menu-item-checked .x-menu-item-icon-default.x-menu-group-icon{background-image:url(images/menu/default-group-checked.png)}.x-menu-item-unchecked .x-menu-item-icon-default.x-menu-group-icon{background-image:none}.x-menu-item-arrow-default{width:12px;height:9px;top:8px;right:0;background-image:url(images/menu/default-menu-parent.png)}.x-menu-item-active .x-menu-item-arrow-default{top:8px;right:0}.x-menu-default-scroller .x-box-scroller-body-horizontal{margin-left:16px}.x-menu-default-vertical-scroller .x-box-scroller-body-vertical{margin-top:24px}.x-box-scroller-menu-default{cursor:pointer;filter:alpha(opacity=50);opacity:.5}.x-box-scroller-menu-default.x-box-scroller-hover{filter:alpha(opacity=60);opacity:.6}.x-box-scroller-menu-default.x-box-scroller-pressed{filter:alpha(opacity=70);opacity:.7}.x-box-scroller-menu-default.x-box-scroller-disabled{filter:alpha(opacity=25);opacity:.25;cursor:default}.x-box-scroller-menu-default.x-box-scroller-top,.x-box-scroller-menu-default.x-box-scroller-bottom{height:16px;width:16px;left:50%;margin-left:-8px}.x-box-scroller-menu-default.x-box-scroller-top{margin-top:4px;margin-right:0;margin-bottom:4px;background-image:url(images/menu/default-scroll-top.png)}.x-box-scroller-menu-default.x-box-scroller-bottom{margin-top:4px;margin-right:0;margin-bottom:4px;background-image:url(images/menu/default-scroll-bottom.png)}.x-ie8 .x-box-scroller-menu-default{background-color:white}.x-grid-locked .x-grid-inner-locked{border-width:0 1px 0 0;border-style:solid}.x-grid-locked-split .x-grid-inner-normal{border-width:0 0 0 1px;border-style:solid}.x-grid-inner-locked{border-right-color:#4f0101}.x-grid-inner-locked .x-column-header-last,.x-grid-inner-locked .x-grid-cell-last{border-right-width:0!important}.x-hmenu-lock{background-image:url(images/grid/hmenu-lock.png)}.x-hmenu-unlock{background-image:url(images/grid/hmenu-unlock.png)}.x-resizable-handle{position:absolute;z-index:100;font-size:1px;line-height:5px;overflow:hidden;filter:alpha(opacity=0);opacity:0;background-color:#fff;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px}.x-collapsed .x-resizable-handle{display:none}.x-resizable-handle-north{cursor:n-resize}.x-resizable-handle-south{cursor:s-resize}.x-resizable-handle-east{cursor:e-resize}.x-resizable-handle-west{cursor:w-resize}.x-resizable-handle-southeast{cursor:se-resize}.x-resizable-handle-northwest{cursor:nw-resize}.x-resizable-handle-northeast{cursor:ne-resize}.x-resizable-handle-southwest{cursor:sw-resize}.x-resizable-handle-east{width:5px;height:100%;right:0;top:0}.x-resizable-handle-south{width:100%;height:5px;left:0;bottom:0}.x-resizable-handle-west{width:5px;height:100%;left:0;top:0}.x-resizable-handle-north{width:100%;height:5px;left:0;top:0}.x-resizable-handle-southeast{width:5px;height:5px;right:0;bottom:0;z-index:101}.x-resizable-handle-northwest{width:5px;height:5px;left:0;top:0;z-index:101}.x-resizable-handle-northeast{width:5px;height:5px;right:0;top:0;z-index:101}.x-resizable-handle-southwest{width:5px;height:5px;left:0;bottom:0;z-index:101}.x-window .x-window-handle{filter:alpha(opacity=0);opacity:0}.x-window-collapsed .x-window-handle{display:none}.x-resizable-proxy{border:1px dashed #3b5a82;position:absolute;overflow:hidden;z-index:50000}.x-resizable-handle-over,.x-resizable-pinned .x-resizable-handle{filter:alpha(opacity=100);opacity:1}.x-resizable-handle-east-over,.x-resizable-handle-west-over{background-image:url(images/sizer/e-handle.png)}.x-resizable-handle-south-over,.x-resizable-handle-north-over{background-image:url(images/sizer/s-handle.png)}.x-resizable-handle-southeast-over{background-position:top left;background-image:url(images/sizer/se-handle.png)}.x-resizable-handle-northwest-over{background-position:bottom right;background-image:url(images/sizer/nw-handle.png)}.x-resizable-handle-northeast-over{background-position:bottom left;background-image:url(images/sizer/ne-handle.png)}.x-resizable-handle-southwest-over{background-position:top right;background-image:url(images/sizer/sw-handle.png)}.x-resizable-pinned .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-west{background-image:url(images/sizer/e-handle.png)}.x-resizable-pinned .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-north{background-image:url(images/sizer/s-handle.png)}.x-resizable-pinned .x-resizable-handle-southeast{background-position:top left;background-image:url(images/sizer/se-handle.png)}.x-resizable-pinned .x-resizable-handle-northwest{background-position:bottom right;background-image:url(images/sizer/nw-handle.png)}.x-resizable-pinned .x-resizable-handle-northeast{background-position:bottom left;background-image:url(images/sizer/ne-handle.png)}.x-resizable-pinned .x-resizable-handle-southwest{background-position:top right;background-image:url(images/sizer/sw-handle.png)}.x-scroll-indicator{position:absolute;background-color:black;opacity:.5;border-radius:3px;margin:2px}.x-scroll-indicator-x{bottom:0;height:6px}.x-scroll-indicator-y{right:0;width:6px}.x-column-header-checkbox{border-color:#f5f5f5}.x-grid-row-checker,.x-column-header-checkbox .x-column-header-text{height:15px;width:15px;background-image:url(images/form/checkbox.png);line-height:15px}.x-column-header-checkbox .x-column-header-inner{padding:6px 4px 6px 4px}.x-grid-cell-row-checker .x-grid-cell-inner{padding:4px 4px 3px 4px}.x-grid-hd-checker-on .x-column-header-text,.x-grid-item-selected .x-grid-row-checker,.x-grid-item-selected .x-grid-row-checker{background-position:0 -15px}.x-btn-plain-toolbar-small{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:transparent}.x-btn-plain-toolbar-small-mc{background-image:url(images/btn/btn-plain-toolbar-small-fbg.gif);background-position:0 top;background-color:transparent}.x-nbr .x-btn-plain-toolbar-small{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-plain-toolbar-small-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-plain-toolbar-small-tl{background-position:0 -6px}.x-btn-plain-toolbar-small-tr{background-position:right -9px}.x-btn-plain-toolbar-small-bl{background-position:0 -12px}.x-btn-plain-toolbar-small-br{background-position:right -15px}.x-btn-plain-toolbar-small-ml{background-position:0 top}.x-btn-plain-toolbar-small-mr{background-position:right top}.x-btn-plain-toolbar-small-tc{background-position:0 0}.x-btn-plain-toolbar-small-bc{background-position:0 -3px}.x-btn-plain-toolbar-small-tr,.x-btn-plain-toolbar-small-br,.x-btn-plain-toolbar-small-mr{padding-right:3px}.x-btn-plain-toolbar-small-tl,.x-btn-plain-toolbar-small-bl,.x-btn-plain-toolbar-small-ml{padding-left:3px}.x-btn-plain-toolbar-small-tc{height:3px}.x-btn-plain-toolbar-small-bc{height:3px}.x-btn-plain-toolbar-small-mc{padding:1px 1px 1px 1px}.x-btn-plain-toolbar-small{border-color:transparent}.x-btn-button-plain-toolbar-small{height:16px}.x-btn-inner-plain-toolbar-small{font:bold 12px/16px helvetica,arial,verdana,sans-serif;color:#666;padding:0 5px;max-width:100%}.x-btn-icon-right>.x-btn-inner-plain-toolbar-small,.x-btn-icon-left>.x-btn-inner-plain-toolbar-small{max-width:calc(100% - 16px)}.x-btn-icon-el-plain-toolbar-small{height:16px}.x-btn-icon-left>.x-btn-icon-el-plain-toolbar-small,.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-small{width:16px}.x-btn-icon-top>.x-btn-icon-el-plain-toolbar-small,.x-btn-icon-bottom>.x-btn-icon-el-plain-toolbar-small{min-width:16px}.x-btn-icon-el-plain-toolbar-small.x-btn-glyph{font-size:16px;line-height:16px;color:#666;opacity:.5}.x-ie8 .x-btn-icon-el-plain-toolbar-small.x-btn-glyph{color:#b2b2b2}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-plain-toolbar-small{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-small{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-plain-toolbar-small{margin-bottom:5px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-plain-toolbar-small{margin-top:5px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-plain-toolbar-small{padding-right:5px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-small{margin-right:5px}.x-btn-arrow-bottom>.x-btn-button-plain-toolbar-small,.x-btn-split-bottom>.x-btn-button-plain-toolbar-small{padding-bottom:3px}.x-btn-wrap-plain-toolbar-small.x-btn-arrow-right:after{width:16px;padding-right:16px;background-image:url(images/button/plain-toolbar-small-arrow.png)}.x-btn-wrap-plain-toolbar-small.x-btn-arrow-bottom:after{height:13px;background-image:url(images/button/plain-toolbar-small-arrow.png)}.x-btn-wrap-plain-toolbar-small.x-btn-split-right:after{width:20px;padding-right:20px;background-image:url(images/button/plain-toolbar-small-s-arrow.png)}.x-btn-wrap-plain-toolbar-small.x-btn-split-bottom:after{height:15px;background-image:url(images/button/plain-toolbar-small-s-arrow-b.png)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-plain-toolbar-small{padding-right:5px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-small{margin-right:5px}.x-btn-focus.x-btn-plain-toolbar-small{background-image:none;background-color:transparent;-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn-over.x-btn-plain-toolbar-small{border-color:#d8d8d8;background-image:none;background-color:#ebebeb;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#ededed),color-stop(50%,#ebebeb),color-stop(51%,#dfdfdf),color-stop(100%,#ebebeb));background-image:-webkit-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-moz-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-o-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-ms-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb)}.x-btn-focus.x-btn-over.x-btn-plain-toolbar-small{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-menu-active.x-btn-plain-toolbar-small,.x-btn.x-btn-pressed.x-btn-plain-toolbar-small{border-color:#cecece;background-image:none;background-color:#e1e1e1;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#e1e1e1),color-stop(50%,#d5d5d5),color-stop(51%,#e1e1e1),color-stop(100%,#e4e4e4));background-image:-webkit-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-moz-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-o-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-ms-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4)}.x-btn-focus.x-btn-menu-active.x-btn-plain-toolbar-small,.x-btn-focus.x-btn-pressed.x-btn-plain-toolbar-small{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-disabled.x-btn-plain-toolbar-small{background-image:none;background-color:transparent}.x-btn-focus .x-btn-plain-toolbar-small-tl,.x-btn-focus .x-btn-plain-toolbar-small-bl,.x-btn-focus .x-btn-plain-toolbar-small-tr,.x-btn-focus .x-btn-plain-toolbar-small-br,.x-btn-focus .x-btn-plain-toolbar-small-tc,.x-btn-focus .x-btn-plain-toolbar-small-bc{background-image:url(images/btn/btn-plain-toolbar-small-focus-corners.gif)}.x-btn-focus .x-btn-plain-toolbar-small-ml,.x-btn-focus .x-btn-plain-toolbar-small-mr{background-image:url(images/btn/btn-plain-toolbar-small-focus-sides.gif)}.x-btn-focus .x-btn-plain-toolbar-small-mc{background-color:transparent;background-image:url(images/btn/btn-plain-toolbar-small-focus-fbg.gif)}.x-btn-over .x-btn-plain-toolbar-small-tl,.x-btn-over .x-btn-plain-toolbar-small-bl,.x-btn-over .x-btn-plain-toolbar-small-tr,.x-btn-over .x-btn-plain-toolbar-small-br,.x-btn-over .x-btn-plain-toolbar-small-tc,.x-btn-over .x-btn-plain-toolbar-small-bc{background-image:url(images/btn/btn-plain-toolbar-small-over-corners.gif)}.x-btn-over .x-btn-plain-toolbar-small-ml,.x-btn-over .x-btn-plain-toolbar-small-mr{background-image:url(images/btn/btn-plain-toolbar-small-over-sides.gif)}.x-btn-over .x-btn-plain-toolbar-small-mc{background-color:#ebebeb;background-image:url(images/btn/btn-plain-toolbar-small-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-plain-toolbar-small-tl,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-small-bl,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-small-tr,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-small-br,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-small-tc,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-small-bc{background-image:url(images/btn/btn-plain-toolbar-small-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-plain-toolbar-small-ml,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-small-mr{background-image:url(images/btn/btn-plain-toolbar-small-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-plain-toolbar-small-mc{background-color:#ebebeb;background-image:url(images/btn/btn-plain-toolbar-small-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-plain-toolbar-small-tl,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-small-bl,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-small-tr,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-small-br,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-small-tc,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-small-bc,.x-btn.x-btn-pressed .x-btn-plain-toolbar-small-tl,.x-btn.x-btn-pressed .x-btn-plain-toolbar-small-bl,.x-btn.x-btn-pressed .x-btn-plain-toolbar-small-tr,.x-btn.x-btn-pressed .x-btn-plain-toolbar-small-br,.x-btn.x-btn-pressed .x-btn-plain-toolbar-small-tc,.x-btn.x-btn-pressed .x-btn-plain-toolbar-small-bc{background-image:url(images/btn/btn-plain-toolbar-small-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-plain-toolbar-small-ml,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-small-mr,.x-btn.x-btn-pressed .x-btn-plain-toolbar-small-ml,.x-btn.x-btn-pressed .x-btn-plain-toolbar-small-mr{background-image:url(images/btn/btn-plain-toolbar-small-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-plain-toolbar-small-mc,.x-btn.x-btn-pressed .x-btn-plain-toolbar-small-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-plain-toolbar-small-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-small-tl,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-small-bl,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-small-tr,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-small-br,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-small-tc,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-small-bc,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-small-tl,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-small-bl,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-small-tr,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-small-br,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-small-tc,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-small-bc{background-image:url(images/btn/btn-plain-toolbar-small-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-small-ml,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-small-mr,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-small-ml,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-small-mr{background-image:url(images/btn/btn-plain-toolbar-small-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-small-mc,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-small-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-plain-toolbar-small-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-plain-toolbar-small-tl,.x-btn.x-btn-disabled .x-btn-plain-toolbar-small-bl,.x-btn.x-btn-disabled .x-btn-plain-toolbar-small-tr,.x-btn.x-btn-disabled .x-btn-plain-toolbar-small-br,.x-btn.x-btn-disabled .x-btn-plain-toolbar-small-tc,.x-btn.x-btn-disabled .x-btn-plain-toolbar-small-bc{background-image:url(images/btn/btn-plain-toolbar-small-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-plain-toolbar-small-ml,.x-btn.x-btn-disabled .x-btn-plain-toolbar-small-mr{background-image:url(images/btn/btn-plain-toolbar-small-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-plain-toolbar-small-mc{background-color:transparent;background-image:url(images/btn/btn-plain-toolbar-small-disabled-fbg.gif)}.x-nbr .x-btn-plain-toolbar-small{background-image:none}.x-btn-disabled.x-btn-plain-toolbar-small{filter:alpha(opacity=50);opacity:.5}.x-btn-plain-toolbar-medium{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:transparent}.x-btn-plain-toolbar-medium-mc{background-image:url(images/btn/btn-plain-toolbar-medium-fbg.gif);background-position:0 top;background-color:transparent}.x-nbr .x-btn-plain-toolbar-medium{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-plain-toolbar-medium-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-plain-toolbar-medium-tl{background-position:0 -6px}.x-btn-plain-toolbar-medium-tr{background-position:right -9px}.x-btn-plain-toolbar-medium-bl{background-position:0 -12px}.x-btn-plain-toolbar-medium-br{background-position:right -15px}.x-btn-plain-toolbar-medium-ml{background-position:0 top}.x-btn-plain-toolbar-medium-mr{background-position:right top}.x-btn-plain-toolbar-medium-tc{background-position:0 0}.x-btn-plain-toolbar-medium-bc{background-position:0 -3px}.x-btn-plain-toolbar-medium-tr,.x-btn-plain-toolbar-medium-br,.x-btn-plain-toolbar-medium-mr{padding-right:3px}.x-btn-plain-toolbar-medium-tl,.x-btn-plain-toolbar-medium-bl,.x-btn-plain-toolbar-medium-ml{padding-left:3px}.x-btn-plain-toolbar-medium-tc{height:3px}.x-btn-plain-toolbar-medium-bc{height:3px}.x-btn-plain-toolbar-medium-mc{padding:1px 1px 1px 1px}.x-btn-plain-toolbar-medium{border-color:transparent}.x-btn-button-plain-toolbar-medium{height:24px}.x-btn-inner-plain-toolbar-medium{font:bold 14px/18px helvetica,arial,verdana,sans-serif;color:#666;padding:0 8px;max-width:100%}.x-btn-icon-right>.x-btn-inner-plain-toolbar-medium,.x-btn-icon-left>.x-btn-inner-plain-toolbar-medium{max-width:calc(100% - 24px)}.x-btn-icon-el-plain-toolbar-medium{height:24px}.x-btn-icon-left>.x-btn-icon-el-plain-toolbar-medium,.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-medium{width:24px}.x-btn-icon-top>.x-btn-icon-el-plain-toolbar-medium,.x-btn-icon-bottom>.x-btn-icon-el-plain-toolbar-medium{min-width:24px}.x-btn-icon-el-plain-toolbar-medium.x-btn-glyph{font-size:24px;line-height:24px;color:#666;opacity:.5}.x-ie8 .x-btn-icon-el-plain-toolbar-medium.x-btn-glyph{color:#b2b2b2}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-plain-toolbar-medium{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-medium{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-plain-toolbar-medium{margin-bottom:5px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-plain-toolbar-medium{margin-top:5px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-plain-toolbar-medium{padding-right:8px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-medium{margin-right:8px}.x-btn-arrow-bottom>.x-btn-button-plain-toolbar-medium,.x-btn-split-bottom>.x-btn-button-plain-toolbar-medium{padding-bottom:3px}.x-btn-wrap-plain-toolbar-medium.x-btn-arrow-right:after{width:24px;padding-right:24px;background-image:url(images/button/plain-toolbar-medium-arrow.png)}.x-btn-wrap-plain-toolbar-medium.x-btn-arrow-bottom:after{height:18px;background-image:url(images/button/plain-toolbar-medium-arrow.png)}.x-btn-wrap-plain-toolbar-medium.x-btn-split-right:after{width:28px;padding-right:28px;background-image:url(images/button/plain-toolbar-medium-s-arrow.png)}.x-btn-wrap-plain-toolbar-medium.x-btn-split-bottom:after{height:24px;background-image:url(images/button/plain-toolbar-medium-s-arrow-b.png)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-plain-toolbar-medium{padding-right:8px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-medium{margin-right:8px}.x-btn-focus.x-btn-plain-toolbar-medium{background-image:none;background-color:transparent;-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn-over.x-btn-plain-toolbar-medium{border-color:#d8d8d8;background-image:none;background-color:#ebebeb;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#ededed),color-stop(50%,#ebebeb),color-stop(51%,#dfdfdf),color-stop(100%,#ebebeb));background-image:-webkit-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-moz-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-o-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-ms-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb)}.x-btn-focus.x-btn-over.x-btn-plain-toolbar-medium{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-menu-active.x-btn-plain-toolbar-medium,.x-btn.x-btn-pressed.x-btn-plain-toolbar-medium{border-color:#cecece;background-image:none;background-color:#e1e1e1;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#e1e1e1),color-stop(50%,#d5d5d5),color-stop(51%,#e1e1e1),color-stop(100%,#e4e4e4));background-image:-webkit-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-moz-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-o-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-ms-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4)}.x-btn-focus.x-btn-menu-active.x-btn-plain-toolbar-medium,.x-btn-focus.x-btn-pressed.x-btn-plain-toolbar-medium{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-disabled.x-btn-plain-toolbar-medium{background-image:none;background-color:transparent}.x-btn-focus .x-btn-plain-toolbar-medium-tl,.x-btn-focus .x-btn-plain-toolbar-medium-bl,.x-btn-focus .x-btn-plain-toolbar-medium-tr,.x-btn-focus .x-btn-plain-toolbar-medium-br,.x-btn-focus .x-btn-plain-toolbar-medium-tc,.x-btn-focus .x-btn-plain-toolbar-medium-bc{background-image:url(images/btn/btn-plain-toolbar-medium-focus-corners.gif)}.x-btn-focus .x-btn-plain-toolbar-medium-ml,.x-btn-focus .x-btn-plain-toolbar-medium-mr{background-image:url(images/btn/btn-plain-toolbar-medium-focus-sides.gif)}.x-btn-focus .x-btn-plain-toolbar-medium-mc{background-color:transparent;background-image:url(images/btn/btn-plain-toolbar-medium-focus-fbg.gif)}.x-btn-over .x-btn-plain-toolbar-medium-tl,.x-btn-over .x-btn-plain-toolbar-medium-bl,.x-btn-over .x-btn-plain-toolbar-medium-tr,.x-btn-over .x-btn-plain-toolbar-medium-br,.x-btn-over .x-btn-plain-toolbar-medium-tc,.x-btn-over .x-btn-plain-toolbar-medium-bc{background-image:url(images/btn/btn-plain-toolbar-medium-over-corners.gif)}.x-btn-over .x-btn-plain-toolbar-medium-ml,.x-btn-over .x-btn-plain-toolbar-medium-mr{background-image:url(images/btn/btn-plain-toolbar-medium-over-sides.gif)}.x-btn-over .x-btn-plain-toolbar-medium-mc{background-color:#ebebeb;background-image:url(images/btn/btn-plain-toolbar-medium-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-plain-toolbar-medium-tl,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-medium-bl,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-medium-tr,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-medium-br,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-medium-tc,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-medium-bc{background-image:url(images/btn/btn-plain-toolbar-medium-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-plain-toolbar-medium-ml,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-medium-mr{background-image:url(images/btn/btn-plain-toolbar-medium-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-plain-toolbar-medium-mc{background-color:#ebebeb;background-image:url(images/btn/btn-plain-toolbar-medium-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-plain-toolbar-medium-tl,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-medium-bl,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-medium-tr,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-medium-br,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-medium-tc,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-medium-bc,.x-btn.x-btn-pressed .x-btn-plain-toolbar-medium-tl,.x-btn.x-btn-pressed .x-btn-plain-toolbar-medium-bl,.x-btn.x-btn-pressed .x-btn-plain-toolbar-medium-tr,.x-btn.x-btn-pressed .x-btn-plain-toolbar-medium-br,.x-btn.x-btn-pressed .x-btn-plain-toolbar-medium-tc,.x-btn.x-btn-pressed .x-btn-plain-toolbar-medium-bc{background-image:url(images/btn/btn-plain-toolbar-medium-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-plain-toolbar-medium-ml,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-medium-mr,.x-btn.x-btn-pressed .x-btn-plain-toolbar-medium-ml,.x-btn.x-btn-pressed .x-btn-plain-toolbar-medium-mr{background-image:url(images/btn/btn-plain-toolbar-medium-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-plain-toolbar-medium-mc,.x-btn.x-btn-pressed .x-btn-plain-toolbar-medium-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-plain-toolbar-medium-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-medium-tl,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-medium-bl,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-medium-tr,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-medium-br,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-medium-tc,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-medium-bc,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-medium-tl,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-medium-bl,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-medium-tr,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-medium-br,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-medium-tc,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-medium-bc{background-image:url(images/btn/btn-plain-toolbar-medium-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-medium-ml,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-medium-mr,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-medium-ml,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-medium-mr{background-image:url(images/btn/btn-plain-toolbar-medium-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-medium-mc,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-medium-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-plain-toolbar-medium-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-plain-toolbar-medium-tl,.x-btn.x-btn-disabled .x-btn-plain-toolbar-medium-bl,.x-btn.x-btn-disabled .x-btn-plain-toolbar-medium-tr,.x-btn.x-btn-disabled .x-btn-plain-toolbar-medium-br,.x-btn.x-btn-disabled .x-btn-plain-toolbar-medium-tc,.x-btn.x-btn-disabled .x-btn-plain-toolbar-medium-bc{background-image:url(images/btn/btn-plain-toolbar-medium-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-plain-toolbar-medium-ml,.x-btn.x-btn-disabled .x-btn-plain-toolbar-medium-mr{background-image:url(images/btn/btn-plain-toolbar-medium-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-plain-toolbar-medium-mc{background-color:transparent;background-image:url(images/btn/btn-plain-toolbar-medium-disabled-fbg.gif)}.x-nbr .x-btn-plain-toolbar-medium{background-image:none}.x-btn-disabled.x-btn-plain-toolbar-medium{filter:alpha(opacity=50);opacity:.5}.x-btn-plain-toolbar-large{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:transparent}.x-btn-plain-toolbar-large-mc{background-image:url(images/btn/btn-plain-toolbar-large-fbg.gif);background-position:0 top;background-color:transparent}.x-nbr .x-btn-plain-toolbar-large{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-plain-toolbar-large-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-plain-toolbar-large-tl{background-position:0 -6px}.x-btn-plain-toolbar-large-tr{background-position:right -9px}.x-btn-plain-toolbar-large-bl{background-position:0 -12px}.x-btn-plain-toolbar-large-br{background-position:right -15px}.x-btn-plain-toolbar-large-ml{background-position:0 top}.x-btn-plain-toolbar-large-mr{background-position:right top}.x-btn-plain-toolbar-large-tc{background-position:0 0}.x-btn-plain-toolbar-large-bc{background-position:0 -3px}.x-btn-plain-toolbar-large-tr,.x-btn-plain-toolbar-large-br,.x-btn-plain-toolbar-large-mr{padding-right:3px}.x-btn-plain-toolbar-large-tl,.x-btn-plain-toolbar-large-bl,.x-btn-plain-toolbar-large-ml{padding-left:3px}.x-btn-plain-toolbar-large-tc{height:3px}.x-btn-plain-toolbar-large-bc{height:3px}.x-btn-plain-toolbar-large-mc{padding:1px 1px 1px 1px}.x-btn-plain-toolbar-large{border-color:transparent}.x-btn-button-plain-toolbar-large{height:32px}.x-btn-inner-plain-toolbar-large{font:bold 16px/20px helvetica,arial,verdana,sans-serif;color:#666;padding:0 10px;max-width:100%}.x-btn-icon-right>.x-btn-inner-plain-toolbar-large,.x-btn-icon-left>.x-btn-inner-plain-toolbar-large{max-width:calc(100% - 32px)}.x-btn-icon-el-plain-toolbar-large{height:32px}.x-btn-icon-left>.x-btn-icon-el-plain-toolbar-large,.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-large{width:32px}.x-btn-icon-top>.x-btn-icon-el-plain-toolbar-large,.x-btn-icon-bottom>.x-btn-icon-el-plain-toolbar-large{min-width:32px}.x-btn-icon-el-plain-toolbar-large.x-btn-glyph{font-size:32px;line-height:32px;color:#666;opacity:.5}.x-ie8 .x-btn-icon-el-plain-toolbar-large.x-btn-glyph{color:#b2b2b2}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-plain-toolbar-large{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-large{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-plain-toolbar-large{margin-bottom:5px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-plain-toolbar-large{margin-top:5px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-plain-toolbar-large{padding-right:10px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-large{margin-right:10px}.x-btn-arrow-bottom>.x-btn-button-plain-toolbar-large,.x-btn-split-bottom>.x-btn-button-plain-toolbar-large{padding-bottom:3px}.x-btn-wrap-plain-toolbar-large.x-btn-arrow-right:after{width:28px;padding-right:28px;background-image:url(images/button/plain-toolbar-large-arrow.png)}.x-btn-wrap-plain-toolbar-large.x-btn-arrow-bottom:after{height:20px;background-image:url(images/button/plain-toolbar-large-arrow.png)}.x-btn-wrap-plain-toolbar-large.x-btn-split-right:after{width:35px;padding-right:35px;background-image:url(images/button/plain-toolbar-large-s-arrow.png)}.x-btn-wrap-plain-toolbar-large.x-btn-split-bottom:after{height:29px;background-image:url(images/button/plain-toolbar-large-s-arrow-b.png)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-plain-toolbar-large{padding-right:10px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-plain-toolbar-large{margin-right:10px}.x-btn-focus.x-btn-plain-toolbar-large{background-image:none;background-color:transparent;-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn-over.x-btn-plain-toolbar-large{border-color:#d8d8d8;background-image:none;background-color:#ebebeb;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#ededed),color-stop(50%,#ebebeb),color-stop(51%,#dfdfdf),color-stop(100%,#ebebeb));background-image:-webkit-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-moz-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-o-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:-ms-linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb);background-image:linear-gradient(top,#ededed,#ebebeb 50%,#dfdfdf 51%,#ebebeb)}.x-btn-focus.x-btn-over.x-btn-plain-toolbar-large{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-menu-active.x-btn-plain-toolbar-large,.x-btn.x-btn-pressed.x-btn-plain-toolbar-large{border-color:#cecece;background-image:none;background-color:#e1e1e1;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#e1e1e1),color-stop(50%,#d5d5d5),color-stop(51%,#e1e1e1),color-stop(100%,#e4e4e4));background-image:-webkit-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-moz-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-o-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:-ms-linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4);background-image:linear-gradient(top,#e1e1e1,#d5d5d5 50%,#e1e1e1 51%,#e4e4e4)}.x-btn-focus.x-btn-menu-active.x-btn-plain-toolbar-large,.x-btn-focus.x-btn-pressed.x-btn-plain-toolbar-large{-webkit-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;-moz-box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset;box-shadow:#703131 0 1px 0 0 inset,#703131 0 -1px 0 0 inset,#703131 -1px 0 0 0 inset,#703131 1px 0 0 0 inset}.x-btn.x-btn-disabled.x-btn-plain-toolbar-large{background-image:none;background-color:transparent}.x-btn-focus .x-btn-plain-toolbar-large-tl,.x-btn-focus .x-btn-plain-toolbar-large-bl,.x-btn-focus .x-btn-plain-toolbar-large-tr,.x-btn-focus .x-btn-plain-toolbar-large-br,.x-btn-focus .x-btn-plain-toolbar-large-tc,.x-btn-focus .x-btn-plain-toolbar-large-bc{background-image:url(images/btn/btn-plain-toolbar-large-focus-corners.gif)}.x-btn-focus .x-btn-plain-toolbar-large-ml,.x-btn-focus .x-btn-plain-toolbar-large-mr{background-image:url(images/btn/btn-plain-toolbar-large-focus-sides.gif)}.x-btn-focus .x-btn-plain-toolbar-large-mc{background-color:transparent;background-image:url(images/btn/btn-plain-toolbar-large-focus-fbg.gif)}.x-btn-over .x-btn-plain-toolbar-large-tl,.x-btn-over .x-btn-plain-toolbar-large-bl,.x-btn-over .x-btn-plain-toolbar-large-tr,.x-btn-over .x-btn-plain-toolbar-large-br,.x-btn-over .x-btn-plain-toolbar-large-tc,.x-btn-over .x-btn-plain-toolbar-large-bc{background-image:url(images/btn/btn-plain-toolbar-large-over-corners.gif)}.x-btn-over .x-btn-plain-toolbar-large-ml,.x-btn-over .x-btn-plain-toolbar-large-mr{background-image:url(images/btn/btn-plain-toolbar-large-over-sides.gif)}.x-btn-over .x-btn-plain-toolbar-large-mc{background-color:#ebebeb;background-image:url(images/btn/btn-plain-toolbar-large-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-plain-toolbar-large-tl,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-large-bl,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-large-tr,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-large-br,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-large-tc,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-large-bc{background-image:url(images/btn/btn-plain-toolbar-large-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-plain-toolbar-large-ml,.x-btn-focus.x-btn-over .x-btn-plain-toolbar-large-mr{background-image:url(images/btn/btn-plain-toolbar-large-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-plain-toolbar-large-mc{background-color:#ebebeb;background-image:url(images/btn/btn-plain-toolbar-large-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-plain-toolbar-large-tl,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-large-bl,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-large-tr,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-large-br,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-large-tc,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-large-bc,.x-btn.x-btn-pressed .x-btn-plain-toolbar-large-tl,.x-btn.x-btn-pressed .x-btn-plain-toolbar-large-bl,.x-btn.x-btn-pressed .x-btn-plain-toolbar-large-tr,.x-btn.x-btn-pressed .x-btn-plain-toolbar-large-br,.x-btn.x-btn-pressed .x-btn-plain-toolbar-large-tc,.x-btn.x-btn-pressed .x-btn-plain-toolbar-large-bc{background-image:url(images/btn/btn-plain-toolbar-large-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-plain-toolbar-large-ml,.x-btn.x-btn-menu-active .x-btn-plain-toolbar-large-mr,.x-btn.x-btn-pressed .x-btn-plain-toolbar-large-ml,.x-btn.x-btn-pressed .x-btn-plain-toolbar-large-mr{background-image:url(images/btn/btn-plain-toolbar-large-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-plain-toolbar-large-mc,.x-btn.x-btn-pressed .x-btn-plain-toolbar-large-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-plain-toolbar-large-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-large-tl,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-large-bl,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-large-tr,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-large-br,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-large-tc,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-large-bc,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-large-tl,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-large-bl,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-large-tr,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-large-br,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-large-tc,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-large-bc{background-image:url(images/btn/btn-plain-toolbar-large-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-large-ml,.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-large-mr,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-large-ml,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-large-mr{background-image:url(images/btn/btn-plain-toolbar-large-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-plain-toolbar-large-mc,.x-btn-focus.x-btn-pressed .x-btn-plain-toolbar-large-mc{background-color:#e1e1e1;background-image:url(images/btn/btn-plain-toolbar-large-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-plain-toolbar-large-tl,.x-btn.x-btn-disabled .x-btn-plain-toolbar-large-bl,.x-btn.x-btn-disabled .x-btn-plain-toolbar-large-tr,.x-btn.x-btn-disabled .x-btn-plain-toolbar-large-br,.x-btn.x-btn-disabled .x-btn-plain-toolbar-large-tc,.x-btn.x-btn-disabled .x-btn-plain-toolbar-large-bc{background-image:url(images/btn/btn-plain-toolbar-large-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-plain-toolbar-large-ml,.x-btn.x-btn-disabled .x-btn-plain-toolbar-large-mr{background-image:url(images/btn/btn-plain-toolbar-large-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-plain-toolbar-large-mc{background-color:transparent;background-image:url(images/btn/btn-plain-toolbar-large-disabled-fbg.gif)}.x-nbr .x-btn-plain-toolbar-large{background-image:none}.x-btn-disabled.x-btn-plain-toolbar-large{filter:alpha(opacity=50);opacity:.5}.x-btn-plain-toolbar-small-disabled .x-btn-icon-el,.x-btn-plain-toolbar-medium-disabled .x-btn-icon-el,.x-btn-plain-toolbar-large-disabled .x-btn-icon-el{background-color:white}.x-ie8 .x-btn-plain-toolbar-small-disabled .x-btn-icon-el,.x-ie8 .x-btn-plain-toolbar-medium-disabled .x-btn-icon-el,.x-ie8 .x-btn-plain-toolbar-large-disabled .x-btn-icon-el{filter:alpha(opacity=50);opacity:.5}.x-panel-light{border-color:#e5dddd;padding:0}.x-panel-header-light{font-size:11px;border:1px solid #e5dddd}.x-panel-header-light .x-tool-img{background-image:url(images/tools/tool-sprites-dark.png);background-color:#e5dddd}.x-panel-header-light-horizontal{padding:9px 9px 10px 9px}.x-panel-header-light-horizontal .x-panel-header-light-tab-bar{margin-top:-9px;margin-bottom:-10px}.x-panel-header-light-horizontal.x-header-noborder{padding:10px 10px 10px 10px}.x-panel-header-light-horizontal.x-header-noborder .x-panel-header-light-tab-bar{margin-top:-10px;margin-bottom:-10px}.x-panel-header-light-vertical{padding:9px 9px 9px 10px}.x-panel-header-light-vertical .x-panel-header-light-tab-bar{margin-right:-9px;margin-left:-10px}.x-panel-header-light-vertical.x-header-noborder{padding:10px 10px 10px 10px}.x-panel-header-light-vertical.x-header-noborder .x-panel-header-light-tab-bar{margin-right:-10px;margin-left:-10px}.x-panel-header-title-light{color:#666;font-size:11px;font-weight:bold;font-family:helvetica,arial,verdana,sans-serif;line-height:16px}.x-panel-header-title-light>.x-title-text-light{text-transform:none;padding:0}.x-panel-header-title-light>.x-title-icon-wrap-light.x-title-icon-top{height:22px;padding-bottom:6px}.x-panel-header-title-light>.x-title-icon-wrap-light.x-title-icon-right{width:22px;padding-left:6px}.x-panel-header-title-light>.x-title-icon-wrap-light.x-title-icon-bottom{height:22px;padding-top:6px}.x-panel-header-title-light>.x-title-icon-wrap-light.x-title-icon-left{width:22px;padding-right:6px}.x-panel-header-title-light>.x-title-icon-wrap-light>.x-title-icon-light{width:16px;height:16px;background-position:center center}.x-panel-header-title-light>.x-title-icon-wrap-light>.x-title-glyph{color:white;font-size:16px;line-height:16px;opacity:.5}.x-ie8 .x-panel-header-title-light>.x-title-icon-wrap-light>.x-title-glyph{color:#f2eeee}.x-panel-body-light{background:white;border-color:#e5dddd;color:black;font-size:11px;font-weight:normal;font-family:helvetica,arial,verdana,sans-serif;border-width:1px;border-style:solid}.x-panel-header-light{background-image:none;background-color:#e5dddd}.x-panel-header-light-vertical{background-image:none;background-color:#e5dddd}.x-panel .x-panel-header-light-collapsed-border-top{border-bottom-width:1px!important}.x-panel .x-panel-header-light-collapsed-border-right{border-left-width:1px!important}.x-panel .x-panel-header-light-collapsed-border-bottom{border-top-width:1px!important}.x-panel .x-panel-header-light-collapsed-border-left{border-right-width:1px!important}.x-panel-header-light-horizontal .x-tool-after-title{margin:0 0 0 6px}.x-panel-header-light-horizontal .x-tool-before-title{margin:0 6px 0 0}.x-panel-header-light-vertical .x-tool-after-title{margin:6px 0 0 0}.x-panel-header-light-vertical .x-tool-before-title{margin:0 0 6px 0}.x-panel-light-resizable .x-panel-handle{filter:alpha(opacity=0);opacity:0}.x-panel-light-outer-border-l{border-left-color:#e5dddd!important;border-left-width:1px!important}.x-panel-light-outer-border-b{border-bottom-color:#e5dddd!important;border-bottom-width:1px!important}.x-panel-light-outer-border-bl{border-bottom-color:#e5dddd!important;border-bottom-width:1px!important;border-left-color:#e5dddd!important;border-left-width:1px!important}.x-panel-light-outer-border-r{border-right-color:#e5dddd!important;border-right-width:1px!important}.x-panel-light-outer-border-rl{border-right-color:#e5dddd!important;border-right-width:1px!important;border-left-color:#e5dddd!important;border-left-width:1px!important}.x-panel-light-outer-border-rb{border-right-color:#e5dddd!important;border-right-width:1px!important;border-bottom-color:#e5dddd!important;border-bottom-width:1px!important}.x-panel-light-outer-border-rbl{border-right-color:#e5dddd!important;border-right-width:1px!important;border-bottom-color:#e5dddd!important;border-bottom-width:1px!important;border-left-color:#e5dddd!important;border-left-width:1px!important}.x-panel-light-outer-border-t{border-top-color:#e5dddd!important;border-top-width:1px!important}.x-panel-light-outer-border-tl{border-top-color:#e5dddd!important;border-top-width:1px!important;border-left-color:#e5dddd!important;border-left-width:1px!important}.x-panel-light-outer-border-tb{border-top-color:#e5dddd!important;border-top-width:1px!important;border-bottom-color:#e5dddd!important;border-bottom-width:1px!important}.x-panel-light-outer-border-tbl{border-top-color:#e5dddd!important;border-top-width:1px!important;border-bottom-color:#e5dddd!important;border-bottom-width:1px!important;border-left-color:#e5dddd!important;border-left-width:1px!important}.x-panel-light-outer-border-tr{border-top-color:#e5dddd!important;border-top-width:1px!important;border-right-color:#e5dddd!important;border-right-width:1px!important}.x-panel-light-outer-border-trl{border-top-color:#e5dddd!important;border-top-width:1px!important;border-right-color:#e5dddd!important;border-right-width:1px!important;border-left-color:#e5dddd!important;border-left-width:1px!important}.x-panel-light-outer-border-trb{border-top-color:#e5dddd!important;border-top-width:1px!important;border-right-color:#e5dddd!important;border-right-width:1px!important;border-bottom-color:#e5dddd!important;border-bottom-width:1px!important}.x-panel-light-outer-border-trbl{border-color:#e5dddd!important;border-width:1px!important}.x-panel-light-framed{border-color:#e5dddd;padding:0}.x-panel-header-light-framed{font-size:11px;border:5px solid #e5dddd}.x-panel-header-light-framed .x-tool-img{background-image:url(images/tools/tool-sprites-dark.png);background-color:#e5dddd}.x-panel-header-light-framed-horizontal{padding:5px 5px 5px 5px}.x-panel-header-light-framed-horizontal .x-panel-header-light-framed-tab-bar{margin-top:-5px;margin-bottom:-5px}.x-panel-header-light-framed-horizontal.x-header-noborder{padding:10px 10px 5px 10px}.x-panel-header-light-framed-horizontal.x-header-noborder .x-panel-header-light-framed-tab-bar{margin-top:-10px;margin-bottom:-5px}.x-panel-header-light-framed-vertical{padding:5px 5px 5px 5px}.x-panel-header-light-framed-vertical .x-panel-header-light-framed-tab-bar{margin-right:-5px;margin-left:-5px}.x-panel-header-light-framed-vertical.x-header-noborder{padding:10px 10px 10px 5px}.x-panel-header-light-framed-vertical.x-header-noborder .x-panel-header-light-framed-tab-bar{margin-right:-10px;margin-left:-5px}.x-panel-header-title-light-framed{color:#666;font-size:11px;font-weight:bold;font-family:helvetica,arial,verdana,sans-serif;line-height:16px}.x-panel-header-title-light-framed>.x-title-text-light-framed{text-transform:none;padding:0}.x-panel-header-title-light-framed>.x-title-icon-wrap-light-framed.x-title-icon-top{height:22px;padding-bottom:6px}.x-panel-header-title-light-framed>.x-title-icon-wrap-light-framed.x-title-icon-right{width:22px;padding-left:6px}.x-panel-header-title-light-framed>.x-title-icon-wrap-light-framed.x-title-icon-bottom{height:22px;padding-top:6px}.x-panel-header-title-light-framed>.x-title-icon-wrap-light-framed.x-title-icon-left{width:22px;padding-right:6px}.x-panel-header-title-light-framed>.x-title-icon-wrap-light-framed>.x-title-icon-light-framed{width:16px;height:16px;background-position:center center}.x-panel-header-title-light-framed>.x-title-icon-wrap-light-framed>.x-title-glyph{color:white;font-size:16px;line-height:16px;opacity:.5}.x-ie8 .x-panel-header-title-light-framed>.x-title-icon-wrap-light-framed>.x-title-glyph{color:#f2eeee}.x-panel-body-light-framed{background:white;border-color:#e5dddd;color:black;font-size:11px;font-weight:normal;font-family:helvetica,arial,verdana,sans-serif;border-width:1px;border-style:solid}.x-panel-light-framed{-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;padding:0;border-width:5px;border-style:solid;background-color:white}.x-panel-light-framed-mc{background-color:white}.x-nbr .x-panel-light-framed{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-light-framed-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-0-0-0-0}.x-panel-light-framed-tl{background-position:0 -10px}.x-panel-light-framed-tr{background-position:right -15px}.x-panel-light-framed-bl{background-position:0 -20px}.x-panel-light-framed-br{background-position:right -25px}.x-panel-light-framed-ml{background-position:0 top}.x-panel-light-framed-mr{background-position:right top}.x-panel-light-framed-tc{background-position:0 0}.x-panel-light-framed-bc{background-position:0 -5px}.x-panel-light-framed-tr,.x-panel-light-framed-br,.x-panel-light-framed-mr{padding-right:5px}.x-panel-light-framed-tl,.x-panel-light-framed-bl,.x-panel-light-framed-ml{padding-left:5px}.x-panel-light-framed-tc{height:5px}.x-panel-light-framed-bc{height:5px}.x-panel-light-framed-tl,.x-panel-light-framed-bl,.x-panel-light-framed-tr,.x-panel-light-framed-br,.x-panel-light-framed-tc,.x-panel-light-framed-bc,.x-panel-light-framed-ml,.x-panel-light-framed-mr{background-image:url(images/panel/panel-light-framed-corners.gif)}.x-panel-light-framed-ml,.x-panel-light-framed-mr{background-image:url(images/panel/panel-light-framed-sides.gif);background-repeat:repeat-y}.x-panel-light-framed-mc{padding:0}.x-panel-header-light-framed-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 5px 5px;border-width:5px 5px 0 5px;border-style:solid;background-color:#e5dddd}.x-panel-header-light-framed-top-mc{background-color:#e5dddd}.x-nbr .x-panel-header-light-framed-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-light-framed-top-frameInfo{font-family:dh-5-5-0-5-5-5-0-5-5-5-5-5}.x-panel-header-light-framed-top-tl{background-position:0 -10px}.x-panel-header-light-framed-top-tr{background-position:right -15px}.x-panel-header-light-framed-top-bl{background-position:0 -20px}.x-panel-header-light-framed-top-br{background-position:right -25px}.x-panel-header-light-framed-top-ml{background-position:0 top}.x-panel-header-light-framed-top-mr{background-position:right top}.x-panel-header-light-framed-top-tc{background-position:0 0}.x-panel-header-light-framed-top-bc{background-position:0 -5px}.x-panel-header-light-framed-top-tr,.x-panel-header-light-framed-top-br,.x-panel-header-light-framed-top-mr{padding-right:5px}.x-panel-header-light-framed-top-tl,.x-panel-header-light-framed-top-bl,.x-panel-header-light-framed-top-ml{padding-left:5px}.x-panel-header-light-framed-top-tc{height:5px}.x-panel-header-light-framed-top-bc{height:0}.x-panel-header-light-framed-top-tl,.x-panel-header-light-framed-top-bl,.x-panel-header-light-framed-top-tr,.x-panel-header-light-framed-top-br,.x-panel-header-light-framed-top-tc,.x-panel-header-light-framed-top-bc,.x-panel-header-light-framed-top-ml,.x-panel-header-light-framed-top-mr{background-image:url(images/panel-header/panel-header-light-framed-top-corners.gif)}.x-panel-header-light-framed-top-ml,.x-panel-header-light-framed-top-mr{background-image:url(images/panel-header/panel-header-light-framed-top-sides.gif);background-repeat:repeat-y}.x-panel-header-light-framed-top-mc{padding:5px 5px 5px 5px}.x-panel-header-light-framed-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 5px 5px;border-width:5px 5px 5px 0;border-style:solid;background-color:#e5dddd}.x-panel-header-light-framed-right-mc{background-color:#e5dddd}.x-nbr .x-panel-header-light-framed-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-light-framed-right-frameInfo{font-family:dh-5-5-5-0-5-5-5-0-5-5-5-5}.x-panel-header-light-framed-right-tl{background-position:0 -10px}.x-panel-header-light-framed-right-tr{background-position:right -15px}.x-panel-header-light-framed-right-bl{background-position:0 -20px}.x-panel-header-light-framed-right-br{background-position:right -25px}.x-panel-header-light-framed-right-ml{background-position:right 0}.x-panel-header-light-framed-right-mr{background-position:right 0}.x-panel-header-light-framed-right-tc{background-position:0 0}.x-panel-header-light-framed-right-bc{background-position:0 -5px}.x-panel-header-light-framed-right-tr,.x-panel-header-light-framed-right-br,.x-panel-header-light-framed-right-mr{padding-right:5px}.x-panel-header-light-framed-right-tl,.x-panel-header-light-framed-right-bl,.x-panel-header-light-framed-right-ml{padding-left:0}.x-panel-header-light-framed-right-tc{height:5px}.x-panel-header-light-framed-right-bc{height:5px}.x-panel-header-light-framed-right-tl,.x-panel-header-light-framed-right-bl,.x-panel-header-light-framed-right-tr,.x-panel-header-light-framed-right-br,.x-panel-header-light-framed-right-tc,.x-panel-header-light-framed-right-bc,.x-panel-header-light-framed-right-ml,.x-panel-header-light-framed-right-mr{background-image:url(images/panel-header/panel-header-light-framed-right-corners.gif)}.x-panel-header-light-framed-right-ml,.x-panel-header-light-framed-right-mr{background-image:url(images/panel-header/panel-header-light-framed-right-sides.gif);background-repeat:repeat-y}.x-panel-header-light-framed-right-mc{padding:5px 5px 5px 5px}.x-panel-header-light-framed-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:0 5px 5px 5px;border-style:solid;background-color:#e5dddd}.x-panel-header-light-framed-bottom-mc{background-color:#e5dddd}.x-nbr .x-panel-header-light-framed-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-light-framed-bottom-frameInfo{font-family:dh-0-5-5-5-0-5-5-5-5-5-5-5}.x-panel-header-light-framed-bottom-tl{background-position:0 -10px}.x-panel-header-light-framed-bottom-tr{background-position:right -15px}.x-panel-header-light-framed-bottom-bl{background-position:0 -20px}.x-panel-header-light-framed-bottom-br{background-position:right -25px}.x-panel-header-light-framed-bottom-ml{background-position:0 bottom}.x-panel-header-light-framed-bottom-mr{background-position:right bottom}.x-panel-header-light-framed-bottom-tc{background-position:0 0}.x-panel-header-light-framed-bottom-bc{background-position:0 -5px}.x-panel-header-light-framed-bottom-tr,.x-panel-header-light-framed-bottom-br,.x-panel-header-light-framed-bottom-mr{padding-right:5px}.x-panel-header-light-framed-bottom-tl,.x-panel-header-light-framed-bottom-bl,.x-panel-header-light-framed-bottom-ml{padding-left:5px}.x-panel-header-light-framed-bottom-tc{height:0}.x-panel-header-light-framed-bottom-bc{height:5px}.x-panel-header-light-framed-bottom-tl,.x-panel-header-light-framed-bottom-bl,.x-panel-header-light-framed-bottom-tr,.x-panel-header-light-framed-bottom-br,.x-panel-header-light-framed-bottom-tc,.x-panel-header-light-framed-bottom-bc,.x-panel-header-light-framed-bottom-ml,.x-panel-header-light-framed-bottom-mr{background-image:url(images/panel-header/panel-header-light-framed-bottom-corners.gif)}.x-panel-header-light-framed-bottom-ml,.x-panel-header-light-framed-bottom-mr{background-image:url(images/panel-header/panel-header-light-framed-bottom-sides.gif);background-repeat:repeat-y}.x-panel-header-light-framed-bottom-mc{padding:5px 5px 5px 5px}.x-panel-header-light-framed-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px 0 5px 5px;border-style:solid;background-color:#e5dddd}.x-panel-header-light-framed-left-mc{background-color:#e5dddd}.x-nbr .x-panel-header-light-framed-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-light-framed-left-frameInfo{font-family:dh-5-0-5-5-5-0-5-5-5-5-5-5}.x-panel-header-light-framed-left-tl{background-position:0 -10px}.x-panel-header-light-framed-left-tr{background-position:right -15px}.x-panel-header-light-framed-left-bl{background-position:0 -20px}.x-panel-header-light-framed-left-br{background-position:right -25px}.x-panel-header-light-framed-left-ml{background-position:left 0}.x-panel-header-light-framed-left-mr{background-position:left 0}.x-panel-header-light-framed-left-tc{background-position:0 0}.x-panel-header-light-framed-left-bc{background-position:0 -5px}.x-panel-header-light-framed-left-tr,.x-panel-header-light-framed-left-br,.x-panel-header-light-framed-left-mr{padding-right:0}.x-panel-header-light-framed-left-tl,.x-panel-header-light-framed-left-bl,.x-panel-header-light-framed-left-ml{padding-left:5px}.x-panel-header-light-framed-left-tc{height:5px}.x-panel-header-light-framed-left-bc{height:5px}.x-panel-header-light-framed-left-tl,.x-panel-header-light-framed-left-bl,.x-panel-header-light-framed-left-tr,.x-panel-header-light-framed-left-br,.x-panel-header-light-framed-left-tc,.x-panel-header-light-framed-left-bc,.x-panel-header-light-framed-left-ml,.x-panel-header-light-framed-left-mr{background-image:url(images/panel-header/panel-header-light-framed-left-corners.gif)}.x-panel-header-light-framed-left-ml,.x-panel-header-light-framed-left-mr{background-image:url(images/panel-header/panel-header-light-framed-left-sides.gif);background-repeat:repeat-y}.x-panel-header-light-framed-left-mc{padding:5px 5px 5px 5px}.x-panel-header-light-framed-collapsed-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#e5dddd}.x-panel-header-light-framed-collapsed-top-mc{background-color:#e5dddd}.x-nbr .x-panel-header-light-framed-collapsed-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-light-framed-collapsed-top-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-panel-header-light-framed-collapsed-top-tl{background-position:0 -10px}.x-panel-header-light-framed-collapsed-top-tr{background-position:right -15px}.x-panel-header-light-framed-collapsed-top-bl{background-position:0 -20px}.x-panel-header-light-framed-collapsed-top-br{background-position:right -25px}.x-panel-header-light-framed-collapsed-top-ml{background-position:0 top}.x-panel-header-light-framed-collapsed-top-mr{background-position:right top}.x-panel-header-light-framed-collapsed-top-tc{background-position:0 0}.x-panel-header-light-framed-collapsed-top-bc{background-position:0 -5px}.x-panel-header-light-framed-collapsed-top-tr,.x-panel-header-light-framed-collapsed-top-br,.x-panel-header-light-framed-collapsed-top-mr{padding-right:5px}.x-panel-header-light-framed-collapsed-top-tl,.x-panel-header-light-framed-collapsed-top-bl,.x-panel-header-light-framed-collapsed-top-ml{padding-left:5px}.x-panel-header-light-framed-collapsed-top-tc{height:5px}.x-panel-header-light-framed-collapsed-top-bc{height:5px}.x-panel-header-light-framed-collapsed-top-tl,.x-panel-header-light-framed-collapsed-top-bl,.x-panel-header-light-framed-collapsed-top-tr,.x-panel-header-light-framed-collapsed-top-br,.x-panel-header-light-framed-collapsed-top-tc,.x-panel-header-light-framed-collapsed-top-bc,.x-panel-header-light-framed-collapsed-top-ml,.x-panel-header-light-framed-collapsed-top-mr{background-image:url(images/panel-header/panel-header-light-framed-collapsed-top-corners.gif)}.x-panel-header-light-framed-collapsed-top-ml,.x-panel-header-light-framed-collapsed-top-mr{background-image:url(images/panel-header/panel-header-light-framed-collapsed-top-sides.gif);background-repeat:repeat-y}.x-panel-header-light-framed-collapsed-top-mc{padding:5px 5px 5px 5px}.x-panel-header-light-framed-collapsed-right{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#e5dddd}.x-panel-header-light-framed-collapsed-right-mc{background-color:#e5dddd}.x-nbr .x-panel-header-light-framed-collapsed-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-light-framed-collapsed-right-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-panel-header-light-framed-collapsed-right-tl{background-position:0 -10px}.x-panel-header-light-framed-collapsed-right-tr{background-position:right -15px}.x-panel-header-light-framed-collapsed-right-bl{background-position:0 -20px}.x-panel-header-light-framed-collapsed-right-br{background-position:right -25px}.x-panel-header-light-framed-collapsed-right-ml{background-position:right 0}.x-panel-header-light-framed-collapsed-right-mr{background-position:right 0}.x-panel-header-light-framed-collapsed-right-tc{background-position:0 0}.x-panel-header-light-framed-collapsed-right-bc{background-position:0 -5px}.x-panel-header-light-framed-collapsed-right-tr,.x-panel-header-light-framed-collapsed-right-br,.x-panel-header-light-framed-collapsed-right-mr{padding-right:5px}.x-panel-header-light-framed-collapsed-right-tl,.x-panel-header-light-framed-collapsed-right-bl,.x-panel-header-light-framed-collapsed-right-ml{padding-left:5px}.x-panel-header-light-framed-collapsed-right-tc{height:5px}.x-panel-header-light-framed-collapsed-right-bc{height:5px}.x-panel-header-light-framed-collapsed-right-tl,.x-panel-header-light-framed-collapsed-right-bl,.x-panel-header-light-framed-collapsed-right-tr,.x-panel-header-light-framed-collapsed-right-br,.x-panel-header-light-framed-collapsed-right-tc,.x-panel-header-light-framed-collapsed-right-bc,.x-panel-header-light-framed-collapsed-right-ml,.x-panel-header-light-framed-collapsed-right-mr{background-image:url(images/panel-header/panel-header-light-framed-collapsed-right-corners.gif)}.x-panel-header-light-framed-collapsed-right-ml,.x-panel-header-light-framed-collapsed-right-mr{background-image:url(images/panel-header/panel-header-light-framed-collapsed-right-sides.gif);background-repeat:repeat-y}.x-panel-header-light-framed-collapsed-right-mc{padding:5px 5px 5px 5px}.x-panel-header-light-framed-collapsed-bottom{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#e5dddd}.x-panel-header-light-framed-collapsed-bottom-mc{background-color:#e5dddd}.x-nbr .x-panel-header-light-framed-collapsed-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-light-framed-collapsed-bottom-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-panel-header-light-framed-collapsed-bottom-tl{background-position:0 -10px}.x-panel-header-light-framed-collapsed-bottom-tr{background-position:right -15px}.x-panel-header-light-framed-collapsed-bottom-bl{background-position:0 -20px}.x-panel-header-light-framed-collapsed-bottom-br{background-position:right -25px}.x-panel-header-light-framed-collapsed-bottom-ml{background-position:0 bottom}.x-panel-header-light-framed-collapsed-bottom-mr{background-position:right bottom}.x-panel-header-light-framed-collapsed-bottom-tc{background-position:0 0}.x-panel-header-light-framed-collapsed-bottom-bc{background-position:0 -5px}.x-panel-header-light-framed-collapsed-bottom-tr,.x-panel-header-light-framed-collapsed-bottom-br,.x-panel-header-light-framed-collapsed-bottom-mr{padding-right:5px}.x-panel-header-light-framed-collapsed-bottom-tl,.x-panel-header-light-framed-collapsed-bottom-bl,.x-panel-header-light-framed-collapsed-bottom-ml{padding-left:5px}.x-panel-header-light-framed-collapsed-bottom-tc{height:5px}.x-panel-header-light-framed-collapsed-bottom-bc{height:5px}.x-panel-header-light-framed-collapsed-bottom-tl,.x-panel-header-light-framed-collapsed-bottom-bl,.x-panel-header-light-framed-collapsed-bottom-tr,.x-panel-header-light-framed-collapsed-bottom-br,.x-panel-header-light-framed-collapsed-bottom-tc,.x-panel-header-light-framed-collapsed-bottom-bc,.x-panel-header-light-framed-collapsed-bottom-ml,.x-panel-header-light-framed-collapsed-bottom-mr{background-image:url(images/panel-header/panel-header-light-framed-collapsed-bottom-corners.gif)}.x-panel-header-light-framed-collapsed-bottom-ml,.x-panel-header-light-framed-collapsed-bottom-mr{background-image:url(images/panel-header/panel-header-light-framed-collapsed-bottom-sides.gif);background-repeat:repeat-y}.x-panel-header-light-framed-collapsed-bottom-mc{padding:5px 5px 5px 5px}.x-panel-header-light-framed-collapsed-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:5px;border-style:solid;background-color:#e5dddd}.x-panel-header-light-framed-collapsed-left-mc{background-color:#e5dddd}.x-nbr .x-panel-header-light-framed-collapsed-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-header-light-framed-collapsed-left-frameInfo{font-family:dh-5-5-5-5-5-5-5-5-5-5-5-5}.x-panel-header-light-framed-collapsed-left-tl{background-position:0 -10px}.x-panel-header-light-framed-collapsed-left-tr{background-position:right -15px}.x-panel-header-light-framed-collapsed-left-bl{background-position:0 -20px}.x-panel-header-light-framed-collapsed-left-br{background-position:right -25px}.x-panel-header-light-framed-collapsed-left-ml{background-position:left 0}.x-panel-header-light-framed-collapsed-left-mr{background-position:left 0}.x-panel-header-light-framed-collapsed-left-tc{background-position:0 0}.x-panel-header-light-framed-collapsed-left-bc{background-position:0 -5px}.x-panel-header-light-framed-collapsed-left-tr,.x-panel-header-light-framed-collapsed-left-br,.x-panel-header-light-framed-collapsed-left-mr{padding-right:5px}.x-panel-header-light-framed-collapsed-left-tl,.x-panel-header-light-framed-collapsed-left-bl,.x-panel-header-light-framed-collapsed-left-ml{padding-left:5px}.x-panel-header-light-framed-collapsed-left-tc{height:5px}.x-panel-header-light-framed-collapsed-left-bc{height:5px}.x-panel-header-light-framed-collapsed-left-tl,.x-panel-header-light-framed-collapsed-left-bl,.x-panel-header-light-framed-collapsed-left-tr,.x-panel-header-light-framed-collapsed-left-br,.x-panel-header-light-framed-collapsed-left-tc,.x-panel-header-light-framed-collapsed-left-bc,.x-panel-header-light-framed-collapsed-left-ml,.x-panel-header-light-framed-collapsed-left-mr{background-image:url(images/panel-header/panel-header-light-framed-collapsed-left-corners.gif)}.x-panel-header-light-framed-collapsed-left-ml,.x-panel-header-light-framed-collapsed-left-mr{background-image:url(images/panel-header/panel-header-light-framed-collapsed-left-sides.gif);background-repeat:repeat-y}.x-panel-header-light-framed-collapsed-left-mc{padding:5px 5px 5px 5px}.x-panel .x-panel-header-light-framed-top{border-bottom-width:5px!important}.x-panel .x-panel-header-light-framed-right{border-left-width:5px!important}.x-panel .x-panel-header-light-framed-bottom{border-top-width:5px!important}.x-panel .x-panel-header-light-framed-left{border-right-width:5px!important}.x-nbr .x-panel-header-light-framed-collapsed-top{border-bottom-width:0!important}.x-nbr .x-panel-header-light-framed-collapsed-right{border-left-width:0!important}.x-nbr .x-panel-header-light-framed-collapsed-bottom{border-top-width:0!important}.x-nbr .x-panel-header-light-framed-collapsed-left{border-right-width:0!important}.x-panel-header-light-framed-horizontal .x-tool-after-title{margin:0 0 0 6px}.x-panel-header-light-framed-horizontal .x-tool-before-title{margin:0 6px 0 0}.x-panel-header-light-framed-vertical .x-tool-after-title{margin:6px 0 0 0}.x-panel-header-light-framed-vertical .x-tool-before-title{margin:0 0 6px 0}.x-panel-light-framed-resizable{overflow:visible}.x-panel-light-framed-resizable .x-panel-handle{filter:alpha(opacity=0);opacity:0}.x-panel-light-framed-resizable .x-panel-handle-north-br{top:-5px}.x-panel-light-framed-resizable .x-panel-handle-south-br{bottom:-5px}.x-panel-light-framed-resizable .x-panel-handle-east-br{right:-5px}.x-panel-light-framed-resizable .x-panel-handle-west-br{left:-5px}.x-panel-light-framed-resizable .x-panel-handle-northwest-br{left:-5px;top:-5px}.x-panel-light-framed-resizable .x-panel-handle-northeast-br{right:-5px;top:-5px}.x-panel-light-framed-resizable .x-panel-handle-southeast-br{right:-5px;bottom:-5px}.x-panel-light-framed-resizable .x-panel-handle-southwest-br{left:-5px;bottom:-5px}.x-panel-light-framed-outer-border-l{border-left-color:#e5dddd!important;border-left-width:5px!important}.x-panel-light-framed-outer-border-b{border-bottom-color:#e5dddd!important;border-bottom-width:5px!important}.x-panel-light-framed-outer-border-bl{border-bottom-color:#e5dddd!important;border-bottom-width:5px!important;border-left-color:#e5dddd!important;border-left-width:5px!important}.x-panel-light-framed-outer-border-r{border-right-color:#e5dddd!important;border-right-width:5px!important}.x-panel-light-framed-outer-border-rl{border-right-color:#e5dddd!important;border-right-width:5px!important;border-left-color:#e5dddd!important;border-left-width:5px!important}.x-panel-light-framed-outer-border-rb{border-right-color:#e5dddd!important;border-right-width:5px!important;border-bottom-color:#e5dddd!important;border-bottom-width:5px!important}.x-panel-light-framed-outer-border-rbl{border-right-color:#e5dddd!important;border-right-width:5px!important;border-bottom-color:#e5dddd!important;border-bottom-width:5px!important;border-left-color:#e5dddd!important;border-left-width:5px!important}.x-panel-light-framed-outer-border-t{border-top-color:#e5dddd!important;border-top-width:5px!important}.x-panel-light-framed-outer-border-tl{border-top-color:#e5dddd!important;border-top-width:5px!important;border-left-color:#e5dddd!important;border-left-width:5px!important}.x-panel-light-framed-outer-border-tb{border-top-color:#e5dddd!important;border-top-width:5px!important;border-bottom-color:#e5dddd!important;border-bottom-width:5px!important}.x-panel-light-framed-outer-border-tbl{border-top-color:#e5dddd!important;border-top-width:5px!important;border-bottom-color:#e5dddd!important;border-bottom-width:5px!important;border-left-color:#e5dddd!important;border-left-width:5px!important}.x-panel-light-framed-outer-border-tr{border-top-color:#e5dddd!important;border-top-width:5px!important;border-right-color:#e5dddd!important;border-right-width:5px!important}.x-panel-light-framed-outer-border-trl{border-top-color:#e5dddd!important;border-top-width:5px!important;border-right-color:#e5dddd!important;border-right-width:5px!important;border-left-color:#e5dddd!important;border-left-width:5px!important}.x-panel-light-framed-outer-border-trb{border-top-color:#e5dddd!important;border-top-width:5px!important;border-right-color:#e5dddd!important;border-right-width:5px!important;border-bottom-color:#e5dddd!important;border-bottom-width:5px!important}.x-panel-light-framed-outer-border-trbl{border-color:#e5dddd!important;border-width:5px!important}.x-grid-header-ct{border:1px solid #c1c1c1}.x-column-header-trigger{background:#f2eded url(images/grid/hd-pop.png) no-repeat center center;border-left:1px solid #c1c1c1}.x-column-header-last{border-right-width:0}.x-column-header-last .x-column-header-over .x-column-header-trigger{border-right:1px solid #c1c1c1}.x-resizable-handle{background-color:#c1c1c1;background-repeat:no-repeat}.x-resizable-handle-east-over,.x-resizable-handle-west-over{background-position:center}.x-resizable-handle-south-over,.x-resizable-handle-north-over{background-position:center}.x-resizable-handle-southeast-over{background-position:-2px -2px}.x-resizable-handle-northwest-over{background-position:2px 2px}.x-resizable-handle-northeast-over{background-position:-2px 2px}.x-resizable-handle-southwest-over{background-position:2px -2px}.x-resizable-pinned .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-west{background-position:center}.x-resizable-pinned .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-north{background-position:center}.x-resizable-pinned .x-resizable-handle-southeast{background-position:-2px -2px}.x-resizable-pinned .x-resizable-handle-northwest{background-position:2px 2px}.x-resizable-pinned .x-resizable-handle-northeast{background-position:-2px 2px}.x-resizable-pinned .x-resizable-handle-southwest{background-position:2px -2px} \ No newline at end of file diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/boundlist/trigger-arrow.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/boundlist/trigger-arrow.png deleted file mode 100644 index 11daac3d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/boundlist/trigger-arrow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/corners-blue.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/box/corners-blue.gif deleted file mode 100644 index fa419b50..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/corners-blue.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/box/corners.gif deleted file mode 100644 index 8aa8cae5..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/l-blue.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/box/l-blue.gif deleted file mode 100644 index 5ed7f004..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/l-blue.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/l.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/box/l.gif deleted file mode 100644 index 0160f97f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/l.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/r-blue.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/box/r-blue.gif deleted file mode 100644 index 3ea5cae3..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/r-blue.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/r.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/box/r.gif deleted file mode 100644 index 34237f62..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/r.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/tb-blue.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/box/tb-blue.gif deleted file mode 100644 index 562fecca..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/tb-blue.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/tb.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/box/tb.gif deleted file mode 100644 index 435889bf..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/box/tb.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow-open-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow-open-rtl.gif deleted file mode 100644 index b8c55c37..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow-open-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow-open.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow-open.gif deleted file mode 100644 index 3ab4f71a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow-open.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow-rtl.gif deleted file mode 100644 index e54eacbe..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow.gif deleted file mode 100644 index b0221875..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-arrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-scroll-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-scroll-left.gif deleted file mode 100644 index 2db8cf5c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-scroll-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-scroll-right.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-scroll-right.gif deleted file mode 100644 index 5d5a7ab5..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-scroll-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-open-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-open-rtl.gif deleted file mode 100644 index 8593bb78..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-open-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-open.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-open.gif deleted file mode 100644 index 23c70b3f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-open.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-over-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-over-rtl.gif deleted file mode 100644 index 05790c35..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-over-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-over.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-over.gif deleted file mode 100644 index 3f9bd609..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-over.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-rtl.gif deleted file mode 100644 index 67cbf4b6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow.gif deleted file mode 100644 index 6b50863a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/breadcrumb/default-split-arrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-corners.gif deleted file mode 100644 index 049f8a66..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-notitle-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-notitle-corners.gif deleted file mode 100644 index 049f8a66..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-notitle-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-notitle-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-notitle-sides.gif deleted file mode 100644 index e7c9480e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-notitle-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-sides.gif deleted file mode 100644 index 17149958..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn-group/btn-group-default-framed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-corners.gif deleted file mode 100644 index db044654..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-disabled-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-disabled-corners.gif deleted file mode 100644 index 65a7b9e7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-disabled-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-disabled-fbg.gif deleted file mode 100644 index 3259bafe..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-disabled-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-disabled-sides.gif deleted file mode 100644 index 1ef57a61..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-fbg.gif deleted file mode 100644 index 346d491b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-corners.gif deleted file mode 100644 index 2f4aec09..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-fbg.gif deleted file mode 100644 index 42f02696..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-over-corners.gif deleted file mode 100644 index 2f4aec09..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-over-fbg.gif deleted file mode 100644 index 42f02696..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-over-sides.gif deleted file mode 100644 index 7228fc08..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-pressed-corners.gif deleted file mode 100644 index 36e7d8c6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-pressed-fbg.gif deleted file mode 100644 index 11268b70..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-pressed-sides.gif deleted file mode 100644 index bfe23769..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-sides.gif deleted file mode 100644 index 7228fc08..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-over-corners.gif deleted file mode 100644 index 2f4aec09..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-over-fbg.gif deleted file mode 100644 index 42f02696..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-over-sides.gif deleted file mode 100644 index 7228fc08..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-pressed-corners.gif deleted file mode 100644 index 36e7d8c6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-pressed-fbg.gif deleted file mode 100644 index 11268b70..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-pressed-sides.gif deleted file mode 100644 index bfe23769..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-sides.gif deleted file mode 100644 index b9f47771..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-large-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-corners.gif deleted file mode 100644 index db044654..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-disabled-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-disabled-corners.gif deleted file mode 100644 index 65a7b9e7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-disabled-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-disabled-fbg.gif deleted file mode 100644 index 716d6421..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-disabled-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-disabled-sides.gif deleted file mode 100644 index 74c933f1..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-fbg.gif deleted file mode 100644 index 8cbb503b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-corners.gif deleted file mode 100644 index 2f4aec09..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-fbg.gif deleted file mode 100644 index 8f585ede..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-over-corners.gif deleted file mode 100644 index 2f4aec09..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-over-fbg.gif deleted file mode 100644 index 8f585ede..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-over-sides.gif deleted file mode 100644 index 7d75be5e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-pressed-corners.gif deleted file mode 100644 index 36e7d8c6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-pressed-fbg.gif deleted file mode 100644 index bb8fc6b2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-pressed-sides.gif deleted file mode 100644 index c975dad8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-sides.gif deleted file mode 100644 index 7d75be5e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-over-corners.gif deleted file mode 100644 index 2f4aec09..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-over-fbg.gif deleted file mode 100644 index 8f585ede..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-over-sides.gif deleted file mode 100644 index 7d75be5e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-pressed-corners.gif deleted file mode 100644 index 36e7d8c6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-pressed-fbg.gif deleted file mode 100644 index bb8fc6b2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-pressed-sides.gif deleted file mode 100644 index c975dad8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-sides.gif deleted file mode 100644 index cf6da871..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-medium-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-corners.gif deleted file mode 100644 index 307913cb..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-disabled-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-disabled-corners.gif deleted file mode 100644 index 65a7b9e7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-disabled-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-disabled-fbg.gif deleted file mode 100644 index 223c1261..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-disabled-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-disabled-sides.gif deleted file mode 100644 index ddb20190..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-fbg.gif deleted file mode 100644 index 16a04a4f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-corners.gif deleted file mode 100644 index 25a9e7a6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-fbg.gif deleted file mode 100644 index 4febe541..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-over-corners.gif deleted file mode 100644 index 2f4aec09..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-over-fbg.gif deleted file mode 100644 index 4febe541..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-over-sides.gif deleted file mode 100644 index 0baef7a8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-pressed-corners.gif deleted file mode 100644 index 6483b245..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-pressed-fbg.gif deleted file mode 100644 index b809e56b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-pressed-sides.gif deleted file mode 100644 index 36c717d2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-sides.gif deleted file mode 100644 index 0baef7a8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-over-corners.gif deleted file mode 100644 index f8be1d9a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-over-fbg.gif deleted file mode 100644 index 4febe541..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-over-sides.gif deleted file mode 100644 index 0baef7a8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-pressed-corners.gif deleted file mode 100644 index 6483b245..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-pressed-fbg.gif deleted file mode 100644 index b809e56b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-pressed-sides.gif deleted file mode 100644 index 36c717d2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-sides.gif deleted file mode 100644 index 129eb8a5..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-small-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-disabled-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-disabled-corners.gif deleted file mode 100644 index 786bcc9d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-disabled-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-disabled-fbg.gif deleted file mode 100644 index 48a5a75c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-disabled-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-disabled-sides.gif deleted file mode 100644 index 51e74c41..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-corners.gif deleted file mode 100644 index 0cca1ff0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-fbg.gif deleted file mode 100644 index 42f02696..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-over-corners.gif deleted file mode 100644 index 0cca1ff0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-over-fbg.gif deleted file mode 100644 index 42f02696..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-over-sides.gif deleted file mode 100644 index 7228fc08..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-pressed-corners.gif deleted file mode 100644 index 2acf3b18..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-pressed-fbg.gif deleted file mode 100644 index 11268b70..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-pressed-sides.gif deleted file mode 100644 index bfe23769..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-sides.gif deleted file mode 100644 index 7228fc08..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-over-corners.gif deleted file mode 100644 index 0cca1ff0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-over-fbg.gif deleted file mode 100644 index 42f02696..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-over-sides.gif deleted file mode 100644 index 7228fc08..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-pressed-corners.gif deleted file mode 100644 index 2acf3b18..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-pressed-fbg.gif deleted file mode 100644 index 11268b70..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-pressed-sides.gif deleted file mode 100644 index bfe23769..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-large-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-disabled-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-disabled-corners.gif deleted file mode 100644 index 786bcc9d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-disabled-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-disabled-fbg.gif deleted file mode 100644 index 48a5a75c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-disabled-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-disabled-sides.gif deleted file mode 100644 index 51e74c41..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-corners.gif deleted file mode 100644 index 0cca1ff0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-fbg.gif deleted file mode 100644 index 8f585ede..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-over-corners.gif deleted file mode 100644 index 0cca1ff0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-over-fbg.gif deleted file mode 100644 index 8f585ede..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-over-sides.gif deleted file mode 100644 index 7d75be5e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-pressed-corners.gif deleted file mode 100644 index 2acf3b18..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-pressed-fbg.gif deleted file mode 100644 index bb8fc6b2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-pressed-sides.gif deleted file mode 100644 index c975dad8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-sides.gif deleted file mode 100644 index 7d75be5e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-over-corners.gif deleted file mode 100644 index 0cca1ff0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-over-fbg.gif deleted file mode 100644 index 8f585ede..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-over-sides.gif deleted file mode 100644 index 7d75be5e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-pressed-corners.gif deleted file mode 100644 index 2acf3b18..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-pressed-fbg.gif deleted file mode 100644 index bb8fc6b2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-pressed-sides.gif deleted file mode 100644 index c975dad8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-medium-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-disabled-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-disabled-corners.gif deleted file mode 100644 index 786bcc9d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-disabled-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-disabled-fbg.gif deleted file mode 100644 index 48a5a75c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-disabled-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-disabled-sides.gif deleted file mode 100644 index 51e74c41..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-corners.gif deleted file mode 100644 index 0cca1ff0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-fbg.gif deleted file mode 100644 index 4febe541..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-over-corners.gif deleted file mode 100644 index 0cca1ff0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-over-fbg.gif deleted file mode 100644 index 4febe541..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-over-sides.gif deleted file mode 100644 index 0baef7a8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-pressed-corners.gif deleted file mode 100644 index e75afb67..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-pressed-fbg.gif deleted file mode 100644 index b809e56b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-pressed-sides.gif deleted file mode 100644 index 36c717d2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-sides.gif deleted file mode 100644 index 0baef7a8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-over-corners.gif deleted file mode 100644 index 0f500ebb..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-over-fbg.gif deleted file mode 100644 index 4febe541..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-over-sides.gif deleted file mode 100644 index 0baef7a8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-pressed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-pressed-corners.gif deleted file mode 100644 index e75afb67..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-pressed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-pressed-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-pressed-fbg.gif deleted file mode 100644 index b809e56b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-pressed-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-pressed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-pressed-sides.gif deleted file mode 100644 index 36c717d2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/btn/btn-default-toolbar-small-pressed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/arrow-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/arrow-rtl.gif deleted file mode 100644 index b8c55c37..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/arrow-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/arrow.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/arrow.gif deleted file mode 100644 index 3ab4f71a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/arrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/btn-arrow.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/btn-arrow.gif deleted file mode 100644 index f90d5df4..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/btn-arrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/btn-sprite.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/btn-sprite.gif deleted file mode 100644 index 834ff978..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/btn-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/btn.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/btn.gif deleted file mode 100644 index 96ea61ab..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/btn.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/group-cs.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/group-cs.gif deleted file mode 100644 index 7059e2b0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/group-cs.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/group-lr.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/group-lr.gif deleted file mode 100644 index 3f41fbd8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/group-lr.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/group-tb.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/group-tb.gif deleted file mode 100644 index c5ea8cab..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/group-tb.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-b-noline.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-b-noline.gif deleted file mode 100644 index a4220ee9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-b-noline.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-b.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-b.gif deleted file mode 100644 index 5b46305b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-b.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-bo.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-bo.gif deleted file mode 100644 index ed6eeca0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-bo.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-light-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-light-rtl.gif deleted file mode 100644 index cfa5ca3b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-light-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-light.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-light.gif deleted file mode 100644 index 08783c9d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-light.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-noline-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-noline-rtl.gif deleted file mode 100644 index c242ef2f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-noline-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-noline.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-noline.gif deleted file mode 100644 index 0953eab5..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-noline.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-o-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-o-rtl.gif deleted file mode 100644 index badb3f89..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-o-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-o.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-o.gif deleted file mode 100644 index b6ca4688..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-o.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-rtl.gif deleted file mode 100644 index da278f51..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow.gif deleted file mode 100644 index 5692b8ac..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/button/s-arrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/datepicker/datepicker-footer-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/datepicker/datepicker-footer-bg.gif deleted file mode 100644 index 2d8439ac..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/datepicker/datepicker-footer-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/datepicker/datepicker-header-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/datepicker/datepicker-header-bg.gif deleted file mode 100644 index 9ab1df39..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/datepicker/datepicker-header-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/dd/drop-add.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/dd/drop-add.gif deleted file mode 100644 index b22cd144..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/dd/drop-add.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/dd/drop-no.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/dd/drop-no.gif deleted file mode 100644 index 08d08335..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/dd/drop-no.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/dd/drop-yes.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/dd/drop-yes.gif deleted file mode 100644 index 8aacb307..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/dd/drop-yes.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/editor/tb-sprite.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/editor/tb-sprite.gif deleted file mode 100644 index fb705776..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/editor/tb-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/box-select-item-close.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/box-select-item-close.gif deleted file mode 100644 index 98d5da95..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/box-select-item-close.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/checkbox.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/checkbox.gif deleted file mode 100644 index 835b346c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/checkbox.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/clear-trigger-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/clear-trigger-rtl.gif deleted file mode 100644 index 940399aa..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/clear-trigger-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/clear-trigger.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/clear-trigger.gif deleted file mode 100644 index be3ff587..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/clear-trigger.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/date-trigger-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/date-trigger-rtl.gif deleted file mode 100644 index 63597658..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/date-trigger-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/date-trigger.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/date-trigger.gif deleted file mode 100644 index e0537cbc..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/date-trigger.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/error-tip-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/error-tip-corners.gif deleted file mode 100644 index 6ea4c383..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/error-tip-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/exclamation.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/exclamation.gif deleted file mode 100644 index ea31a306..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/exclamation.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/radio.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/radio.gif deleted file mode 100644 index db3a5305..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/radio.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/search-trigger-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/search-trigger-rtl.gif deleted file mode 100644 index 3ff38462..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/search-trigger-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/search-trigger.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/search-trigger.gif deleted file mode 100644 index 0cc4f596..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/search-trigger.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner-rtl.gif deleted file mode 100644 index ff14c066..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner-small-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner-small-rtl.gif deleted file mode 100644 index 70c536e6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner-small-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner-small.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner-small.gif deleted file mode 100644 index e70f8d80..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner-small.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner.gif deleted file mode 100644 index 1e323bf0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/spinner.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/tag-field-item-close.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/tag-field-item-close.gif deleted file mode 100644 index 63b022ba..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/tag-field-item-close.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/text-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/text-bg.gif deleted file mode 100644 index 4179607c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/text-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-rtl.gif deleted file mode 100644 index 33e73752..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-square-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-square-rtl.gif deleted file mode 100644 index a86f6ce2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-square-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-square.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-square.gif deleted file mode 100644 index 7a0f585c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-square.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-tpl-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-tpl-rtl.gif deleted file mode 100644 index 1e766e47..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-tpl-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-tpl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-tpl.gif deleted file mode 100644 index e3701a38..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger-tpl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger.gif deleted file mode 100644 index d7be2f31..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/form/trigger.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-corners.gif deleted file mode 100644 index 79c147ad..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-sides.gif deleted file mode 100644 index 7d0af3d7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-corners.gif deleted file mode 100644 index 42c40b18..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-sides.gif deleted file mode 100644 index 7d0af3d7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid-row-editor-buttons/grid-row-editor-buttons-default-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/arrow-left-white.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/arrow-left-white.gif deleted file mode 100644 index 63088f56..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/arrow-left-white.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/arrow-right-white.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/arrow-right-white.gif deleted file mode 100644 index e9e06789..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/arrow-right-white.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-bg.gif deleted file mode 100644 index d76ffbcc..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-bg.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-bg.png deleted file mode 100644 index 0bcc2367..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-bg.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-selected-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-selected-bg.gif deleted file mode 100644 index f1da867d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-selected-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-selected-bg.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-selected-bg.png deleted file mode 100644 index 500c3bdd..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/cell-special-selected-bg.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/col-move-bottom.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/col-move-bottom.gif deleted file mode 100644 index c525f7eb..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/col-move-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/col-move-top.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/col-move-top.gif deleted file mode 100644 index ccc92b6b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/col-move-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/column-header-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/column-header-bg.gif deleted file mode 100644 index dec6733f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/column-header-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/column-header-over-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/column-header-over-bg.gif deleted file mode 100644 index bd0c1e0f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/column-header-over-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/columns.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/columns.gif deleted file mode 100644 index 2d3a8239..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/columns.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-left.gif deleted file mode 100644 index 5d923b28..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-left.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-left.png deleted file mode 100644 index 5dc69678..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-left.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-right.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-right.gif deleted file mode 100644 index 8d154db7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-right.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-right.png deleted file mode 100644 index b1a18192..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dd-insert-arrow-right.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dirty-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dirty-rtl.gif deleted file mode 100644 index 22fa12a1..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dirty-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dirty.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dirty.gif deleted file mode 100644 index 4f217a47..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/dirty.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/done.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/done.gif deleted file mode 100644 index a937cb22..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/done.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/drop-no.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/drop-no.gif deleted file mode 100644 index 31a332bf..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/drop-no.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/drop-yes.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/drop-yes.gif deleted file mode 100644 index 926010e1..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/drop-yes.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/equals.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/equals.png deleted file mode 100644 index ea1dffbb..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/equals.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/find.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/find.png deleted file mode 100644 index 15474796..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/find.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/greater_than.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/greater_than.png deleted file mode 100644 index edbf2fe7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/greater_than.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/less_than.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/less_than.png deleted file mode 100644 index 5eda3a52..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/filters/less_than.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/footer-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/footer-bg.gif deleted file mode 100644 index 126120f7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/footer-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-blue-hd.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-blue-hd.gif deleted file mode 100644 index 862094e6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-blue-hd.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-blue-split.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-blue-split.gif deleted file mode 100644 index 5286f58f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-blue-split.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-hrow.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-hrow.gif deleted file mode 100644 index 63741042..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-hrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-loading.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-loading.gif deleted file mode 100644 index d112c540..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-split.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-split.gif deleted file mode 100644 index c76a16e9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-split.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-vista-hd.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-vista-hd.gif deleted file mode 100644 index d0972638..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid-vista-hd.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hd-btn-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hd-btn-left.gif deleted file mode 100644 index 78927053..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hd-btn-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hd-btn.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hd-btn.gif deleted file mode 100644 index daf1ef2b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hd-btn.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hrow-over.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hrow-over.gif deleted file mode 100644 index f9c07af1..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hrow-over.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hrow.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hrow.gif deleted file mode 100644 index 8d459a30..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-hrow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-rowheader.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-rowheader.gif deleted file mode 100644 index 2799b45c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/grid3-rowheader.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-by.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-by.gif deleted file mode 100644 index d6075bba..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-by.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-collapse.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-collapse.gif deleted file mode 100644 index ec980038..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-collapse.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-expand-sprite.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-expand-sprite.gif deleted file mode 100644 index d24891de..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-expand-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-expand.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-expand.gif deleted file mode 100644 index 71c8ac43..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/group-expand.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hd-pop.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hd-pop.gif deleted file mode 100644 index eb8ba796..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hd-pop.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-asc.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-asc.gif deleted file mode 100644 index 15058ff6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-asc.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-desc.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-desc.gif deleted file mode 100644 index f26b7c2f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-desc.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-lock.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-lock.gif deleted file mode 100644 index 15961261..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-lock.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-lock.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-lock.png deleted file mode 100644 index 8b81e7ff..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-lock.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-unlock.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-unlock.gif deleted file mode 100644 index af59cf92..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-unlock.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-unlock.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-unlock.png deleted file mode 100644 index 9dd5df34..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/hmenu-unlock.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/invalid_line.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/invalid_line.gif deleted file mode 100644 index fb7e0f34..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/invalid_line.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/loading.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/loading.gif deleted file mode 100644 index e846e1d6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/mso-hd.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/mso-hd.gif deleted file mode 100644 index 669f3cf0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/mso-hd.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/nowait.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/nowait.gif deleted file mode 100644 index 4c5862cd..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/nowait.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-first-disabled.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-first-disabled.gif deleted file mode 100644 index 1e02c419..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-first-disabled.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-first.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-first.gif deleted file mode 100644 index 60be4bcd..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-first.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-last-disabled.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-last-disabled.gif deleted file mode 100644 index 86970677..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-last-disabled.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-last.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-last.gif deleted file mode 100644 index beb4a830..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-last.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-next-disabled.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-next-disabled.gif deleted file mode 100644 index 90a7756f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-next-disabled.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-next.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-next.gif deleted file mode 100644 index 97db1c22..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-next.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-prev-disabled.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-prev-disabled.gif deleted file mode 100644 index 37154d62..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-prev-disabled.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-prev.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-prev.gif deleted file mode 100644 index d07e61c3..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/page-prev.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/pick-button.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/pick-button.gif deleted file mode 100644 index 6957924a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/pick-button.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/property-cell-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/property-cell-bg.gif deleted file mode 100644 index 7890cf9f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/property-cell-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/property-cell-selected-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/property-cell-selected-bg.gif deleted file mode 100644 index 1dfe9a69..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/property-cell-selected-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/refresh-disabled.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/refresh-disabled.gif deleted file mode 100644 index 607800b8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/refresh-disabled.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/refresh.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/refresh.gif deleted file mode 100644 index 868b2dc5..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/refresh.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-check-sprite.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-check-sprite.gif deleted file mode 100644 index 61011646..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-check-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-expand-sprite.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-expand-sprite.gif deleted file mode 100644 index 09c00a66..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-expand-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-over.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-over.gif deleted file mode 100644 index b288e387..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-over.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-sel.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-sel.gif deleted file mode 100644 index 98209e6e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/row-sel.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/sort-hd.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/sort-hd.gif deleted file mode 100644 index 4cf483d2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/sort-hd.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/sort_asc.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/sort_asc.gif deleted file mode 100644 index 7e562e20..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/sort_asc.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/sort_desc.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/sort_desc.gif deleted file mode 100644 index 9b7a871b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/sort_desc.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/wait.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/wait.gif deleted file mode 100644 index 471c1a4f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/grid/wait.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-bottom.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-bottom.gif deleted file mode 100644 index c18f9e34..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-left.gif deleted file mode 100644 index 99f7993f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-right.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-right.gif deleted file mode 100644 index 5b13c5a8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-top.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-top.gif deleted file mode 100644 index a4ca2bb2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/layout/mini-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/magnify.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/magnify.png deleted file mode 100644 index b807c42a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/magnify.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-checked.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-checked.gif deleted file mode 100644 index fad58937..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-checked.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-group-checked.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-group-checked.gif deleted file mode 100644 index c8824887..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-group-checked.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-menu-parent-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-menu-parent-left.gif deleted file mode 100644 index 1ce2ccb4..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-menu-parent-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-menu-parent.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-menu-parent.gif deleted file mode 100644 index 5461a8bf..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-menu-parent.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-scroll-bottom.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-scroll-bottom.gif deleted file mode 100644 index 845f9e52..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-scroll-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-scroll-top.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-scroll-top.gif deleted file mode 100644 index 4bfa1541..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-scroll-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-unchecked.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-unchecked.gif deleted file mode 100644 index 43823e52..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/menu/default-unchecked.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-bottom-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-bottom-bg.gif deleted file mode 100644 index 344a10ee..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-bottom-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-bottom-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-bottom-corners.gif deleted file mode 100644 index 2bc1bb5a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-bottom-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-bottom-fbg.gif deleted file mode 100644 index b4e13fb6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-bottom-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-bottom-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-bottom-sides.gif deleted file mode 100644 index 425e3146..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif deleted file mode 100644 index c346d7dd..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-bottom-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-bottom-fbg.gif deleted file mode 100644 index b4e13fb6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-bottom-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif deleted file mode 100644 index 425e3146..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-corners-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-corners-rtl.gif deleted file mode 100644 index caf1c2e5..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-corners.gif deleted file mode 100644 index fc187976..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-fbg-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-fbg-rtl.gif deleted file mode 100644 index 2494e614..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-fbg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-fbg.gif deleted file mode 100644 index 44df2cc2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-sides-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-sides-rtl.gif deleted file mode 100644 index 99adc2b9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-sides-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-sides.gif deleted file mode 100644 index ec85f654..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-corners-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-corners-rtl.gif deleted file mode 100644 index 76634a06..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-corners.gif deleted file mode 100644 index 7f15dedc..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-fbg-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-fbg-rtl.gif deleted file mode 100644 index c61da305..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-fbg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-fbg.gif deleted file mode 100644 index cc6098a6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-sides-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-sides-rtl.gif deleted file mode 100644 index a5bf6580..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-sides-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-sides.gif deleted file mode 100644 index 9cbb323c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-top-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-top-corners.gif deleted file mode 100644 index 18cb6228..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-top-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-top-fbg.gif deleted file mode 100644 index a41bdc3e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-top-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-top-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-top-sides.gif deleted file mode 100644 index 26b70a24..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-collapsed-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-corners-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-corners-rtl.gif deleted file mode 100644 index 593948ef..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-corners.gif deleted file mode 100644 index 46572c07..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-fbg-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-fbg-rtl.gif deleted file mode 100644 index 2494e614..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-fbg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-fbg.gif deleted file mode 100644 index 44df2cc2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-sides-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-sides-rtl.gif deleted file mode 100644 index 99adc2b9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-sides-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-sides.gif deleted file mode 100644 index ec85f654..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-corners-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-corners-rtl.gif deleted file mode 100644 index dadc4ce9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-corners.gif deleted file mode 100644 index 223f3cb0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-fbg-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-fbg-rtl.gif deleted file mode 100644 index c61da305..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-fbg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-fbg.gif deleted file mode 100644 index cc6098a6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-sides-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-sides-rtl.gif deleted file mode 100644 index a5bf6580..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-sides-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-sides.gif deleted file mode 100644 index 9cbb323c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-top-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-top-corners.gif deleted file mode 100644 index 30dd99e1..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-top-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-top-fbg.gif deleted file mode 100644 index a41bdc3e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-top-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-top-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-top-sides.gif deleted file mode 100644 index 26b70a24..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-framed-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-left-bg-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-left-bg-rtl.gif deleted file mode 100644 index 99f01c70..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-left-bg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-left-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-left-bg.gif deleted file mode 100644 index 03818c3d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-left-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-right-bg-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-right-bg-rtl.gif deleted file mode 100644 index d7482f09..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-right-bg-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-right-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-right-bg.gif deleted file mode 100644 index 37dc9795..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-right-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-top-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-top-bg.gif deleted file mode 100644 index 0c6edc3b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel-header/panel-header-default-top-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel/panel-default-framed-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel/panel-default-framed-corners.gif deleted file mode 100644 index af225730..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel/panel-default-framed-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel/panel-default-framed-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/panel/panel-default-framed-sides.gif deleted file mode 100644 index 8f9df70f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/panel/panel-default-framed-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/progress/progress-default-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/progress/progress-default-bg.gif deleted file mode 100644 index 7c170371..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/progress/progress-default-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/blue-loading.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/blue-loading.gif deleted file mode 100644 index 3bbf639e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/blue-loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/calendar.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/calendar.gif deleted file mode 100644 index 133cf232..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/calendar.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/glass-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/glass-bg.gif deleted file mode 100644 index 26fbbae3..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/glass-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/hd-sprite.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/hd-sprite.gif deleted file mode 100644 index 42da1ea1..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/hd-sprite.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-error.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-error.gif deleted file mode 100644 index 397b655a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-error.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-info.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-info.gif deleted file mode 100644 index 58281c30..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-info.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-question.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-question.gif deleted file mode 100644 index 08abd82a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-question.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-warning.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-warning.gif deleted file mode 100644 index 27ff98b4..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/icon-warning.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/large-loading.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/large-loading.gif deleted file mode 100644 index b36b555b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/large-loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/left-btn.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/left-btn.gif deleted file mode 100644 index 3301054f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/left-btn.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/loading-balls.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/loading-balls.gif deleted file mode 100644 index 9ce214be..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/loading-balls.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/right-btn.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/right-btn.gif deleted file mode 100644 index c529110f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/right-btn.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/shadow-c.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/shadow-c.png deleted file mode 100644 index d435f80a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/shadow-c.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/shadow-lr.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/shadow-lr.png deleted file mode 100644 index bb88b6f2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/shadow-lr.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/shadow.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/shadow.png deleted file mode 100644 index 75c0eba3..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/shadow.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/warning.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/warning.gif deleted file mode 100644 index 806d4bc0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/shared/warning.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/e-handle-dark.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/e-handle-dark.gif deleted file mode 100644 index b5486c1a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/e-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/e-handle.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/e-handle.gif deleted file mode 100644 index a8ed0ede..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/e-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/ne-handle-dark.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/ne-handle-dark.gif deleted file mode 100644 index 04e5ecf7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/ne-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/ne-handle.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/ne-handle.gif deleted file mode 100644 index 6f7b0c29..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/ne-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/nw-handle-dark.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/nw-handle-dark.gif deleted file mode 100644 index 6e49d696..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/nw-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/nw-handle.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/nw-handle.gif deleted file mode 100644 index 92ad82cf..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/nw-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/s-handle-dark.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/s-handle-dark.gif deleted file mode 100644 index 4eb5f0fc..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/s-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/s-handle.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/s-handle.gif deleted file mode 100644 index d7eeae27..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/s-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/se-handle-dark.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/se-handle-dark.gif deleted file mode 100644 index c4c10878..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/se-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/se-handle.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/se-handle.gif deleted file mode 100644 index f011a3bb..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/se-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/square.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/square.gif deleted file mode 100644 index 7751d5e1..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/square.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/sw-handle-dark.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/sw-handle-dark.gif deleted file mode 100644 index 77224b0c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/sw-handle-dark.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/sw-handle.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/sw-handle.gif deleted file mode 100644 index aa903dd0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/sizer/sw-handle.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-bg.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-bg.png deleted file mode 100644 index 10ede26b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-bg.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-thumb.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-thumb.png deleted file mode 100644 index f427af56..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-thumb.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-v-bg.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-v-bg.png deleted file mode 100644 index 6ed116a0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-v-bg.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-v-thumb.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-v-thumb.png deleted file mode 100644 index 8be11b94..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/slider/slider-v-thumb.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-bottom-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-bottom-left.gif deleted file mode 100644 index e6525b97..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-bottom-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-bottom-right.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-bottom-right.gif deleted file mode 100644 index be657af4..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-bottom-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-left-bottom.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-left-bottom.gif deleted file mode 100644 index ecc3116e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-left-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-left-top.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-left-top.gif deleted file mode 100644 index 4610705b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-left-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-right-bottom.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-right-bottom.gif deleted file mode 100644 index 737cc3ff..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-right-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-right-top.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-right-top.gif deleted file mode 100644 index 49bc1bf7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-right-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-top-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-top-left.gif deleted file mode 100644 index 35048040..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-top-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-top-right.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-top-right.gif deleted file mode 100644 index eee6080d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/default-scroll-top-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-bottom-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-bottom-bg.gif deleted file mode 100644 index e8208676..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-bottom-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-left-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-left-bg.gif deleted file mode 100644 index 55832036..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-left-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-right-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-right-bg.gif deleted file mode 100644 index d55ba065..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-right-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-top-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-top-bg.gif deleted file mode 100644 index 89a116fd..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab-bar/tab-bar-default-top-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-active-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-active-corners.gif deleted file mode 100644 index 436d5153..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-active-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-active-fbg.gif deleted file mode 100644 index 880b797c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-active-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-active-sides.gif deleted file mode 100644 index a95afbda..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-corners.gif deleted file mode 100644 index 0c7dcdef..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-disabled-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-disabled-corners.gif deleted file mode 100644 index 2a4b2e91..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-disabled-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-disabled-fbg.gif deleted file mode 100644 index 6023a7e8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-disabled-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-disabled-sides.gif deleted file mode 100644 index 44ab77bf..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-fbg.gif deleted file mode 100644 index f003f4d2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-active-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-active-corners.gif deleted file mode 100644 index 436d5153..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-active-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-active-fbg.gif deleted file mode 100644 index 880b797c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-active-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-active-sides.gif deleted file mode 100644 index a95afbda..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-corners.gif deleted file mode 100644 index 0c7dcdef..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-fbg.gif deleted file mode 100644 index f003f4d2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-over-corners.gif deleted file mode 100644 index b42ccb7f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-over-fbg.gif deleted file mode 100644 index 3a09e17e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-over-sides.gif deleted file mode 100644 index 7fd4dd2d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-sides.gif deleted file mode 100644 index 5d557b40..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-over-corners.gif deleted file mode 100644 index b42ccb7f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-over-fbg.gif deleted file mode 100644 index 3a09e17e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-over-sides.gif deleted file mode 100644 index 7fd4dd2d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-sides.gif deleted file mode 100644 index 5d557b40..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-close.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-close.gif deleted file mode 100644 index 98d5da95..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-close.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-active-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-active-corners.gif deleted file mode 100644 index 060497d0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-active-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-active-fbg.gif deleted file mode 100644 index feade9c0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-active-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-active-sides.gif deleted file mode 100644 index 408a9884..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-corners.gif deleted file mode 100644 index 55edfe5b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-disabled-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-disabled-corners.gif deleted file mode 100644 index 872758e1..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-disabled-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-disabled-fbg.gif deleted file mode 100644 index 40ca14aa..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-disabled-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-disabled-sides.gif deleted file mode 100644 index 2dedd9c5..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-fbg.gif deleted file mode 100644 index 41843484..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-active-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-active-corners.gif deleted file mode 100644 index 060497d0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-active-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-active-fbg.gif deleted file mode 100644 index feade9c0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-active-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-active-sides.gif deleted file mode 100644 index 408a9884..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-corners.gif deleted file mode 100644 index 55edfe5b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-fbg.gif deleted file mode 100644 index 6a23385b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-over-corners.gif deleted file mode 100644 index 80d0c08c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-over-fbg.gif deleted file mode 100644 index fbeab2db..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-over-sides.gif deleted file mode 100644 index 28ab7147..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-sides.gif deleted file mode 100644 index 00a70323..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-over-corners.gif deleted file mode 100644 index 80d0c08c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-over-fbg.gif deleted file mode 100644 index fbeab2db..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-over-sides.gif deleted file mode 100644 index 28ab7147..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-sides.gif deleted file mode 100644 index 91df4148..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-active-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-active-corners.gif deleted file mode 100644 index 4b9b1d85..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-active-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-active-fbg.gif deleted file mode 100644 index feade9c0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-active-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-active-sides.gif deleted file mode 100644 index 77530f42..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-corners.gif deleted file mode 100644 index cdd0ac5b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-disabled-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-disabled-corners.gif deleted file mode 100644 index cd5787d9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-disabled-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-disabled-fbg.gif deleted file mode 100644 index 40ca14aa..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-disabled-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-disabled-sides.gif deleted file mode 100644 index 2ee83192..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-fbg.gif deleted file mode 100644 index 41843484..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-active-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-active-corners.gif deleted file mode 100644 index 4b9b1d85..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-active-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-active-fbg.gif deleted file mode 100644 index feade9c0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-active-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-active-sides.gif deleted file mode 100644 index 77530f42..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-corners.gif deleted file mode 100644 index cdd0ac5b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-fbg.gif deleted file mode 100644 index 6a23385b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-over-corners.gif deleted file mode 100644 index 15e73874..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-over-fbg.gif deleted file mode 100644 index fbeab2db..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-over-sides.gif deleted file mode 100644 index 648185d3..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-sides.gif deleted file mode 100644 index f1405a14..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-over-corners.gif deleted file mode 100644 index 15e73874..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-over-fbg.gif deleted file mode 100644 index fbeab2db..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-over-sides.gif deleted file mode 100644 index 648185d3..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-sides.gif deleted file mode 100644 index 53b27416..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-active-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-active-corners.gif deleted file mode 100644 index be17b68c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-active-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-active-fbg.gif deleted file mode 100644 index 2d8c6fef..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-active-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-active-sides.gif deleted file mode 100644 index 6ed493f9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-corners.gif deleted file mode 100644 index f05f8a8f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-disabled-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-disabled-corners.gif deleted file mode 100644 index 5b4a9002..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-disabled-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-disabled-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-disabled-fbg.gif deleted file mode 100644 index a38b6281..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-disabled-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-disabled-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-disabled-sides.gif deleted file mode 100644 index a19cc7e8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-disabled-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-fbg.gif deleted file mode 100644 index 1ed53562..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-active-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-active-corners.gif deleted file mode 100644 index be17b68c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-active-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-active-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-active-fbg.gif deleted file mode 100644 index 2d8c6fef..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-active-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-active-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-active-sides.gif deleted file mode 100644 index 6ed493f9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-active-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-corners.gif deleted file mode 100644 index f05f8a8f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-fbg.gif deleted file mode 100644 index 1ed53562..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-over-corners.gif deleted file mode 100644 index 96817de9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-over-fbg.gif deleted file mode 100644 index 94bfb45d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-over-sides.gif deleted file mode 100644 index 6ac4aa9a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-sides.gif deleted file mode 100644 index 2f644d13..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-focus-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-over-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-over-corners.gif deleted file mode 100644 index 96817de9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-over-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-over-fbg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-over-fbg.gif deleted file mode 100644 index 94bfb45d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-over-fbg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-over-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-over-sides.gif deleted file mode 100644 index 6ac4aa9a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-over-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-sides.gif deleted file mode 100644 index 2f644d13..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tab/tab-default-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-default-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-default-corners.gif deleted file mode 100644 index 0999a53f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-default-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-default-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-default-sides.gif deleted file mode 100644 index 5f2e4bfa..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-default-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-form-invalid-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-form-invalid-corners.gif deleted file mode 100644 index b27398dc..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-form-invalid-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-form-invalid-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-form-invalid-sides.gif deleted file mode 100644 index b39a15bb..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tip/tip-form-invalid-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-more-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-more-left.gif deleted file mode 100644 index 8f8cbd42..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-more-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-more.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-more.gif deleted file mode 100644 index 82beafda..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-more.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-bottom.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-bottom.gif deleted file mode 100644 index 1296e22d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-left.gif deleted file mode 100644 index 2db8cf5c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-right.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-right.gif deleted file mode 100644 index 5d5a7ab5..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-top.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-top.gif deleted file mode 100644 index 6545b437..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/default-scroll-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-more-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-more-left.gif deleted file mode 100644 index 8f8cbd42..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-more-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-more.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-more.gif deleted file mode 100644 index 82beafda..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-more.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-scroll-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-scroll-left.gif deleted file mode 100644 index 2db8cf5c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-scroll-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-scroll-right.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-scroll-right.gif deleted file mode 100644 index 5d5a7ab5..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/footer-scroll-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/toolbar-default-bg.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/toolbar-default-bg.gif deleted file mode 100644 index f010d334..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/toolbar/toolbar-default-bg.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tools/tool-sprite-tpl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tools/tool-sprite-tpl.gif deleted file mode 100644 index 18277a3d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tools/tool-sprite-tpl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tools/tool-sprites.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tools/tool-sprites.gif deleted file mode 100644 index 36b6b675..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tools/tool-sprites.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tools/tools-sprites-trans.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tools/tools-sprites-trans.gif deleted file mode 100644 index b6d7ba36..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tools/tools-sprites-trans.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/arrows-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/arrows-rtl.gif deleted file mode 100644 index 7083d77d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/arrows-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/arrows.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/arrows.gif deleted file mode 100644 index f7b8b1ca..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/arrows.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-above.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-above.gif deleted file mode 100644 index 30d1ca71..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-above.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-add.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-add.gif deleted file mode 100644 index b22cd144..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-add.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-append.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-append.gif deleted file mode 100644 index b22cd144..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-append.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-below.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-below.gif deleted file mode 100644 index 85f66b1e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-below.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-between.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-between.gif deleted file mode 100644 index 5c6c09d9..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-between.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-no.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-no.gif deleted file mode 100644 index 9d9c6a9c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-no.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-over.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-over.gif deleted file mode 100644 index 30d1ca71..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-over.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-under.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-under.gif deleted file mode 100644 index 85f66b1e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-under.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-yes.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-yes.gif deleted file mode 100644 index 8aacb307..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/drop-yes.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-minus-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-minus-rtl.gif deleted file mode 100644 index 10227e60..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-minus-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-minus.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-minus.gif deleted file mode 100644 index 55d8a0fa..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-minus.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-plus-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-plus-rtl.gif deleted file mode 100644 index f4eef893..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-plus-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-plus.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-plus.gif deleted file mode 100644 index a5c62fab..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-plus.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-rtl.gif deleted file mode 100644 index a5e7248c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end.gif deleted file mode 100644 index 406a88df..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-end.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-line-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-line-rtl.gif deleted file mode 100644 index 6e5b8b44..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-line-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-line.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-line.gif deleted file mode 100644 index e25ed03f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-line.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus-nl-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus-nl-rtl.gif deleted file mode 100644 index 2d8dd984..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus-nl-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus-nl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus-nl.gif deleted file mode 100644 index f50bd40a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus-nl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus-rtl.gif deleted file mode 100644 index ed3e5a0d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus.gif deleted file mode 100644 index a7287961..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-minus.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus-nl-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus-nl-rtl.gif deleted file mode 100644 index 2d1e9174..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus-nl-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus-nl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus-nl.gif deleted file mode 100644 index 96f8d723..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus-nl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus-rtl.gif deleted file mode 100644 index cb0cb492..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus.gif deleted file mode 100644 index ae41983c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-plus.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-rtl.gif deleted file mode 100644 index 1139cb02..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow.gif deleted file mode 100644 index 201c413e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/elbow.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder-open-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder-open-rtl.gif deleted file mode 100644 index a34c546c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder-open-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder-open.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder-open.gif deleted file mode 100644 index 361e1be3..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder-open.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder-rtl.gif deleted file mode 100644 index 4fab30f8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder.gif deleted file mode 100644 index b2fd81a1..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/folder.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/leaf-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/leaf-rtl.gif deleted file mode 100644 index ab0979a3..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/leaf-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/leaf.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/leaf.gif deleted file mode 100644 index 445769d3..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/leaf.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/loading.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/loading.gif deleted file mode 100644 index e846e1d6..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/loading.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/s.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/s.gif deleted file mode 100644 index 1d11fa9a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/tree/s.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-bottom.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-bottom.gif deleted file mode 100644 index c18f9e34..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-bottom.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-left.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-left.gif deleted file mode 100644 index 99f7993f..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-left.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-right.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-right.gif deleted file mode 100644 index 5b13c5a8..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-right.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-top.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-top.gif deleted file mode 100644 index a4ca2bb2..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/util/splitter/mini-top.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/ux/dashboard/magnify.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/ux/dashboard/magnify.png deleted file mode 100644 index 0efc4470..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/ux/dashboard/magnify.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-bottom-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-bottom-corners.gif deleted file mode 100644 index 6e44aba4..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-bottom-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-bottom-sides.gif deleted file mode 100644 index d0f60e65..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-bottom-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-bottom-corners.gif deleted file mode 100644 index dce586d4..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-bottom-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-bottom-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-bottom-sides.gif deleted file mode 100644 index 46901d8a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-bottom-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-left-corners-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-left-corners-rtl.gif deleted file mode 100644 index aa043c6a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-left-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-left-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-left-corners.gif deleted file mode 100644 index 0dfd487c..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-left-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-left-sides.gif deleted file mode 100644 index 11bfe125..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-right-corners-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-right-corners-rtl.gif deleted file mode 100644 index 51939545..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-right-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-right-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-right-corners.gif deleted file mode 100644 index ba0497a7..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-right-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-right-sides.gif deleted file mode 100644 index 41939a96..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-top-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-top-corners.gif deleted file mode 100644 index 5040891b..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-top-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-top-sides.gif deleted file mode 100644 index 46901d8a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-collapsed-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-left-corners-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-left-corners-rtl.gif deleted file mode 100644 index 60d74998..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-left-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-left-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-left-corners.gif deleted file mode 100644 index 75bac703..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-left-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-left-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-left-sides.gif deleted file mode 100644 index 7022ec9e..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-left-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-right-corners-rtl.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-right-corners-rtl.gif deleted file mode 100644 index d7f1704d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-right-corners-rtl.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-right-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-right-corners.gif deleted file mode 100644 index 875c04b1..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-right-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-right-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-right-sides.gif deleted file mode 100644 index e100d454..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-right-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-top-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-top-corners.gif deleted file mode 100644 index 16e61866..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-top-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-top-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-top-sides.gif deleted file mode 100644 index d0f60e65..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window-header/window-header-default-top-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-error.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-error.gif deleted file mode 100644 index 397b655a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-error.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-info.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-info.gif deleted file mode 100644 index 58281c30..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-info.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-question.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-question.gif deleted file mode 100644 index 08abd82a..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-question.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-warning.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-warning.gif deleted file mode 100644 index 27ff98b4..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/icon-warning.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/fade-blue.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/fade-blue.png deleted file mode 100644 index 4dbf08b0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/fade-blue.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/fader.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/fader.png deleted file mode 100644 index be8c27fa..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/fader.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/icon16_error.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/icon16_error.png deleted file mode 100644 index 5f168d32..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/icon16_error.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/icon16_info.png b/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/icon16_info.png deleted file mode 100644 index 6c6b32d0..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/toast/icon16_info.png and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/window-default-corners.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window/window-default-corners.gif deleted file mode 100644 index c6081732..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/window-default-corners.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/window-default-sides.gif b/app/resources/appunto-auth/theme/ext-theme-gray/images/window/window-default-sides.gif deleted file mode 100644 index 4b1d651d..00000000 Binary files a/app/resources/appunto-auth/theme/ext-theme-gray/images/window/window-default-sides.gif and /dev/null differ diff --git a/app/resources/appunto-auth/theme/ext-theme-gray/theme.css b/app/resources/appunto-auth/theme/ext-theme-gray/theme.css deleted file mode 100644 index 52ffc3bf..00000000 --- a/app/resources/appunto-auth/theme/ext-theme-gray/theme.css +++ /dev/null @@ -1 +0,0 @@ -.x-body{margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.x-no-touch-scroll{touch-action:none;-ms-touch-action:none}@-ms-viewport{width:device-width}img{border:0}.x-border-box,.x-border-box *{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x-ltr{direction:ltr}.x-clear{overflow:hidden;clear:both;font-size:0;line-height:0;display:table}.x-layer{position:absolute!important;overflow:hidden}.x-fixed-layer{position:fixed!important;overflow:hidden}.x-shim{position:absolute;left:0;top:0;overflow:hidden;filter:alpha(opacity=0);opacity:0}.x-hidden-display{display:none!important}.x-hidden-visibility{visibility:hidden!important}.x-hidden,.x-hidden-offsets{display:block!important;visibility:hidden!important;position:absolute!important;top:-10000px!important}.x-hidden-clip{position:absolute!important;clip:rect(0,0,0,0)}.x-masked-relative{position:relative}.x-ie-shadow{background-color:#777;display:none;position:absolute;overflow:hidden}.x-unselectable{user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-drag:none;cursor:default}.x-selectable{cursor:auto;-moz-user-select:text;-webkit-user-select:text;-ms-user-select:text;user-select:text;-o-user-select:text}.x-list-plain{list-style-type:none;margin:0;padding:0}.x-table-plain{border-collapse:collapse;border-spacing:0;font-size:1em}.x-frame-tl,.x-frame-tr,.x-frame-tc,.x-frame-bl,.x-frame-br,.x-frame-bc{overflow:hidden;background-repeat:no-repeat}.x-frame-tc,.x-frame-bc{background-repeat:repeat-x}td.x-frame-tl,td.x-frame-tr,td.x-frame-bl,td.x-frame-br{width:1px}.x-frame-mc{background-repeat:repeat-x;overflow:hidden}.x-proxy-el{position:absolute;background:#b4b4b4;filter:alpha(opacity=80);opacity:.8}.x-css-shadow{position:absolute;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px}.x-item-disabled,.x-item-disabled *{cursor:default}.x-component,.x-container{position:relative}.x-webkit *:focus{outline:0}.x-touch-scroller{display:table;min-width:100%}.x-box-item{position:absolute!important;left:0;top:0}.x-autocontainer-outerCt{display:table}.x-autocontainer-innerCt{display:table-cell;height:100%;vertical-align:top}.x-mask{z-index:100;position:absolute;top:0;left:0;width:100%;height:100%}.x-mask-fixed{position:fixed}.x-mask-shim{z-index:100;position:absolute;top:0;left:0;width:100%;height:100%}.x-mask-msg{z-index:101;position:absolute}.x-progress{position:relative;border-style:solid;overflow:hidden}.x-progress-bar{overflow:hidden;position:absolute;width:0;height:100%}.x-progress-text{overflow:hidden;position:absolute}.x-title-icon{background-repeat:no-repeat;background-position:0 0;vertical-align:middle;text-align:center}.x-title{display:table;table-layout:fixed}.x-title-text{display:table-cell;overflow:hidden;white-space:nowrap;-o-text-overflow:ellipsis;text-overflow:ellipsis;vertical-align:middle}.x-title-align-left{text-align:left}.x-title-align-center{text-align:center}.x-title-align-right{text-align:right}.x-title-rotate-right{-webkit-transform:rotate(90deg);-webkit-transform-origin:0 0;-moz-transform:rotate(90deg);-moz-transform-origin:0 0;-o-transform:rotate(90deg);-o-transform-origin:0 0;-ms-transform:rotate(90deg);-ms-transform-origin:0 0;transform:rotate(90deg);transform-origin:0 0}.x-ie8 .x-title-rotate-right{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1)}.x-title-rotate-left{-webkit-transform:rotate(270deg);-webkit-transform-origin:100% 0;-moz-transform:rotate(270deg);-moz-transform-origin:100% 0;-o-transform:rotate(270deg);-o-transform-origin:100% 0;-ms-transform:rotate(270deg);-ms-transform-origin:100% 0;transform:rotate(270deg);transform-origin:100% 0}.x-ie8 .x-title-rotate-left{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.x-horizontal.x-header .x-title-rotate-right.x-title-align-left>.x-title-item{vertical-align:bottom}.x-horizontal.x-header .x-title-rotate-right.x-title-align-center>.x-title-item{vertical-align:middle}.x-horizontal.x-header .x-title-rotate-right.x-title-align-right>.x-title-item{vertical-align:top}.x-horizontal.x-header .x-title-rotate-left.x-title-align-left>.x-title-item{vertical-align:top}.x-horizontal.x-header .x-title-rotate-left.x-title-align-center>.x-title-item{vertical-align:middle}.x-horizontal.x-header .x-title-rotate-left.x-title-align-right>.x-title-item{vertical-align:bottom}.x-vertical.x-header .x-title-rotate-none.x-title-align-left>.x-title-item{vertical-align:top}.x-vertical.x-header .x-title-rotate-none.x-title-align-center>.x-title-item{vertical-align:middle}.x-vertical.x-header .x-title-rotate-none.x-title-align-right>.x-title-item{vertical-align:bottom}.x-title-icon-wrap{display:table-cell;text-align:center;vertical-align:middle;line-height:0}.x-title-icon-wrap.x-title-icon-top,.x-title-icon-wrap.x-title-icon-bottom{display:table-row}.x-title-icon{display:inline-block;vertical-align:middle;background-position:center;background-repeat:no-repeat}.x-tool{font-size:0;line-height:0}.x-header>.x-box-inner{overflow:visible}.x-btn{display:inline-block;outline:0;cursor:pointer;white-space:nowrap;text-decoration:none;overflow:hidden;position:relative}.x-btn>.x-frame{height:100%;width:100%}.x-btn-wrap{display:table;height:100%;width:100%}.x-btn-button{vertical-align:middle;display:table-cell;white-space:nowrap;line-height:0}.x-btn-inner{display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.x-btn-icon.x-btn-no-text>.x-btn-inner{display:none}.x-btn-icon-el{display:none;vertical-align:middle;background-position:center center;background-repeat:no-repeat}.x-btn-icon>.x-btn-icon-el{display:inline-block}.x-btn-icon-top>.x-btn-icon-el,.x-btn-icon-bottom>.x-btn-icon-el{display:block}.x-btn-button-center{text-align:center}.x-btn-button-left{text-align:left}.x-btn-button-right{text-align:right}.x-opera12m-btn-arrow-right{display:table}.x-opera12m-btn-arrow-right>.x-btn-arrow-right,.x-opera12m-btn-arrow-right>.x-btn-split-right{display:table-row}.x-btn-arrow:after,.x-btn-split:after{background-repeat:no-repeat;content:'';box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x-btn-arrow-right:after,.x-btn-split-right:after{display:table-cell;background-position:right center}.x-btn-arrow-bottom:after,.x-btn-split-bottom:after{display:table-row;background-position:center bottom;content:'\00a0';line-height:0}.x-btn-mc{overflow:visible}.x-splitter{font-size:1px}.x-splitter-horizontal{cursor:e-resize;cursor:row-resize}.x-splitter-vertical{cursor:e-resize;cursor:col-resize}.x-splitter-collapsed,.x-splitter-horizontal-noresize,.x-splitter-vertical-noresize{cursor:default}.x-splitter-active{z-index:4}.x-collapse-el{position:absolute;background-repeat:no-repeat}.x-box-layout-ct{overflow:hidden;position:relative}.x-box-target{position:absolute;width:20000px;top:0;left:0;height:1px}.x-box-inner{overflow:hidden;position:relative;left:0;top:0}.x-box-scroller{position:absolute;background-repeat:no-repeat;background-position:center;line-height:0;font-size:0}.x-box-scroller-top{top:0}.x-box-scroller-right{right:0}.x-box-scroller-bottom{bottom:0}.x-box-scroller-left{left:0}.x-box-menu-body-horizontal{float:left}.x-box-menu-after{position:relative;float:left}.x-toolbar-text{white-space:nowrap}.x-toolbar-separator{display:block;font-size:1px;overflow:hidden;cursor:default;border:0;width:0;height:0;line-height:0}.x-toolbar-scroller{padding-left:0}.x-toolbar-plain{border:0}.x-dd-drag-proxy,.x-dd-drag-current{z-index:1000000!important;pointer-events:none}.x-dd-drag-repair .x-dd-drag-ghost{filter:alpha(opacity=60);opacity:.6}.x-dd-drag-repair .x-dd-drop-icon{display:none}.x-dd-drag-ghost{filter:alpha(opacity=85);opacity:.85;padding:5px;padding-left:20px;white-space:nowrap;color:#000;font:normal 11px tahoma,arial,verdana,sans-serif;border:1px solid;border-color:#ddd #bbb #bbb #ddd;background-color:#fff}.x-dd-drop-icon{position:absolute;top:3px;left:3px;display:block;width:16px;height:16px;background-color:transparent;background-position:center;background-repeat:no-repeat;z-index:1}.x-dd-drop-ok .x-dd-drop-icon{background-image:url(images/dd/drop-yes.gif)}.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url(images/dd/drop-add.gif)}.x-dd-drop-nodrop div.x-dd-drop-icon{background-image:url(images/dd/drop-no.gif)}.x-docked{position:absolute!important;z-index:1}.x-docked-vertical{position:static}.x-docked-top{border-bottom-width:0!important}.x-docked-bottom{border-top-width:0!important}.x-docked-left{border-right-width:0!important}.x-docked-right{border-left-width:0!important}.x-docked-noborder-top{border-top-width:0!important}.x-docked-noborder-right{border-right-width:0!important}.x-docked-noborder-bottom{border-bottom-width:0!important}.x-docked-noborder-left{border-left-width:0!important}.x-noborder-l{border-left-width:0!important}.x-noborder-b{border-bottom-width:0!important}.x-noborder-bl{border-bottom-width:0!important;border-left-width:0!important}.x-noborder-r{border-right-width:0!important}.x-noborder-rl{border-right-width:0!important;border-left-width:0!important}.x-noborder-rb{border-right-width:0!important;border-bottom-width:0!important}.x-noborder-rbl{border-right-width:0!important;border-bottom-width:0!important;border-left-width:0!important}.x-noborder-t{border-top-width:0!important}.x-noborder-tl{border-top-width:0!important;border-left-width:0!important}.x-noborder-tb{border-top-width:0!important;border-bottom-width:0!important}.x-noborder-tbl{border-top-width:0!important;border-bottom-width:0!important;border-left-width:0!important}.x-noborder-tr{border-top-width:0!important;border-right-width:0!important}.x-noborder-trl{border-top-width:0!important;border-right-width:0!important;border-left-width:0!important}.x-noborder-trb{border-top-width:0!important;border-right-width:0!important;border-bottom-width:0!important}.x-noborder-trbl{border-width:0!important}.x-panel,.x-plain{overflow:hidden;position:relative}.x-panel{outline:0}td.x-frame-mc{vertical-align:top}.x-panel-body{overflow:hidden;position:relative}.x-panel-header-plain,.x-panel-body-plain{border:0;padding:0}.x-tip{position:absolute;overflow:visible}.x-tip-body{overflow:hidden;position:relative}.x-tip-anchor{position:absolute;overflow:hidden;border-style:solid}.x-form-item{display:table;table-layout:fixed;border-spacing:0;border-collapse:separate}.x-form-item-label{overflow:hidden}.x-form-item-label,.x-form-item-body{display:table-cell}.x-form-item-body{vertical-align:middle;height:100%}.x-form-item-label-inner{display:inline-block}.x-form-item-label-top{display:table-row;height:1px}.x-form-item-label-top>.x-form-item-label-inner{display:table-cell}.x-form-item-label-top-side-error:after{display:table-cell;content:''}.x-form-item-label-right{text-align:right}.x-form-error-wrap-side{display:table-cell;vertical-align:middle}.x-form-error-wrap-under{display:table-row;height:1px}.x-form-error-wrap-under>.x-form-error-msg{display:table-cell}.x-form-error-wrap-under-side-label:before{display:table-cell;content:''}.x-form-invalid-icon{overflow:hidden}.x-form-invalid-icon ul{display:none}.x-form-display-field-body{vertical-align:top}.x-fit-item{position:relative}.x-grid-view{overflow:hidden;position:relative}.x-grid-row-table{width:0;table-layout:fixed;border:0 none;border-collapse:separate;border-spacing:0}.x-grid-item{table-layout:fixed;outline:0}.x-grid-row{outline:0}.x-grid-td{overflow:hidden;border-width:0;vertical-align:top}.x-grid-cell-inner{overflow:hidden;white-space:nowrap}.x-wrap-cell .x-grid-cell-inner{white-space:normal}.x-grid-resize-marker{position:absolute;z-index:5;top:0}.x-view-item-focused{outline:1px dashed #ccc!important;outline-offset:-1px}.x-form-cb-wrap{vertical-align:top}.x-form-cb-wrap-inner{position:relative}.x-form-cb{position:absolute;left:0;right:auto;vertical-align:top;overflow:hidden;padding:0;border:0}.x-form-cb::-moz-focus-inner{padding:0;border:0}.x-form-cb-after{left:auto;right:0}.x-form-cb-label{display:inline-block}.x-form-cb-wrap-inner-no-box-label>.x-form-cb{position:static}.x-col-move-top,.x-col-move-bottom{position:absolute;top:0;line-height:0;font-size:0;overflow:hidden;z-index:20000;background:no-repeat center top transparent}.x-grid-header-ct{cursor:default}.x-column-header{position:absolute;overflow:hidden;background-repeat:repeat-x}.x-column-header-inner{white-space:nowrap;position:relative;overflow:hidden}.x-column-header-text{white-space:nowrap;background-repeat:no-repeat}.x-column-header-trigger{display:none;height:100%;background-repeat:no-repeat;position:absolute;right:0;top:0;z-index:2}.x-column-header-over .x-column-header-trigger,.x-column-header-open .x-column-header-trigger{display:block}.x-column-header-align-right{text-align:right}.x-column-header-align-left{text-align:left}.x-column-header-align-center{text-align:center}.x-form-trigger-wrap{display:table;width:100%;height:100%}.x-gecko .x-form-trigger-wrap{display:-moz-inline-box;display:inline-flex;vertical-align:top}.x-form-text-wrap{display:table-cell;overflow:hidden;height:100%}.x-gecko .x-form-text-wrap{display:block;-moz-box-flex:1;flex:1}.x-form-item-body.x-form-text-grow{min-width:inherit;max-width:inherit}.x-form-text{border:0;margin:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;display:block;background:repeat-x 0 0;width:100%;height:100%}.x-webkit .x-form-text{height:calc(100%+3px)}.x-form-trigger{display:table-cell;vertical-align:top;cursor:pointer;overflow:hidden;background-repeat:no-repeat;line-height:0;white-space:nowrap}.x-item-disabled .x-form-trigger{cursor:default}.x-form-trigger.x-form-trigger-cmp{background:0;border:0}.x-gecko .x-form-trigger{display:block}.x-border-layout-ct{overflow:hidden}.x-border-layout-ct{position:relative}.x-border-region-slide-in{z-index:5}.x-region-collapsed-placeholder{z-index:4}.x-tab{display:block;outline:0;cursor:pointer;white-space:nowrap;text-decoration:none;overflow:hidden;position:relative}.x-tab>.x-frame{height:100%;width:100%}.x-tab-wrap{display:table;height:100%;width:100%}.x-tab-button{vertical-align:middle;display:table-cell;white-space:nowrap;line-height:0}.x-tab-inner{display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.x-tab-icon.x-tab-no-text>.x-tab-inner{display:none}.x-tab-icon-el{display:none;vertical-align:middle;background-position:center center;background-repeat:no-repeat}.x-tab-icon>.x-tab-icon-el{display:inline-block}.x-tab-icon-top>.x-tab-icon-el,.x-tab-icon-bottom>.x-tab-icon-el{display:block}.x-tab-button-center{text-align:center}.x-tab-button-left{text-align:left}.x-tab-button-right{text-align:right}.x-tab-mc{overflow:visible}.x-tab{z-index:1}.x-tab-active{z-index:3}.x-tab-button{position:relative}.x-tab-close-btn{display:block;position:absolute;font-size:0;line-height:0}.x-tab-rotate-left{-webkit-transform:rotate(270deg);-webkit-transform-origin:100% 0;-moz-transform:rotate(270deg);-moz-transform-origin:100% 0;-o-transform:rotate(270deg);-o-transform-origin:100% 0;-ms-transform:rotate(270deg);-ms-transform-origin:100% 0;transform:rotate(270deg);transform-origin:100% 0}.x-ie8 .x-tab-rotate-left{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.x-tab-rotate-right{-webkit-transform:rotate(90deg);-webkit-transform-origin:0 0;-moz-transform:rotate(90deg);-moz-transform-origin:0 0;-o-transform:rotate(90deg);-o-transform-origin:0 0;-ms-transform:rotate(90deg);-ms-transform-origin:0 0;transform:rotate(90deg);transform-origin:0 0}.x-ie8 .x-tab-rotate-right{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1)}.x-tab-tr,.x-tab-br,.x-tab-mr,.x-tab-tl,.x-tab-bl,.x-tab-ml{width:1px}.x-tab-bar{z-index:0;position:relative}.x-tab-bar-body{position:relative}.x-tab-bar-strip{position:absolute;line-height:0;font-size:0;z-index:2}.x-tab-bar-top>.x-tab-bar-strip{bottom:0}.x-tab-bar-bottom>.x-tab-bar-strip{top:0}.x-tab-bar-left>.x-tab-bar-strip{right:0}.x-tab-bar-right>.x-tab-bar-strip{left:0}.x-tab-bar-horizontal .x-tab-bar-strip{width:100%;left:0}.x-tab-bar-vertical{display:table-cell}.x-tab-bar-vertical .x-tab-bar-strip{height:100%;top:0}.x-tab-bar-plain{background:transparent!important}.x-box-scroller-plain{background-color:transparent!important}.x-window{outline:0;overflow:hidden}.x-window .x-window-wrap{position:relative}.x-window-body{position:relative;overflow:hidden}.x-resizable-overlay{position:absolute;left:0;top:0;width:100%;height:100%;display:none;z-index:200000;background-color:#fff;filter:alpha(opacity=0);opacity:0}.x-form-textarea{overflow:auto;resize:none}div.x-form-text-grow .x-form-textarea{min-height:inherit}.x-message-box .x-form-display-field{height:auto}.x-menu{outline:0}.x-menu-item{white-space:nowrap;overflow:hidden;border-color:transparent;border-style:solid}.x-menu-item-cmp .x-field-label-cell{vertical-align:middle}.x-menu-icon-separator{position:absolute;top:0;z-index:0;height:100%;overflow:hidden}.x-menu-plain .x-menu-icon-separator{display:none}.x-menu-item-link{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;text-decoration:none;outline:0;display:block}.x-menu-item-link-href{-webkit-touch-callout:default}.x-menu-item-text{display:inline-block}.x-menu-item-icon,.x-menu-item-icon-right,.x-menu-item-arrow{font-size:0;position:absolute;text-align:center;background-repeat:no-repeat}.x-resizable-wrapped{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x-column-header-checkbox .x-column-header-text{display:block;background-repeat:no-repeat;font-size:0}.x-grid-cell-row-checker{vertical-align:middle;background-repeat:no-repeat;font-size:0}.x-body{color:black;font-size:12px;font-family:tahoma,arial,verdana,sans-serif}.x-animating-size,.x-collapsed{overflow:hidden!important}.x-mask{filter:alpha(opacity=50);opacity:.5;background:#ccc;cursor:default}.x-mask-msg{padding:2px;border-style:solid;border-width:1px;border-color:#bcb0b0;background:#e0e0e0}.x-mask-msg-inner{padding:0 5px;border-style:solid;border-width:1px;border-color:#b3b3b3;background-color:#eee;color:#222;font:normal 11px tahoma,arial,verdana,sans-serif}.x-mask-msg-text{padding:5px 5px 5px 20px;background-image:url(images/grid/loading.gif);background-repeat:no-repeat;background-position:0 center}.x-progress-default{background-color:#f1f1f1;border-width:1px;height:20px;border-color:#8e8e8e}.x-progress-default .x-progress-bar-default{background-image:none;background-color:#ababab;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#d1d1d1),color-stop(50%,#b8b8b8),color-stop(51%,#ababab),color-stop(100%,#9e9e9e));background-image:-webkit-linear-gradient(top,#d1d1d1,#b8b8b8 50%,#ababab 51%,#9e9e9e);background-image:-moz-linear-gradient(top,#d1d1d1,#b8b8b8 50%,#ababab 51%,#9e9e9e);background-image:-o-linear-gradient(top,#d1d1d1,#b8b8b8 50%,#ababab 51%,#9e9e9e);background-image:-ms-linear-gradient(top,#d1d1d1,#b8b8b8 50%,#ababab 51%,#9e9e9e);background-image:linear-gradient(top,#d1d1d1,#b8b8b8 50%,#ababab 51%,#9e9e9e)}.x-nlg .x-progress-default .x-progress-bar-default{background:repeat-x;background-image:url(images/progress/progress-default-bg.gif)}.x-progress-default .x-progress-text{color:white;font-weight:bold;font-size:11px;font-family:tahoma,arial,verdana,sans-serif;text-align:center;line-height:18px}.x-progress-default .x-progress-text-back{color:#5d5d5d;line-height:18px}.x-progressbar-default-cell>.x-grid-cell-inner,.x-progressbarwidget-default-cell>.x-grid-cell-inner{padding-top:0;padding-bottom:0}.x-progressbar-default-cell>.x-grid-cell-inner .x-progress-default,.x-progressbarwidget-default-cell>.x-grid-cell-inner .x-progress-default{height:18px}.x-tool{cursor:pointer}.x-tool-img{overflow:hidden;width:15px;height:15px;background-image:url(images/tools/tool-sprites.gif);margin:0}.x-tool-placeholder{visibility:hidden}.x-tool-close{background-position:0 0}.x-tool-minimize{background-position:0 -15px}.x-tool-maximize{background-position:0 -30px}.x-tool-restore{background-position:0 -45px}.x-tool-toggle{background-position:0 -60px}.x-panel-collapsed .x-tool-toggle{background-position:0 -75px}.x-tool-gear{background-position:0 -90px}.x-tool-prev{background-position:0 -105px}.x-tool-next{background-position:0 -120px}.x-tool-pin{background-position:0 -135px}.x-tool-unpin{background-position:0 -150px}.x-tool-right{background-position:0 -165px}.x-tool-left{background-position:0 -180px}.x-tool-down{background-position:0 -195px}.x-tool-up{background-position:0 -210px}.x-tool-refresh{background-position:0 -225px}.x-tool-plus{background-position:0 -240px}.x-tool-minus{background-position:0 -255px}.x-tool-search{background-position:0 -270px}.x-tool-save{background-position:0 -285px}.x-tool-help{background-position:0 -300px}.x-tool-print{background-position:0 -315px}.x-tool-expand{background-position:0 -330px}.x-tool-collapse{background-position:0 -345px}.x-tool-resize{background-position:0 -360px}.x-tool-move{background-position:0 -375px}.x-tool-expand-bottom,.x-tool-collapse-bottom{background-position:0 -195px}.x-tool-expand-top,.x-tool-collapse-top{background-position:0 -210px}.x-tool-expand-left,.x-tool-collapse-left{background-position:0 -180px}.x-tool-expand-right,.x-tool-collapse-right{background-position:0 -165px}.x-tool-over .x-tool-close{background-position:-15px 0}.x-tool-over .x-tool-minimize{background-position:-15px -15px}.x-tool-over .x-tool-maximize{background-position:-15px -30px}.x-tool-over .x-tool-restore{background-position:-15px -45px}.x-tool-over .x-tool-toggle{background-position:-15px -60px}.x-panel-collapsed .x-tool-over .x-tool-toggle{background-position:-15px -75px}.x-tool-over .x-tool-gear{background-position:-15px -90px}.x-tool-over .x-tool-prev{background-position:-15px -105px}.x-tool-over .x-tool-next{background-position:-15px -120px}.x-tool-over .x-tool-pin{background-position:-15px -135px}.x-tool-over .x-tool-unpin{background-position:-15px -150px}.x-tool-over .x-tool-right{background-position:-15px -165px}.x-tool-over .x-tool-left{background-position:-15px -180px}.x-tool-over .x-tool-down{background-position:-15px -195px}.x-tool-over .x-tool-up{background-position:-15px -210px}.x-tool-over .x-tool-refresh{background-position:-15px -225px}.x-tool-over .x-tool-plus{background-position:-15px -240px}.x-tool-over .x-tool-minus{background-position:-15px -255px}.x-tool-over .x-tool-search{background-position:-15px -270px}.x-tool-over .x-tool-save{background-position:-15px -285px}.x-tool-over .x-tool-help{background-position:-15px -300px}.x-tool-over .x-tool-print{background-position:-15px -315px}.x-tool-over .x-tool-expand{background-position:-15px -330px}.x-tool-over .x-tool-collapse{background-position:-15px -345px}.x-tool-over .x-tool-resize{background-position:-15px -360px}.x-tool-over .x-tool-move{background-position:-15px -375px}.x-tool-over .x-tool-expand-bottom,.x-tool-over .x-tool-collapse-bottom{background-position:-15px -195px}.x-tool-over .x-tool-expand-top,.x-tool-over .x-tool-collapse-top{background-position:-15px -210px}.x-tool-over .x-tool-expand-left,.x-tool-over .x-tool-collapse-left{background-position:-15px -180px}.x-tool-over .x-tool-expand-right,.x-tool-over .x-tool-collapse-right{background-position:-15px -165px}.x-header-draggable .x-header-body,.x-header-ghost{cursor:move}.x-header-text{white-space:nowrap}.x-btn-default-small{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:2px 2px 2px 2px;border-width:1px;border-style:solid;background-image:none;background-color:#f8f8f8;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fff),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#fff,#eee);background-image:-moz-linear-gradient(top,#fff,#eee);background-image:-o-linear-gradient(top,#fff,#eee);background-image:-ms-linear-gradient(top,#fff,#eee);background-image:linear-gradient(top,#fff,#eee)}.x-btn-default-small-mc{background-image:url(images/btn/btn-default-small-fbg.gif);background-position:0 top;background-color:#f8f8f8}.x-nbr .x-btn-default-small{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-default-small-frameInfo{font-family:th-3-3-3-3-1-1-1-1-2-2-2-2}.x-btn-default-small-tl{background-position:0 -6px}.x-btn-default-small-tr{background-position:right -9px}.x-btn-default-small-bl{background-position:0 -12px}.x-btn-default-small-br{background-position:right -15px}.x-btn-default-small-ml{background-position:0 top}.x-btn-default-small-mr{background-position:right top}.x-btn-default-small-tc{background-position:0 0}.x-btn-default-small-bc{background-position:0 -3px}.x-btn-default-small-tr,.x-btn-default-small-br,.x-btn-default-small-mr{padding-right:3px}.x-btn-default-small-tl,.x-btn-default-small-bl,.x-btn-default-small-ml{padding-left:3px}.x-btn-default-small-tc{height:3px}.x-btn-default-small-bc{height:3px}.x-btn-default-small-tl,.x-btn-default-small-bl,.x-btn-default-small-tr,.x-btn-default-small-br,.x-btn-default-small-tc,.x-btn-default-small-bc,.x-btn-default-small-ml,.x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-corners.gif)}.x-btn-default-small-ml,.x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-sides.gif)}.x-btn-default-small-mc{padding:0}.x-btn-default-small{border-color:#bbb}.x-btn-button-default-small{height:16px}.x-btn-inner-default-small{font:normal 11px/16px tahoma,arial,verdana,sans-serif;color:#333;padding:0 4px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-small,.x-btn-icon-left>.x-btn-inner-default-small{max-width:calc(100% - 16px)}.x-btn-icon-el-default-small{height:16px}.x-btn-icon-left>.x-btn-icon-el-default-small,.x-btn-icon-right>.x-btn-icon-el-default-small{width:16px}.x-btn-icon-top>.x-btn-icon-el-default-small,.x-btn-icon-bottom>.x-btn-icon-el-default-small{min-width:16px}.x-btn-icon-el-default-small.x-btn-glyph{font-size:16px;line-height:16px;color:#333;opacity:.5}.x-ie8 .x-btn-icon-el-default-small.x-btn-glyph{color:#959595}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-small{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-small{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-small{margin-bottom:4px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-small{margin-top:4px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-small{padding-right:4px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-small{margin-right:4px}.x-btn-arrow-bottom>.x-btn-button-default-small,.x-btn-split-bottom>.x-btn-button-default-small{padding-bottom:2px}.x-btn-wrap-default-small.x-btn-arrow-right:after{width:8px;padding-right:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-small.x-btn-arrow-bottom:after{height:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-small.x-btn-split-right:after{width:14px;padding-right:14px;background-image:url(images/button/s-arrow.gif)}.x-btn-wrap-default-small.x-btn-split-bottom:after{height:14px;background-image:url(images/button/s-arrow-b.gif)}.x-btn-over>.x-btn-wrap-default-small.x-btn-split-right:after{background-image:url(images/button/s-arrow-o.gif)}.x-btn-over>.x-btn-wrap-default-small.x-btn-split-bottom:after{background-image:url(images/button/s-arrow-bo.gif)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-small{padding-right:4px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-small{margin-right:4px}.x-btn-focus.x-btn-default-small{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn-focus.x-btn-default-small .x-btn-wrap{outline:1px dotted #333}.x-btn-over.x-btn-default-small{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn.x-btn-menu-active.x-btn-default-small,.x-btn.x-btn-pressed.x-btn-default-small{border-color:#9d9d9d;background-image:none;background-color:#d6d6d6;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#c7c7c7),color-stop(100%,#e0e0e0));background-image:-webkit-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-moz-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-o-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-ms-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:linear-gradient(top,#c7c7c7,#e0e0e0)}.x-btn.x-btn-disabled.x-btn-default-small{border-color:#d7d7d7;background-image:none;background-color:#ececec;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f4f4f4),color-stop(100%,#e2e2e2));background-image:-webkit-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:-moz-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:-o-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:-ms-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:linear-gradient(top,#f4f4f4,#e2e2e2)}.x-btn-focus .x-btn-default-small-tl,.x-btn-focus .x-btn-default-small-bl,.x-btn-focus .x-btn-default-small-tr,.x-btn-focus .x-btn-default-small-br,.x-btn-focus .x-btn-default-small-tc,.x-btn-focus .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-focus-corners.gif)}.x-btn-focus .x-btn-default-small-ml,.x-btn-focus .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-focus-sides.gif)}.x-btn-focus .x-btn-default-small-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-small-focus-fbg.gif)}.x-btn-over .x-btn-default-small-tl,.x-btn-over .x-btn-default-small-bl,.x-btn-over .x-btn-default-small-tr,.x-btn-over .x-btn-default-small-br,.x-btn-over .x-btn-default-small-tc,.x-btn-over .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-over-corners.gif)}.x-btn-over .x-btn-default-small-ml,.x-btn-over .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-over-sides.gif)}.x-btn-over .x-btn-default-small-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-small-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-small-tl,.x-btn-focus.x-btn-over .x-btn-default-small-bl,.x-btn-focus.x-btn-over .x-btn-default-small-tr,.x-btn-focus.x-btn-over .x-btn-default-small-br,.x-btn-focus.x-btn-over .x-btn-default-small-tc,.x-btn-focus.x-btn-over .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-small-ml,.x-btn-focus.x-btn-over .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-small-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-small-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-small-tl,.x-btn.x-btn-menu-active .x-btn-default-small-bl,.x-btn.x-btn-menu-active .x-btn-default-small-tr,.x-btn.x-btn-menu-active .x-btn-default-small-br,.x-btn.x-btn-menu-active .x-btn-default-small-tc,.x-btn.x-btn-menu-active .x-btn-default-small-bc,.x-btn.x-btn-pressed .x-btn-default-small-tl,.x-btn.x-btn-pressed .x-btn-default-small-bl,.x-btn.x-btn-pressed .x-btn-default-small-tr,.x-btn.x-btn-pressed .x-btn-default-small-br,.x-btn.x-btn-pressed .x-btn-default-small-tc,.x-btn.x-btn-pressed .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-small-ml,.x-btn.x-btn-menu-active .x-btn-default-small-mr,.x-btn.x-btn-pressed .x-btn-default-small-ml,.x-btn.x-btn-pressed .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-small-mc,.x-btn.x-btn-pressed .x-btn-default-small-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-small-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-small-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-small-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-small-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-small-br,.x-btn-focus.x-btn-menu-active .x-btn-default-small-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-small-bc,.x-btn-focus.x-btn-pressed .x-btn-default-small-tl,.x-btn-focus.x-btn-pressed .x-btn-default-small-bl,.x-btn-focus.x-btn-pressed .x-btn-default-small-tr,.x-btn-focus.x-btn-pressed .x-btn-default-small-br,.x-btn-focus.x-btn-pressed .x-btn-default-small-tc,.x-btn-focus.x-btn-pressed .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-small-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-small-mr,.x-btn-focus.x-btn-pressed .x-btn-default-small-ml,.x-btn-focus.x-btn-pressed .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-small-mc,.x-btn-focus.x-btn-pressed .x-btn-default-small-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-small-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-small-tl,.x-btn.x-btn-disabled .x-btn-default-small-bl,.x-btn.x-btn-disabled .x-btn-default-small-tr,.x-btn.x-btn-disabled .x-btn-default-small-br,.x-btn.x-btn-disabled .x-btn-default-small-tc,.x-btn.x-btn-disabled .x-btn-default-small-bc{background-image:url(images/btn/btn-default-small-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-small-ml,.x-btn.x-btn-disabled .x-btn-default-small-mr{background-image:url(images/btn/btn-default-small-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-small-mc{background-color:#ececec;background-image:url(images/btn/btn-default-small-disabled-fbg.gif)}.x-nbr .x-btn-default-small{background-image:none}.x-btn-disabled.x-btn-default-small .x-btn-inner,.x-btn-disabled.x-btn-default-small .x-btn-icon-el{filter:alpha(opacity=50);opacity:.5}.x-btn-default-medium{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#f8f8f8;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fff),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#fff,#eee);background-image:-moz-linear-gradient(top,#fff,#eee);background-image:-o-linear-gradient(top,#fff,#eee);background-image:-ms-linear-gradient(top,#fff,#eee);background-image:linear-gradient(top,#fff,#eee)}.x-btn-default-medium-mc{background-image:url(images/btn/btn-default-medium-fbg.gif);background-position:0 top;background-color:#f8f8f8}.x-nbr .x-btn-default-medium{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-default-medium-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-default-medium-tl{background-position:0 -6px}.x-btn-default-medium-tr{background-position:right -9px}.x-btn-default-medium-bl{background-position:0 -12px}.x-btn-default-medium-br{background-position:right -15px}.x-btn-default-medium-ml{background-position:0 top}.x-btn-default-medium-mr{background-position:right top}.x-btn-default-medium-tc{background-position:0 0}.x-btn-default-medium-bc{background-position:0 -3px}.x-btn-default-medium-tr,.x-btn-default-medium-br,.x-btn-default-medium-mr{padding-right:3px}.x-btn-default-medium-tl,.x-btn-default-medium-bl,.x-btn-default-medium-ml{padding-left:3px}.x-btn-default-medium-tc{height:3px}.x-btn-default-medium-bc{height:3px}.x-btn-default-medium-tl,.x-btn-default-medium-bl,.x-btn-default-medium-tr,.x-btn-default-medium-br,.x-btn-default-medium-tc,.x-btn-default-medium-bc,.x-btn-default-medium-ml,.x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-corners.gif)}.x-btn-default-medium-ml,.x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-sides.gif)}.x-btn-default-medium-mc{padding:1px 1px 1px 1px}.x-btn-default-medium{border-color:#bbb}.x-btn-button-default-medium{height:24px}.x-btn-inner-default-medium{font:normal 11px/16px tahoma,arial,verdana,sans-serif;color:#333;padding:0 4px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-medium,.x-btn-icon-left>.x-btn-inner-default-medium{max-width:calc(100% - 24px)}.x-btn-icon-el-default-medium{height:24px}.x-btn-icon-left>.x-btn-icon-el-default-medium,.x-btn-icon-right>.x-btn-icon-el-default-medium{width:24px}.x-btn-icon-top>.x-btn-icon-el-default-medium,.x-btn-icon-bottom>.x-btn-icon-el-default-medium{min-width:24px}.x-btn-icon-el-default-medium.x-btn-glyph{font-size:24px;line-height:24px;color:#333;opacity:.5}.x-ie8 .x-btn-icon-el-default-medium.x-btn-glyph{color:#959595}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-medium{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-medium{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-medium{margin-bottom:4px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-medium{margin-top:4px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-medium{padding-right:4px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-medium{margin-right:4px}.x-btn-arrow-bottom>.x-btn-button-default-medium,.x-btn-split-bottom>.x-btn-button-default-medium{padding-bottom:3px}.x-btn-wrap-default-medium.x-btn-arrow-right:after{width:8px;padding-right:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-medium.x-btn-arrow-bottom:after{height:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-medium.x-btn-split-right:after{width:14px;padding-right:14px;background-image:url(images/button/s-arrow.gif)}.x-btn-wrap-default-medium.x-btn-split-bottom:after{height:14px;background-image:url(images/button/s-arrow-b.gif)}.x-btn-over>.x-btn-wrap-default-medium.x-btn-split-right:after{background-image:url(images/button/s-arrow-o.gif)}.x-btn-over>.x-btn-wrap-default-medium.x-btn-split-bottom:after{background-image:url(images/button/s-arrow-bo.gif)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-medium{padding-right:4px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-medium{margin-right:4px}.x-btn-focus.x-btn-default-medium{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn-focus.x-btn-default-medium .x-btn-wrap{outline:1px dotted #333}.x-btn-over.x-btn-default-medium{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn.x-btn-menu-active.x-btn-default-medium,.x-btn.x-btn-pressed.x-btn-default-medium{border-color:#9d9d9d;background-image:none;background-color:#d6d6d6;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#c7c7c7),color-stop(100%,#e0e0e0));background-image:-webkit-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-moz-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-o-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-ms-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:linear-gradient(top,#c7c7c7,#e0e0e0)}.x-btn.x-btn-disabled.x-btn-default-medium{border-color:#d7d7d7;background-image:none;background-color:#ececec;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f4f4f4),color-stop(100%,#e2e2e2));background-image:-webkit-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:-moz-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:-o-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:-ms-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:linear-gradient(top,#f4f4f4,#e2e2e2)}.x-btn-focus .x-btn-default-medium-tl,.x-btn-focus .x-btn-default-medium-bl,.x-btn-focus .x-btn-default-medium-tr,.x-btn-focus .x-btn-default-medium-br,.x-btn-focus .x-btn-default-medium-tc,.x-btn-focus .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-focus-corners.gif)}.x-btn-focus .x-btn-default-medium-ml,.x-btn-focus .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-focus-sides.gif)}.x-btn-focus .x-btn-default-medium-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-medium-focus-fbg.gif)}.x-btn-over .x-btn-default-medium-tl,.x-btn-over .x-btn-default-medium-bl,.x-btn-over .x-btn-default-medium-tr,.x-btn-over .x-btn-default-medium-br,.x-btn-over .x-btn-default-medium-tc,.x-btn-over .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-over-corners.gif)}.x-btn-over .x-btn-default-medium-ml,.x-btn-over .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-over-sides.gif)}.x-btn-over .x-btn-default-medium-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-medium-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-medium-tl,.x-btn-focus.x-btn-over .x-btn-default-medium-bl,.x-btn-focus.x-btn-over .x-btn-default-medium-tr,.x-btn-focus.x-btn-over .x-btn-default-medium-br,.x-btn-focus.x-btn-over .x-btn-default-medium-tc,.x-btn-focus.x-btn-over .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-medium-ml,.x-btn-focus.x-btn-over .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-medium-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-medium-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-medium-tl,.x-btn.x-btn-menu-active .x-btn-default-medium-bl,.x-btn.x-btn-menu-active .x-btn-default-medium-tr,.x-btn.x-btn-menu-active .x-btn-default-medium-br,.x-btn.x-btn-menu-active .x-btn-default-medium-tc,.x-btn.x-btn-menu-active .x-btn-default-medium-bc,.x-btn.x-btn-pressed .x-btn-default-medium-tl,.x-btn.x-btn-pressed .x-btn-default-medium-bl,.x-btn.x-btn-pressed .x-btn-default-medium-tr,.x-btn.x-btn-pressed .x-btn-default-medium-br,.x-btn.x-btn-pressed .x-btn-default-medium-tc,.x-btn.x-btn-pressed .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-medium-ml,.x-btn.x-btn-menu-active .x-btn-default-medium-mr,.x-btn.x-btn-pressed .x-btn-default-medium-ml,.x-btn.x-btn-pressed .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-medium-mc,.x-btn.x-btn-pressed .x-btn-default-medium-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-medium-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-medium-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-br,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-bc,.x-btn-focus.x-btn-pressed .x-btn-default-medium-tl,.x-btn-focus.x-btn-pressed .x-btn-default-medium-bl,.x-btn-focus.x-btn-pressed .x-btn-default-medium-tr,.x-btn-focus.x-btn-pressed .x-btn-default-medium-br,.x-btn-focus.x-btn-pressed .x-btn-default-medium-tc,.x-btn-focus.x-btn-pressed .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-medium-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-medium-mr,.x-btn-focus.x-btn-pressed .x-btn-default-medium-ml,.x-btn-focus.x-btn-pressed .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-medium-mc,.x-btn-focus.x-btn-pressed .x-btn-default-medium-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-medium-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-medium-tl,.x-btn.x-btn-disabled .x-btn-default-medium-bl,.x-btn.x-btn-disabled .x-btn-default-medium-tr,.x-btn.x-btn-disabled .x-btn-default-medium-br,.x-btn.x-btn-disabled .x-btn-default-medium-tc,.x-btn.x-btn-disabled .x-btn-default-medium-bc{background-image:url(images/btn/btn-default-medium-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-medium-ml,.x-btn.x-btn-disabled .x-btn-default-medium-mr{background-image:url(images/btn/btn-default-medium-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-medium-mc{background-color:#ececec;background-image:url(images/btn/btn-default-medium-disabled-fbg.gif)}.x-nbr .x-btn-default-medium{background-image:none}.x-btn-disabled.x-btn-default-medium .x-btn-inner,.x-btn-disabled.x-btn-default-medium .x-btn-icon-el{filter:alpha(opacity=50);opacity:.5}.x-btn-default-large{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#f8f8f8;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fff),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#fff,#eee);background-image:-moz-linear-gradient(top,#fff,#eee);background-image:-o-linear-gradient(top,#fff,#eee);background-image:-ms-linear-gradient(top,#fff,#eee);background-image:linear-gradient(top,#fff,#eee)}.x-btn-default-large-mc{background-image:url(images/btn/btn-default-large-fbg.gif);background-position:0 top;background-color:#f8f8f8}.x-nbr .x-btn-default-large{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-btn-default-large-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-default-large-tl{background-position:0 -6px}.x-btn-default-large-tr{background-position:right -9px}.x-btn-default-large-bl{background-position:0 -12px}.x-btn-default-large-br{background-position:right -15px}.x-btn-default-large-ml{background-position:0 top}.x-btn-default-large-mr{background-position:right top}.x-btn-default-large-tc{background-position:0 0}.x-btn-default-large-bc{background-position:0 -3px}.x-btn-default-large-tr,.x-btn-default-large-br,.x-btn-default-large-mr{padding-right:3px}.x-btn-default-large-tl,.x-btn-default-large-bl,.x-btn-default-large-ml{padding-left:3px}.x-btn-default-large-tc{height:3px}.x-btn-default-large-bc{height:3px}.x-btn-default-large-tl,.x-btn-default-large-bl,.x-btn-default-large-tr,.x-btn-default-large-br,.x-btn-default-large-tc,.x-btn-default-large-bc,.x-btn-default-large-ml,.x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-corners.gif)}.x-btn-default-large-ml,.x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-sides.gif)}.x-btn-default-large-mc{padding:1px 1px 1px 1px}.x-btn-default-large{border-color:#bbb}.x-btn-button-default-large{height:32px}.x-btn-inner-default-large{font:normal 11px/16px tahoma,arial,verdana,sans-serif;color:#333;padding:0 4px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-large,.x-btn-icon-left>.x-btn-inner-default-large{max-width:calc(100% - 32px)}.x-btn-icon-el-default-large{height:32px}.x-btn-icon-left>.x-btn-icon-el-default-large,.x-btn-icon-right>.x-btn-icon-el-default-large{width:32px}.x-btn-icon-top>.x-btn-icon-el-default-large,.x-btn-icon-bottom>.x-btn-icon-el-default-large{min-width:32px}.x-btn-icon-el-default-large.x-btn-glyph{font-size:32px;line-height:32px;color:#333;opacity:.5}.x-ie8 .x-btn-icon-el-default-large.x-btn-glyph{color:#959595}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-large{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-large{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-large{margin-bottom:4px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-large{margin-top:4px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-large{padding-right:4px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-large{margin-right:4px}.x-btn-arrow-bottom>.x-btn-button-default-large,.x-btn-split-bottom>.x-btn-button-default-large{padding-bottom:3px}.x-btn-wrap-default-large.x-btn-arrow-right:after{width:8px;padding-right:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-large.x-btn-arrow-bottom:after{height:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-large.x-btn-split-right:after{width:14px;padding-right:14px;background-image:url(images/button/s-arrow.gif)}.x-btn-wrap-default-large.x-btn-split-bottom:after{height:14px;background-image:url(images/button/s-arrow-b.gif)}.x-btn-over>.x-btn-wrap-default-large.x-btn-split-right:after{background-image:url(images/button/s-arrow-o.gif)}.x-btn-over>.x-btn-wrap-default-large.x-btn-split-bottom:after{background-image:url(images/button/s-arrow-bo.gif)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-large{padding-right:4px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-large{margin-right:4px}.x-btn-focus.x-btn-default-large{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn-focus.x-btn-default-large .x-btn-wrap{outline:1px dotted #333}.x-btn-over.x-btn-default-large{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn.x-btn-menu-active.x-btn-default-large,.x-btn.x-btn-pressed.x-btn-default-large{border-color:#9d9d9d;background-image:none;background-color:#d6d6d6;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#c7c7c7),color-stop(100%,#e0e0e0));background-image:-webkit-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-moz-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-o-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-ms-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:linear-gradient(top,#c7c7c7,#e0e0e0)}.x-btn.x-btn-disabled.x-btn-default-large{border-color:#d7d7d7;background-image:none;background-color:#ececec;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f4f4f4),color-stop(100%,#e2e2e2));background-image:-webkit-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:-moz-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:-o-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:-ms-linear-gradient(top,#f4f4f4,#e2e2e2);background-image:linear-gradient(top,#f4f4f4,#e2e2e2)}.x-btn-focus .x-btn-default-large-tl,.x-btn-focus .x-btn-default-large-bl,.x-btn-focus .x-btn-default-large-tr,.x-btn-focus .x-btn-default-large-br,.x-btn-focus .x-btn-default-large-tc,.x-btn-focus .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-focus-corners.gif)}.x-btn-focus .x-btn-default-large-ml,.x-btn-focus .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-focus-sides.gif)}.x-btn-focus .x-btn-default-large-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-large-focus-fbg.gif)}.x-btn-over .x-btn-default-large-tl,.x-btn-over .x-btn-default-large-bl,.x-btn-over .x-btn-default-large-tr,.x-btn-over .x-btn-default-large-br,.x-btn-over .x-btn-default-large-tc,.x-btn-over .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-over-corners.gif)}.x-btn-over .x-btn-default-large-ml,.x-btn-over .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-over-sides.gif)}.x-btn-over .x-btn-default-large-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-large-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-large-tl,.x-btn-focus.x-btn-over .x-btn-default-large-bl,.x-btn-focus.x-btn-over .x-btn-default-large-tr,.x-btn-focus.x-btn-over .x-btn-default-large-br,.x-btn-focus.x-btn-over .x-btn-default-large-tc,.x-btn-focus.x-btn-over .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-large-ml,.x-btn-focus.x-btn-over .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-large-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-large-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-large-tl,.x-btn.x-btn-menu-active .x-btn-default-large-bl,.x-btn.x-btn-menu-active .x-btn-default-large-tr,.x-btn.x-btn-menu-active .x-btn-default-large-br,.x-btn.x-btn-menu-active .x-btn-default-large-tc,.x-btn.x-btn-menu-active .x-btn-default-large-bc,.x-btn.x-btn-pressed .x-btn-default-large-tl,.x-btn.x-btn-pressed .x-btn-default-large-bl,.x-btn.x-btn-pressed .x-btn-default-large-tr,.x-btn.x-btn-pressed .x-btn-default-large-br,.x-btn.x-btn-pressed .x-btn-default-large-tc,.x-btn.x-btn-pressed .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-large-ml,.x-btn.x-btn-menu-active .x-btn-default-large-mr,.x-btn.x-btn-pressed .x-btn-default-large-ml,.x-btn.x-btn-pressed .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-large-mc,.x-btn.x-btn-pressed .x-btn-default-large-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-large-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-large-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-large-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-large-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-large-br,.x-btn-focus.x-btn-menu-active .x-btn-default-large-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-large-bc,.x-btn-focus.x-btn-pressed .x-btn-default-large-tl,.x-btn-focus.x-btn-pressed .x-btn-default-large-bl,.x-btn-focus.x-btn-pressed .x-btn-default-large-tr,.x-btn-focus.x-btn-pressed .x-btn-default-large-br,.x-btn-focus.x-btn-pressed .x-btn-default-large-tc,.x-btn-focus.x-btn-pressed .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-large-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-large-mr,.x-btn-focus.x-btn-pressed .x-btn-default-large-ml,.x-btn-focus.x-btn-pressed .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-large-mc,.x-btn-focus.x-btn-pressed .x-btn-default-large-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-large-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-large-tl,.x-btn.x-btn-disabled .x-btn-default-large-bl,.x-btn.x-btn-disabled .x-btn-default-large-tr,.x-btn.x-btn-disabled .x-btn-default-large-br,.x-btn.x-btn-disabled .x-btn-default-large-tc,.x-btn.x-btn-disabled .x-btn-default-large-bc{background-image:url(images/btn/btn-default-large-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-large-ml,.x-btn.x-btn-disabled .x-btn-default-large-mr{background-image:url(images/btn/btn-default-large-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-large-mc{background-color:#ececec;background-image:url(images/btn/btn-default-large-disabled-fbg.gif)}.x-nbr .x-btn-default-large{background-image:none}.x-btn-disabled.x-btn-default-large .x-btn-inner,.x-btn-disabled.x-btn-default-large .x-btn-icon-el{filter:alpha(opacity=50);opacity:.5}.x-btn-default-toolbar-small{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:2px 2px 2px 2px;border-width:1px;border-style:solid;background-color:transparent}.x-btn-default-toolbar-small-mc{background-color:transparent}.x-nbr .x-btn-default-toolbar-small{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-btn-default-toolbar-small-frameInfo{font-family:th-3-3-3-3-1-1-1-1-2-2-2-2}.x-btn-default-toolbar-small-tl{background-position:0 -6px}.x-btn-default-toolbar-small-tr{background-position:right -9px}.x-btn-default-toolbar-small-bl{background-position:0 -12px}.x-btn-default-toolbar-small-br{background-position:right -15px}.x-btn-default-toolbar-small-ml{background-position:0 top}.x-btn-default-toolbar-small-mr{background-position:right top}.x-btn-default-toolbar-small-tc{background-position:0 0}.x-btn-default-toolbar-small-bc{background-position:0 -3px}.x-btn-default-toolbar-small-tr,.x-btn-default-toolbar-small-br,.x-btn-default-toolbar-small-mr{padding-right:3px}.x-btn-default-toolbar-small-tl,.x-btn-default-toolbar-small-bl,.x-btn-default-toolbar-small-ml{padding-left:3px}.x-btn-default-toolbar-small-tc{height:3px}.x-btn-default-toolbar-small-bc{height:3px}.x-btn-default-toolbar-small-mc{padding:0}.x-btn-default-toolbar-small{border-color:transparent}.x-btn-button-default-toolbar-small{height:16px}.x-btn-inner-default-toolbar-small{font:normal 11px/16px tahoma,arial,verdana,sans-serif;color:#333;padding:0 4px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-toolbar-small,.x-btn-icon-left>.x-btn-inner-default-toolbar-small{max-width:calc(100% - 16px)}.x-btn-icon-el-default-toolbar-small{height:16px}.x-btn-icon-left>.x-btn-icon-el-default-toolbar-small,.x-btn-icon-right>.x-btn-icon-el-default-toolbar-small{width:16px}.x-btn-icon-top>.x-btn-icon-el-default-toolbar-small,.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-small{min-width:16px}.x-btn-icon-el-default-toolbar-small.x-btn-glyph{font-size:16px;line-height:16px;color:#333;opacity:.5}.x-ie8 .x-btn-icon-el-default-toolbar-small.x-btn-glyph{color:#999}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-toolbar-small{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-small{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-toolbar-small{margin-bottom:4px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-small{margin-top:4px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-small{padding-right:4px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-small{margin-right:4px}.x-btn-arrow-bottom>.x-btn-button-default-toolbar-small,.x-btn-split-bottom>.x-btn-button-default-toolbar-small{padding-bottom:2px}.x-btn-wrap-default-toolbar-small.x-btn-arrow-right:after{width:8px;padding-right:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-toolbar-small.x-btn-arrow-bottom:after{height:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-toolbar-small.x-btn-split-right:after{width:14px;padding-right:14px;background-image:url(images/button/s-arrow-noline.gif)}.x-btn-wrap-default-toolbar-small.x-btn-split-bottom:after{height:14px;background-image:url(images/button/s-arrow-b-noline.gif)}.x-btn-over>.x-btn-wrap-default-toolbar-small.x-btn-split-right:after{background-image:url(images/button/s-arrow-o.gif)}.x-btn-over>.x-btn-wrap-default-toolbar-small.x-btn-split-bottom:after{background-image:url(images/button/s-arrow-bo.gif)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-small{padding-right:4px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-small{margin-right:4px}.x-btn-focus.x-btn-default-toolbar-small{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn-focus.x-btn-default-toolbar-small .x-btn-wrap{outline:1px dotted #333}.x-btn-over.x-btn-default-toolbar-small{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn.x-btn-menu-active.x-btn-default-toolbar-small,.x-btn.x-btn-pressed.x-btn-default-toolbar-small{border-color:#9d9d9d;background-image:none;background-color:#d6d6d6;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#c7c7c7),color-stop(100%,#e0e0e0));background-image:-webkit-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-moz-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-o-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-ms-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:linear-gradient(top,#c7c7c7,#e0e0e0)}.x-btn.x-btn-disabled.x-btn-default-toolbar-small{border-color:#d7d7d7;background-image:none;background-color:transparent}.x-btn.x-btn-disabled.x-btn-default-toolbar-small .x-btn-inner{color:#8c8c8c}.x-btn-focus .x-btn-default-toolbar-small-tl,.x-btn-focus .x-btn-default-toolbar-small-bl,.x-btn-focus .x-btn-default-toolbar-small-tr,.x-btn-focus .x-btn-default-toolbar-small-br,.x-btn-focus .x-btn-default-toolbar-small-tc,.x-btn-focus .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-focus-corners.gif)}.x-btn-focus .x-btn-default-toolbar-small-ml,.x-btn-focus .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-focus-sides.gif)}.x-btn-focus .x-btn-default-toolbar-small-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-toolbar-small-focus-fbg.gif)}.x-btn-over .x-btn-default-toolbar-small-tl,.x-btn-over .x-btn-default-toolbar-small-bl,.x-btn-over .x-btn-default-toolbar-small-tr,.x-btn-over .x-btn-default-toolbar-small-br,.x-btn-over .x-btn-default-toolbar-small-tc,.x-btn-over .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-over-corners.gif)}.x-btn-over .x-btn-default-toolbar-small-ml,.x-btn-over .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-over-sides.gif)}.x-btn-over .x-btn-default-toolbar-small-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-toolbar-small-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-tl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-bl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-tr,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-br,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-tc,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-ml,.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-small-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-toolbar-small-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-tl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-bl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-tr,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-br,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-tc,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-bc,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-tl,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-bl,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-tr,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-br,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-tc,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-ml,.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-mr,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-ml,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-small-mc,.x-btn.x-btn-pressed .x-btn-default-toolbar-small-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-toolbar-small-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-br,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-bc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-tl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-bl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-tr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-br,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-tc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-mr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-ml,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-small-mc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-small-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-toolbar-small-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-small-tl,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-bl,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-tr,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-br,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-tc,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-bc{background-image:url(images/btn/btn-default-toolbar-small-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-small-ml,.x-btn.x-btn-disabled .x-btn-default-toolbar-small-mr{background-image:url(images/btn/btn-default-toolbar-small-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-small-mc{background-color:transparent;background-image:url(images/btn/btn-default-toolbar-small-disabled-fbg.gif)}.x-nbr .x-btn-default-toolbar-small{background-image:none}.x-btn-disabled.x-btn-default-toolbar-small{filter:alpha(opacity=50);opacity:.5}.x-btn-default-toolbar-medium{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-color:transparent}.x-btn-default-toolbar-medium-mc{background-color:transparent}.x-nbr .x-btn-default-toolbar-medium{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-btn-default-toolbar-medium-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-default-toolbar-medium-tl{background-position:0 -6px}.x-btn-default-toolbar-medium-tr{background-position:right -9px}.x-btn-default-toolbar-medium-bl{background-position:0 -12px}.x-btn-default-toolbar-medium-br{background-position:right -15px}.x-btn-default-toolbar-medium-ml{background-position:0 top}.x-btn-default-toolbar-medium-mr{background-position:right top}.x-btn-default-toolbar-medium-tc{background-position:0 0}.x-btn-default-toolbar-medium-bc{background-position:0 -3px}.x-btn-default-toolbar-medium-tr,.x-btn-default-toolbar-medium-br,.x-btn-default-toolbar-medium-mr{padding-right:3px}.x-btn-default-toolbar-medium-tl,.x-btn-default-toolbar-medium-bl,.x-btn-default-toolbar-medium-ml{padding-left:3px}.x-btn-default-toolbar-medium-tc{height:3px}.x-btn-default-toolbar-medium-bc{height:3px}.x-btn-default-toolbar-medium-mc{padding:1px 1px 1px 1px}.x-btn-default-toolbar-medium{border-color:transparent}.x-btn-button-default-toolbar-medium{height:24px}.x-btn-inner-default-toolbar-medium{font:normal 11px/16px tahoma,arial,verdana,sans-serif;color:#333;padding:0 4px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-toolbar-medium,.x-btn-icon-left>.x-btn-inner-default-toolbar-medium{max-width:calc(100% - 24px)}.x-btn-icon-el-default-toolbar-medium{height:24px}.x-btn-icon-left>.x-btn-icon-el-default-toolbar-medium,.x-btn-icon-right>.x-btn-icon-el-default-toolbar-medium{width:24px}.x-btn-icon-top>.x-btn-icon-el-default-toolbar-medium,.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-medium{min-width:24px}.x-btn-icon-el-default-toolbar-medium.x-btn-glyph{font-size:24px;line-height:24px;color:#333;opacity:.5}.x-ie8 .x-btn-icon-el-default-toolbar-medium.x-btn-glyph{color:#999}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-toolbar-medium{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-medium{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-toolbar-medium{margin-bottom:4px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-medium{margin-top:4px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-medium{padding-right:4px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-medium{margin-right:4px}.x-btn-arrow-bottom>.x-btn-button-default-toolbar-medium,.x-btn-split-bottom>.x-btn-button-default-toolbar-medium{padding-bottom:3px}.x-btn-wrap-default-toolbar-medium.x-btn-arrow-right:after{width:8px;padding-right:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-toolbar-medium.x-btn-arrow-bottom:after{height:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-toolbar-medium.x-btn-split-right:after{width:14px;padding-right:14px;background-image:url(images/button/s-arrow-noline.gif)}.x-btn-wrap-default-toolbar-medium.x-btn-split-bottom:after{height:14px;background-image:url(images/button/s-arrow-b-noline.gif)}.x-btn-over>.x-btn-wrap-default-toolbar-medium.x-btn-split-right:after{background-image:url(images/button/s-arrow-o.gif)}.x-btn-over>.x-btn-wrap-default-toolbar-medium.x-btn-split-bottom:after{background-image:url(images/button/s-arrow-bo.gif)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-medium{padding-right:4px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-medium{margin-right:4px}.x-btn-focus.x-btn-default-toolbar-medium{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn-focus.x-btn-default-toolbar-medium .x-btn-wrap{outline:1px dotted #333}.x-btn-over.x-btn-default-toolbar-medium{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn.x-btn-menu-active.x-btn-default-toolbar-medium,.x-btn.x-btn-pressed.x-btn-default-toolbar-medium{border-color:#9d9d9d;background-image:none;background-color:#d6d6d6;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#c7c7c7),color-stop(100%,#e0e0e0));background-image:-webkit-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-moz-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-o-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-ms-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:linear-gradient(top,#c7c7c7,#e0e0e0)}.x-btn.x-btn-disabled.x-btn-default-toolbar-medium{border-color:#d7d7d7;background-image:none;background-color:transparent}.x-btn.x-btn-disabled.x-btn-default-toolbar-medium .x-btn-inner{color:#8c8c8c}.x-btn-focus .x-btn-default-toolbar-medium-tl,.x-btn-focus .x-btn-default-toolbar-medium-bl,.x-btn-focus .x-btn-default-toolbar-medium-tr,.x-btn-focus .x-btn-default-toolbar-medium-br,.x-btn-focus .x-btn-default-toolbar-medium-tc,.x-btn-focus .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-focus-corners.gif)}.x-btn-focus .x-btn-default-toolbar-medium-ml,.x-btn-focus .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-focus-sides.gif)}.x-btn-focus .x-btn-default-toolbar-medium-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-toolbar-medium-focus-fbg.gif)}.x-btn-over .x-btn-default-toolbar-medium-tl,.x-btn-over .x-btn-default-toolbar-medium-bl,.x-btn-over .x-btn-default-toolbar-medium-tr,.x-btn-over .x-btn-default-toolbar-medium-br,.x-btn-over .x-btn-default-toolbar-medium-tc,.x-btn-over .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-over-corners.gif)}.x-btn-over .x-btn-default-toolbar-medium-ml,.x-btn-over .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-over-sides.gif)}.x-btn-over .x-btn-default-toolbar-medium-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-toolbar-medium-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-tl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-bl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-tr,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-br,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-tc,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-ml,.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-medium-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-toolbar-medium-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-tl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-bl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-tr,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-br,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-tc,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-bc,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-tl,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-bl,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-tr,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-br,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-tc,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-ml,.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-mr,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-ml,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-medium-mc,.x-btn.x-btn-pressed .x-btn-default-toolbar-medium-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-toolbar-medium-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-br,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-bc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-tl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-bl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-tr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-br,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-tc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-mr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-ml,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-medium-mc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-medium-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-toolbar-medium-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-tl,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-bl,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-tr,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-br,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-tc,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-bc{background-image:url(images/btn/btn-default-toolbar-medium-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-ml,.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-mr{background-image:url(images/btn/btn-default-toolbar-medium-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-medium-mc{background-color:transparent;background-image:url(images/btn/btn-default-toolbar-medium-disabled-fbg.gif)}.x-nbr .x-btn-default-toolbar-medium{background-image:none}.x-btn-disabled.x-btn-default-toolbar-medium{filter:alpha(opacity=50);opacity:.5}.x-btn-default-toolbar-large{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-color:transparent}.x-btn-default-toolbar-large-mc{background-color:transparent}.x-nbr .x-btn-default-toolbar-large{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-btn-default-toolbar-large-frameInfo{font-family:th-3-3-3-3-1-1-1-1-3-3-3-3}.x-btn-default-toolbar-large-tl{background-position:0 -6px}.x-btn-default-toolbar-large-tr{background-position:right -9px}.x-btn-default-toolbar-large-bl{background-position:0 -12px}.x-btn-default-toolbar-large-br{background-position:right -15px}.x-btn-default-toolbar-large-ml{background-position:0 top}.x-btn-default-toolbar-large-mr{background-position:right top}.x-btn-default-toolbar-large-tc{background-position:0 0}.x-btn-default-toolbar-large-bc{background-position:0 -3px}.x-btn-default-toolbar-large-tr,.x-btn-default-toolbar-large-br,.x-btn-default-toolbar-large-mr{padding-right:3px}.x-btn-default-toolbar-large-tl,.x-btn-default-toolbar-large-bl,.x-btn-default-toolbar-large-ml{padding-left:3px}.x-btn-default-toolbar-large-tc{height:3px}.x-btn-default-toolbar-large-bc{height:3px}.x-btn-default-toolbar-large-mc{padding:1px 1px 1px 1px}.x-btn-default-toolbar-large{border-color:transparent}.x-btn-button-default-toolbar-large{height:32px}.x-btn-inner-default-toolbar-large{font:normal 11px/16px tahoma,arial,verdana,sans-serif;color:#333;padding:0 4px;max-width:100%}.x-btn-icon-right>.x-btn-inner-default-toolbar-large,.x-btn-icon-left>.x-btn-inner-default-toolbar-large{max-width:calc(100% - 32px)}.x-btn-icon-el-default-toolbar-large{height:32px}.x-btn-icon-left>.x-btn-icon-el-default-toolbar-large,.x-btn-icon-right>.x-btn-icon-el-default-toolbar-large{width:32px}.x-btn-icon-top>.x-btn-icon-el-default-toolbar-large,.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-large{min-width:32px}.x-btn-icon-el-default-toolbar-large.x-btn-glyph{font-size:32px;line-height:32px;color:#333;opacity:.5}.x-ie8 .x-btn-icon-el-default-toolbar-large.x-btn-glyph{color:#999}.x-btn-text.x-btn-icon-left>.x-btn-icon-el-default-toolbar-large{margin-right:0}.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-large{margin-left:0}.x-btn-text.x-btn-icon-top>.x-btn-icon-el-default-toolbar-large{margin-bottom:4px}.x-btn-text.x-btn-icon-bottom>.x-btn-icon-el-default-toolbar-large{margin-top:4px}.x-btn-arrow-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-large{padding-right:4px}.x-btn-arrow-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-large{margin-right:4px}.x-btn-arrow-bottom>.x-btn-button-default-toolbar-large,.x-btn-split-bottom>.x-btn-button-default-toolbar-large{padding-bottom:3px}.x-btn-wrap-default-toolbar-large.x-btn-arrow-right:after{width:8px;padding-right:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-toolbar-large.x-btn-arrow-bottom:after{height:8px;background-image:url(images/button/arrow.gif)}.x-btn-wrap-default-toolbar-large.x-btn-split-right:after{width:14px;padding-right:14px;background-image:url(images/button/s-arrow-noline.gif)}.x-btn-wrap-default-toolbar-large.x-btn-split-bottom:after{height:14px;background-image:url(images/button/s-arrow-b-noline.gif)}.x-btn-over>.x-btn-wrap-default-toolbar-large.x-btn-split-right:after{background-image:url(images/button/s-arrow-o.gif)}.x-btn-over>.x-btn-wrap-default-toolbar-large.x-btn-split-bottom:after{background-image:url(images/button/s-arrow-bo.gif)}.x-btn-split-right>.x-btn-icon.x-btn-no-text.x-btn-button-default-toolbar-large{padding-right:4px}.x-btn-split-right>.x-btn-text.x-btn-icon-right>.x-btn-icon-el-default-toolbar-large{margin-right:4px}.x-btn-focus.x-btn-default-toolbar-large{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn-focus.x-btn-default-toolbar-large .x-btn-wrap{outline:1px dotted #333}.x-btn-over.x-btn-default-toolbar-large{border-color:#9d9d9d;background-image:none;background-color:#f3f3f3;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fbfbfb),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-moz-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-o-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:-ms-linear-gradient(top,#fbfbfb,#e9e9e9);background-image:linear-gradient(top,#fbfbfb,#e9e9e9)}.x-btn.x-btn-menu-active.x-btn-default-toolbar-large,.x-btn.x-btn-pressed.x-btn-default-toolbar-large{border-color:#9d9d9d;background-image:none;background-color:#d6d6d6;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#c7c7c7),color-stop(100%,#e0e0e0));background-image:-webkit-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-moz-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-o-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:-ms-linear-gradient(top,#c7c7c7,#e0e0e0);background-image:linear-gradient(top,#c7c7c7,#e0e0e0)}.x-btn.x-btn-disabled.x-btn-default-toolbar-large{border-color:#d7d7d7;background-image:none;background-color:transparent}.x-btn.x-btn-disabled.x-btn-default-toolbar-large .x-btn-inner{color:#8c8c8c}.x-btn-focus .x-btn-default-toolbar-large-tl,.x-btn-focus .x-btn-default-toolbar-large-bl,.x-btn-focus .x-btn-default-toolbar-large-tr,.x-btn-focus .x-btn-default-toolbar-large-br,.x-btn-focus .x-btn-default-toolbar-large-tc,.x-btn-focus .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-focus-corners.gif)}.x-btn-focus .x-btn-default-toolbar-large-ml,.x-btn-focus .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-focus-sides.gif)}.x-btn-focus .x-btn-default-toolbar-large-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-toolbar-large-focus-fbg.gif)}.x-btn-over .x-btn-default-toolbar-large-tl,.x-btn-over .x-btn-default-toolbar-large-bl,.x-btn-over .x-btn-default-toolbar-large-tr,.x-btn-over .x-btn-default-toolbar-large-br,.x-btn-over .x-btn-default-toolbar-large-tc,.x-btn-over .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-over-corners.gif)}.x-btn-over .x-btn-default-toolbar-large-ml,.x-btn-over .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-over-sides.gif)}.x-btn-over .x-btn-default-toolbar-large-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-toolbar-large-over-fbg.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-tl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-bl,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-tr,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-br,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-tc,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-focus-over-corners.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-ml,.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-focus-over-sides.gif)}.x-btn-focus.x-btn-over .x-btn-default-toolbar-large-mc{background-color:#f3f3f3;background-image:url(images/btn/btn-default-toolbar-large-focus-over-fbg.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-tl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-bl,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-tr,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-br,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-tc,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-bc,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-tl,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-bl,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-tr,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-br,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-tc,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-pressed-corners.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-ml,.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-mr,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-ml,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-pressed-sides.gif)}.x-btn.x-btn-menu-active .x-btn-default-toolbar-large-mc,.x-btn.x-btn-pressed .x-btn-default-toolbar-large-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-toolbar-large-pressed-fbg.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-tl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-bl,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-tr,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-br,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-tc,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-bc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-tl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-bl,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-tr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-br,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-tc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-focus-pressed-corners.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-ml,.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-mr,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-ml,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-focus-pressed-sides.gif)}.x-btn-focus.x-btn-menu-active .x-btn-default-toolbar-large-mc,.x-btn-focus.x-btn-pressed .x-btn-default-toolbar-large-mc{background-color:#d6d6d6;background-image:url(images/btn/btn-default-toolbar-large-focus-pressed-fbg.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-large-tl,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-bl,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-tr,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-br,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-tc,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-bc{background-image:url(images/btn/btn-default-toolbar-large-disabled-corners.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-large-ml,.x-btn.x-btn-disabled .x-btn-default-toolbar-large-mr{background-image:url(images/btn/btn-default-toolbar-large-disabled-sides.gif)}.x-btn.x-btn-disabled .x-btn-default-toolbar-large-mc{background-color:transparent;background-image:url(images/btn/btn-default-toolbar-large-disabled-fbg.gif)}.x-nbr .x-btn-default-toolbar-large{background-image:none}.x-btn-disabled.x-btn-default-toolbar-large{filter:alpha(opacity=50);opacity:.5}.x-collapse-el{cursor:pointer}.x-layout-split-left,.x-layout-split-right{top:50%;margin-top:-18px;width:5px;height:35px}.x-layout-split-top,.x-layout-split-bottom{left:50%;width:35px;height:5px;margin-left:-18px}.x-layout-split-left{background-image:url(images/util/splitter/mini-left.gif)}.x-layout-split-right{background-image:url(images/util/splitter/mini-right.gif)}.x-layout-split-top{background-image:url(images/util/splitter/mini-top.gif)}.x-layout-split-bottom{background-image:url(images/util/splitter/mini-bottom.gif)}.x-splitter-collapsed .x-layout-split-left{background-image:url(images/util/splitter/mini-right.gif)}.x-splitter-collapsed .x-layout-split-right{background-image:url(images/util/splitter/mini-left.gif)}.x-splitter-collapsed .x-layout-split-top{background-image:url(images/util/splitter/mini-bottom.gif)}.x-splitter-collapsed .x-layout-split-bottom{background-image:url(images/util/splitter/mini-top.gif)}.x-splitter-active{background-color:#b4b4b4;filter:alpha(opacity=80);opacity:.8}.x-splitter-active .x-collapse-el{filter:alpha(opacity=30);opacity:.3}.x-toolbar-default{padding:2px 0 2px 2px;border-style:solid;border-color:#bcb0b0;border-width:1px;background-image:none;background-color:#d8d8d8;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#e6e6e6),color-stop(100%,#efefef));background-image:-webkit-linear-gradient(top,#e6e6e6,#efefef);background-image:-moz-linear-gradient(top,#e6e6e6,#efefef);background-image:-o-linear-gradient(top,#e6e6e6,#efefef);background-image:-ms-linear-gradient(top,#e6e6e6,#efefef);background-image:linear-gradient(top,#e6e6e6,#efefef)}.x-toolbar-default .x-toolbar-item{margin:0 2px 0 0}.x-toolbar-default .x-toolbar-separator-horizontal{margin:0 2px 0 0;height:14px;border-style:solid;border-width:0 1px;border-left-color:#aca899;border-right-color:white}.x-toolbar-default .x-box-menu-after{margin:0 2px}.x-toolbar-default-vertical{padding:2px 2px 0}.x-toolbar-default-vertical .x-toolbar-item{margin:0 0 2px 0}.x-toolbar-default-vertical .x-toolbar-separator-vertical{margin:0 5px 2px;border-style:solid none;border-width:1px 0;border-top-color:#aca899;border-bottom-color:white}.x-toolbar-default-vertical .x-box-menu-after{margin:2px 0}.x-nlg .x-toolbar-default{background-image:url(images/toolbar/toolbar-default-bg.gif)!important;background-repeat:repeat-x}.x-toolbar-text-default{padding:0 4px;color:black;font:normal 11px/16px tahoma,arial,verdana,sans-serif}.x-toolbar-spacer-default{width:2px}.x-toolbar-default-scroller .x-box-scroller-body-horizontal{margin-left:12px}.x-toolbar-default-vertical-scroller .x-box-scroller-body-vertical{margin-top:13px}.x-box-scroller-toolbar-default{cursor:pointer}.x-box-scroller-toolbar-default.x-box-scroller-disabled{filter:alpha(opacity=50);opacity:.5;cursor:default}.x-box-scroller-toolbar-default.x-box-scroller-left,.x-box-scroller-toolbar-default.x-box-scroller-right{width:14px;height:22px;border-style:solid;border-color:#8db2e3;border-width:0 0 1px;top:50%;margin-top:-11px}.x-box-scroller-toolbar-default.x-box-scroller-left{margin-left:0;margin-right:0;margin-bottom:0;background-image:url(images/toolbar/default-scroll-left.gif);background-position:-14px 0}.x-box-scroller-toolbar-default.x-box-scroller-left.x-box-scroller-hover{background-position:0 0}.x-box-scroller-toolbar-default.x-box-scroller-right{margin-left:0;margin-right:0;margin-bottom:0;background-image:url(images/toolbar/default-scroll-right.gif);background-position:0 0}.x-box-scroller-toolbar-default.x-box-scroller-right.x-box-scroller-hover{background-position:-14px 0}.x-box-scroller-toolbar-default.x-box-scroller-top,.x-box-scroller-toolbar-default.x-box-scroller-bottom{height:5px;width:35px;left:50%;margin-left:-17px}.x-box-scroller-toolbar-default.x-box-scroller-top{margin-top:5px;margin-right:0;margin-bottom:5px;background-image:url(images/toolbar/default-scroll-top.gif);background-position:0 -5px}.x-box-scroller-toolbar-default.x-box-scroller-top.x-box-scroller-hover{background-position:0 0}.x-box-scroller-toolbar-default.x-box-scroller-bottom{margin-top:5px;margin-right:0;margin-bottom:5px;background-image:url(images/toolbar/default-scroll-bottom.gif);background-position:0 0}.x-box-scroller-toolbar-default.x-box-scroller-bottom.x-box-scroller-hover{background-position:0 -5px}.x-ie8 .x-box-scroller-toolbar-default{background-color:#d8d8d8}.x-toolbar-more-icon{background-image:url(images/toolbar/default-more.gif)}.x-toolbar-footer{padding:4px 0 4px 6px;border-style:solid;border-color:#bcb0b0;border-width:0;background-image:none;background-color:transparent}.x-toolbar-footer .x-toolbar-item{margin:0 6px 0 0}.x-toolbar-footer .x-toolbar-separator-horizontal{margin:0 2px 0 0;height:14px;border-style:solid;border-width:0 1px;border-left-color:#aca899;border-right-color:white}.x-toolbar-footer .x-box-menu-after{margin:0 6px}.x-toolbar-footer-vertical{padding:4px 6px 0}.x-toolbar-footer-vertical .x-toolbar-item{margin:0 0 4px 0}.x-toolbar-footer-vertical .x-toolbar-separator-vertical{margin:0 5px 2px;border-style:solid none;border-width:1px 0;border-top-color:#aca899;border-bottom-color:white}.x-toolbar-footer-vertical .x-box-menu-after{margin:4px 0}.x-nlg .x-toolbar-footer{background-image:url(images/toolbar/toolbar-footer-bg.gif)!important;background-repeat:repeat-x}.x-toolbar-text-footer{padding:0 4px;color:black;font:normal 11px/16px tahoma,arial,verdana,sans-serif}.x-toolbar-spacer-footer{width:2px}.x-toolbar-footer-scroller .x-box-scroller-body-horizontal{margin-left:8px}.x-toolbar-footer-vertical-scroller .x-box-scroller-body-vertical{margin-top:11px}.x-box-scroller-toolbar-footer{cursor:pointer}.x-box-scroller-toolbar-footer.x-box-scroller-disabled{filter:alpha(opacity=50);opacity:.5;cursor:default}.x-box-scroller-toolbar-footer.x-box-scroller-left,.x-box-scroller-toolbar-footer.x-box-scroller-right{width:14px;height:22px;border-style:solid;border-color:#8db2e3;border-width:0 0 1px;top:50%;margin-top:-11px}.x-box-scroller-toolbar-footer.x-box-scroller-left{margin-left:0;margin-right:0;margin-bottom:0;background-image:url(images/toolbar/footer-scroll-left.gif);background-position:-14px 0}.x-box-scroller-toolbar-footer.x-box-scroller-left.x-box-scroller-hover{background-position:0 0}.x-box-scroller-toolbar-footer.x-box-scroller-right{margin-left:0;margin-right:0;margin-bottom:0;background-image:url(images/toolbar/footer-scroll-right.gif);background-position:0 0}.x-box-scroller-toolbar-footer.x-box-scroller-right.x-box-scroller-hover{background-position:-14px 0}.x-ie8 .x-box-scroller-toolbar-footer{background-color:transparent}.x-toolbar-more-icon{background-image:url(images/toolbar/footer-more.gif)}.x-panel-ghost{filter:alpha(opacity=65);opacity:.65}.x-panel-default{border-color:#d0d0d0;padding:0}.x-panel-header-default{font-size:11px;border:1px solid #d0d0d0}.x-panel-header-default-horizontal{padding:5px}.x-panel-header-default-horizontal .x-panel-header-default-tab-bar{margin-top:-5px;margin-bottom:-5px}.x-panel-header-default-horizontal.x-header-noborder{padding:6px 6px 5px 6px}.x-panel-header-default-horizontal.x-header-noborder .x-panel-header-default-tab-bar{margin-top:-6px;margin-bottom:-5px}.x-panel-header-default-vertical{padding:5px 5px 5px 5px}.x-panel-header-default-vertical .x-panel-header-default-tab-bar{margin-right:-5px;margin-left:-5px}.x-panel-header-default-vertical.x-header-noborder{padding:6px 6px 6px 5px}.x-panel-header-default-vertical.x-header-noborder .x-panel-header-default-tab-bar{margin-right:-6px;margin-left:-5px}.x-panel-header-title-default{color:#333;font-size:11px;font-weight:bold;font-family:tahoma,arial,verdana,sans-serif;line-height:15px}.x-panel-header-title-default>.x-title-text-default{text-transform:none;padding:0 2px 1px}.x-panel-header-title-default>.x-title-icon-wrap-default.x-title-icon-top{height:18px;padding-bottom:2px}.x-panel-header-title-default>.x-title-icon-wrap-default.x-title-icon-right{width:18px;padding-left:2px}.x-panel-header-title-default>.x-title-icon-wrap-default.x-title-icon-bottom{height:18px;padding-top:2px}.x-panel-header-title-default>.x-title-icon-wrap-default.x-title-icon-left{width:18px;padding-right:2px}.x-panel-header-title-default>.x-title-icon-wrap-default>.x-title-icon-default{width:16px;height:16px;background-position:center center}.x-panel-header-title-default>.x-title-icon-wrap-default>.x-title-glyph{color:#333;font-size:16px;line-height:16px;opacity:.5}.x-ie8 .x-panel-header-title-default>.x-title-icon-wrap-default>.x-title-glyph{color:#858282}.x-panel-body-default{background:white;border-color:#d0d0d0;color:black;font-size:12px;font-weight:normal;font-family:tahoma,arial,verdana,sans-serif;border-width:1px;border-style:solid}.x-panel-header-default{background-image:none;background-color:#d7d2d2;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f0f0f0),color-stop(100%,#d7d7d7));background-image:-webkit-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-moz-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-o-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-ms-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:linear-gradient(top,#f0f0f0,#d7d7d7)}.x-panel-header-default-vertical{background-image:none;background-color:#d7d2d2;background-image:-webkit-gradient(linear,100% 50%,0% 50%,color-stop(0%,#f0f0f0),color-stop(100%,#d7d7d7));background-image:-webkit-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-moz-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-o-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-ms-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:linear-gradient(right,#f0f0f0,#d7d7d7)}.x-nlg .x-panel-header-default-top{background:url(images/panel-header/panel-header-default-top-bg.gif)}.x-nlg .x-panel-header-default-bottom{background:url(images/panel-header/panel-header-default-bottom-bg.gif) bottom left}.x-nlg .x-panel-header-default-left{background:url(images/panel-header/panel-header-default-left-bg.gif) top left}.x-nlg .x-panel-header-default-right{background:url(images/panel-header/panel-header-default-right-bg.gif) top right}.x-panel .x-panel-header-default-collapsed-border-top{border-bottom-width:1px!important}.x-panel .x-panel-header-default-collapsed-border-right{border-left-width:1px!important}.x-panel .x-panel-header-default-collapsed-border-bottom{border-top-width:1px!important}.x-panel .x-panel-header-default-collapsed-border-left{border-right-width:1px!important}.x-panel-header-default-top{-webkit-box-shadow:#ececec 0 1px 0 0 inset;-moz-box-shadow:#ececec 0 1px 0 0 inset;box-shadow:#ececec 0 1px 0 0 inset}.x-panel-header-default-right{-webkit-box-shadow:#ececec -1px 0 0 0 inset;-moz-box-shadow:#ececec -1px 0 0 0 inset;box-shadow:#ececec -1px 0 0 0 inset}.x-panel-header-default-bottom{-webkit-box-shadow:#ececec 0 -1px 0 0 inset;-moz-box-shadow:#ececec 0 -1px 0 0 inset;box-shadow:#ececec 0 -1px 0 0 inset}.x-panel-header-default-left{-webkit-box-shadow:#ececec 1px 0 0 0 inset;-moz-box-shadow:#ececec 1px 0 0 0 inset;box-shadow:#ececec 1px 0 0 0 inset}.x-panel-header-default-horizontal .x-tool-after-title{margin:0 0 0 2px}.x-panel-header-default-horizontal .x-tool-before-title{margin:0 2px 0 0}.x-panel-header-default-vertical .x-tool-after-title{margin:2px 0 0 0}.x-panel-header-default-vertical .x-tool-before-title{margin:0 0 2px 0}.x-panel-default-resizable .x-panel-handle{filter:alpha(opacity=0);opacity:0}.x-panel-default-framed{border-color:#d0d0d0;padding:4px}.x-panel-header-default-framed{font-size:11px;border:1px solid #d0d0d0}.x-panel-header-default-framed-horizontal{padding:5px}.x-panel-header-default-framed-horizontal .x-panel-header-default-framed-tab-bar{margin-top:-5px;margin-bottom:-5px}.x-panel-header-default-framed-horizontal.x-header-noborder{padding:6px 6px 5px 6px}.x-panel-header-default-framed-horizontal.x-header-noborder .x-panel-header-default-framed-tab-bar{margin-top:-6px;margin-bottom:-5px}.x-panel-header-default-framed-vertical{padding:5px 5px 5px 5px}.x-panel-header-default-framed-vertical .x-panel-header-default-framed-tab-bar{margin-right:-5px;margin-left:-5px}.x-panel-header-default-framed-vertical.x-header-noborder{padding:6px 6px 6px 5px}.x-panel-header-default-framed-vertical.x-header-noborder .x-panel-header-default-framed-tab-bar{margin-right:-6px;margin-left:-5px}.x-panel-header-title-default-framed{color:#333;font-size:11px;font-weight:bold;font-family:tahoma,arial,verdana,sans-serif;line-height:15px}.x-panel-header-title-default-framed>.x-title-text-default-framed{text-transform:none;padding:0 2px 1px}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed.x-title-icon-top{height:18px;padding-bottom:2px}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed.x-title-icon-right{width:18px;padding-left:2px}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed.x-title-icon-bottom{height:18px;padding-top:2px}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed.x-title-icon-left{width:18px;padding-right:2px}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed>.x-title-icon-default-framed{width:16px;height:16px;background-position:center center}.x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed>.x-title-glyph{color:#333;font-size:16px;line-height:16px;opacity:.5}.x-ie8 .x-panel-header-title-default-framed>.x-title-icon-wrap-default-framed>.x-title-glyph{color:#858282}.x-panel-body-default-framed{background:#f1f1f1;border-color:#d0d0d0;color:black;font-size:12px;font-weight:normal;font-family:tahoma,arial,verdana,sans-serif;border-width:0;border-style:solid}.x-panel-default-framed{-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;padding:4px 4px 4px 4px;border-width:1px;border-style:solid;background-color:#f1f1f1}.x-panel-default-framed-mc{background-color:#f1f1f1}.x-nbr .x-panel-default-framed{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-panel-default-framed-frameInfo{font-family:dh-4-4-4-4-1-1-1-1-4-4-4-4}.x-panel-default-framed-tl{background-position:0 -8px}.x-panel-default-framed-tr{background-position:right -12px}.x-panel-default-framed-bl{background-position:0 -16px}.x-panel-default-framed-br{background-position:right -20px}.x-panel-default-framed-ml{background-position:0 top}.x-panel-default-framed-mr{background-position:right top}.x-panel-default-framed-tc{background-position:0 0}.x-panel-default-framed-bc{background-position:0 -4px}.x-panel-default-framed-tr,.x-panel-default-framed-br,.x-panel-default-framed-mr{padding-right:4px}.x-panel-default-framed-tl,.x-panel-default-framed-bl,.x-panel-default-framed-ml{padding-left:4px}.x-panel-default-framed-tc{height:4px}.x-panel-default-framed-bc{height:4px}.x-panel-default-framed-tl,.x-panel-default-framed-bl,.x-panel-default-framed-tr,.x-panel-default-framed-br,.x-panel-default-framed-tc,.x-panel-default-framed-bc,.x-panel-default-framed-ml,.x-panel-default-framed-mr{background-image:url(images/panel/panel-default-framed-corners.gif)}.x-panel-default-framed-ml,.x-panel-default-framed-mr{background-image:url(images/panel/panel-default-framed-sides.gif);background-repeat:repeat-y}.x-panel-default-framed-mc{padding:1px 1px 1px 1px}.x-panel-header-default-framed-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 5px 5px;border-width:1px 1px 0 1px;border-style:solid;background-image:none;background-color:#d7d2d2;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f0f0f0),color-stop(100%,#d7d7d7));background-image:-webkit-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-moz-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-o-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-ms-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:linear-gradient(top,#f0f0f0,#d7d7d7)}.x-panel-header-default-framed-top-mc{background-image:url(images/panel-header/panel-header-default-framed-top-fbg.gif);background-position:0 top;background-color:#d7d2d2}.x-nbr .x-panel-header-default-framed-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-panel-header-default-framed-top-frameInfo{font-family:dh-4-4-0-4-1-1-0-1-5-5-5-5}.x-panel-header-default-framed-top-tl{background-position:0 -8px}.x-panel-header-default-framed-top-tr{background-position:right -12px}.x-panel-header-default-framed-top-bl{background-position:0 -16px}.x-panel-header-default-framed-top-br{background-position:right -20px}.x-panel-header-default-framed-top-ml{background-position:0 top}.x-panel-header-default-framed-top-mr{background-position:right top}.x-panel-header-default-framed-top-tc{background-position:0 0}.x-panel-header-default-framed-top-bc{background-position:0 -4px}.x-panel-header-default-framed-top-tr,.x-panel-header-default-framed-top-br,.x-panel-header-default-framed-top-mr{padding-right:4px}.x-panel-header-default-framed-top-tl,.x-panel-header-default-framed-top-bl,.x-panel-header-default-framed-top-ml{padding-left:4px}.x-panel-header-default-framed-top-tc{height:4px}.x-panel-header-default-framed-top-bc{height:0}.x-panel-header-default-framed-top-tl,.x-panel-header-default-framed-top-bl,.x-panel-header-default-framed-top-tr,.x-panel-header-default-framed-top-br,.x-panel-header-default-framed-top-tc,.x-panel-header-default-framed-top-bc,.x-panel-header-default-framed-top-ml,.x-panel-header-default-framed-top-mr{background-image:url(images/panel-header/panel-header-default-framed-top-corners.gif)}.x-panel-header-default-framed-top-ml,.x-panel-header-default-framed-top-mr{background-image:url(images/panel-header/panel-header-default-framed-top-sides.gif)}.x-panel-header-default-framed-top-mc{padding:2px 2px 5px 2px}.x-panel-header-default-framed-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 5px 5px;border-width:1px 1px 1px 0;border-style:solid;background-image:none;background-color:#d7d2d2;background-image:-webkit-gradient(linear,100% 50%,0% 50%,color-stop(0%,#f0f0f0),color-stop(100%,#d7d7d7));background-image:-webkit-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-moz-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-o-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-ms-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:linear-gradient(right,#f0f0f0,#d7d7d7)}.x-panel-header-default-framed-right-mc{background-image:url(images/panel-header/panel-header-default-framed-right-fbg.gif);background-position:right 0;background-repeat:repeat-y;background-color:#d7d2d2}.x-nbr .x-panel-header-default-framed-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-panel-header-default-framed-right-frameInfo{font-family:dv-4-4-4-0-1-1-1-0-5-5-5-5}.x-panel-header-default-framed-right-tl{background-position:0 0}.x-panel-header-default-framed-right-tr{background-position:0 -4px}.x-panel-header-default-framed-right-bl{background-position:0 -8px}.x-panel-header-default-framed-right-br{background-position:0 -12px}.x-panel-header-default-framed-right-ml{background-position:-4px 0}.x-panel-header-default-framed-right-mr{background-position:right 0}.x-panel-header-default-framed-right-tc{background-position:right 0}.x-panel-header-default-framed-right-bc{background-position:right -4px}.x-panel-header-default-framed-right-tr,.x-panel-header-default-framed-right-br,.x-panel-header-default-framed-right-mr{padding-right:4px}.x-panel-header-default-framed-right-tl,.x-panel-header-default-framed-right-bl,.x-panel-header-default-framed-right-ml{padding-left:0}.x-panel-header-default-framed-right-tc{height:4px}.x-panel-header-default-framed-right-bc{height:4px}.x-panel-header-default-framed-right-tl,.x-panel-header-default-framed-right-bl,.x-panel-header-default-framed-right-tr,.x-panel-header-default-framed-right-br,.x-panel-header-default-framed-right-tc,.x-panel-header-default-framed-right-bc,.x-panel-header-default-framed-right-ml,.x-panel-header-default-framed-right-mr{background-image:url(images/panel-header/panel-header-default-framed-right-corners.gif)}.x-panel-header-default-framed-right-tc,.x-panel-header-default-framed-right-bc{background-image:url(images/panel-header/panel-header-default-framed-right-sides.gif);background-repeat:repeat-x}.x-panel-header-default-framed-right-mc{padding:2px 2px 2px 5px}.x-panel-header-default-framed-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:0 1px 1px 1px;border-style:solid;background-image:none;background-color:#d7d2d2;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f0f0f0),color-stop(100%,#d7d7d7));background-image:-webkit-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-moz-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-o-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-ms-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:linear-gradient(top,#f0f0f0,#d7d7d7)}.x-panel-header-default-framed-bottom-mc{background-image:url(images/panel-header/panel-header-default-framed-bottom-fbg.gif);background-position:0 bottom;background-color:#d7d2d2}.x-nbr .x-panel-header-default-framed-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-panel-header-default-framed-bottom-frameInfo{font-family:dh-0-4-4-4-0-1-1-1-5-5-5-5}.x-panel-header-default-framed-bottom-tl{background-position:0 -8px}.x-panel-header-default-framed-bottom-tr{background-position:right -12px}.x-panel-header-default-framed-bottom-bl{background-position:0 -16px}.x-panel-header-default-framed-bottom-br{background-position:right -20px}.x-panel-header-default-framed-bottom-ml{background-position:0 bottom}.x-panel-header-default-framed-bottom-mr{background-position:right bottom}.x-panel-header-default-framed-bottom-tc{background-position:0 0}.x-panel-header-default-framed-bottom-bc{background-position:0 -4px}.x-panel-header-default-framed-bottom-tr,.x-panel-header-default-framed-bottom-br,.x-panel-header-default-framed-bottom-mr{padding-right:4px}.x-panel-header-default-framed-bottom-tl,.x-panel-header-default-framed-bottom-bl,.x-panel-header-default-framed-bottom-ml{padding-left:4px}.x-panel-header-default-framed-bottom-tc{height:0}.x-panel-header-default-framed-bottom-bc{height:4px}.x-panel-header-default-framed-bottom-tl,.x-panel-header-default-framed-bottom-bl,.x-panel-header-default-framed-bottom-tr,.x-panel-header-default-framed-bottom-br,.x-panel-header-default-framed-bottom-tc,.x-panel-header-default-framed-bottom-bc,.x-panel-header-default-framed-bottom-ml,.x-panel-header-default-framed-bottom-mr{background-image:url(images/panel-header/panel-header-default-framed-bottom-corners.gif)}.x-panel-header-default-framed-bottom-ml,.x-panel-header-default-framed-bottom-mr{background-image:url(images/panel-header/panel-header-default-framed-bottom-sides.gif)}.x-panel-header-default-framed-bottom-mc{padding:5px 2px 2px 2px}.x-panel-header-default-framed-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:1px 0 1px 1px;border-style:solid;background-image:none;background-color:#d7d2d2;background-image:-webkit-gradient(linear,100% 50%,0% 50%,color-stop(0%,#f0f0f0),color-stop(100%,#d7d7d7));background-image:-webkit-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-moz-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-o-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-ms-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:linear-gradient(right,#f0f0f0,#d7d7d7)}.x-panel-header-default-framed-left-mc{background-image:url(images/panel-header/panel-header-default-framed-left-fbg.gif);background-position:left 0;background-repeat:repeat-y;background-color:#d7d2d2}.x-nbr .x-panel-header-default-framed-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-panel-header-default-framed-left-frameInfo{font-family:dv-4-0-4-4-1-0-1-1-5-5-5-5}.x-panel-header-default-framed-left-tl{background-position:0 0}.x-panel-header-default-framed-left-tr{background-position:0 -4px}.x-panel-header-default-framed-left-bl{background-position:0 -8px}.x-panel-header-default-framed-left-br{background-position:0 -12px}.x-panel-header-default-framed-left-ml{background-position:-4px 0}.x-panel-header-default-framed-left-mr{background-position:right 0}.x-panel-header-default-framed-left-tc{background-position:left 0}.x-panel-header-default-framed-left-bc{background-position:left -4px}.x-panel-header-default-framed-left-tr,.x-panel-header-default-framed-left-br,.x-panel-header-default-framed-left-mr{padding-right:0}.x-panel-header-default-framed-left-tl,.x-panel-header-default-framed-left-bl,.x-panel-header-default-framed-left-ml{padding-left:4px}.x-panel-header-default-framed-left-tc{height:4px}.x-panel-header-default-framed-left-bc{height:4px}.x-panel-header-default-framed-left-tl,.x-panel-header-default-framed-left-bl,.x-panel-header-default-framed-left-tr,.x-panel-header-default-framed-left-br,.x-panel-header-default-framed-left-tc,.x-panel-header-default-framed-left-bc,.x-panel-header-default-framed-left-ml,.x-panel-header-default-framed-left-mr{background-image:url(images/panel-header/panel-header-default-framed-left-corners.gif)}.x-panel-header-default-framed-left-tc,.x-panel-header-default-framed-left-bc{background-image:url(images/panel-header/panel-header-default-framed-left-sides.gif);background-repeat:repeat-x}.x-panel-header-default-framed-left-mc{padding:2px 5px 2px 2px}.x-panel-header-default-framed-collapsed-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d7d2d2;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f0f0f0),color-stop(100%,#d7d7d7));background-image:-webkit-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-moz-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-o-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-ms-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:linear-gradient(top,#f0f0f0,#d7d7d7)}.x-panel-header-default-framed-collapsed-top-mc{background-image:url(images/panel-header/panel-header-default-framed-collapsed-top-fbg.gif);background-position:0 top;background-color:#d7d2d2}.x-nbr .x-panel-header-default-framed-collapsed-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-panel-header-default-framed-collapsed-top-frameInfo{font-family:dh-4-4-4-4-1-1-1-1-5-5-5-5}.x-panel-header-default-framed-collapsed-top-tl{background-position:0 -8px}.x-panel-header-default-framed-collapsed-top-tr{background-position:right -12px}.x-panel-header-default-framed-collapsed-top-bl{background-position:0 -16px}.x-panel-header-default-framed-collapsed-top-br{background-position:right -20px}.x-panel-header-default-framed-collapsed-top-ml{background-position:0 top}.x-panel-header-default-framed-collapsed-top-mr{background-position:right top}.x-panel-header-default-framed-collapsed-top-tc{background-position:0 0}.x-panel-header-default-framed-collapsed-top-bc{background-position:0 -4px}.x-panel-header-default-framed-collapsed-top-tr,.x-panel-header-default-framed-collapsed-top-br,.x-panel-header-default-framed-collapsed-top-mr{padding-right:4px}.x-panel-header-default-framed-collapsed-top-tl,.x-panel-header-default-framed-collapsed-top-bl,.x-panel-header-default-framed-collapsed-top-ml{padding-left:4px}.x-panel-header-default-framed-collapsed-top-tc{height:4px}.x-panel-header-default-framed-collapsed-top-bc{height:4px}.x-panel-header-default-framed-collapsed-top-tl,.x-panel-header-default-framed-collapsed-top-bl,.x-panel-header-default-framed-collapsed-top-tr,.x-panel-header-default-framed-collapsed-top-br,.x-panel-header-default-framed-collapsed-top-tc,.x-panel-header-default-framed-collapsed-top-bc,.x-panel-header-default-framed-collapsed-top-ml,.x-panel-header-default-framed-collapsed-top-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-top-corners.gif)}.x-panel-header-default-framed-collapsed-top-ml,.x-panel-header-default-framed-collapsed-top-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-top-sides.gif)}.x-panel-header-default-framed-collapsed-top-mc{padding:2px 2px 2px 2px}.x-panel-header-default-framed-collapsed-right{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d7d2d2;background-image:-webkit-gradient(linear,100% 50%,0% 50%,color-stop(0%,#f0f0f0),color-stop(100%,#d7d7d7));background-image:-webkit-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-moz-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-o-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-ms-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:linear-gradient(right,#f0f0f0,#d7d7d7)}.x-panel-header-default-framed-collapsed-right-mc{background-image:url(images/panel-header/panel-header-default-framed-collapsed-right-fbg.gif);background-position:right 0;background-repeat:repeat-y;background-color:#d7d2d2}.x-nbr .x-panel-header-default-framed-collapsed-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-panel-header-default-framed-collapsed-right-frameInfo{font-family:dv-4-4-4-4-1-1-1-1-5-5-5-5}.x-panel-header-default-framed-collapsed-right-tl{background-position:0 0}.x-panel-header-default-framed-collapsed-right-tr{background-position:0 -4px}.x-panel-header-default-framed-collapsed-right-bl{background-position:0 -8px}.x-panel-header-default-framed-collapsed-right-br{background-position:0 -12px}.x-panel-header-default-framed-collapsed-right-ml{background-position:-4px 0}.x-panel-header-default-framed-collapsed-right-mr{background-position:right 0}.x-panel-header-default-framed-collapsed-right-tc{background-position:right 0}.x-panel-header-default-framed-collapsed-right-bc{background-position:right -4px}.x-panel-header-default-framed-collapsed-right-tr,.x-panel-header-default-framed-collapsed-right-br,.x-panel-header-default-framed-collapsed-right-mr{padding-right:4px}.x-panel-header-default-framed-collapsed-right-tl,.x-panel-header-default-framed-collapsed-right-bl,.x-panel-header-default-framed-collapsed-right-ml{padding-left:4px}.x-panel-header-default-framed-collapsed-right-tc{height:4px}.x-panel-header-default-framed-collapsed-right-bc{height:4px}.x-panel-header-default-framed-collapsed-right-tl,.x-panel-header-default-framed-collapsed-right-bl,.x-panel-header-default-framed-collapsed-right-tr,.x-panel-header-default-framed-collapsed-right-br,.x-panel-header-default-framed-collapsed-right-tc,.x-panel-header-default-framed-collapsed-right-bc,.x-panel-header-default-framed-collapsed-right-ml,.x-panel-header-default-framed-collapsed-right-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-right-corners.gif)}.x-panel-header-default-framed-collapsed-right-tc,.x-panel-header-default-framed-collapsed-right-bc{background-image:url(images/panel-header/panel-header-default-framed-collapsed-right-sides.gif);background-repeat:repeat-x}.x-panel-header-default-framed-collapsed-right-mc{padding:2px 2px 2px 2px}.x-panel-header-default-framed-collapsed-bottom{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d7d2d2;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f0f0f0),color-stop(100%,#d7d7d7));background-image:-webkit-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-moz-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-o-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:-ms-linear-gradient(top,#f0f0f0,#d7d7d7);background-image:linear-gradient(top,#f0f0f0,#d7d7d7)}.x-panel-header-default-framed-collapsed-bottom-mc{background-image:url(images/panel-header/panel-header-default-framed-collapsed-bottom-fbg.gif);background-position:0 bottom;background-color:#d7d2d2}.x-nbr .x-panel-header-default-framed-collapsed-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-panel-header-default-framed-collapsed-bottom-frameInfo{font-family:dh-4-4-4-4-1-1-1-1-5-5-5-5}.x-panel-header-default-framed-collapsed-bottom-tl{background-position:0 -8px}.x-panel-header-default-framed-collapsed-bottom-tr{background-position:right -12px}.x-panel-header-default-framed-collapsed-bottom-bl{background-position:0 -16px}.x-panel-header-default-framed-collapsed-bottom-br{background-position:right -20px}.x-panel-header-default-framed-collapsed-bottom-ml{background-position:0 bottom}.x-panel-header-default-framed-collapsed-bottom-mr{background-position:right bottom}.x-panel-header-default-framed-collapsed-bottom-tc{background-position:0 0}.x-panel-header-default-framed-collapsed-bottom-bc{background-position:0 -4px}.x-panel-header-default-framed-collapsed-bottom-tr,.x-panel-header-default-framed-collapsed-bottom-br,.x-panel-header-default-framed-collapsed-bottom-mr{padding-right:4px}.x-panel-header-default-framed-collapsed-bottom-tl,.x-panel-header-default-framed-collapsed-bottom-bl,.x-panel-header-default-framed-collapsed-bottom-ml{padding-left:4px}.x-panel-header-default-framed-collapsed-bottom-tc{height:4px}.x-panel-header-default-framed-collapsed-bottom-bc{height:4px}.x-panel-header-default-framed-collapsed-bottom-tl,.x-panel-header-default-framed-collapsed-bottom-bl,.x-panel-header-default-framed-collapsed-bottom-tr,.x-panel-header-default-framed-collapsed-bottom-br,.x-panel-header-default-framed-collapsed-bottom-tc,.x-panel-header-default-framed-collapsed-bottom-bc,.x-panel-header-default-framed-collapsed-bottom-ml,.x-panel-header-default-framed-collapsed-bottom-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif)}.x-panel-header-default-framed-collapsed-bottom-ml,.x-panel-header-default-framed-collapsed-bottom-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif)}.x-panel-header-default-framed-collapsed-bottom-mc{padding:2px 2px 2px 2px}.x-panel-header-default-framed-collapsed-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 5px 5px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d7d2d2;background-image:-webkit-gradient(linear,100% 50%,0% 50%,color-stop(0%,#f0f0f0),color-stop(100%,#d7d7d7));background-image:-webkit-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-moz-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-o-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:-ms-linear-gradient(right,#f0f0f0,#d7d7d7);background-image:linear-gradient(right,#f0f0f0,#d7d7d7)}.x-panel-header-default-framed-collapsed-left-mc{background-image:url(images/panel-header/panel-header-default-framed-collapsed-left-fbg.gif);background-position:left 0;background-repeat:repeat-y;background-color:#d7d2d2}.x-nbr .x-panel-header-default-framed-collapsed-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-panel-header-default-framed-collapsed-left-frameInfo{font-family:dv-4-4-4-4-1-1-1-1-5-5-5-5}.x-panel-header-default-framed-collapsed-left-tl{background-position:0 0}.x-panel-header-default-framed-collapsed-left-tr{background-position:0 -4px}.x-panel-header-default-framed-collapsed-left-bl{background-position:0 -8px}.x-panel-header-default-framed-collapsed-left-br{background-position:0 -12px}.x-panel-header-default-framed-collapsed-left-ml{background-position:-4px 0}.x-panel-header-default-framed-collapsed-left-mr{background-position:right 0}.x-panel-header-default-framed-collapsed-left-tc{background-position:left 0}.x-panel-header-default-framed-collapsed-left-bc{background-position:left -4px}.x-panel-header-default-framed-collapsed-left-tr,.x-panel-header-default-framed-collapsed-left-br,.x-panel-header-default-framed-collapsed-left-mr{padding-right:4px}.x-panel-header-default-framed-collapsed-left-tl,.x-panel-header-default-framed-collapsed-left-bl,.x-panel-header-default-framed-collapsed-left-ml{padding-left:4px}.x-panel-header-default-framed-collapsed-left-tc{height:4px}.x-panel-header-default-framed-collapsed-left-bc{height:4px}.x-panel-header-default-framed-collapsed-left-tl,.x-panel-header-default-framed-collapsed-left-bl,.x-panel-header-default-framed-collapsed-left-tr,.x-panel-header-default-framed-collapsed-left-br,.x-panel-header-default-framed-collapsed-left-tc,.x-panel-header-default-framed-collapsed-left-bc,.x-panel-header-default-framed-collapsed-left-ml,.x-panel-header-default-framed-collapsed-left-mr{background-image:url(images/panel-header/panel-header-default-framed-collapsed-left-corners.gif)}.x-panel-header-default-framed-collapsed-left-tc,.x-panel-header-default-framed-collapsed-left-bc{background-image:url(images/panel-header/panel-header-default-framed-collapsed-left-sides.gif);background-repeat:repeat-x}.x-panel-header-default-framed-collapsed-left-mc{padding:2px 2px 2px 2px}.x-panel .x-panel-header-default-framed-top{border-bottom-width:1px!important}.x-panel .x-panel-header-default-framed-right{border-left-width:1px!important}.x-panel .x-panel-header-default-framed-bottom{border-top-width:1px!important}.x-panel .x-panel-header-default-framed-left{border-right-width:1px!important}.x-nbr .x-panel-header-default-framed-collapsed-top{border-bottom-width:0!important}.x-nbr .x-panel-header-default-framed-collapsed-right{border-left-width:0!important}.x-nbr .x-panel-header-default-framed-collapsed-bottom{border-top-width:0!important}.x-nbr .x-panel-header-default-framed-collapsed-left{border-right-width:0!important}.x-panel-header-default-framed-top{-webkit-box-shadow:#ececec 0 1px 0 0 inset,#ececec -1px 0 0 0 inset,#ececec 1px 0 0 0 inset;-moz-box-shadow:#ececec 0 1px 0 0 inset,#ececec -1px 0 0 0 inset,#ececec 1px 0 0 0 inset;box-shadow:#ececec 0 1px 0 0 inset,#ececec -1px 0 0 0 inset,#ececec 1px 0 0 0 inset}.x-panel-header-default-framed-right{-webkit-box-shadow:#ececec 0 1px 0 0 inset,#ececec 0 -1px 0 0 inset,#ececec -1px 0 0 0 inset;-moz-box-shadow:#ececec 0 1px 0 0 inset,#ececec 0 -1px 0 0 inset,#ececec -1px 0 0 0 inset;box-shadow:#ececec 0 1px 0 0 inset,#ececec 0 -1px 0 0 inset,#ececec -1px 0 0 0 inset}.x-panel-header-default-framed-bottom{-webkit-box-shadow:#ececec 0 -1px 0 0 inset,#ececec -1px 0 0 0 inset,#ececec 1px 0 0 0 inset;-moz-box-shadow:#ececec 0 -1px 0 0 inset,#ececec -1px 0 0 0 inset,#ececec 1px 0 0 0 inset;box-shadow:#ececec 0 -1px 0 0 inset,#ececec -1px 0 0 0 inset,#ececec 1px 0 0 0 inset}.x-panel-header-default-framed-left{-webkit-box-shadow:#ececec 0 1px 0 0 inset,#ececec 0 -1px 0 0 inset,#ececec 1px 0 0 0 inset;-moz-box-shadow:#ececec 0 1px 0 0 inset,#ececec 0 -1px 0 0 inset,#ececec 1px 0 0 0 inset;box-shadow:#ececec 0 1px 0 0 inset,#ececec 0 -1px 0 0 inset,#ececec 1px 0 0 0 inset}.x-panel-header-default-framed-horizontal .x-tool-after-title{margin:0 0 0 2px}.x-panel-header-default-framed-horizontal .x-tool-before-title{margin:0 2px 0 0}.x-panel-header-default-framed-vertical .x-tool-after-title{margin:2px 0 0 0}.x-panel-header-default-framed-vertical .x-tool-before-title{margin:0 0 2px 0}.x-panel-default-framed-resizable .x-panel-handle{filter:alpha(opacity=0);opacity:0}.x-tip-anchor{position:absolute;overflow:hidden;height:10px;width:10px;border-style:solid;border-width:5px;border-color:#868686}.x-tip-anchor-top{border-top-color:transparent;border-left-color:transparent;border-right-color:transparent;_border-top-color:pink;_border-left-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.x-tip-anchor-bottom{border-bottom-color:transparent;border-left-color:transparent;border-right-color:transparent;_border-bottom-color:pink;_border-left-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.x-tip-anchor-left{border-top-color:transparent;border-bottom-color:transparent;border-left-color:transparent;_border-top-color:pink;_border-bottom-color:pink;_border-left-color:pink;_filter:chroma(color=pink)}.x-tip-anchor-right{border-top-color:transparent;border-bottom-color:transparent;border-right-color:transparent;_border-top-color:pink;_border-bottom-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.x-tip-default{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:2px 2px 2px 2px;border-width:1px;border-style:solid;background-color:#ccc}.x-tip-default-mc{background-color:#ccc}.x-nbr .x-tip-default{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-tip-default-frameInfo{font-family:th-3-3-3-3-1-1-1-1-2-2-2-2}.x-tip-default-tl{background-position:0 -6px}.x-tip-default-tr{background-position:right -9px}.x-tip-default-bl{background-position:0 -12px}.x-tip-default-br{background-position:right -15px}.x-tip-default-ml{background-position:0 top}.x-tip-default-mr{background-position:right top}.x-tip-default-tc{background-position:0 0}.x-tip-default-bc{background-position:0 -3px}.x-tip-default-tr,.x-tip-default-br,.x-tip-default-mr{padding-right:3px}.x-tip-default-tl,.x-tip-default-bl,.x-tip-default-ml{padding-left:3px}.x-tip-default-tc{height:3px}.x-tip-default-bc{height:3px}.x-tip-default-tl,.x-tip-default-bl,.x-tip-default-tr,.x-tip-default-br,.x-tip-default-tc,.x-tip-default-bc,.x-tip-default-ml,.x-tip-default-mr{background-image:url(images/tip/tip-default-corners.gif)}.x-tip-default-ml,.x-tip-default-mr{background-image:url(images/tip/tip-default-sides.gif);background-repeat:repeat-y}.x-tip-default-mc{padding:0}.x-tip-default{border-color:#868686}.x-tip-default .x-tool-img{background-color:#ccc}.x-tip-header-default .x-tool-after-title{margin:0 0 0 6px}.x-tip-header-default .x-tool-before-title{margin:0 6px 0 0}.x-tip-header-default{padding:3px 3px 0 3px}.x-tip-header-title-default{color:#444;font-size:11px;font-weight:bold}.x-tip-body-default{padding:3px;color:#444;font-size:11px;font-weight:normal}.x-tip-body-default a{color:#2a2a2a}.x-tip-form-invalid{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;padding:4px 4px 4px 4px;border-width:1px;border-style:solid;background-color:white}.x-tip-form-invalid-mc{background-color:white}.x-nbr .x-tip-form-invalid{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-tip-form-invalid-frameInfo{font-family:th-5-5-5-5-1-1-1-1-4-4-4-4}.x-tip-form-invalid-tl{background-position:0 -10px}.x-tip-form-invalid-tr{background-position:right -15px}.x-tip-form-invalid-bl{background-position:0 -20px}.x-tip-form-invalid-br{background-position:right -25px}.x-tip-form-invalid-ml{background-position:0 top}.x-tip-form-invalid-mr{background-position:right top}.x-tip-form-invalid-tc{background-position:0 0}.x-tip-form-invalid-bc{background-position:0 -5px}.x-tip-form-invalid-tr,.x-tip-form-invalid-br,.x-tip-form-invalid-mr{padding-right:5px}.x-tip-form-invalid-tl,.x-tip-form-invalid-bl,.x-tip-form-invalid-ml{padding-left:5px}.x-tip-form-invalid-tc{height:5px}.x-tip-form-invalid-bc{height:5px}.x-tip-form-invalid-tl,.x-tip-form-invalid-bl,.x-tip-form-invalid-tr,.x-tip-form-invalid-br,.x-tip-form-invalid-tc,.x-tip-form-invalid-bc,.x-tip-form-invalid-ml,.x-tip-form-invalid-mr{background-image:url(images/tip/tip-form-invalid-corners.gif)}.x-tip-form-invalid-ml,.x-tip-form-invalid-mr{background-image:url(images/tip/tip-form-invalid-sides.gif);background-repeat:repeat-y}.x-tip-form-invalid-mc{padding:0}.x-tip-form-invalid{border-color:#a1311f;-webkit-box-shadow:#d87166 0 1px 0 0 inset,#d87166 0 -1px 0 0 inset,#d87166 -1px 0 0 0 inset,#d87166 1px 0 0 0 inset;-moz-box-shadow:#d87166 0 1px 0 0 inset,#d87166 0 -1px 0 0 inset,#d87166 -1px 0 0 0 inset,#d87166 1px 0 0 0 inset;box-shadow:#d87166 0 1px 0 0 inset,#d87166 0 -1px 0 0 inset,#d87166 -1px 0 0 0 inset,#d87166 1px 0 0 0 inset}.x-tip-form-invalid .x-tool-img{background-color:white}.x-tip-header-form-invalid .x-tool-after-title{margin:0 0 0 6px}.x-tip-header-form-invalid .x-tool-before-title{margin:0 6px 0 0}.x-tip-header-form-invalid{padding:3px 3px 0 3px}.x-tip-header-title-form-invalid{color:#444;font-size:11px;font-weight:bold}.x-tip-body-form-invalid{padding:3px 3px 3px 22px;color:#444;font-size:11px;font-weight:normal}.x-tip-body-form-invalid a{color:#2a2a2a}.x-tip-body-form-invalid{background:1px 1px no-repeat;background-image:url(images/form/exclamation.gif)}.x-tip-body-form-invalid li{margin-bottom:4px}.x-tip-body-form-invalid li.last{margin-bottom:0}.x-form-item-label-default{color:black;font:normal 12px/14px tahoma,arial,verdana,sans-serif;min-height:22px;padding-top:4px;padding-right:5px}.x-ie8 .x-form-item-label-default{min-height:18px}.x-form-item-label-default.x-form-item-label-top{height:1px}.x-form-item-label-default.x-form-item-label-top>.x-form-item-label-inner{padding-top:4px;padding-bottom:5px}.x-form-item-label-default.x-form-item-label-top-side-error:after{width:18px}.x-form-item-body-default{min-height:22px}.x-form-invalid-icon-default{width:16px;height:16px;margin:0 1px 0 1px;background:url(images/form/exclamation.gif) no-repeat}.x-form-invalid-under-default{padding:2px 2px 2px 20px;color:#c0272b;font:normal 11px/16px tahoma,arial,verdana,sans-serif;background:no-repeat 0 2px;background-image:url(images/form/exclamation.gif)}.x-form-error-wrap-default.x-form-error-wrap-side{width:18px}.x-form-item-default.x-item-disabled{filter:alpha(opacity=30);opacity:.3}.x-form-item-label-toolbar{color:black;font:normal 11px/13px tahoma,arial,verdana,sans-serif;min-height:20px;padding-top:4px;padding-right:5px}.x-ie8 .x-form-item-label-toolbar{min-height:16px}.x-form-item-label-toolbar.x-form-item-label-top{height:1px}.x-form-item-label-toolbar.x-form-item-label-top>.x-form-item-label-inner{padding-top:4px;padding-bottom:5px}.x-form-item-label-toolbar.x-form-item-label-top-side-error:after{width:18px}.x-form-item-body-toolbar{min-height:20px}.x-form-invalid-icon-toolbar{width:16px;height:16px;margin:0 1px 0 1px;background:url(images/form/exclamation.gif) no-repeat}.x-form-invalid-under-toolbar{padding:2px 2px 2px 20px;color:#c30;font:normal 12px/16px tahoma,arial,verdana,sans-serif;background:no-repeat 0 2px;background-image:url(images/form/exclamation.gif)}.x-form-error-wrap-toolbar.x-form-error-wrap-side{width:18px}.x-form-item-toolbar.x-item-disabled{filter:alpha(opacity=30);opacity:.3}.x-autocontainer-form-item,.x-anchor-form-item,.x-vbox-form-item,.x-table-form-item{margin-bottom:5px}.x-form-display-field-default{height:22px;font:normal 12px/14px tahoma,arial,verdana,sans-serif;color:black;margin-top:4px}.x-form-display-field-toolbar{height:22px;font:normal 11px/13px tahoma,arial,verdana,sans-serif;color:black;margin-top:5px}.x-grid-body{background:white;border-width:1px;border-style:solid;border-color:#d0d0d0}.x-grid-item-container{min-height:1px}.x-grid-empty{padding:10px;color:gray;background-color:white;font:normal 11px tahoma,arial,verdana,sans-serif}.x-grid-item{color:black;font:normal 11px/13px tahoma,arial,verdana,sans-serif;background-color:white}.x-grid-item-alt{background-color:#fafafa}.x-grid-item-over{color:black;background-color:#efefef}.x-grid-item-focused{outline:0;color:black}.x-grid-item-focused .x-grid-cell-inner{z-index:1}.x-grid-item-focused .x-grid-cell-inner:before{content:"";position:absolute;z-index:-1;top:0;right:0;bottom:0;left:0;border:1px dotted #464646}.x-grid-item-selected{color:black;background-color:#e0e0e0}.x-grid-with-row-lines .x-grid-item{border-style:solid;border-width:1px 0 0;border-color:#ededed}.x-grid-with-row-lines .x-grid-item:first-child{border-top-color:white}.x-grid-with-row-lines .x-grid-item.x-grid-item-over{border-style:solid;border-color:#ddd}.x-grid-with-row-lines .x-grid-item-over+.x-grid-item{border-top-style:solid;border-top-color:#ddd}.x-grid-with-row-lines .x-grid-item.x-grid-item-selected{border-style:dotted;border-color:#bfb8b8}.x-grid-with-row-lines .x-grid-item-selected+.x-grid-item{border-top-style:dotted;border-top-color:#bfb8b8}.x-grid-with-row-lines .x-grid-item:last-child{border-bottom-width:1px}.x-ie8 .x-grid-with-row-lines .x-grid-item{border-width:1px 0;margin-top:-1px}.x-ie8 .x-grid-with-row-lines .x-grid-item:first-child{margin-top:0}.x-grid-cell-inner{position:relative;text-overflow:ellipsis;padding:3px 6px 4px 6px}.x-grid-cell-special{border-color:#c6c6c6;border-style:solid;border-right-width:1px;background-image:none;background-color:#f6f6f6;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f6f6f6),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#f6f6f6,#e9e9e9);background-image:-moz-linear-gradient(top,#f6f6f6,#e9e9e9);background-image:-o-linear-gradient(top,#f6f6f6,#e9e9e9);background-image:-ms-linear-gradient(top,#f6f6f6,#e9e9e9);background-image:linear-gradient(top,#f6f6f6,#e9e9e9)}.x-grid-item-selected .x-grid-cell-special{border-right-color:#d4b7b7;background-image:none;background-color:#e0e0e0;background-image:-webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,#e0e0e0),color-stop(100%,#d3d3d3));background-image:-webkit-linear-gradient(left,#e0e0e0,#d3d3d3);background-image:-moz-linear-gradient(left,#e0e0e0,#d3d3d3);background-image:-o-linear-gradient(left,#e0e0e0,#d3d3d3);background-image:-ms-linear-gradient(left,#e0e0e0,#d3d3d3);background-image:linear-gradient(left,#e0e0e0,#d3d3d3)}.x-nlg .x-grid-cell-special{background-repeat:repeat-y;background-image:url(images/grid/cell-special-bg.gif)}.x-nlg .x-grid-item-selected .x-grid-cell-special{background-image:url(images/grid/cell-special-selected-bg.gif)}.x-grid-cell-special .x-cmd-slicer.x-grid-cell-special:before{display:none;content:"x-slicer:bg:url(images/grid/cell-special-bg.gif)"!important}.x-grid-cell-special .x-cmd-slicer.x-grid-cell-special-selected:before{display:none;content:"x-slicer:bg:url(images/grid/cell-special-selected-bg.gif)"!important}.x-grid-dirty-cell{background:url(images/grid/dirty.gif) no-repeat 0 0}.x-grid-row .x-grid-cell-selected{color:black;background-color:#b8cfee}.x-grid-with-col-lines .x-grid-cell{border-right:1px solid #c6c6c6}.x-grid-resize-marker{width:1px;background-color:#0f0f0f}.x-form-cb-wrap-default{height:22px}.x-form-cb-default{margin-top:5px}.x-form-checkbox-default,.x-form-radio-default{width:13px;height:13px}.x-form-radio-default{background:url(images/form/radio.gif) no-repeat}.x-form-cb-checked .x-form-radio-default{background-position:0 -13px}.x-form-checkbox-default{background:url(images/form/checkbox.gif) no-repeat}.x-form-cb-checked .x-form-checkbox-default{background-position:0 -13px}.x-field-default-form-checkbox-focus{background-position:-13px 0}.x-form-cb-checked .x-field-default-form-checkbox-focus{background-position:-13px -13px}.x-form-cb-label-default{margin-top:4px;font:normal tahoma,arial,verdana,sans-serif/14px tahoma,arial,verdana,sans-serif}.x-form-cb-label-default.x-form-cb-label-before{padding-right:17px}.x-form-cb-label-default.x-form-cb-label-after{padding-left:17px}.x-form-cb-wrap-toolbar{height:20px}.x-form-cb-toolbar{margin-top:4px}.x-form-checkbox-toolbar,.x-form-radio-toolbar{width:13px;height:13px}.x-form-radio-toolbar{background:url(images/form/radio.gif) no-repeat}.x-form-cb-checked .x-form-radio-toolbar{background-position:0 -13px}.x-form-checkbox-toolbar{background:url(images/form/checkbox.gif) no-repeat}.x-form-cb-checked .x-form-checkbox-toolbar{background-position:0 -13px}.x-field-toolbar-form-checkbox-focus{background-position:-13px 0}.x-form-cb-checked .x-field-toolbar-form-checkbox-focus{background-position:-13px -13px}.x-form-cb-label-toolbar{margin-top:4px;font:normal tahoma,arial,verdana,sans-serif/13px tahoma,arial,verdana,sans-serif}.x-form-cb-label-toolbar.x-form-cb-label-before{padding-right:17px}.x-form-cb-label-toolbar.x-form-cb-label-after{padding-left:17px}.x-col-move-top,.x-col-move-bottom{width:9px;height:9px}.x-col-move-top{background-image:url(images/grid/col-move-top.gif)}.x-col-move-bottom{background-image:url(images/grid/col-move-bottom.gif)}.x-grid-header-ct{border:1px solid #d0d0d0;border-bottom-color:#c5c5c5;background-color:#c5c5c5;background-image:none;background-color:#c5c5c5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f9f9f9),color-stop(100%,#e3e4e6));background-image:-webkit-linear-gradient(top,#f9f9f9,#e3e4e6);background-image:-moz-linear-gradient(top,#f9f9f9,#e3e4e6);background-image:-o-linear-gradient(top,#f9f9f9,#e3e4e6);background-image:-ms-linear-gradient(top,#f9f9f9,#e3e4e6);background-image:linear-gradient(top,#f9f9f9,#e3e4e6)}.x-grid-header-ct-hidden{border:0!important}.x-grid-body{border-top-color:#c5c5c5}.x-hmenu-sort-asc{background-image:url(images/grid/hmenu-asc.gif)}.x-hmenu-sort-desc{background-image:url(images/grid/hmenu-desc.gif)}.x-cols-icon{background-image:url(images/grid/columns.gif)}.x-column-header{border-right:1px solid #c5c5c5;color:black;font:normal 11px/13px tahoma,arial,verdana,sans-serif;outline:0;background-image:none;background-color:#c5c5c5;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f9f9f9),color-stop(100%,#e3e4e6));background-image:-webkit-linear-gradient(top,#f9f9f9,#e3e4e6);background-image:-moz-linear-gradient(top,#f9f9f9,#e3e4e6);background-image:-o-linear-gradient(top,#f9f9f9,#e3e4e6);background-image:-ms-linear-gradient(top,#f9f9f9,#e3e4e6);background-image:linear-gradient(top,#f9f9f9,#e3e4e6)}.x-group-sub-header{background:transparent;border-top:1px solid #c5c5c5}.x-group-sub-header .x-column-header-inner{padding:3px 6px 5px 6px}.x-column-header-inner{position:relative;padding:4px 6px 5px 6px;text-overflow:ellipsis}.x-column-header-inner-empty{text-overflow:clip}.x-column-header.x-column-header-focus{color:black}.x-column-header.x-column-header-focus .x-column-header-inner:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border:1px dotted #333}.x-column-header.x-column-header-focus.x-group-sub-header .x-column-header-inner:before{bottom:0}.x-column-header-over,.x-column-header-sort-ASC,.x-column-header-sort-DESC{background-image:none;background-color:#f0f0f0;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fff),color-stop(100%,#f0f0f0));background-image:-webkit-linear-gradient(top,#fff,#f0f0f0);background-image:-moz-linear-gradient(top,#fff,#f0f0f0);background-image:-o-linear-gradient(top,#fff,#f0f0f0);background-image:-ms-linear-gradient(top,#fff,#f0f0f0);background-image:linear-gradient(top,#fff,#f0f0f0)}.x-nlg .x-grid-header-ct,.x-nlg .x-column-header{background-image:url(images/grid/column-header-bg.gif)}.x-nlg .x-column-header-over,.x-nlg .x-column-header-sort-ASC,.x-nlg .x-column-header-sort-DESC{background-image:url(images/grid/column-header-over-bg.gif)}.x-column-header-open{background-color:transparent}.x-column-header-open .x-column-header-trigger{background-color:transparent}.x-column-header-trigger{width:14px;cursor:pointer;background-color:transparent;background-position:0 center}.x-column-header-align-right .x-column-header-text{margin-right:9px}.x-column-header-sort-ASC .x-column-header-text,.x-column-header-sort-DESC .x-column-header-text{padding-right:12px;background-position:right center}.x-column-header-sort-ASC .x-column-header-text{background-image:url(images/grid/sort_asc.gif)}.x-column-header-sort-DESC .x-column-header-text{background-image:url(images/grid/sort_desc.gif)}.x-form-text-field-body-default{min-width:150px;max-width:150px}.x-form-text-wrap-default{border-width:1px;border-style:solid;border-color:#b5b8c8}.x-form-text-wrap-default.x-form-text-wrap-focus{border-color:#a1a1a1}.x-form-text-wrap-default.x-form-text-wrap-invalid{border-color:#c30}.x-form-text-default{color:black;padding:1px 3px 2px 3px;background-color:white;background-image:url(images/form/text-bg.gif);font:normal 12px/17px tahoma,arial,verdana,sans-serif;min-height:20px}.x-ie8 .x-form-text-default{min-height:17px}.x-form-text-default.x-form-textarea{line-height:14px;min-height:56px}.x-ie8 .x-form-text-default.x-form-textarea{min-height:53px}.x-form-text-default.x-form-text-file{color:gray}.x-form-empty-field-default{color:gray}.x-form-invalid-field-default{background-color:white;background-image:url(images/grid/invalid_line.gif);background-repeat:repeat-x;background-position:bottom}.x-form-trigger-default{background:transparent url(images/form/trigger.gif) no-repeat;background-position:0 0;width:17px;border-width:0 0 1px;border-color:#b5b8c8;border-style:solid}.x-form-trigger-default.x-form-trigger-over{background-position:-17px 0;border-color:#a1a1a1}.x-form-trigger-default.x-form-trigger-over.x-form-trigger-focus{background-position:-68px 0}.x-form-trigger-default.x-form-trigger-focus{background-position:-51px 0;border-color:#a1a1a1}.x-form-trigger.x-form-trigger-default.x-form-trigger-click{background-position:-34px 0}.x-form-text-field-body-toolbar{min-width:150px;max-width:150px}.x-form-text-wrap-toolbar{border-width:1px;border-style:solid;border-color:#b5b8c8}.x-form-text-wrap-toolbar.x-form-text-wrap-focus{border-color:#a1a1a1}.x-form-text-wrap-toolbar.x-form-text-wrap-invalid{border-color:#c30}.x-form-text-toolbar{color:black;padding:1px 3px 2px 3px;background-color:white;background-image:url(images/form/text-bg.gif);font:normal 12px/15px tahoma,arial,verdana,sans-serif;min-height:18px}.x-ie8 .x-form-text-toolbar{min-height:15px}.x-form-text-toolbar.x-form-textarea{line-height:14px;min-height:56px}.x-ie8 .x-form-text-toolbar.x-form-textarea{min-height:53px}.x-form-text-toolbar.x-form-text-file{color:gray}.x-form-empty-field-toolbar{color:gray}.x-form-invalid-field-toolbar{background-color:white;background-image:url(images/grid/invalid_line.gif);background-repeat:repeat-x;background-position:bottom}.x-form-trigger-toolbar{background:white url(images/form/trigger.gif) no-repeat;background-position:0 0;width:17px;border-width:0 0 1px;border-color:#b5b8c8;border-style:solid}.x-form-trigger-toolbar.x-form-trigger-over{background-position:-17px 0}.x-form-trigger-toolbar.x-form-trigger-over.x-form-trigger-focus{background-position:-68px 0}.x-form-trigger-toolbar.x-form-trigger-focus{background-position:-51px 0;border-color:null}.x-form-trigger.x-form-trigger-toolbar.x-form-trigger-click{background-position:-34px 0}.x-form-clear-trigger{background-image:url(images/form/clear-trigger.gif)}.x-form-search-trigger{background-image:url(images/form/search-trigger.gif)}body.x-border-layout-ct,div.x-border-layout-ct{background-color:#e0e0e0}.x-tab-default-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:3px 9px 3px 9px;border-width:1px 1px 0 1px;border-style:solid;background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#dcdcdc),color-stop(100%,#eaeaea));background-image:-webkit-linear-gradient(top,#dcdcdc,#eaeaea);background-image:-moz-linear-gradient(top,#dcdcdc,#eaeaea);background-image:-o-linear-gradient(top,#dcdcdc,#eaeaea);background-image:-ms-linear-gradient(top,#dcdcdc,#eaeaea);background-image:linear-gradient(top,#dcdcdc,#eaeaea)}.x-tab-default-top-mc{background-image:url(images/tab/tab-default-top-fbg.gif);background-position:0 top;background-color:#eaeaea}.x-nbr .x-tab-default-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-tab-default-top-frameInfo{font-family:th-4-4-0-4-1-1-0-1-3-9-3-9}.x-tab-default-top-tl{background-position:0 -8px}.x-tab-default-top-tr{background-position:right -12px}.x-tab-default-top-bl{background-position:0 -16px}.x-tab-default-top-br{background-position:right -20px}.x-tab-default-top-ml{background-position:0 top}.x-tab-default-top-mr{background-position:right top}.x-tab-default-top-tc{background-position:0 0}.x-tab-default-top-bc{background-position:0 -4px}.x-tab-default-top-tr,.x-tab-default-top-br,.x-tab-default-top-mr{padding-right:4px}.x-tab-default-top-tl,.x-tab-default-top-bl,.x-tab-default-top-ml{padding-left:4px}.x-tab-default-top-tc{height:4px}.x-tab-default-top-bc{height:0}.x-tab-default-top-tl,.x-tab-default-top-bl,.x-tab-default-top-tr,.x-tab-default-top-br,.x-tab-default-top-tc,.x-tab-default-top-bc,.x-tab-default-top-ml,.x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-corners.gif)}.x-tab-default-top-ml,.x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-sides.gif)}.x-tab-default-top-mc{padding:0 6px 3px 6px}.x-tab-default-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:4px 9px 3px 9px;border-width:0 1px 1px 1px;border-style:solid;background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear,50% 100%,50% 0,color-stop(0%,#dcdcdc),color-stop(100%,#eaeaea));background-image:-webkit-linear-gradient(bottom,#dcdcdc,#eaeaea);background-image:-moz-linear-gradient(bottom,#dcdcdc,#eaeaea);background-image:-o-linear-gradient(bottom,#dcdcdc,#eaeaea);background-image:-ms-linear-gradient(bottom,#dcdcdc,#eaeaea);background-image:linear-gradient(bottom,#dcdcdc,#eaeaea)}.x-tab-default-bottom-mc{background-image:url(images/tab/tab-default-bottom-fbg.gif);background-position:0 bottom;background-color:#eaeaea}.x-nbr .x-tab-default-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-tab-default-bottom-frameInfo{font-family:th-4-4-4-4-0-1-1-1-4-9-3-9}.x-tab-default-bottom-tl{background-position:0 -8px}.x-tab-default-bottom-tr{background-position:right -12px}.x-tab-default-bottom-bl{background-position:0 -16px}.x-tab-default-bottom-br{background-position:right -20px}.x-tab-default-bottom-ml{background-position:0 bottom}.x-tab-default-bottom-mr{background-position:right bottom}.x-tab-default-bottom-tc{background-position:0 0}.x-tab-default-bottom-bc{background-position:0 -4px}.x-tab-default-bottom-tr,.x-tab-default-bottom-br,.x-tab-default-bottom-mr{padding-right:4px}.x-tab-default-bottom-tl,.x-tab-default-bottom-bl,.x-tab-default-bottom-ml{padding-left:4px}.x-tab-default-bottom-tc{height:4px}.x-tab-default-bottom-bc{height:4px}.x-tab-default-bottom-tl,.x-tab-default-bottom-bl,.x-tab-default-bottom-tr,.x-tab-default-bottom-br,.x-tab-default-bottom-tc,.x-tab-default-bottom-bc,.x-tab-default-bottom-ml,.x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-corners.gif)}.x-tab-default-bottom-ml,.x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-sides.gif)}.x-tab-default-bottom-mc{padding:0 6px 0 6px}.x-tab-default-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:3px 9px 3px 9px;border-width:1px 0 1px 1px;border-style:solid;background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#dcdcdc),color-stop(100%,#eaeaea));background-image:-webkit-linear-gradient(top,#dcdcdc,#eaeaea);background-image:-moz-linear-gradient(top,#dcdcdc,#eaeaea);background-image:-o-linear-gradient(top,#dcdcdc,#eaeaea);background-image:-ms-linear-gradient(top,#dcdcdc,#eaeaea);background-image:linear-gradient(top,#dcdcdc,#eaeaea)}.x-tab-default-left-mc{background-image:url(images/tab/tab-default-left-fbg.gif);background-position:0 top;background-color:#eaeaea}.x-nbr .x-tab-default-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-tab-default-left-frameInfo{font-family:th-4-4-4-4-1-0-1-1-3-9-3-9}.x-tab-default-left-tl{background-position:0 -8px}.x-tab-default-left-tr{background-position:right -12px}.x-tab-default-left-bl{background-position:0 -16px}.x-tab-default-left-br{background-position:right -20px}.x-tab-default-left-ml{background-position:0 top}.x-tab-default-left-mr{background-position:right top}.x-tab-default-left-tc{background-position:0 0}.x-tab-default-left-bc{background-position:0 -4px}.x-tab-default-left-tr,.x-tab-default-left-br,.x-tab-default-left-mr{padding-right:4px}.x-tab-default-left-tl,.x-tab-default-left-bl,.x-tab-default-left-ml{padding-left:4px}.x-tab-default-left-tc{height:4px}.x-tab-default-left-bc{height:4px}.x-tab-default-left-tl,.x-tab-default-left-bl,.x-tab-default-left-tr,.x-tab-default-left-br,.x-tab-default-left-tc,.x-tab-default-left-bc,.x-tab-default-left-ml,.x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-corners.gif)}.x-tab-default-left-ml,.x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-sides.gif)}.x-tab-default-left-mc{padding:0 5px 0 6px}.x-tab-default-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:3px 9px 3px 9px;border-width:1px 1px 1px 0;border-style:solid;background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#dcdcdc),color-stop(100%,#eaeaea));background-image:-webkit-linear-gradient(top,#dcdcdc,#eaeaea);background-image:-moz-linear-gradient(top,#dcdcdc,#eaeaea);background-image:-o-linear-gradient(top,#dcdcdc,#eaeaea);background-image:-ms-linear-gradient(top,#dcdcdc,#eaeaea);background-image:linear-gradient(top,#dcdcdc,#eaeaea)}.x-tab-default-right-mc{background-image:url(images/tab/tab-default-right-fbg.gif);background-position:0 top;background-color:#eaeaea}.x-nbr .x-tab-default-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;background-image:none;box-shadow:none!important}.x-tab-default-right-frameInfo{font-family:th-4-4-4-4-1-1-1-0-3-9-3-9}.x-tab-default-right-tl{background-position:0 -8px}.x-tab-default-right-tr{background-position:right -12px}.x-tab-default-right-bl{background-position:0 -16px}.x-tab-default-right-br{background-position:right -20px}.x-tab-default-right-ml{background-position:0 top}.x-tab-default-right-mr{background-position:right top}.x-tab-default-right-tc{background-position:0 0}.x-tab-default-right-bc{background-position:0 -4px}.x-tab-default-right-tr,.x-tab-default-right-br,.x-tab-default-right-mr{padding-right:4px}.x-tab-default-right-tl,.x-tab-default-right-bl,.x-tab-default-right-ml{padding-left:4px}.x-tab-default-right-tc{height:4px}.x-tab-default-right-bc{height:4px}.x-tab-default-right-tl,.x-tab-default-right-bl,.x-tab-default-right-tr,.x-tab-default-right-br,.x-tab-default-right-tc,.x-tab-default-right-bc,.x-tab-default-right-ml,.x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-corners.gif)}.x-tab-default-right-ml,.x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-sides.gif)}.x-tab-default-right-mc{padding:0 6px 0 5px}.x-tab-default{border-color:#b5b5b5;cursor:pointer;-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-top{margin:0 0 0 2px;-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-top.x-tab-rotate-left{margin:0 2px 0 0}.x-tab-default-top.x-tab-focus{-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-top.x-tab-over{-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-top.x-tab.x-tab-active{-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-top.x-tab.x-tab-disabled{-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-right{margin:2px 0 0 0;-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset}.x-tab-default-right.x-tab-rotate-right{margin:0 0 2px 0}.x-tab-default-right.x-tab-focus{-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset}.x-tab-default-right.x-tab-over{-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset}.x-tab-default-right.x-tab.x-tab-active{-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset}.x-tab-default-right.x-tab.x-tab-disabled{-webkit-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white -1px 0 0 0 inset}.x-tab-default-bottom{margin:0 0 0 2px;-webkit-box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-bottom.x-tab-rotate-left{margin:0 2px 0 0}.x-tab-default-bottom.x-tab-focus{-webkit-box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-bottom.x-tab-over{-webkit-box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-bottom.x-tab.x-tab-active{-webkit-box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-bottom.x-tab.x-tab-disabled{-webkit-box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 -1px 0 0 inset,white -1px 0 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-left{margin:2px 0 0 0;-webkit-box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-left.x-tab-rotate-right{margin:0 0 2px 0}.x-tab-default-left.x-tab-focus{-webkit-box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-left.x-tab-over{-webkit-box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-left.x-tab.x-tab-active{-webkit-box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset}.x-tab-default-left.x-tab.x-tab-disabled{-webkit-box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset;-moz-box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset;box-shadow:white 0 1px 0 0 inset,white 1px 0 0 0 inset}.x-tab-button-default{height:16px}.x-tab-inner-default{font:bold 11px/13px tahoma,arial,verdana,sans-serif;color:#6f6f6f;max-width:100%}.x-tab-icon-right>.x-tab-inner-default,.x-tab-icon-left>.x-tab-inner-default{max-width:calc(100% - 16px)}.x-tab-icon-el-default{height:16px;line-height:16px;background-position:center center}.x-tab-icon-left>.x-tab-icon-el-default,.x-tab-icon-right>.x-tab-icon-el-default{width:16px}.x-tab-icon-top>.x-tab-icon-el-default,.x-tab-icon-bottom>.x-tab-icon-el-default{min-width:16px}.x-tab-icon-el-default.x-tab-glyph{font-size:16px;line-height:16px;color:#6f6f6f;opacity:.5}.x-ie8 .x-tab-icon-el-default.x-tab-glyph{color:#acacac}.x-tab-text.x-tab-icon-left>.x-tab-icon-el-default{margin-right:4px}.x-tab-text.x-tab-icon-right>.x-tab-icon-el-default{margin-left:4px}.x-tab-text.x-tab-icon-top>.x-tab-icon-el-default{margin-bottom:4px}.x-tab-text.x-tab-icon-bottom>.x-tab-icon-el-default{margin-top:4px}.x-tab-focus.x-tab-default .x-tab-button:before{position:absolute;content:' ';top:0;right:0;bottom:0;left:0;outline:1px dotted #6f6f6f}.x-tab-focus.x-tab-default.x-tab-closable .x-tab-button:before{right:14px}.x-tab-over.x-tab-default{background-color:#f2eeee}.x-tab-over.x-tab-default-top,.x-tab-over.x-tab-default-left,.x-tab-over.x-tab-default-right{background-image:none;background-color:#f2eeee;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fff),color-stop(100%,#f0f0f0));background-image:-webkit-linear-gradient(top,#fff,#f0f0f0);background-image:-moz-linear-gradient(top,#fff,#f0f0f0);background-image:-o-linear-gradient(top,#fff,#f0f0f0);background-image:-ms-linear-gradient(top,#fff,#f0f0f0);background-image:linear-gradient(top,#fff,#f0f0f0)}.x-tab-over.x-tab-default-bottom{background-image:none;background-color:#f2eeee;background-image:-webkit-gradient(linear,50% 100%,50% 0,color-stop(0%,#fff),color-stop(100%,#f0f0f0));background-image:-webkit-linear-gradient(bottom,#fff,#f0f0f0);background-image:-moz-linear-gradient(bottom,#fff,#f0f0f0);background-image:-o-linear-gradient(bottom,#fff,#f0f0f0);background-image:-ms-linear-gradient(bottom,#fff,#f0f0f0);background-image:linear-gradient(bottom,#fff,#f0f0f0)}.x-tab.x-tab-active.x-tab-default{background-color:#eaeaea}.x-tab.x-tab-active.x-tab-default .x-tab-inner-default{color:#333}.x-tab.x-tab-active.x-tab-default .x-tab-glyph{color:#333}.x-ie8 .x-tab.x-tab-active.x-tab-default .x-tab-glyph{color:#8e8e8e}.x-tab.x-tab-active.x-tab-default-top,.x-tab.x-tab-active.x-tab-default-left,.x-tab.x-tab-active.x-tab-default-right{background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#fff),color-stop(100%,#eaeaea));background-image:-webkit-linear-gradient(top,#fff,#eaeaea);background-image:-moz-linear-gradient(top,#fff,#eaeaea);background-image:-o-linear-gradient(top,#fff,#eaeaea);background-image:-ms-linear-gradient(top,#fff,#eaeaea);background-image:linear-gradient(top,#fff,#eaeaea)}.x-tab.x-tab-active.x-tab-default-bottom{background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear,50% 100%,50% 0,color-stop(0%,#fff),color-stop(100%,#eaeaea));background-image:-webkit-linear-gradient(bottom,#fff,#eaeaea);background-image:-moz-linear-gradient(bottom,#fff,#eaeaea);background-image:-o-linear-gradient(bottom,#fff,#eaeaea);background-image:-ms-linear-gradient(bottom,#fff,#eaeaea);background-image:linear-gradient(bottom,#fff,#eaeaea)}.x-tab.x-tab-disabled.x-tab-default{border-color:#dadada;background-color:#eee;cursor:default}.x-tab.x-tab-disabled.x-tab-default .x-tab-inner-default{color:#b7b7b7}.x-tab.x-tab-disabled.x-tab-default .x-tab-icon-el-default{filter:alpha(opacity=50);opacity:.5}.x-tab.x-tab-disabled.x-tab-default .x-tab-glyph{color:#b7b7b7;opacity:.3;filter:none}.x-ie8 .x-tab.x-tab-disabled.x-tab-default .x-tab-glyph{color:#ddd}.x-tab.x-tab-disabled.x-tab-default-top,.x-tab.x-tab-disabled.x-tab-default-left,.x-tab.x-tab-disabled.x-tab-default-right{background-image:none;background-color:#eee;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#eee),color-stop(100%,#f4f4f4));background-image:-webkit-linear-gradient(top,#eee,#f4f4f4);background-image:-moz-linear-gradient(top,#eee,#f4f4f4);background-image:-o-linear-gradient(top,#eee,#f4f4f4);background-image:-ms-linear-gradient(top,#eee,#f4f4f4);background-image:linear-gradient(top,#eee,#f4f4f4)}.x-tab.x-tab-disabled.x-tab-default-bottom{background-image:none;background-color:#eee;background-image:-webkit-gradient(linear,50% 100%,50% 0,color-stop(0%,#eee),color-stop(100%,#f4f4f4));background-image:-webkit-linear-gradient(bottom,#eee,#f4f4f4);background-image:-moz-linear-gradient(bottom,#eee,#f4f4f4);background-image:-o-linear-gradient(bottom,#eee,#f4f4f4);background-image:-ms-linear-gradient(bottom,#eee,#f4f4f4);background-image:linear-gradient(bottom,#eee,#f4f4f4)}.x-nbr .x-tab-default{background-image:none}.x-tab-over .x-tab-default-top-tl,.x-tab-over .x-tab-default-top-bl,.x-tab-over .x-tab-default-top-tr,.x-tab-over .x-tab-default-top-br,.x-tab-over .x-tab-default-top-tc,.x-tab-over .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-over-corners.gif)}.x-tab-over .x-tab-default-top-ml,.x-tab-over .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-over-sides.gif)}.x-tab-over .x-tab-default-top-mc{background-color:#f2eeee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-over-fbg.gif)}.x-tab-focus .x-tab-default-top-tl,.x-tab-focus .x-tab-default-top-bl,.x-tab-focus .x-tab-default-top-tr,.x-tab-focus .x-tab-default-top-br,.x-tab-focus .x-tab-default-top-tc,.x-tab-focus .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-focus-corners.gif)}.x-tab-focus .x-tab-default-top-ml,.x-tab-focus .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-focus-sides.gif)}.x-tab-focus .x-tab-default-top-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-focus-fbg.gif)}.x-tab-focus.x-tab-over .x-tab-default-top-tl,.x-tab-focus.x-tab-over .x-tab-default-top-bl,.x-tab-focus.x-tab-over .x-tab-default-top-tr,.x-tab-focus.x-tab-over .x-tab-default-top-br,.x-tab-focus.x-tab-over .x-tab-default-top-tc,.x-tab-focus.x-tab-over .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-focus-over-corners.gif)}.x-tab-focus.x-tab-over .x-tab-default-top-ml,.x-tab-focus.x-tab-over .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-focus-over-sides.gif)}.x-tab-focus.x-tab-over .x-tab-default-top-mc{background-color:#f2eeee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-focus-over-fbg.gif)}.x-tab.x-tab-active .x-tab-default-top-tl,.x-tab.x-tab-active .x-tab-default-top-bl,.x-tab.x-tab-active .x-tab-default-top-tr,.x-tab.x-tab-active .x-tab-default-top-br,.x-tab.x-tab-active .x-tab-default-top-tc,.x-tab.x-tab-active .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-active-corners.gif)}.x-tab.x-tab-active .x-tab-default-top-ml,.x-tab.x-tab-active .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-active-sides.gif)}.x-tab.x-tab-active .x-tab-default-top-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-active-fbg.gif)}.x-tab-focus.x-tab-active .x-tab-default-top-tl,.x-tab-focus.x-tab-active .x-tab-default-top-bl,.x-tab-focus.x-tab-active .x-tab-default-top-tr,.x-tab-focus.x-tab-active .x-tab-default-top-br,.x-tab-focus.x-tab-active .x-tab-default-top-tc,.x-tab-focus.x-tab-active .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-focus-active-corners.gif)}.x-tab-focus.x-tab-active .x-tab-default-top-ml,.x-tab-focus.x-tab-active .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-focus-active-sides.gif)}.x-tab-focus.x-tab-active .x-tab-default-top-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-focus-active-fbg.gif)}.x-tab.x-tab-disabled .x-tab-default-top-tl,.x-tab.x-tab-disabled .x-tab-default-top-bl,.x-tab.x-tab-disabled .x-tab-default-top-tr,.x-tab.x-tab-disabled .x-tab-default-top-br,.x-tab.x-tab-disabled .x-tab-default-top-tc,.x-tab.x-tab-disabled .x-tab-default-top-bc{background-image:url(images/tab/tab-default-top-disabled-corners.gif)}.x-tab.x-tab-disabled .x-tab-default-top-ml,.x-tab.x-tab-disabled .x-tab-default-top-mr{background-image:url(images/tab/tab-default-top-disabled-sides.gif)}.x-tab.x-tab-disabled .x-tab-default-top-mc{background-color:#eee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-top-disabled-fbg.gif)}.x-tab-over .x-tab-default-right-tl,.x-tab-over .x-tab-default-right-bl,.x-tab-over .x-tab-default-right-tr,.x-tab-over .x-tab-default-right-br,.x-tab-over .x-tab-default-right-tc,.x-tab-over .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-over-corners.gif)}.x-tab-over .x-tab-default-right-ml,.x-tab-over .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-over-sides.gif)}.x-tab-over .x-tab-default-right-mc{background-color:#f2eeee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-over-fbg.gif)}.x-tab-focus .x-tab-default-right-tl,.x-tab-focus .x-tab-default-right-bl,.x-tab-focus .x-tab-default-right-tr,.x-tab-focus .x-tab-default-right-br,.x-tab-focus .x-tab-default-right-tc,.x-tab-focus .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-focus-corners.gif)}.x-tab-focus .x-tab-default-right-ml,.x-tab-focus .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-focus-sides.gif)}.x-tab-focus .x-tab-default-right-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-focus-fbg.gif)}.x-tab-focus.x-tab-over .x-tab-default-right-tl,.x-tab-focus.x-tab-over .x-tab-default-right-bl,.x-tab-focus.x-tab-over .x-tab-default-right-tr,.x-tab-focus.x-tab-over .x-tab-default-right-br,.x-tab-focus.x-tab-over .x-tab-default-right-tc,.x-tab-focus.x-tab-over .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-focus-over-corners.gif)}.x-tab-focus.x-tab-over .x-tab-default-right-ml,.x-tab-focus.x-tab-over .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-focus-over-sides.gif)}.x-tab-focus.x-tab-over .x-tab-default-right-mc{background-color:#f2eeee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-focus-over-fbg.gif)}.x-tab.x-tab-active .x-tab-default-right-tl,.x-tab.x-tab-active .x-tab-default-right-bl,.x-tab.x-tab-active .x-tab-default-right-tr,.x-tab.x-tab-active .x-tab-default-right-br,.x-tab.x-tab-active .x-tab-default-right-tc,.x-tab.x-tab-active .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-active-corners.gif)}.x-tab.x-tab-active .x-tab-default-right-ml,.x-tab.x-tab-active .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-active-sides.gif)}.x-tab.x-tab-active .x-tab-default-right-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-active-fbg.gif)}.x-tab-focus.x-tab-active .x-tab-default-right-tl,.x-tab-focus.x-tab-active .x-tab-default-right-bl,.x-tab-focus.x-tab-active .x-tab-default-right-tr,.x-tab-focus.x-tab-active .x-tab-default-right-br,.x-tab-focus.x-tab-active .x-tab-default-right-tc,.x-tab-focus.x-tab-active .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-focus-active-corners.gif)}.x-tab-focus.x-tab-active .x-tab-default-right-ml,.x-tab-focus.x-tab-active .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-focus-active-sides.gif)}.x-tab-focus.x-tab-active .x-tab-default-right-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-focus-active-fbg.gif)}.x-tab.x-tab-disabled .x-tab-default-right-tl,.x-tab.x-tab-disabled .x-tab-default-right-bl,.x-tab.x-tab-disabled .x-tab-default-right-tr,.x-tab.x-tab-disabled .x-tab-default-right-br,.x-tab.x-tab-disabled .x-tab-default-right-tc,.x-tab.x-tab-disabled .x-tab-default-right-bc{background-image:url(images/tab/tab-default-right-disabled-corners.gif)}.x-tab.x-tab-disabled .x-tab-default-right-ml,.x-tab.x-tab-disabled .x-tab-default-right-mr{background-image:url(images/tab/tab-default-right-disabled-sides.gif)}.x-tab.x-tab-disabled .x-tab-default-right-mc{background-color:#eee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-right-disabled-fbg.gif)}.x-tab-over .x-tab-default-bottom-tl,.x-tab-over .x-tab-default-bottom-bl,.x-tab-over .x-tab-default-bottom-tr,.x-tab-over .x-tab-default-bottom-br,.x-tab-over .x-tab-default-bottom-tc,.x-tab-over .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-over-corners.gif)}.x-tab-over .x-tab-default-bottom-ml,.x-tab-over .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-over-sides.gif)}.x-tab-over .x-tab-default-bottom-mc{background-color:#f2eeee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-over-fbg.gif)}.x-tab-focus .x-tab-default-bottom-tl,.x-tab-focus .x-tab-default-bottom-bl,.x-tab-focus .x-tab-default-bottom-tr,.x-tab-focus .x-tab-default-bottom-br,.x-tab-focus .x-tab-default-bottom-tc,.x-tab-focus .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-focus-corners.gif)}.x-tab-focus .x-tab-default-bottom-ml,.x-tab-focus .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-focus-sides.gif)}.x-tab-focus .x-tab-default-bottom-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-focus-fbg.gif)}.x-tab-focus.x-tab-over .x-tab-default-bottom-tl,.x-tab-focus.x-tab-over .x-tab-default-bottom-bl,.x-tab-focus.x-tab-over .x-tab-default-bottom-tr,.x-tab-focus.x-tab-over .x-tab-default-bottom-br,.x-tab-focus.x-tab-over .x-tab-default-bottom-tc,.x-tab-focus.x-tab-over .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-focus-over-corners.gif)}.x-tab-focus.x-tab-over .x-tab-default-bottom-ml,.x-tab-focus.x-tab-over .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-focus-over-sides.gif)}.x-tab-focus.x-tab-over .x-tab-default-bottom-mc{background-color:#f2eeee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-focus-over-fbg.gif)}.x-tab.x-tab-active .x-tab-default-bottom-tl,.x-tab.x-tab-active .x-tab-default-bottom-bl,.x-tab.x-tab-active .x-tab-default-bottom-tr,.x-tab.x-tab-active .x-tab-default-bottom-br,.x-tab.x-tab-active .x-tab-default-bottom-tc,.x-tab.x-tab-active .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-active-corners.gif)}.x-tab.x-tab-active .x-tab-default-bottom-ml,.x-tab.x-tab-active .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-active-sides.gif)}.x-tab.x-tab-active .x-tab-default-bottom-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-active-fbg.gif)}.x-tab-focus.x-tab-active .x-tab-default-bottom-tl,.x-tab-focus.x-tab-active .x-tab-default-bottom-bl,.x-tab-focus.x-tab-active .x-tab-default-bottom-tr,.x-tab-focus.x-tab-active .x-tab-default-bottom-br,.x-tab-focus.x-tab-active .x-tab-default-bottom-tc,.x-tab-focus.x-tab-active .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-focus-active-corners.gif)}.x-tab-focus.x-tab-active .x-tab-default-bottom-ml,.x-tab-focus.x-tab-active .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-focus-active-sides.gif)}.x-tab-focus.x-tab-active .x-tab-default-bottom-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-focus-active-fbg.gif)}.x-tab.x-tab-disabled .x-tab-default-bottom-tl,.x-tab.x-tab-disabled .x-tab-default-bottom-bl,.x-tab.x-tab-disabled .x-tab-default-bottom-tr,.x-tab.x-tab-disabled .x-tab-default-bottom-br,.x-tab.x-tab-disabled .x-tab-default-bottom-tc,.x-tab.x-tab-disabled .x-tab-default-bottom-bc{background-image:url(images/tab/tab-default-bottom-disabled-corners.gif)}.x-tab.x-tab-disabled .x-tab-default-bottom-ml,.x-tab.x-tab-disabled .x-tab-default-bottom-mr{background-image:url(images/tab/tab-default-bottom-disabled-sides.gif)}.x-tab.x-tab-disabled .x-tab-default-bottom-mc{background-color:#eee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-bottom-disabled-fbg.gif)}.x-tab-over .x-tab-default-left-tl,.x-tab-over .x-tab-default-left-bl,.x-tab-over .x-tab-default-left-tr,.x-tab-over .x-tab-default-left-br,.x-tab-over .x-tab-default-left-tc,.x-tab-over .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-over-corners.gif)}.x-tab-over .x-tab-default-left-ml,.x-tab-over .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-over-sides.gif)}.x-tab-over .x-tab-default-left-mc{background-color:#f2eeee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-over-fbg.gif)}.x-tab-focus .x-tab-default-left-tl,.x-tab-focus .x-tab-default-left-bl,.x-tab-focus .x-tab-default-left-tr,.x-tab-focus .x-tab-default-left-br,.x-tab-focus .x-tab-default-left-tc,.x-tab-focus .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-focus-corners.gif)}.x-tab-focus .x-tab-default-left-ml,.x-tab-focus .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-focus-sides.gif)}.x-tab-focus .x-tab-default-left-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-focus-fbg.gif)}.x-tab-focus.x-tab-over .x-tab-default-left-tl,.x-tab-focus.x-tab-over .x-tab-default-left-bl,.x-tab-focus.x-tab-over .x-tab-default-left-tr,.x-tab-focus.x-tab-over .x-tab-default-left-br,.x-tab-focus.x-tab-over .x-tab-default-left-tc,.x-tab-focus.x-tab-over .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-focus-over-corners.gif)}.x-tab-focus.x-tab-over .x-tab-default-left-ml,.x-tab-focus.x-tab-over .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-focus-over-sides.gif)}.x-tab-focus.x-tab-over .x-tab-default-left-mc{background-color:#f2eeee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-focus-over-fbg.gif)}.x-tab.x-tab-active .x-tab-default-left-tl,.x-tab.x-tab-active .x-tab-default-left-bl,.x-tab.x-tab-active .x-tab-default-left-tr,.x-tab.x-tab-active .x-tab-default-left-br,.x-tab.x-tab-active .x-tab-default-left-tc,.x-tab.x-tab-active .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-active-corners.gif)}.x-tab.x-tab-active .x-tab-default-left-ml,.x-tab.x-tab-active .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-active-sides.gif)}.x-tab.x-tab-active .x-tab-default-left-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-active-fbg.gif)}.x-tab-focus.x-tab-active .x-tab-default-left-tl,.x-tab-focus.x-tab-active .x-tab-default-left-bl,.x-tab-focus.x-tab-active .x-tab-default-left-tr,.x-tab-focus.x-tab-active .x-tab-default-left-br,.x-tab-focus.x-tab-active .x-tab-default-left-tc,.x-tab-focus.x-tab-active .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-focus-active-corners.gif)}.x-tab-focus.x-tab-active .x-tab-default-left-ml,.x-tab-focus.x-tab-active .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-focus-active-sides.gif)}.x-tab-focus.x-tab-active .x-tab-default-left-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-focus-active-fbg.gif)}.x-tab.x-tab-disabled .x-tab-default-left-tl,.x-tab.x-tab-disabled .x-tab-default-left-bl,.x-tab.x-tab-disabled .x-tab-default-left-tr,.x-tab.x-tab-disabled .x-tab-default-left-br,.x-tab.x-tab-disabled .x-tab-default-left-tc,.x-tab.x-tab-disabled .x-tab-default-left-bc{background-image:url(images/tab/tab-default-left-disabled-corners.gif)}.x-tab.x-tab-disabled .x-tab-default-left-ml,.x-tab.x-tab-disabled .x-tab-default-left-mr{background-image:url(images/tab/tab-default-left-disabled-sides.gif)}.x-tab.x-tab-disabled .x-tab-default-left-mc{background-color:#eee;background-repeat:repeat-x;background-image:url(images/tab/tab-default-left-disabled-fbg.gif)}.x-tab-default-tl,.x-tab-default-bl,.x-tab-default-tr,.x-tab-default-br{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)}.x-tab-default .x-tab-close-btn{top:2px;right:2px;width:11px;height:11px;background:url(images/tab/tab-default-close.gif) 0 0;filter:alpha(opacity=60);opacity:.6}.x-tab-default .x-tab-close-btn-over{filter:alpha(opacity=100);opacity:1}.x-tab-default.x-tab-active .x-tab-close-btn{background-position:0 -11px}.x-tab-default.x-tab-disabled .x-tab-close-btn{filter:alpha(opacity=30);opacity:.3}.x-tab-closable.x-tab-default .x-tab-button{padding-right:14px}.x-tab-bar-default{background-color:#d2d2d2;border-style:solid;border-color:#d0d0d0}.x-tab-bar-default-top{border-width:1px 1px 0 1px}.x-tab-bar-default-bottom{border-width:0 1px 1px 1px}.x-tab-bar-default-left{border-width:1px 0 1px 1px}.x-tab-bar-default-right{border-width:1px 1px 1px 0}.x-tab-bar-default-top>.x-tab-bar-body-default{padding:1px 0 0}.x-tab-bar-default-bottom>.x-tab-bar-body-default{padding:0 0 1px 0}.x-tab-bar-default-left>.x-tab-bar-body-default{padding:0 0 0 1px}.x-tab-bar-default-right>.x-tab-bar-body-default{padding:0 1px 0 0}.x-tab-bar-plain.x-tab-bar-default-horizontal{border-top-color:transparent;border-bottom-color:transparent;border-left-width:0;border-right-width:0}.x-tab-bar-plain.x-tab-bar-default-vertical{border-right-color:transparent;border-left-color:transparent;border-top-width:0;border-bottom-width:0}.x-tab-bar-top>.x-tab-bar-body-default{padding-bottom:2px}.x-tab-bar-bottom>.x-tab-bar-body-default{padding-top:2px}.x-tab-bar-left>.x-tab-bar-body-default{padding-right:2px}.x-tab-bar-right>.x-tab-bar-body-default{padding-left:2px}.x-tab-bar-strip-default{border-style:solid;border-color:#d0d0d0;background-color:#eaeaea}.x-tab-bar-top>.x-tab-bar-strip-default{border-width:1px 0 0 0;height:3px}.x-tab-bar-top.x-tab-bar-plain>.x-tab-bar-strip-default{border-width:1px 1px 0 1px}.x-tab-bar-bottom>.x-tab-bar-strip-default{border-width:0 0 1px 0;height:3px}.x-tab-bar-bottom.x-tab-bar-plain>.x-tab-bar-strip-default{border-width:0 1px 1px 1px}.x-tab-bar-left>.x-tab-bar-strip-default{border-width:0 0 0 1px;width:3px}.x-tab-bar-left.x-tab-bar-plain>.x-tab-bar-strip-default{border-width:1px 0 1px 1px}.x-tab-bar-right>.x-tab-bar-strip-default{border-width:0 1px 0 0;width:3px}.x-tab-bar-right.x-tab-bar-plain>.x-tab-bar-strip-default{border-width:1px 1px 1px 0}.x-tab-bar-horizontal>.x-tab-bar-body-default{min-height:26px}.x-ie9m .x-tab-bar-horizontal>.x-tab-bar-body-default{min-height:23px}.x-tab-bar-vertical>.x-tab-bar-body-default{min-width:26px}.x-ie9m .x-tab-bar-vertical>.x-tab-bar-body-default{min-width:23px}.x-tab-bar-default-top{background-image:none;background-color:#d2d2d2;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#dfdede),color-stop(100%,#d2d2d2));background-image:-webkit-linear-gradient(top,#dfdede,#d2d2d2);background-image:-moz-linear-gradient(top,#dfdede,#d2d2d2);background-image:-o-linear-gradient(top,#dfdede,#d2d2d2);background-image:-ms-linear-gradient(top,#dfdede,#d2d2d2);background-image:linear-gradient(top,#dfdede,#d2d2d2)}.x-nlg .x-tab-bar-default-top{background:url(images/tab-bar/tab-bar-default-top-bg.gif)}.x-tab-bar-default-bottom{background-image:none;background-color:#d2d2d2;background-image:-webkit-gradient(linear,50% 100%,50% 0,color-stop(0%,#dfdede),color-stop(100%,#d2d2d2));background-image:-webkit-linear-gradient(bottom,#dfdede,#d2d2d2);background-image:-moz-linear-gradient(bottom,#dfdede,#d2d2d2);background-image:-o-linear-gradient(bottom,#dfdede,#d2d2d2);background-image:-ms-linear-gradient(bottom,#dfdede,#d2d2d2);background-image:linear-gradient(bottom,#dfdede,#d2d2d2)}.x-nlg .x-tab-bar-default-bottom{background:url(images/tab-bar/tab-bar-default-bottom-bg.gif) bottom 0}.x-tab-bar-default-left{background-image:none;background-color:#d2d2d2;background-image:-webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,#dfdede),color-stop(100%,#d2d2d2));background-image:-webkit-linear-gradient(left,#dfdede,#d2d2d2);background-image:-moz-linear-gradient(left,#dfdede,#d2d2d2);background-image:-o-linear-gradient(left,#dfdede,#d2d2d2);background-image:-ms-linear-gradient(left,#dfdede,#d2d2d2);background-image:linear-gradient(left,#dfdede,#d2d2d2)}.x-nlg .x-tab-bar-default-left{background:url(images/tab-bar/tab-bar-default-left-bg.gif)}.x-tab-bar-default-right{background-image:none;background-color:#d2d2d2;background-image:-webkit-gradient(linear,100% 50%,0% 50%,color-stop(0%,#dfdede),color-stop(100%,#d2d2d2));background-image:-webkit-linear-gradient(right,#dfdede,#d2d2d2);background-image:-moz-linear-gradient(right,#dfdede,#d2d2d2);background-image:-o-linear-gradient(right,#dfdede,#d2d2d2);background-image:-ms-linear-gradient(right,#dfdede,#d2d2d2);background-image:linear-gradient(right,#dfdede,#d2d2d2)}.x-nlg .x-tab-bar-default-right{background:url(images/tab-bar/tab-bar-default-right-bg.gif) 0 right}.x-tab-bar-default-scroller .x-box-scroller-body-horizontal{margin-left:18px}.x-tab-bar-default-vertical-scroller .x-box-scroller-body-vertical{margin-top:17px}.x-box-scroller-tab-bar-default{cursor:pointer}.x-box-scroller-tab-bar-default.x-box-scroller-disabled{filter:alpha(opacity=50);opacity:.5;cursor:default}.x-box-scroller-tab-bar-default.x-box-scroller-left,.x-box-scroller-tab-bar-default.x-box-scroller-right{width:18px;top:0;bottom:0}.x-box-scroller-tab-bar-default.x-box-scroller-left{margin:0;background-position:-18px 0}.x-box-scroller-tab-bar-default.x-box-scroller-left.x-box-scroller-hover{background-position:0 0}.x-box-scroller-tab-bar-default.x-box-scroller-right{margin:0;background-position:0 0}.x-box-scroller-tab-bar-default.x-box-scroller-right.x-box-scroller-hover{background-position:-18px 0}.x-box-scroller-tab-bar-default.x-box-scroller-top,.x-box-scroller-tab-bar-default.x-box-scroller-bottom{height:18px;left:0;right:0}.x-box-scroller-tab-bar-default.x-box-scroller-top{margin:0;background-position:0 -18px}.x-box-scroller-tab-bar-default.x-box-scroller-top.x-box-scroller-hover{background-position:0 0}.x-box-scroller-tab-bar-default.x-box-scroller-bottom{margin:0;background-position:0 0}.x-box-scroller-tab-bar-default.x-box-scroller-bottom.x-box-scroller-hover{background-position:0 -18px}.x-tab-bar-default-right .x-box-scroller-top{background-position:right -18px}.x-tab-bar-default-right .x-box-scroller-top.x-box-scroller-hover{background-position:right 0}.x-tab-bar-default-right .x-box-scroller-bottom{background-position:right 0}.x-tab-bar-default-right .x-box-scroller-bottom.x-box-scroller-hover{background-position:right -18px}.x-tab-bar-default-bottom .x-box-scroller-left{background-position:-18px bottom}.x-tab-bar-default-bottom .x-box-scroller-left.x-box-scroller-hover{background-position:0 bottom}.x-tab-bar-default-bottom .x-box-scroller-right{background-position:0 bottom}.x-tab-bar-default-bottom .x-box-scroller-right.x-box-scroller-hover{background-position:-18px bottom}.x-tab-bar-default-top .x-box-scroller-left{background-image:url(images/tab-bar/default-scroll-left-top.gif)}.x-tab-bar-default-top .x-box-scroller-right{background-image:url(images/tab-bar/default-scroll-right-top.gif)}.x-tab-bar-default-bottom .x-box-scroller-left{background-image:url(images/tab-bar/default-scroll-left-bottom.gif)}.x-tab-bar-default-bottom .x-box-scroller-right{background-image:url(images/tab-bar/default-scroll-right-bottom.gif)}.x-tab-bar-default-left .x-box-scroller-top{background-image:url(images/tab-bar/default-scroll-top-left.gif)}.x-tab-bar-default-left .x-box-scroller-bottom{background-image:url(images/tab-bar/default-scroll-bottom-left.gif)}.x-tab-bar-default-right .x-box-scroller-top{background-image:url(images/tab-bar/default-scroll-top-right.gif)}.x-tab-bar-default-right .x-box-scroller-bottom{background-image:url(images/tab-bar/default-scroll-bottom-right.gif)}.x-window-ghost{filter:alpha(opacity=65);opacity:.65}.x-window-default{border-color:#a9a9a9;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;-webkit-box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 0 -1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset,#ebe7e7 1px 0 0 0 inset;-moz-box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 0 -1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset,#ebe7e7 1px 0 0 0 inset;box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 0 -1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset,#ebe7e7 1px 0 0 0 inset}.x-window-default{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;padding:4px 4px 4px 4px;border-width:1px;border-style:solid;background-color:#e8e8e8}.x-window-default-mc{background-color:#e8e8e8}.x-nbr .x-window-default{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-default-frameInfo{font-family:dh-5-5-5-5-1-1-1-1-4-4-4-4}.x-window-default-tl{background-position:0 -10px}.x-window-default-tr{background-position:right -15px}.x-window-default-bl{background-position:0 -20px}.x-window-default-br{background-position:right -25px}.x-window-default-ml{background-position:0 top}.x-window-default-mr{background-position:right top}.x-window-default-tc{background-position:0 0}.x-window-default-bc{background-position:0 -5px}.x-window-default-tr,.x-window-default-br,.x-window-default-mr{padding-right:5px}.x-window-default-tl,.x-window-default-bl,.x-window-default-ml{padding-left:5px}.x-window-default-tc{height:5px}.x-window-default-bc{height:5px}.x-window-default-tl,.x-window-default-bl,.x-window-default-tr,.x-window-default-br,.x-window-default-tc,.x-window-default-bc,.x-window-default-ml,.x-window-default-mr{background-image:url(images/window/window-default-corners.gif)}.x-window-default-ml,.x-window-default-mr{background-image:url(images/window/window-default-sides.gif);background-repeat:repeat-y}.x-window-default-mc{padding:0}.x-window-body-default{border-color:#bcb1b0;border-width:1px;border-style:solid;background:#e0e0e0;color:black;font-size:12px;font-weight:normal;font-family:tahoma,arial,verdana,sans-serif}.x-window-header-default{font-size:11px;border-color:#a9a9a9;background-color:#e8e8e8}.x-window-header-default .x-tool-img{background-color:#e8e8e8}.x-window-header-default-horizontal .x-window-header-default-tab-bar{margin-top:-5px;margin-bottom:-5px}.x-window-header-default-vertical .x-window-header-default-tab-bar{margin-right:-5px;margin-left:-5px}.x-window-header-title-default{color:#333;font-size:11px;font-weight:bold;font-family:tahoma,arial,verdana,sans-serif;line-height:15px}.x-window-header-title-default>.x-title-text-default{padding:0 2px 1px;text-transform:none}.x-window-header-title-default>.x-title-icon-wrap-default.x-title-icon-top{height:18px;padding-bottom:2px}.x-window-header-title-default>.x-title-icon-wrap-default.x-title-icon-right{width:18px;padding-left:2px}.x-window-header-title-default>.x-title-icon-wrap-default.x-title-icon-bottom{height:18px;padding-top:2px}.x-window-header-title-default>.x-title-icon-wrap-default.x-title-icon-left{width:18px;padding-right:2px}.x-window-header-title-default>.x-title-icon-wrap-default>.x-title-icon-default{width:16px;height:16px;background-position:center center}.x-window-header-title-default>.x-title-icon-wrap-default>.x-title-glyph{color:#333;font-size:16px;line-height:16px;opacity:.5}.x-ie8 .x-window-header-title-default>.x-title-icon-wrap-default>.x-title-glyph{color:#8d8d8d}.x-window-header-default-top{-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 1px 5px;border-width:1px 1px 0 1px;border-style:solid;background-color:#e8e8e8}.x-window-header-default-top-mc{background-color:#e8e8e8}.x-nbr .x-window-header-default-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-top-frameInfo{font-family:dh-5-5-0-5-1-1-0-1-5-5-1-5}.x-window-header-default-top-tl{background-position:0 -10px}.x-window-header-default-top-tr{background-position:right -15px}.x-window-header-default-top-bl{background-position:0 -20px}.x-window-header-default-top-br{background-position:right -25px}.x-window-header-default-top-ml{background-position:0 top}.x-window-header-default-top-mr{background-position:right top}.x-window-header-default-top-tc{background-position:0 0}.x-window-header-default-top-bc{background-position:0 -5px}.x-window-header-default-top-tr,.x-window-header-default-top-br,.x-window-header-default-top-mr{padding-right:5px}.x-window-header-default-top-tl,.x-window-header-default-top-bl,.x-window-header-default-top-ml{padding-left:5px}.x-window-header-default-top-tc{height:5px}.x-window-header-default-top-bc{height:0}.x-window-header-default-top-tl,.x-window-header-default-top-bl,.x-window-header-default-top-tr,.x-window-header-default-top-br,.x-window-header-default-top-tc,.x-window-header-default-top-bc,.x-window-header-default-top-ml,.x-window-header-default-top-mr{background-image:url(images/window-header/window-header-default-top-corners.gif)}.x-window-header-default-top-ml,.x-window-header-default-top-mr{background-image:url(images/window-header/window-header-default-top-sides.gif);background-repeat:repeat-y}.x-window-header-default-top-mc{padding:1px 1px 1px 1px}.x-window-header-default-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 5px 1px;border-width:1px 1px 1px 0;border-style:solid;background-color:#e8e8e8}.x-window-header-default-right-mc{background-color:#e8e8e8}.x-nbr .x-window-header-default-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-right-frameInfo{font-family:dh-5-5-5-0-1-1-1-0-5-5-5-1}.x-window-header-default-right-tl{background-position:0 -10px}.x-window-header-default-right-tr{background-position:right -15px}.x-window-header-default-right-bl{background-position:0 -20px}.x-window-header-default-right-br{background-position:right -25px}.x-window-header-default-right-ml{background-position:0 top}.x-window-header-default-right-mr{background-position:right top}.x-window-header-default-right-tc{background-position:0 0}.x-window-header-default-right-bc{background-position:0 -5px}.x-window-header-default-right-tr,.x-window-header-default-right-br,.x-window-header-default-right-mr{padding-right:5px}.x-window-header-default-right-tl,.x-window-header-default-right-bl,.x-window-header-default-right-ml{padding-left:0}.x-window-header-default-right-tc{height:5px}.x-window-header-default-right-bc{height:5px}.x-window-header-default-right-tl,.x-window-header-default-right-bl,.x-window-header-default-right-tr,.x-window-header-default-right-br,.x-window-header-default-right-tc,.x-window-header-default-right-bc,.x-window-header-default-right-ml,.x-window-header-default-right-mr{background-image:url(images/window-header/window-header-default-right-corners.gif)}.x-window-header-default-right-ml,.x-window-header-default-right-mr{background-image:url(images/window-header/window-header-default-right-sides.gif);background-repeat:repeat-y}.x-window-header-default-right-mc{padding:1px 1px 1px 1px}.x-window-header-default-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:1px 5px 5px 5px;border-width:0 1px 1px 1px;border-style:solid;background-color:#e8e8e8}.x-window-header-default-bottom-mc{background-color:#e8e8e8}.x-nbr .x-window-header-default-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-bottom-frameInfo{font-family:dh-0-5-5-5-0-1-1-1-1-5-5-5}.x-window-header-default-bottom-tl{background-position:0 -10px}.x-window-header-default-bottom-tr{background-position:right -15px}.x-window-header-default-bottom-bl{background-position:0 -20px}.x-window-header-default-bottom-br{background-position:right -25px}.x-window-header-default-bottom-ml{background-position:0 top}.x-window-header-default-bottom-mr{background-position:right top}.x-window-header-default-bottom-tc{background-position:0 0}.x-window-header-default-bottom-bc{background-position:0 -5px}.x-window-header-default-bottom-tr,.x-window-header-default-bottom-br,.x-window-header-default-bottom-mr{padding-right:5px}.x-window-header-default-bottom-tl,.x-window-header-default-bottom-bl,.x-window-header-default-bottom-ml{padding-left:5px}.x-window-header-default-bottom-tc{height:0}.x-window-header-default-bottom-bc{height:5px}.x-window-header-default-bottom-tl,.x-window-header-default-bottom-bl,.x-window-header-default-bottom-tr,.x-window-header-default-bottom-br,.x-window-header-default-bottom-tc,.x-window-header-default-bottom-bc,.x-window-header-default-bottom-ml,.x-window-header-default-bottom-mr{background-image:url(images/window-header/window-header-default-bottom-corners.gif)}.x-window-header-default-bottom-ml,.x-window-header-default-bottom-mr{background-image:url(images/window-header/window-header-default-bottom-sides.gif);background-repeat:repeat-y}.x-window-header-default-bottom-mc{padding:1px 1px 1px 1px}.x-window-header-default-left{-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:5px 1px 5px 5px;border-width:1px 0 1px 1px;border-style:solid;background-color:#e8e8e8}.x-window-header-default-left-mc{background-color:#e8e8e8}.x-nbr .x-window-header-default-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-left-frameInfo{font-family:dh-5-0-5-5-1-0-1-1-5-1-5-5}.x-window-header-default-left-tl{background-position:0 -10px}.x-window-header-default-left-tr{background-position:right -15px}.x-window-header-default-left-bl{background-position:0 -20px}.x-window-header-default-left-br{background-position:right -25px}.x-window-header-default-left-ml{background-position:0 top}.x-window-header-default-left-mr{background-position:right top}.x-window-header-default-left-tc{background-position:0 0}.x-window-header-default-left-bc{background-position:0 -5px}.x-window-header-default-left-tr,.x-window-header-default-left-br,.x-window-header-default-left-mr{padding-right:0}.x-window-header-default-left-tl,.x-window-header-default-left-bl,.x-window-header-default-left-ml{padding-left:5px}.x-window-header-default-left-tc{height:5px}.x-window-header-default-left-bc{height:5px}.x-window-header-default-left-tl,.x-window-header-default-left-bl,.x-window-header-default-left-tr,.x-window-header-default-left-br,.x-window-header-default-left-tc,.x-window-header-default-left-bc,.x-window-header-default-left-ml,.x-window-header-default-left-mr{background-image:url(images/window-header/window-header-default-left-corners.gif)}.x-window-header-default-left-ml,.x-window-header-default-left-mr{background-image:url(images/window-header/window-header-default-left-sides.gif);background-repeat:repeat-y}.x-window-header-default-left-mc{padding:1px 1px 1px 1px}.x-window-header-default-collapsed-top{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;padding:5px 5px 5px 5px;border-width:1px;border-style:solid;background-color:#e8e8e8}.x-window-header-default-collapsed-top-mc{background-color:#e8e8e8}.x-nbr .x-window-header-default-collapsed-top{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-collapsed-top-frameInfo{font-family:dh-5-5-5-5-1-1-1-1-5-5-5-5}.x-window-header-default-collapsed-top-tl{background-position:0 -10px}.x-window-header-default-collapsed-top-tr{background-position:right -15px}.x-window-header-default-collapsed-top-bl{background-position:0 -20px}.x-window-header-default-collapsed-top-br{background-position:right -25px}.x-window-header-default-collapsed-top-ml{background-position:0 top}.x-window-header-default-collapsed-top-mr{background-position:right top}.x-window-header-default-collapsed-top-tc{background-position:0 0}.x-window-header-default-collapsed-top-bc{background-position:0 -5px}.x-window-header-default-collapsed-top-tr,.x-window-header-default-collapsed-top-br,.x-window-header-default-collapsed-top-mr{padding-right:5px}.x-window-header-default-collapsed-top-tl,.x-window-header-default-collapsed-top-bl,.x-window-header-default-collapsed-top-ml{padding-left:5px}.x-window-header-default-collapsed-top-tc{height:5px}.x-window-header-default-collapsed-top-bc{height:5px}.x-window-header-default-collapsed-top-tl,.x-window-header-default-collapsed-top-bl,.x-window-header-default-collapsed-top-tr,.x-window-header-default-collapsed-top-br,.x-window-header-default-collapsed-top-tc,.x-window-header-default-collapsed-top-bc,.x-window-header-default-collapsed-top-ml,.x-window-header-default-collapsed-top-mr{background-image:url(images/window-header/window-header-default-collapsed-top-corners.gif)}.x-window-header-default-collapsed-top-ml,.x-window-header-default-collapsed-top-mr{background-image:url(images/window-header/window-header-default-collapsed-top-sides.gif);background-repeat:repeat-y}.x-window-header-default-collapsed-top-mc{padding:1px 1px 1px 1px}.x-window-header-default-collapsed-right{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;padding:5px 5px 5px 5px;border-width:1px;border-style:solid;background-color:#e8e8e8}.x-window-header-default-collapsed-right-mc{background-color:#e8e8e8}.x-nbr .x-window-header-default-collapsed-right{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-collapsed-right-frameInfo{font-family:dh-5-5-5-5-1-1-1-1-5-5-5-5}.x-window-header-default-collapsed-right-tl{background-position:0 -10px}.x-window-header-default-collapsed-right-tr{background-position:right -15px}.x-window-header-default-collapsed-right-bl{background-position:0 -20px}.x-window-header-default-collapsed-right-br{background-position:right -25px}.x-window-header-default-collapsed-right-ml{background-position:0 top}.x-window-header-default-collapsed-right-mr{background-position:right top}.x-window-header-default-collapsed-right-tc{background-position:0 0}.x-window-header-default-collapsed-right-bc{background-position:0 -5px}.x-window-header-default-collapsed-right-tr,.x-window-header-default-collapsed-right-br,.x-window-header-default-collapsed-right-mr{padding-right:5px}.x-window-header-default-collapsed-right-tl,.x-window-header-default-collapsed-right-bl,.x-window-header-default-collapsed-right-ml{padding-left:5px}.x-window-header-default-collapsed-right-tc{height:5px}.x-window-header-default-collapsed-right-bc{height:5px}.x-window-header-default-collapsed-right-tl,.x-window-header-default-collapsed-right-bl,.x-window-header-default-collapsed-right-tr,.x-window-header-default-collapsed-right-br,.x-window-header-default-collapsed-right-tc,.x-window-header-default-collapsed-right-bc,.x-window-header-default-collapsed-right-ml,.x-window-header-default-collapsed-right-mr{background-image:url(images/window-header/window-header-default-collapsed-right-corners.gif)}.x-window-header-default-collapsed-right-ml,.x-window-header-default-collapsed-right-mr{background-image:url(images/window-header/window-header-default-collapsed-right-sides.gif);background-repeat:repeat-y}.x-window-header-default-collapsed-right-mc{padding:1px 1px 1px 1px}.x-window-header-default-collapsed-bottom{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;padding:5px 5px 5px 5px;border-width:1px;border-style:solid;background-color:#e8e8e8}.x-window-header-default-collapsed-bottom-mc{background-color:#e8e8e8}.x-nbr .x-window-header-default-collapsed-bottom{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-collapsed-bottom-frameInfo{font-family:dh-5-5-5-5-1-1-1-1-5-5-5-5}.x-window-header-default-collapsed-bottom-tl{background-position:0 -10px}.x-window-header-default-collapsed-bottom-tr{background-position:right -15px}.x-window-header-default-collapsed-bottom-bl{background-position:0 -20px}.x-window-header-default-collapsed-bottom-br{background-position:right -25px}.x-window-header-default-collapsed-bottom-ml{background-position:0 top}.x-window-header-default-collapsed-bottom-mr{background-position:right top}.x-window-header-default-collapsed-bottom-tc{background-position:0 0}.x-window-header-default-collapsed-bottom-bc{background-position:0 -5px}.x-window-header-default-collapsed-bottom-tr,.x-window-header-default-collapsed-bottom-br,.x-window-header-default-collapsed-bottom-mr{padding-right:5px}.x-window-header-default-collapsed-bottom-tl,.x-window-header-default-collapsed-bottom-bl,.x-window-header-default-collapsed-bottom-ml{padding-left:5px}.x-window-header-default-collapsed-bottom-tc{height:5px}.x-window-header-default-collapsed-bottom-bc{height:5px}.x-window-header-default-collapsed-bottom-tl,.x-window-header-default-collapsed-bottom-bl,.x-window-header-default-collapsed-bottom-tr,.x-window-header-default-collapsed-bottom-br,.x-window-header-default-collapsed-bottom-tc,.x-window-header-default-collapsed-bottom-bc,.x-window-header-default-collapsed-bottom-ml,.x-window-header-default-collapsed-bottom-mr{background-image:url(images/window-header/window-header-default-collapsed-bottom-corners.gif)}.x-window-header-default-collapsed-bottom-ml,.x-window-header-default-collapsed-bottom-mr{background-image:url(images/window-header/window-header-default-collapsed-bottom-sides.gif);background-repeat:repeat-y}.x-window-header-default-collapsed-bottom-mc{padding:1px 1px 1px 1px}.x-window-header-default-collapsed-left{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;padding:5px 5px 5px 5px;border-width:1px;border-style:solid;background-color:#e8e8e8}.x-window-header-default-collapsed-left-mc{background-color:#e8e8e8}.x-nbr .x-window-header-default-collapsed-left{padding:0!important;border-width:0!important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;background-color:transparent!important;box-shadow:none!important}.x-window-header-default-collapsed-left-frameInfo{font-family:dh-5-5-5-5-1-1-1-1-5-5-5-5}.x-window-header-default-collapsed-left-tl{background-position:0 -10px}.x-window-header-default-collapsed-left-tr{background-position:right -15px}.x-window-header-default-collapsed-left-bl{background-position:0 -20px}.x-window-header-default-collapsed-left-br{background-position:right -25px}.x-window-header-default-collapsed-left-ml{background-position:0 top}.x-window-header-default-collapsed-left-mr{background-position:right top}.x-window-header-default-collapsed-left-tc{background-position:0 0}.x-window-header-default-collapsed-left-bc{background-position:0 -5px}.x-window-header-default-collapsed-left-tr,.x-window-header-default-collapsed-left-br,.x-window-header-default-collapsed-left-mr{padding-right:5px}.x-window-header-default-collapsed-left-tl,.x-window-header-default-collapsed-left-bl,.x-window-header-default-collapsed-left-ml{padding-left:5px}.x-window-header-default-collapsed-left-tc{height:5px}.x-window-header-default-collapsed-left-bc{height:5px}.x-window-header-default-collapsed-left-tl,.x-window-header-default-collapsed-left-bl,.x-window-header-default-collapsed-left-tr,.x-window-header-default-collapsed-left-br,.x-window-header-default-collapsed-left-tc,.x-window-header-default-collapsed-left-bc,.x-window-header-default-collapsed-left-ml,.x-window-header-default-collapsed-left-mr{background-image:url(images/window-header/window-header-default-collapsed-left-corners.gif)}.x-window-header-default-collapsed-left-ml,.x-window-header-default-collapsed-left-mr{background-image:url(images/window-header/window-header-default-collapsed-left-sides.gif);background-repeat:repeat-y}.x-window-header-default-collapsed-left-mc{padding:1px 1px 1px 1px}.x-window-header-default-top{-webkit-box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset,#ebe7e7 1px 0 0 0 inset;-moz-box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset,#ebe7e7 1px 0 0 0 inset;box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset,#ebe7e7 1px 0 0 0 inset}.x-window-header-default-right{-webkit-box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 0 -1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset;-moz-box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 0 -1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset;box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 0 -1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset}.x-window-header-default-bottom{-webkit-box-shadow:#ebe7e7 0 -1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset,#ebe7e7 1px 0 0 0 inset;-moz-box-shadow:#ebe7e7 0 -1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset,#ebe7e7 1px 0 0 0 inset;box-shadow:#ebe7e7 0 -1px 0 0 inset,#ebe7e7 -1px 0 0 0 inset,#ebe7e7 1px 0 0 0 inset}.x-window-header-default-left{-webkit-box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 0 -1px 0 0 inset,#ebe7e7 1px 0 0 0 inset;-moz-box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 0 -1px 0 0 inset,#ebe7e7 1px 0 0 0 inset;box-shadow:#ebe7e7 0 1px 0 0 inset,#ebe7e7 0 -1px 0 0 inset,#ebe7e7 1px 0 0 0 inset}.x-window-header-default .x-window-header-icon{width:16px;height:16px;color:#333;font-size:16px;line-height:16px;background-position:center center}.x-window-header-default .x-window-header-glyph{color:#333;font-size:16px;line-height:16px;opacity:.5}.x-ie8 .x-window-header-default .x-window-header-glyph{color:#8d8d8d}.x-window-header-default-horizontal .x-tool-after-title{margin:0 0 0 2px}.x-window-header-default-horizontal .x-tool-before-title{margin:0 2px 0 0}.x-window-header-default-vertical .x-tool-after-title{margin:2px 0 0 0}.x-window-header-default-vertical .x-tool-before-title{margin:0 0 2px 0}.x-window-default-collapsed .x-window-header{border-width:1px!important}.x-nbr .x-window-default-collapsed .x-window-header{border-width:0!important}.x-window-body-plain{background-color:transparent}.x-message-box .x-window-body{background-color:#e8e8e8;border-width:0}.x-message-box-info,.x-message-box-warning,.x-message-box-question,.x-message-box-error{background-position:left top;background-repeat:no-repeat}.x-message-box-icon{height:32px;width:32px;margin-right:10px}.x-message-box-info{background-image:url(images/shared/icon-info.gif)}.x-message-box-warning{background-image:url(images/shared/icon-warning.gif)}.x-message-box-question{background-image:url(images/shared/icon-question.gif)}.x-message-box-error{background-image:url(images/shared/icon-error.gif)}.x-form-trigger-spinner-default{width:17px;border:0}.x-form-spinner-default{background-image:url(images/form/spinner.gif);background-color:white;width:17px;height:11px}.x-form-spinner-up-default{background-position:0 0}.x-form-spinner-up-default.x-form-spinner-over{background-position:-17px 0}.x-form-spinner-up-default.x-form-spinner-over.x-form-spinner-focus{background-position:-68px 0}.x-form-spinner-up-default.x-form-spinner-focus{background-position:-51px 0}.x-form-spinner-up-default.x-form-spinner.x-form-spinner-click{background-position:-34px 0}.x-form-spinner-down-default{background-position:0 -11px}.x-form-spinner-down-default.x-form-spinner-over{background-position:-17px -11px}.x-form-spinner-down-default.x-form-spinner-over.x-form-spinner-focus{background-position:-68px -11px}.x-form-spinner-down-default.x-form-spinner-focus{background-position:-51px -11px}.x-form-spinner-down-default.x-form-spinner.x-form-spinner-click{background-position:-34px -11px}.x-form-trigger-spinner-toolbar{width:17px;border:0}.x-form-spinner-toolbar{background-image:url(images/form/spinner-small.gif);background-color:white;width:17px;height:10px}.x-form-spinner-up-toolbar{background-position:0 0}.x-form-spinner-up-toolbar.x-form-spinner-over{background-position:-17px 0}.x-form-spinner-up-toolbar.x-form-spinner-over.x-form-spinner-focus{background-position:-68px 0}.x-form-spinner-up-toolbar.x-form-spinner-focus{background-position:-51px 0}.x-form-spinner-up-toolbar.x-form-spinner.x-form-spinner-click{background-position:-34px 0}.x-form-spinner-down-toolbar{background-position:0 -10px}.x-form-spinner-down-toolbar.x-form-spinner-over{background-position:-17px -10px}.x-form-spinner-down-toolbar.x-form-spinner-over.x-form-spinner-focus{background-position:-68px -10px}.x-form-spinner-down-toolbar.x-form-spinner-focus{background-position:-51px -10px}.x-form-spinner-down-toolbar.x-form-spinner.x-form-spinner-click{background-position:-34px -10px}.x-tbar-page-number{width:30px}.x-tbar-page-first{background-image:url(images/grid/page-first.gif)}.x-tbar-page-prev{background-image:url(images/grid/page-prev.gif)}.x-tbar-page-next{background-image:url(images/grid/page-next.gif)}.x-tbar-page-last{background-image:url(images/grid/page-last.gif)}.x-tbar-loading{background-image:url(images/grid/refresh.gif)}.x-item-disabled .x-tbar-page-first{background-image:url(images/grid/page-first-disabled.gif)}.x-item-disabled .x-tbar-page-prev{background-image:url(images/grid/page-prev-disabled.gif)}.x-item-disabled .x-tbar-page-next{background-image:url(images/grid/page-next-disabled.gif)}.x-item-disabled .x-tbar-page-last{background-image:url(images/grid/page-last-disabled.gif)}.x-item-disabled .x-tbar-loading{background-image:url(images/grid/refresh-disabled.gif)}.x-menu-default{border-style:solid;border-width:1px;border-color:#d0d0d0}.x-menu-body-default{background:#f0f0f0;padding:2px}.x-menu-icon-separator-default{left:24px;border-left:solid 1px #e0e0e0;background-color:white;width:2px}.x-menu-item-default{border-width:1px;cursor:pointer}.x-menu-item-default.x-menu-item-active{background-image:none;background-color:#e6e6e6;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#eee),color-stop(100%,#dcdcdc));background-image:-webkit-linear-gradient(top,#eee,#dcdcdc);background-image:-moz-linear-gradient(top,#eee,#dcdcdc);background-image:-o-linear-gradient(top,#eee,#dcdcdc);background-image:-ms-linear-gradient(top,#eee,#dcdcdc);background-image:linear-gradient(top,#eee,#dcdcdc);-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;border-color:#9d9d9d}.x-nlg .x-menu-item-default.x-menu-item-active{background:#e6e6e6 repeat-x left top;background-image:url(images/menu/menu-item-default-active-bg.gif)}.x-menu-item-default.x-menu-item-separator{height:2px;border-top:solid 1px #e0e0e0;background-color:white;margin:2px 0;padding:0}.x-menu-item-default.x-menu-item-disabled{filter:alpha(opacity=50);opacity:.5}.x-ie9m .x-menu-item-default.x-menu-item-disabled .x-menu-item-icon-ui{filter:alpha(opacity=50);opacity:.5}.x-ie9m .x-menu-item-default.x-menu-item-disabled .x-menu-item-text-default{background-color:transparent}.x-menu-item-default .x-form-item-label{font-size:11px;color:#222}.x-menu-item-text-default,.x-menu-item-cmp-default{margin:0 4px 0 4px}.x-menu-item-text-default{font:normal 11px tahoma,arial,verdana,sans-serif;line-height:21px;padding-top:1px;color:#222;cursor:pointer}.x-menu-item-text-default.x-menu-item-indent{margin-left:30px}.x-menu-item-text-default.x-menu-item-indent-no-separator{margin-left:24px}.x-menu-item-text-default.x-menu-item-indent-right-icon{margin-right:28px}.x-menu-item-text-default.x-menu-item-indent-right-arrow{margin-right:21px}.x-menu-item-indent-default{margin-left:30px}.x-menu-item-icon-default{width:16px;height:16px;top:4px;left:3px;background-position:center center}.x-menu-item-icon-default.x-menu-item-glyph{font-size:16px;line-height:16px;color:#222;opacity:.5}.x-ie8 .x-menu-item-icon-default.x-menu-item-glyph{color:#898989}.x-menu-item-icon-default.x-menu-item-icon-right{width:16px;height:16px;top:4px;right:5px;left:auto;background-position:center center}.x-menu-item-checked .x-menu-item-icon-default.x-menu-item-checkbox{background-image:url(images/menu/default-checked.gif)}.x-menu-item-unchecked .x-menu-item-icon-default.x-menu-item-checkbox{background-image:url(images/menu/default-unchecked.gif)}.x-menu-item-checked .x-menu-item-icon-default.x-menu-group-icon{background-image:url(images/menu/default-group-checked.gif)}.x-menu-item-unchecked .x-menu-item-icon-default.x-menu-group-icon{background-image:none}.x-menu-item-arrow-default{width:12px;height:9px;top:7px;right:0;background-image:url(images/menu/default-menu-parent.gif)}.x-menu-item-active .x-menu-item-arrow-default{top:6px;right:-1px}.x-menu-default-scroller .x-box-scroller-body-horizontal{margin-left:14px}.x-menu-default-vertical-scroller .x-box-scroller-body-vertical{margin-top:11px}.x-box-scroller-menu-default{cursor:pointer}.x-box-scroller-menu-default.x-box-scroller-disabled{filter:alpha(opacity=50);opacity:.5;cursor:default}.x-box-scroller-menu-default.x-box-scroller-top,.x-box-scroller-menu-default.x-box-scroller-bottom{height:5px;width:35px;left:50%;margin-left:-17px}.x-box-scroller-menu-default.x-box-scroller-top{margin-top:4px;margin-right:0;margin-bottom:4px;background-image:url(images/menu/default-scroll-top.gif);background-position:0 -5px}.x-box-scroller-menu-default.x-box-scroller-top.x-box-scroller-hover{background-position:0 0}.x-box-scroller-menu-default.x-box-scroller-bottom{margin-top:4px;margin-right:0;margin-bottom:4px;background-image:url(images/menu/default-scroll-bottom.gif);background-position:0 0}.x-box-scroller-menu-default.x-box-scroller-bottom.x-box-scroller-hover{background-position:0 -5px}.x-ie8 .x-box-scroller-menu-default{background-color:#f0f0f0}.x-grid-locked .x-grid-inner-locked{border-width:0 1px 0 0;border-style:solid}.x-grid-locked-split .x-grid-inner-normal{border-width:0 0 0 1px;border-style:solid}.x-grid-inner-locked{border-right-color:#d0d0d0}.x-grid-inner-locked .x-column-header-last,.x-grid-inner-locked .x-grid-cell-last{border-right-width:0!important}.x-hmenu-lock{background-image:url(images/grid/hmenu-lock.gif)}.x-hmenu-unlock{background-image:url(images/grid/hmenu-unlock.gif)}.x-resizable-handle{position:absolute;z-index:100;font-size:1px;line-height:6px;overflow:hidden;filter:alpha(opacity=0);opacity:0;background-color:#fff}.x-collapsed .x-resizable-handle{display:none}.x-resizable-handle-north{cursor:n-resize}.x-resizable-handle-south{cursor:s-resize}.x-resizable-handle-east{cursor:e-resize}.x-resizable-handle-west{cursor:w-resize}.x-resizable-handle-southeast{cursor:se-resize}.x-resizable-handle-northwest{cursor:nw-resize}.x-resizable-handle-northeast{cursor:ne-resize}.x-resizable-handle-southwest{cursor:sw-resize}.x-resizable-handle-east{width:6px;height:100%;right:0;top:0}.x-resizable-handle-south{width:100%;height:6px;left:0;bottom:0}.x-resizable-handle-west{width:6px;height:100%;left:0;top:0}.x-resizable-handle-north{width:100%;height:6px;left:0;top:0}.x-resizable-handle-southeast{width:6px;height:6px;right:0;bottom:0;z-index:101}.x-resizable-handle-northwest{width:6px;height:6px;left:0;top:0;z-index:101}.x-resizable-handle-northeast{width:6px;height:6px;right:0;top:0;z-index:101}.x-resizable-handle-southwest{width:6px;height:6px;left:0;bottom:0;z-index:101}.x-window .x-window-handle{filter:alpha(opacity=0);opacity:0}.x-window-collapsed .x-window-handle{display:none}.x-resizable-proxy{border:1px dashed #3b5a82;position:absolute;overflow:hidden;z-index:50000}.x-resizable-handle-over,.x-resizable-pinned .x-resizable-handle{filter:alpha(opacity=100);opacity:1}.x-resizable-handle-east-over,.x-resizable-handle-west-over{background-image:url(images/sizer/e-handle.gif)}.x-resizable-handle-south-over,.x-resizable-handle-north-over{background-image:url(images/sizer/s-handle.gif)}.x-resizable-handle-southeast-over{background-position:top left;background-image:url(images/sizer/se-handle.gif)}.x-resizable-handle-northwest-over{background-position:bottom right;background-image:url(images/sizer/nw-handle.gif)}.x-resizable-handle-northeast-over{background-position:bottom left;background-image:url(images/sizer/ne-handle.gif)}.x-resizable-handle-southwest-over{background-position:top right;background-image:url(images/sizer/sw-handle.gif)}.x-resizable-pinned .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-west{background-image:url(images/sizer/e-handle.gif)}.x-resizable-pinned .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-north{background-image:url(images/sizer/s-handle.gif)}.x-resizable-pinned .x-resizable-handle-southeast{background-position:top left;background-image:url(images/sizer/se-handle.gif)}.x-resizable-pinned .x-resizable-handle-northwest{background-position:bottom right;background-image:url(images/sizer/nw-handle.gif)}.x-resizable-pinned .x-resizable-handle-northeast{background-position:bottom left;background-image:url(images/sizer/ne-handle.gif)}.x-resizable-pinned .x-resizable-handle-southwest{background-position:top right;background-image:url(images/sizer/sw-handle.gif)}.x-scroll-indicator{position:absolute;background-color:black;opacity:.5;border-radius:3px;margin:2px}.x-scroll-indicator-x{bottom:0;height:6px}.x-scroll-indicator-y{right:0;width:6px}.x-column-header-checkbox{border-color:#c5c5c5}.x-grid-row-checker,.x-column-header-checkbox .x-column-header-text{height:13px;width:13px;background-image:url(images/form/checkbox.gif);line-height:13px}.x-column-header-checkbox .x-column-header-inner{padding:5px 5px 4px 5px}.x-grid-cell-row-checker .x-grid-cell-inner{padding:4px 5px 3px 5px}.x-grid-no-row-lines .x-grid-row-focused .x-grid-cell-row-checker .x-grid-cell-inner{padding-top:3px;padding-bottom:2px}.x-grid-hd-checker-on .x-column-header-text,.x-grid-item-selected .x-grid-row-checker,.x-grid-item-selected .x-grid-row-checker{background-position:0 -13px}.x-box-tl{background:transparent no-repeat 0 0}.x-box-tc{height:8px;background:transparent repeat-x 0 0;overflow:hidden}.x-box-tr{background:transparent no-repeat right -8px}.x-box-ml{background:transparent repeat-y 0;padding-left:4px;overflow:hidden}.x-box-mc{background:repeat-x 0 -16px;padding:4px 10px}.x-box-mc h3{margin:0 0 4px 0}.x-box-mr{background:transparent repeat-y right;padding-right:4px;overflow:hidden}.x-box-bl{background:transparent no-repeat 0 -16px}.x-box-bc{background:transparent repeat-x 0 -8px;height:8px;overflow:hidden}.x-box-br{background:transparent no-repeat right -24px}.x-box-tl,.x-box-bl{padding-left:8px;overflow:hidden}.x-box-tr,.x-box-br{padding-right:8px;overflow:hidden}.x-box-tl{background-image:url(images/box/corners.gif)}.x-box-tc{background-image:url(images/box/tb.gif)}.x-box-tr{background-image:url(images/box/corners.gif)}.x-box-ml{background-image:url(images/box/l.gif)}.x-box-mc{background-color:#eee;background-image:url(images/box/tb.gif);font-family:"Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif;color:#393939;font-size:15px}.x-box-mc h3{font-size:18px;font-weight:bold}.x-box-mr{background-image:url(images/box/r.gif)}.x-box-bl{background-image:url(images/box/corners.gif)}.x-box-bc{background-image:url(images/box/tb.gif)}.x-box-br{background-image:url(images/box/corners.gif)}.x-box-blue .x-box-bl,.x-box-blue .x-box-br,.x-box-blue .x-box-tl,.x-box-blue .x-box-tr{background-image:url(images/box/corners-blue.gif)}.x-box-blue .x-box-bc,.x-box-blue .x-box-mc,.x-box-blue .x-box-tc{background-image:url(images/box/tb-blue.gif)}.x-box-blue .x-box-mc{background-color:#c3daf9}.x-box-blue .x-box-mc h3{color:#17385b}.x-box-blue .x-box-ml{background-image:url(images/box/l-blue.gif)}.x-box-blue .x-box-mr{background-image:url(images/box/r-blue.gif)}.x-column-header-trigger{background-color:#c5c5c5;background-image:url(images/grid/grid3-hd-btn.gif)}.x-message-box .x-msg-box-wait{background-image:url(images/shared/blue-loading.gif)}.x-resizable-handle-east-over,.x-resizable-handle-west-over{background-position:left}.x-resizable-handle-south-over,.x-resizable-handle-north-over{background-position:top}.x-resizable-handle-southeast-over{background-position:top left}.x-resizable-handle-northwest-over{background-position:bottom right}.x-resizable-handle-northeast-over{background-position:bottom left}.x-resizable-handle-southwest-over{background-position:top right}.x-resizable-pinned .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-west{background-position:left}.x-resizable-pinned .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-north{background-position:top}.x-resizable-pinned .x-resizable-handle-southeast{background-position:top left}.x-resizable-pinned .x-resizable-handle-northwest{background-position:bottom right}.x-resizable-pinned .x-resizable-handle-northeast{background-position:bottom left}.x-resizable-pinned .x-resizable-handle-southwest{background-position:top right} \ No newline at end of file diff --git a/app/spark.info b/app/spark.info deleted file mode 100644 index e4d205da..00000000 --- a/app/spark.info +++ /dev/null @@ -1,13 +0,0 @@ -# This is the spark-sdk specification. It's in a magical format without a name. -# Use this format while developing your own sparks! - -# This is the spark name. This should be the registered name of the spark. -name: Appunto-Auth - -# This is the current version of this spark. All sparks should be in -# x.x.x format. Validation will fail otherwise. -version: 0.1.2 - -# This is the version of CodeIgniter this spark is compatible up to. It should -# be in x.x.x format -compatibility: 2.2.0 diff --git a/app/src/Application.js b/app/src/Application.js deleted file mode 100644 index c4b846c1..00000000 --- a/app/src/Application.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * The main application class. An instance of this class is created by app.js when it calls - * Ext.application(). This is the ideal place to handle application launch and initialization - * details. - */ -Ext.define('AppuntoAuth.Application', -{ - extend: 'Ext.app.Application', - - requires: [ - 'AppuntoAuth.lib.util.FakeConsole', - 'AppuntoAuth.lib.util.CustomVTypes', - 'AppuntoAuth.lib.util.SearchField', - 'AppuntoAuth.lib.util.KeepAlive', - 'AppuntoAuth.lib.lang.Default' - ], - - name: 'AppuntoAuth', - - enableQuickTips : true, - - controllers: [ - 'Navigation', - 'Status', - 'Users', - 'Roles', - 'Permissions', - 'Paths', - 'Sessions' - ] - -}); diff --git a/app/src/controller/Navigation.js b/app/src/controller/Navigation.js deleted file mode 100644 index 4d3e961b..00000000 --- a/app/src/controller/Navigation.js +++ /dev/null @@ -1,99 +0,0 @@ -/** - * The Navigation controller used to handle things like routes. - */ -Ext.define('AppuntoAuth.controller.Navigation', { - extend: 'Ext.app.Controller', - - views: [ - 'main.Main', - 'main.Frame' - ], - - refs: - [{ - ref: 'tabs', - selector: 'appa-main-frame' - }], - - - config : { - routes : { - 'status' : 'redirStatus', - 'users' : 'redirUsers', - 'roles' : 'redirRoles', - 'permissions' : 'redirPermissions', - 'paths' : 'redirPaths', - 'sessions' : 'redirSessions' - } - }, - - init: function() - { - this.control( - { - 'appa-main-frame': { - beforetabchange : this.redirTabClick - }, - 'appa-main button[action="logout"]': { - click : this.logout - } - }); - }, - - logout: function() - { - location.href = ci_site_url + ci_logout_url; - }, - - redirTabClick: function(panel,newCard) - { - //this.getTabs().on('beforetabchange',function(){console.log('func');}); - this.getTabs().clearListeners(); - this.redirectTo(newCard.itemId.substr(4)); - this.getTabs().on('beforetabchange',this.redirTabClick,this); - }, - - changeCardSuppressEvent: function(tab) - { - //this.getTabs().on('beforetabchange',function(){}); - this.getTabs().setActiveTab(tab); - //this.getTabs().on('beforetabchange',this.redirTabClick,this); - }, - - redirStatus: function() - { - this.getTabs().setActiveTab('tab-status'); - //this.changeCardSuppressEvent('tab-status'); - }, - - redirUsers: function() - { - this.getTabs().setActiveTab('tab-users'); - //this.changeCardSuppressEvent('tab-users'); - }, - - redirRoles: function() - { - this.getTabs().setActiveTab('tab-roles'); - //this.changeCardSuppressEvent('tab-roles'); - }, - - redirPermissions: function() - { - this.getTabs().setActiveTab('tab-permissions'); - //this.changeCardSuppressEvent('tab-permissions'); - }, - - redirPaths: function() - { - this.getTabs().setActiveTab('tab-paths'); - //this.changeCardSuppressEvent('tab-paths'); - }, - - redirSessions: function() - { - this.getTabs().setActiveTab('tab-sessions'); - //this.changeCardSuppressEvent('tab-sessions'); - } - -}); diff --git a/app/src/controller/Paths.js b/app/src/controller/Paths.js deleted file mode 100644 index 9d2744ab..00000000 --- a/app/src/controller/Paths.js +++ /dev/null @@ -1,490 +0,0 @@ -Ext.define('AppuntoAuth.controller.Paths', { - extend: 'Ext.app.Controller', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - models: [ - 'Path', - 'Permission' - ], - - stores: [ - 'Paths', - 'Controllers', - 'PathItems', - 'PermissionsSelection' - ], - - views: [ - 'path.Frame', - 'path.ControllerView', - 'path.PathView', - 'path.ContextMenu' - ], - - refs : [{ - ref : 'list', - selector: 'appa_path_list' - },{ - ref : 'delete_unfound_button', - selector: 'appa_path_list button[action="delete_not_found"]' - },{ - ref : 'frame', - selector: 'appa_path_frame' - },{ - ref : 'controllers', - selector: 'appa_path_controller_view' - }], - - init: function() - { - this.lastSelected = null; - - this.control( - { - 'appa_path_frame': { - activate : this.pathsActivate - }, - 'appa_path_path_view' : { - itemcontextmenu : this.showContextMenu, - // Stop the browser getting the event - containercontextmenu: function(view, e) { e.preventDefault(); }, - contextmenu : function(e) { e.preventDefault(); } - }, - 'appa_path_contextmenu menuitem[action="set_public"]': { - click: this.setPublic - }, - 'appa_path_contextmenu menuitem[action="set_private"]': { - click: this.setPrivate - }, - 'appa_path_contextmenu menuitem[group="permission"]': { - click: this.setPermission - }, - 'appa_path_contextmenu menuitem[action="remove_permission"]': { - click: this.removePermission - }, - 'appa_path_contextmenu menuitem[action="delete"]': { - click: this.deletePath - }, - 'appa_path_frame button[action="verify-paths"]': { - click: this.verifyPaths - }, - 'appa_path_controller_view': { - select: this.controllerSelected - } - }); - - }, - - pathsActivate: function() - { - // Load permissions selection store for context menu - Ext.getStore('PermissionsSelection').load(); - - this.verifyPaths(); - }, - - verifyPaths: function() - { - var el = this.getFrame().up('container').getEl(), - store = Ext.getStore('Paths'), - me = this, - cb; - - cb = function(records, operation, success) - { - el.unmask(); - if (success && operation.getResultSet().total > 0) - { - Ext.Msg.alert(Lang.localize('result'),operation.getResultSet().message,me.refreshView,me); - } - else - { - me.refreshView(); - } - } - - el.mask(Lang.localize('path_verify')); - - store.load({ - ci_method : 'verify_paths', - callback : cb - }) - - }, - - refreshView: function(reselect,refreshPathWindow) - { - var me = this, - el = this.getFrame().up('container').getEl(), - cb; - - cb = function(records, operation, success) - { - if (success) - { - me.loadControllers(); - el.unmask(); - } - else - { - Ext.getStore('Paths').removeAll(); - } - } - - this.setLastSelected(); - el.mask(Lang.localize('path_refreshing')); - Ext.getStore('Paths').load({callback: cb}); - }, - - setLastSelected: function() - { - this.lastSelected = this.getControllers().getSelectionModel().getLastSelected(); - }, - - restoreSelection: function() - { - var store = Ext.getStore('Controllers'), - view = this.getControllers(); - - if (this.lastSelected != null && this.lastSelected != undefined) { - idx = store.findExact('ci_controller',this.lastSelected.get('ci_controller')); - view.getSelectionModel().select(idx); - } - }, - - loadControllers: function() - { - var store = Ext.getStore('Paths'), - view = this.getControllers(), - view_store = Ext.getStore('Controllers'), - records = store.getRange(), - controllers = [], - view_data = [], - meta = {}, - controller; - - Ext.Array.each(records, function(rec) { - controller = rec.get('ci_controller'); - if (Ext.Array.indexOf(controllers,controller) == -1) Ext.Array.push(controllers,controller); - }); - - Ext.Array.each(controllers, function(ci_class) { - meta[ci_class] = - { - ci_controller : ci_class, - dir : '', - full_path : '', - methods : 0, - public_methods : 0, - private_methods : 0 - }; - }); - - Ext.Array.each(records, function(rec) { - ci_class = rec.get('ci_controller'); - - meta[ci_class].dir = rec.get('dir'); - meta[ci_class].full_path = rec.get('full_path'); - - meta[ci_class].methods += 1; - - if (rec.get('public_flag')==1) - { - meta[ci_class].public_methods += 1; - } - else - { - meta[ci_class].private_methods += 1; - } - }); - - Ext.Array.each(controllers, function(ci_class) { - Ext.Array.push(view_data,meta[ci_class]); - }); - - view_store.loadData(view_data); - this.restoreSelection(); - - }, - - controllerSelected: function(view,rec) - { - this.loadPaths(rec.get('ci_controller')); - this.lastSelected = rec; - }, - - loadPaths: function(controller) - { - var store = Ext.getStore('Paths'), - item_store = Ext.getStore('PathItems'), - records = store.getRange() - filtered = []; - - Ext.Array.each(records, function(record) { - if (record.get('ci_controller') == controller) - { - Ext.Array.push(filtered,record); - } - }); - - item_store.loadData(filtered); - }, - - expandAllGroups: function() - { - this.getList().getView().getFeature('grouping').expandAll(); - }, - - collapseAllGroups: function() - { - this.getList().getView().getFeature('grouping').collapseAll(); - }, - - groupingChanged: function(store, grouper) - { - var list = this.getList(), - col = grouper.items[0].property; - - list.features[0].groupHeaderTpl = list.getGroupHeader(col); - }, - - showContextMenu: function(view, rec, item, idx, e) - { - e.preventDefault(); - - var menu = Ext.widget('appa_path_contextmenu'), - store = Ext.getStore('PermissionsSelection'), - perms = store.getRange(); - - // pass the contextmenu the record so we don't have to worry about a selection change - menu.setRecord(rec); - - // select the record that was context-clicked - view.getSelectionModel().select(rec,false,true); // keepExisting=false, suppressEvent=true - - Ext.Array.each(perms, function(perm) - { - perm_menu_item = - { - text : perm.get('name'), - value : perm.get('id'), - checked : rec.get('permission_id') == perm.get('id'), - group : 'permission' - }; - menu.down('menuitem[action="set_permission"]').menu.add(perm_menu_item); - }); - - - // Show/Hide menu items based on record state - menu.down('menuitem[action="set_private"]').setVisible(rec.data.public_flag != 0); - menu.down('menuitem[action="set_public"]').setVisible(rec.data.public_flag != 1); - - // Enable set permission if not public - menu.down('menuitem[action="set_permission"]').setDisabled(rec.data.public_flag == 1); - - // Enable remove permission if not public and has a permission - menu.down('menuitem[action="remove_permission"]').setDisabled(rec.data.public_flag == 1 || rec.get('permission_id')==0); - - // Enable delete if record not found - menu.down('menuitem[action="delete"]').setDisabled(rec.data.found != 0); - - menu.showAt(e.getXY()); - }, - - findPaths: function() - { - var me = this, - list = this.getList(), - store = list.getStore(), - cb; - - cb = function(records, operation, success) - { - if (success) - { - if (operation.getResultSet().total > 0) - { - Ext.Msg.alert('Result',operation.getResultSet().message,me.refreshList,me); - } - else - { - me.refreshList(); - } - } - } - - store.load({ - ci_method : 'verify_paths', - callback : cb - }); - }, - - refreshList: function() - { - var me = this, - list = this.getList(), - store = list.getStore(), - cb, - unfound; - - cb = function(records, operation, success) - { - if (success) - { - unfound = store.findBy(function(rec){ - if (rec.get('found') == 0) return true; - }); - me.getDelete_unfound_button().setDisabled(unfound == -1); - } - } - - store.load({ - callback : cb - }); - }, - - setPublic: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - store = Ext.getStore('Paths'), - me = this, - cb; - - cb = function(records, operation) { operation.success ? me.loadControllers() : record.reject() }; - - rec = store.getRange(store.findExact('id',record.get('id')))[0]; - - rec.set({ public_flag: 1 }); - rec.save({ callback: cb }); - }, - - setPrivate: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - store = Ext.getStore('Paths'), - me = this, - cb; - - cb = function(records, operation) { operation.success ? me.loadControllers() : record.reject() }; - - rec = store.getRange(store.findExact('id',record.get('id')))[0]; - - rec.set({ public_flag: 0 }); - rec.save({ callback: cb }); - }, - - denyPermissionChangeForPublic: function(e) - { - // why? - //if (e.record.get('public_flag')==1) return false; - return true; - }, - - updatePath: function(editor, e) - { - var fail_cb = function(rec, operation) { - e.record.reject(); - }; - - if (e.field == 'permission_name') - { - e.record.set('permission_id',e.value); - } - - if (e.value != e.originalValue) - { - e.record.save({ - failure: fail_cb - }); - } - }, - - setPermission: function(menuitem) - { - var record = menuitem.up('menu').up('menu').getRecord(), - store = Ext.getStore('Paths'), - me = this, - cb; - - cb = function(records, operation) { operation.success ? me.loadControllers() : record.reject() }; - - rec = store.getRange(store.findExact('id',record.get('id')))[0]; - - rec.set({ permission_id: menuitem.value }); - rec.save({ callback: cb }); - - }, - - removePermission: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - fail_cb = function(rec, operation) { record.reject(); }; - - record.save({ - failure : fail_cb, - ci_method : 'remove_permission' - }); - }, - - deletePath: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - store = Ext.getStore('Paths'), - me = this, - rec,cb; - - cb = function(records, operation) - { - if (operation.success) - { - me.refreshView(true); - } - else { record.reject() }; - }; - - rec = store.getRange(store.findExact('id',record.get('id')))[0]; - - rec.erase({ callback: cb }); - }, - - deleteNotFound: function() - { - var me = this, - list = this.getList(), - store = list.getStore(), - cb; - - cb = function(records, operation, success) - { - if (success) - { - me.findPaths(); - } - } - - store.load({ - ci_method : 'delete_not_found', - callback : cb - }); - }, - - filterAuthPaths: function(button) - { - var list = this.getList(), - store = list.getStore(); - - if (button.pressed) - { - store.filter({filterFn: function(item) { return item.get("dir") != 'appunto-auth'; }}); - } - else - { - store.clearFilter(); - } - } -}); - - diff --git a/app/src/controller/Permissions.js b/app/src/controller/Permissions.js deleted file mode 100644 index 6139e690..00000000 --- a/app/src/controller/Permissions.js +++ /dev/null @@ -1,200 +0,0 @@ -Ext.define('AppuntoAuth.controller.Permissions', { - extend: 'Ext.app.Controller', - - models: [ - 'Permission' - ], - - stores : [ - 'Permissions' - ], - - views: [ - 'permission.List', - 'permission.ContextMenu', - 'permission.Add', - 'permission.Edit' - ], - - refs : [{ - ref : 'list', - selector: 'appa_permission_list' - }], - - init: function() - { - this.control( - { - 'appa_permission_list' : { - activate : this.refreshList, - itemdblclick : this.editPermission, - itemcontextmenu : this.showContextMenu, - // Stop the browser getting the event - containercontextmenu: function(view, e) { e.preventDefault(); }, - contextmenu : function(e) { e.preventDefault(); } - }, - 'appa_permission_list button[action="add"]': { - click: this.addPermission - }, - 'appa_permission_list button[action="refresh"]': { - click: this.refreshList - }, - 'appa_permission_contextmenu menuitem[action="add"]': { - click: this.addPermission - }, - 'appa_permission_add button[action=save]' : { - click: this.createPermission - }, - 'appa_permission_contextmenu menuitem[action="edit"]': { - click: this.editPermission - }, - 'appa_permission_edit button[action=save]': { - click: this.updatePermission - }, - 'appa_permission_contextmenu menuitem[action="delete"]': { - click: this.confirmPermissionDeletion - } - }); - }, - - showContextMenu: function(view, rec, item, idx, e) - { - e.preventDefault(); - - var menu = Ext.widget('appa_permission_contextmenu'); - - // pass the contextmenu the record so we don't have to worry about a selection change - menu.setRecord(rec); - - // select the record that was context-clicked - view.getSelectionModel().select(rec,false,true); // keepExisting=false, suppressEvent=true - - // Show/Hide menu items based on record state - if (rec.data.active == 1) - { - menu.down('menuitem[action="activate"]').hide(); - } - if (rec.data.active == 0) - { - menu.down('menuitem[action="deactivate"]').hide(); - } - menu.showAt(e.getXY()); - }, - - refreshList: function(button) - { - var cb = function(records, operation, success) - { - if (!success) - { - this.getList().getStore().removeAll(); - } - } - - this.getList().getStore().load(); - }, - - addPermission: function(source,e) - { - var win = Ext.widget('appa_permission_add'), - form = win.down('form'); - - form.getForm().findField('name').focus(false,100); - win.showAt(e.getXY()); - }, - - createPermission: function(button) - { - var win = button.up('window'), - form = win.down('form'), - values = form.getValues(), - record = Ext.create('AppuntoAuth.model.Permission'), - store = this.getList().getStore(), - win_cb; - - win_cb = function(rec, operation) { - store.insert(0,rec); - win.close(); - } - - if (form.getForm().isValid()) - { - record.set(values); - record.save({ - success: win_cb - }); - } - }, - - editPermission: function(menuitem,e) - { - var rec = menuitem.up('menu').getRecord(), - win = Ext.widget('appa_permission_edit'), - form = win.down('form'); - - form.loadRecord(rec); - form.getForm().findField('name').focus(false,100); - win.showAt(e.getXY()); - }, - - updatePermission: function(button) - { - var win = button.up('window'), - form = win.down('form').form, - record = form.getRecord(), - values = form.getValues(), - cb; - - cb = function(rec, operation) { - if (operation.success == true) { win.close(); } else { record.reject() }; - } - - if (form.isDirty()) - { - if (form.isValid()) - { - record.set(values); - record.save({ callback : cb }); - } - } - else - { - win.close(); - } - - }, - - - confirmPermissionDeletion: function(menuitem) - { - var rec = menuitem.up('menu').getRecord(), - store = this.getList().getStore(), - title = Lang.localize('role_delete')+': '+rec.data.name; - - Ext.MessageBox.confirm(title, Lang.localize('perm_delete_confirm'), Ext.bind(this.deletePermission,this,[rec,store],true)); - }, - - deletePermission: function(button, dummy, msgbox, record, store) - { - var view = this.getList(), - cb; - - cb = function(rec, operation) - { - if (operation.success == true) - { - store.remove(record); - } - else - { - store.load( { callback : function() { view.getSelectionModel().select(record); } } ); - } - } - - if (button == "yes") - { - record.erase( { callback : cb }); - } - } - -}); diff --git a/app/src/controller/Roles.js b/app/src/controller/Roles.js deleted file mode 100644 index 0ab97f86..00000000 --- a/app/src/controller/Roles.js +++ /dev/null @@ -1,347 +0,0 @@ -Ext.define('AppuntoAuth.controller.Roles', { - extend: 'Ext.app.Controller', - - models: [ - 'Role', - 'RolePermission' - ], - - stores: [ - 'Roles', - 'RolePermissions' - ], - - views: [ - 'role.Frame', - 'role.List', - 'role.ContextMenu', - 'role.Add', - 'role.Edit', - 'role.PermissionList', - 'role.PermissionContextMenu' - ], - - refs : [{ - ref : 'list', - selector: 'appa_role_list' - },{ - ref : 'permissionsList', - selector: 'appa_role_permission_list' - }], - - init: function() - { - this.control( - { - 'appa_role_frame' : { - activate : this.refreshList - }, - 'appa_role_list' : { - render : this.defineStoreEventHandlers, - select : this.roleSelected, - itemdblclick : this.editRole, - itemcontextmenu : this.showContextMenu, - // Stop the browser getting the event - containercontextmenu: function(view, e) { e.preventDefault(); }, - contextmenu : function(e) { e.preventDefault(); } - }, - 'appa_role_permission_list' : { - itemcontextmenu : this.showPermissionContextMenu, - // Stop the browser getting the event - containercontextmenu: function(view, e) { e.preventDefault(); }, - contextmenu : function(e) { e.preventDefault(); } - }, - 'appa_role_list button[action="add"]': { - click: this.addRole - }, - 'appa_role_frame button[action="refresh"]': { - click: this.refreshList - }, - 'appa_role_contextmenu menuitem[action="add"]': { - click: this.addRole - }, - 'appa_role_add button[action=save]' : { - click: this.createRole - }, - 'appa_role_contextmenu menuitem[action="edit"]': { - click: this.editRole - }, - 'appa_role_edit button[action=save]': { - click: this.updateRole - }, - 'appa_role_contextmenu menuitem[action="delete"]': { - click: this.confirmRoleDeletion - }, - 'appa_role_permission_list menuitem[group="permission-view"]': { - click: this.togglePermissionView - }, - 'appa_role_permission_contextmenu menuitem[action="add"]': { - click: this.addPermission - }, - 'appa_role_permission_contextmenu menuitem[action="remove"]': { - click: this.removePermission - } - }); - - }, - - refreshList: function(button) - { - var view = this.getList(), - sm = view.getSelectionModel(), - cb; - - cb = function() - { - // reselct record, forcing reload of permissions grid - if (sm.hasSelection()) - { - rec = sm.getSelection()[0]; - sm.deselectAll() - sm.select(rec); - } - } - - view.getStore().load( {callback: cb }); - - }, - - defineStoreEventHandlers: function(button) - { - this.getList().getStore().on({ - scope : this, - load : this.storeLoad - }); - }, - - /** - * Called on the RolesStore load event. Clears the RolePermissions store so the - * permission pane does not contain leftover information. - * @return void - */ - storeLoad: function() - { - var permission_list = this.getPermissionsList(), - permission_store = permission_list.getStore(); - - permission_list.setTitle(Lang.localize('tab_permissions')); - permission_store.removeAll(); - }, - - showContextMenu: function(view, rec, item, idx, e) - { - e.preventDefault(); - - var menu = Ext.widget('appa_role_contextmenu'); - - // pass the contextmenu the record so we don't have to worry about a selection change - menu.setRecord(rec); - - // select the record that was context-clicked - view.getSelectionModel().select(rec,false,true); // keepExisting=false, suppressEvent=true - - menu.showAt(e.getXY()); - }, - - roleSelected: function(view, record) - { - var permission_list = this.getPermissionsList(), - permission_store = permission_list.getStore(); - - permission_list.setTitle(Lang.localize('role_perm_for')+' '+record.get('name')); - - permission_store.load({ - id : record.get('id'), - ci_method : 'permissions' - }); - }, - - addRole: function(source,e) - { - var win = Ext.widget('appa_role_add'), - form = win.down('form'); - - form.getForm().findField('name').focus(false,100); - win.showAt(e.getXY()); - }, - - createRole: function(button) - { - var win = button.up('window'), - form = win.down('form'), - values = form.getValues(), - record = Ext.create('AppuntoAuth.model.Role'), - view = this.getList(), - store = view.getStore(), - win_cb; - - win_cb = function(rec, operation) { - store.insert(0,rec); - view.getSelectionModel().select(rec); - win.close(); - } - - if (form.getForm().isValid()) - { - record.set(values); - record.save({ - success: win_cb - }); - } - }, - - editRole: function(menuitem,e) - { - var rec = menuitem.up('menu').getRecord(), - win = Ext.widget('appa_role_edit'), - form = win.down('form'); - - form.loadRecord(rec); - form.getForm().findField('name').focus(false,100); - win.showAt(e.getXY()); - }, - - updateRole: function(button) - { - var win = button.up('window'), - form = win.down('form').form, - record = form.getRecord(), - values = form.getValues(), - cb; - - cb = function(rec, operation) { - if (operation.success == true) { win.close(); } else { record.reject() }; - } - - if (form.isDirty()) - { - if (form.isValid()) - { - record.set(values); - record.save({ callback : cb }); - } - } - else - { - win.close(); - } - - }, - - - confirmRoleDeletion: function(menuitem) - { - var rec = menuitem.up('menu').getRecord(), - store = this.getList().getStore(), - title = Lang.localize('role_delete')+': '+rec.data.name; - - Ext.MessageBox.confirm(title, Lang.localize('role_delete_confirm'), Ext.bind(this.deleteRole,this,[rec,store],true)); - }, - - deleteRole: function(button, dummy, msgbox, record, store) - { - var view = this.getList(), - cb; - - cb = function(rec, operation) - { - if (operation.success == true) - { - store.remove(record); - } - else - { - store.load( { callback : function() { view.getSelectionModel().select(record); } } ); - } - } - - if (button == "yes") - { - record.erase( { callback : cb }); - } - }, - - togglePermissionView: function(menuitem) - { - this.showAllPermissions(menuitem.value == 1); - }, - - showAllPermissions: function(showall) - { - var permissions = this.getPermissionsList(), - store = permissions.getStore(), - button = permissions.down('#permission-view-toggle'); - - if (showall == true) - { - store.clearFilter(); - button.setText(Lang.localize('role_perm_view_all')); - } - else - { - store.filter('inRole',1); - button.setText(Lang.localize('role_perm_view_selected')); - } - }, - - showPermissionContextMenu: function(view, rec, item, idx, e) - { - e.preventDefault(); - - var menu = Ext.widget('appa_role_permission_contextmenu'); - - // pass the contextmenu the record so we don't have to worry about a selection change - menu.setRecord(rec); - - // select the record that was context-clicked - view.getSelectionModel().select(rec,false,true); // keepExisting=false, suppressEvent=true - - // Show/Hide menu items based on record state - if (rec.get('inRole') == 1) - { - menu.down('menuitem[action="add"]').hide(); - } - if (rec.data.inRole == 0) - { - menu.down('menuitem[action="remove"]').hide(); - } - menu.showAt(e.getXY()); - }, - - addPermission: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - roles = this.getList(), - role = roles.getSelectionModel().getSelection()[0], - fail_cb; - - fail_cb = function() { record.reject(); } - - record.set({ hasPermission: 1 }); - record.save({ - ci_method : 'add_permission', - params : { role_id : role.get('id')}, - failure : fail_cb - }); - }, - - removePermission: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - roles = this.getList(), - role = roles.getSelectionModel().getSelection()[0], - fail_cb; - - fail_cb = function() { record.reject(); } - - record.set({ hasPermission: 0 }); - record.save({ - ci_method : 'remove_permission', - params : { role_id : role.get('id')}, - failure : fail_cb - }); - } - - -}); - diff --git a/app/src/controller/Sessions.js b/app/src/controller/Sessions.js deleted file mode 100644 index d6941ad2..00000000 --- a/app/src/controller/Sessions.js +++ /dev/null @@ -1,17 +0,0 @@ -Ext.define('AppuntoAuth.controller.Sessions', { - extend: 'Ext.app.Controller', - - models: [ - 'Session' - ], - - stores : [ - 'Sessions' - ], - - views: [ - 'session.List', - 'session.ContextMenu' - ] - -}); diff --git a/app/src/controller/Status.js b/app/src/controller/Status.js deleted file mode 100644 index 87e828f0..00000000 --- a/app/src/controller/Status.js +++ /dev/null @@ -1,39 +0,0 @@ -Ext.define('AppuntoAuth.controller.Status', { - extend: 'Ext.app.Controller', - - models: [ - 'StatusInfo' - ], - - stores : [ - 'StatusInfos' - ], - - views: [ - 'status.View' - ], - - refs : [{ - ref : 'statusInfo', - selector: 'appa_status_view dataview' - }], - - init: function() - { - this.control( - { - 'appa_status_view' : { - activate : this.refreshView - }, - 'appa_status_view button[action="refresh"]': { - click : this.refreshView - } - }); - }, - - refreshView: function(button) - { - this.getStatusInfo().getStore().load(); - } - -}); diff --git a/app/src/controller/Users.js b/app/src/controller/Users.js deleted file mode 100644 index ccf3f417..00000000 --- a/app/src/controller/Users.js +++ /dev/null @@ -1,696 +0,0 @@ -Ext.define('AppuntoAuth.controller.Users', { - extend: 'Ext.app.Controller', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - models: [ - 'User', - 'UserRole', - 'UserPermission', - 'Login' - ], - - stores : [ - 'Users', - 'UserRoles', - 'UserPermissions', - 'Logins' - ], - - views: [ - 'user.Frame', - 'user.List', - 'user.ContextMenu', - 'user.Add', - 'user.Edit', - 'user.ChangePassword', - 'user.RoleList', - 'user.RoleContextMenu', - 'user.PermissionList', - 'user.PermissionContextMenu', - 'user.LoginsWidget' - ], - - refs : [{ - ref : 'list', - selector: 'appa_user_list' - },{ - ref : 'rolePermissionFrame', - selector: '#role-permission-frame' - },{ - ref : 'roleList', - selector: 'appa_user_role_list' - },{ - ref : 'permissionList', - selector: 'appa_user_permission_list' - },{ - ref : 'loginsWidget', - selector: 'appa_user_logins_widget' - }], - - /* */ - init: function() - { - this.control( - { - 'appa_user_frame' : { - activate: this.loadStore - }, - 'appa_user_list' : { - render : this.defineStoreEventHandlers, - select : this.userSelected, - deselect : this.userDeselected, - itemdblclick : this.editUser, - itemcontextmenu : this.showContextMenu, - // Stop the browser getting the event - containercontextmenu: function(view, e) { e.preventDefault(); }, - contextmenu : function(e) { e.preventDefault(); } - }, - 'appa_user_list tool' : { - click : this.resizeUserList - }, - 'appa_user_role_list' : { - itemcontextmenu : this.showRoleContextMenu, - // Stop the browser getting the event - containercontextmenu: function(view, e) { e.preventDefault(); }, - contextmenu : function(e) { e.preventDefault(); } - }, - 'appa_user_permission_list' : { - itemcontextmenu : this.showPermissionContextMenu, - // Stop the browser getting the event - containercontextmenu: function(view, e) { e.preventDefault(); }, - contextmenu : function(e) { e.preventDefault(); } - }, - 'appa_user_list button[action="add"]': { - click: this.addUser - }, - 'appa_user_contextmenu menuitem[action="add"]': { - click: this.addUser - }, - 'appa_user_add button[action=save]' : { - click: this.createUser - }, - 'appa_user_contextmenu menuitem[action="edit"]': { - click: this.editUser - }, - 'appa_user_edit button[action=save]': { - click: this.updateUser - }, - 'appa_user_contextmenu menuitem[action="delete"]': { - click: this.confirmUserDeletion - }, - 'appa_user_contextmenu menuitem[action="change_password"]': { - click: this.changePassword - }, - 'appa_user_changepassword button[action=save]': { - click: this.updatePassword - }, - 'appa_user_contextmenu menuitem[action="activate"]': { - click: this.activateUser - }, - 'appa_user_contextmenu menuitem[action="deactivate"]': { - click: this.deactivateUser - }, - 'appa_user_role_list menuitem[group="role-view"]': { - click: this.toggleRoleView - }, - 'appa_user_role_contextmenu menuitem[action="add"]': { - click: this.addRole - }, - 'appa_user_role_contextmenu menuitem[action="remove"]': { - click: this.removeRole - }, - 'appa_user_permission_list menuitem[group="permission-view"]': { - click: this.togglePermissionView - }, - 'appa_user_permission_contextmenu menuitem[action="add"]': { - click: this.addPermission - }, - 'appa_user_permission_contextmenu menuitem[action="remove"]': { - click: this.removePermission - } - }); - - }, - - - /** - * Loads the Users store. - * @return void - */ - loadStore: function() - { - //this.getList().getStore().load(); - var view = this.getList(), - sm = view.getSelectionModel(), - cb; - - cb = function() - { - // reselct record, forcing reload of roles/permissions grids - if (sm.hasSelection()) - { - rec = sm.getSelection()[0]; - sm.deselectAll() - sm.select(rec); - } - } - - view.getStore().load( {callback: cb }); - }, - - defineStoreEventHandlers: function(button) - { - this.getList().getStore().on({ - scope : this, - load : this.storeLoad - }); - }, - - resizeUserList: function(tool) - { - var list = this.getList(), - frame = this.getRolePermissionFrame(); - - if (frame.collapsed) - { - frame.expand(); - frame.setIconCls('shield'); - this.setRoleTitle(); - tool.setType('next'); - list.columns[5].hide(); - list.columns[6].hide(); - list.columns[7].hide(); - list.columns[8].hide(); - } - else - { - frame.collapse(); - frame.setIconCls(''); - this.setRoleTitle(); - tool.setType('prev'); - list.columns[5].show(); - list.columns[6].show(); - list.columns[7].show(); - list.columns[8].show(); - } - }, - - /** - * Called on the UsersStore load event. Clears the UsersRoles and UserPermissions stores so those panes - * do not contain leftover information. - * @return void - */ - storeLoad: function() - { - var role_list = this.getRoleList(), - permission_list = this.getPermissionList(); - - this.getRoleList().getStore().removeAll(); - this.setEmptyMessageRole(); - this.setRoleTitle(); - - this.getPermissionList().getStore().removeAll(); - this.setEmptyMessagePerm(); - this.setPermissionTitle(); - }, - - setEmptyMessageRole: function() - { - var selection = this.getList().getSelectionModel().hasSelection(), - list = this.getRoleList(); - - if (selection) - { - list.getView().emptyText = '

'+Lang.localize('user_no_roles')+'

'; - } - else - { - list.getView().emptyText = '

'+Lang.localize('user_select')+'

'; - } - list.getView().refresh(); - }, - - setEmptyMessagePerm: function() - { - var selection = this.getList().getSelectionModel().hasSelection(), - list = this.getPermissionList(); - - if (selection) - { - list.getView().emptyText = '

'+Lang.localize('user_no_perm')+'

'; - } - else - { - list.getView().emptyText = '

'+Lang.localize('user_select')+'

'; - } - list.getView().refresh(); - }, - - setRoleTitle: function(username) - { - var frame = this.getRolePermissionFrame(); - - if (frame.collapsed) - { - frame.setTitle(Lang.localize('user_role_list')+ ' / ' +Lang.localize('user_perm_list')); - } - else if (username != undefined) - { - frame.setTitle(Lang.localize('user_role_list_for')+ ' ' +username); - } - else - { - frame.setTitle(Lang.localize('user_role_list')); - } - - }, - - setPermissionTitle: function(username) - { - var permission_list = this.getPermissionList(); - - if (username != undefined) - { - permission_list.setTitle(Lang.localize('user_perm_list_for')+ ' ' +username); - } - else - { - permission_list.setTitle(Lang.localize('user_perm_list')); - } - - }, - - userSelected: function(view, record) - { - var role_list = this.getRoleList(), - permission_list = this.getPermissionList(), - role_store = role_list.getStore(), - permission_store = permission_list.getStore(); - - this.setEmptyMessageRole(); - this.setEmptyMessagePerm(); - - this.setRoleTitle(record.get('username')); - this.setPermissionTitle(record.get('username')); - - role_store.load({ - id : record.get('id'), - ci_method : 'roles' - }); - - permission_store.load({ - id : record.get('id'), - ci_method : 'permissions' - }); - - }, - - userDeselected: function(view, record) - { - var role_list = this.getRoleList(), - permission_list = this.getPermissionList(), - role_store = role_list.getStore(), - permission_store = permission_list.getStore(); - - this.setEmptyMessageRole(); - this.setEmptyMessagePerm(); - - if (!this.getList().getSelectionModel().hasSelection()) - { - this.setRoleTitle(undefined); - this.setPermissionTitle(undefined); - - role_store.removeAll(); - permission_store.removeAll(); - } - - }, - - showContextMenu: function(view, rec, item, idx, e) - { - e.preventDefault(); - - var menu = Ext.widget('appa_user_contextmenu'); - - // pass the contextmenu the record so we don't have to worry about a selection change - menu.setRecord(rec); - - // select the record that was context-clicked - view.getSelectionModel().select(rec,false,true); // keepExisting=false, suppressEvent=true - - // Show/Hide menu items based on record state - if (rec.data.active == 1) - { - menu.down('menuitem[action="activate"]').hide(); - } - if (rec.data.active == 0) - { - menu.down('menuitem[action="deactivate"]').hide(); - } - menu.showAt(e.getXY()); - }, - - addUser: function(source,e) - { - var win = Ext.widget('appa_user_add'), - form = win.down('form'); - - form.getForm().findField('username').focus(false,100); - win.show(); - }, - - createUser: function(button) - { - var win = button.up('window'), - form = win.down('form'), - values = form.getValues(), - record = Ext.create('AppuntoAuth.model.User'), - store = this.getList().getStore(), - cb; - - cb = function(rec, operation) - { - if (operation.success == true) - { - store.insert(0,rec); - win.close(); - } - else - { - store.remove(record); - } - } - - if (form.getForm().isValid()) - { - record.set(values); - record.save({ - callback : cb - }); - } - }, - - editUser: function(menuitem,e) - { - var rec = menuitem.up('menu').getRecord(), - win = Ext.widget('appa_user_edit'), - form = win.down('form'); - - form.loadRecord(rec); - form.getForm().findField('username').focus(false,100); - win.show(); - }, - - updateUser: function(button) - { - var win = button.up('window'), - form = win.down('form').form, - record = form.getRecord(), - values = form.getValues(), - cb; - - cb = function(rec, operation) { - if (operation.success == true) { rec.commit(); win.close(); } else { record.reject() }; - } - - if (form.isDirty()) - { - if (form.isValid()) - { - record.set(values); - record.save({ callback : cb }); - } - } - else - { - win.close(); - } - - }, - - - confirmUserDeletion: function(menuitem) - { - var rec = menuitem.up('menu').getRecord(), - store = this.getList().getStore(), - title = Lang.localize('user_delete')+ ' '+rec.data.username+' ('+rec.data.email+')'; - - Ext.MessageBox.confirm(title, Lang.localize('user_delete_confirm'), Ext.bind(this.deleteUser,this,[rec,store],true)); - }, - - deleteUser: function(button, dummy, msgbox, record, store) - { - if (button == "yes") - { - record.erase( - { - success: function() { store.remove(record); } - } - ); - } - }, - - changePassword: function(menuitem) - { - var rec = menuitem.up('menu').getRecord(), - view = Ext.widget('appa_user_changepassword'), - form = view.down('form'); - - form.loadRecord(rec); - form.getForm().findField('password').focus(false,100); - view.show(); - }, - - - updatePassword: function(button) - { - var win = button.up('window'), - form = win.down('form').form, - record = form.getRecord(), - values = form.getValues(), - win_cb; - - win_cb = function(rec, operation) { - win.close(); - } - - if (form.isValid()) - { - record.set(values); - record.save({ - ci_method : 'update_pass', - success : win_cb - }); - // remove passwords from record - record.data.password = ''; - record.data.password2 = ''; - } - }, - - activateUser: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - fail_cb; - - fail_cb = function() { record.reject(); } - - record.set({ active: 1 }); - record.save({ failure: fail_cb }); - }, - - deactivateUser: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - fail_cb; - - fail_cb = function() { record.reject(); } - - record.set({ active: 0 }); - record.save({ failure: fail_cb }); - }, - - toggleRoleView: function(menuitem) - { - this.showAllRoles(menuitem.value == 1); - }, - - showAllRoles: function(showall) - { - var roles = this.getRoleList(), - store = roles.getStore(), - button = roles.down('#role-view-toggle'); - - if (showall == true) - { - store.clearFilter(); - button.setText(Lang.localize('user_role_view_all')); - } - else - { - store.filter('hasRole',1); - button.setText(Lang.localize('user_role_view_selected')); - } - }, - - showRoleContextMenu: function(view, rec, item, idx, e) - { - e.preventDefault(); - - var menu = Ext.widget('appa_user_role_contextmenu'); - - // pass the contextmenu the record so we don't have to worry about a selection change - menu.setRecord(rec); - - // select the record that was context-clicked - view.getSelectionModel().select(rec,false,true); // keepExisting=false, suppressEvent=true - - // Show/Hide menu items based on record state - if (rec.data.hasRole == 1) - { - menu.down('menuitem[action="add"]').hide(); - } - else if (rec.data.hasRole == 0) - { - menu.down('menuitem[action="remove"]').hide(); - } - menu.showAt(e.getXY()); - }, - - addRole: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - users = this.getList(), - user = users.getSelectionModel().getSelection()[0], - permission_store = this.getPermissionList().getStore(), - cb; - - cb = function(rec, operation) { - if (operation.success == true) - { - permission_store.load({ - id : user.get('id'), - ci_method : 'permissions' - }); - } - else { record.reject() }; - } - - record.set({ hasRole: 1 }); - record.save({ - ci_method : 'add_role', - params : { user_id : user.get('id')}, - callback : cb - }); - }, - - removeRole: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - users = this.getList(), - user = users.getSelectionModel().getSelection()[0], - permission_store = this.getPermissionList().getStore(), - cb; - - cb = function(rec, operation) { - if (operation.success == true) - { - permission_store.load({ - id : user.get('id'), - ci_method : 'permissions' - }); - } - else { record.reject() }; - } - - record.set({ hasRole: 0 }); - record.save({ - ci_method : 'remove_role', - params : { user_id : user.get('id')}, - callback : cb - }); - }, - - togglePermissionView: function(menuitem) - { - this.showAllPermissions(menuitem.value == 1); - }, - - showAllPermissions: function(showall) - { - var permissions = this.getPermissionList(), - store = permissions.getStore(), - button = permissions.down('#permission-view-toggle'); - - if (showall == true) - { - store.clearFilter(); - button.setText(Lang.localize('user_perm_view_all')); - } - else - { - store.filter('hasPermission',1); - button.setText(Lang.localize('user_perm_view_selected')); - } - }, - - showPermissionContextMenu: function(view, rec, item, idx, e) - { - e.preventDefault(); - - var menu = Ext.widget('appa_user_permission_contextmenu'); - - // pass the contextmenu the record so we don't have to worry about a selection change - menu.setRecord(rec); - - // select the record that was context-clicked - view.getSelectionModel().select(rec,false,true); // keepExisting=false, suppressEvent=true - - // Show/Hide menu items based on record state - if (rec.data.userHasPermission == 1) - { - menu.down('menuitem[action="add"]').hide(); - } - else if (rec.data.userHasPermission == 0) - { - menu.down('menuitem[action="remove"]').hide(); - } - menu.showAt(e.getXY()); - }, - - addPermission: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - users = this.getList(), - user = users.getSelectionModel().getSelection()[0], - fail_cb; - - fail_cb = function() { record.reject(); } - - record.set({ userHasPermission: 1 }); - record.save({ - ci_method : 'add_permission', - params : { user_id : user.get('id')}, - failure : fail_cb - }); - }, - - removePermission: function(menuitem) - { - var record = menuitem.up('menu').getRecord(), - users = this.getList(), - user = users.getSelectionModel().getSelection()[0], - fail_cb; - - fail_cb = function() { record.reject(); } - - record.set({ userHasPermission: 0 }); - record.save({ - ci_method : 'remove_permission', - params : { user_id : user.get('id')}, - failure : fail_cb - }); - } -}); diff --git a/app/src/lib/lang/Default.js b/app/src/lib/lang/Default.js deleted file mode 100644 index 4284f83c..00000000 --- a/app/src/lib/lang/Default.js +++ /dev/null @@ -1,177 +0,0 @@ -Ext.define('AppuntoAuth.lib.lang.Default', { - - alternateClassName: 'Lang', - - singleton: true, - - requires: [ - 'Ext.window.MessageBox' - ], - - constructor: function() - { - if (Ext.window.MessageBox) - { - Ext.window.MessageBox.prototype.buttonText = { - ok : this.localize('ok'), - cancel : this.localize('cancel'), - yes : this.localize('yes'), - no : this.localize('no') - }; - } - }, - - localize: function(label) - { - if (typeof Language !== 'undefined' && typeof Language.override !== 'undefined' && typeof Language.override[label] !== 'undefined') - { - return Language.override[label]; - } - else if ( typeof Lang[label] !== 'undefined' ) - { - return Lang[label]; - } - else - { - return undefined; - } - }, - - // Global - name : 'Name', //used in headers for various entities - description : 'Description', //used in headers for various entities - refresh : 'Refresh', // reload the data - result : 'Result', - save : 'Save', - cancel : 'Cancel', - yes : 'Yes', - no : 'No', - ok : 'Ok', - login : 'login', - loading : 'Loading...', - field_required : 'This field is required', - paging_message : 'Displaying {0} - {1} of {2}', - - // Proxy errors - server_error_title : 'Server error', - server_error_unknown : 'Unknown error: The server did not send any information about the error.', - server_error_no_response: 'Unknown error: Server did not send a response.', - server_error_decode : 'Error decoding the response sent by the server.', - server_error_undefined : 'Undefined Server Error', - - // Application tabs - tab_status : 'Status', - tab_users : 'Users', - tab_user_roles : 'User Roles', - tab_permissions : 'Permissions', - tab_paths : 'Paths', - tab_sessions : 'Sessions', - - // User list - username : 'Username', - name : 'Name', - surname : 'Last name', - email : 'Email', - email_format : 'This field should be an e-mail address in the format "user@example.com"', - password : 'Password', - password_confirm : 'Confirm password', - password_change : 'Change password', - password_match : 'Passwords do not match', - password_format : 'Password must be at least 6 characters, no more than 16 characters, and must include at least one upper case letter, one lower case letter, and one numeric digit.', - user_set_active : 'Set user as active', - active : 'Active', // Whether or not this user has been activated or deactivated - user_add : 'Add user', - user_edit : 'Edit user', - user_delete : 'Delete user', - user_delete_confirm : 'Are you sure you want to delete this user?', - user_activate : 'Activate user', - user_deactivate : 'Deactivate user', - last_ip : 'Last IP', - last_login : 'Last Login', - created : 'Created', - modified : 'Modified', - never : 'Never', - user_select : 'Select a user', - user_select_or : 'Select a User or select Show All above.', - user_no_roles : 'No roles are assigned to this user. Select Show All for a list of available roles', - user_no_perm : 'No permissions are assigned to this user. Select Show All for a list of available permissions', - user_role_list : 'User roles', - user_role_list_for : 'User roles for', //will be followed by username - user_role_add : 'Add user to role', - user_role_remove : 'Remove user from role', - user_perm_list : 'Application permissions', - user_perm_list_for : 'Application permissions for', //wilbe followed by username - user_perm_add : 'Grant user permission', - user_perm_remove : 'Revoke user permission', - user_role_view_all : 'Show all roles', - user_role_view_selected : 'Show only roles for the selected user', - user_perm_view_all : 'Show all permissions', - user_perm_view_selected : 'Show only permissions for the selected user', - granted_to : 'Granted to', // permission is granted to user or to the user's role - grant_role : 'Role', - grant_user : 'User', - user_perm_granted_role : 'permission granted through role', - user_perm_granted_user : 'permission granted to user', - - - // Role list - role_add : 'Add role', - role_edit : 'Edit role', - role_delete : 'Delete role', - role_delete_confirm : 'Are you sure you want to delete this role?', - role_perm_view_all : 'Show all permissions', - role_perm_view_selected : 'Show only permissions for the selected role', - role_perm_for : 'Permissions for', - role_select : 'Select a Role or select Show All above.', - role_perm_add : 'Add permission to role', - role_perm_remove : 'Remove permission from role', - - // Permission list - perm_internal_name : 'Internal Name', - perm_add : 'Add permission', - perm_edit : 'Edit permission', - perm_delete : 'Delete permission', - perm_delete_confirm : 'Are you sure you want to delete this permission?', - - - // Path list - path_tab_controllers : 'Controllers', - path_tab_paths : 'Paths', - controller_methods : 'methods', - controller_public : 'public', - controller_private : 'private', - path_verify : 'Verifing application paths', - path_refreshing : 'Refreshing paths', - path_public : 'Public', - path_private : 'Private', - path_method : 'Method', // A Codeigniter function inside a controller - path_path : 'Path', - path_access : 'Access', // Header for public/private column - path_permission : 'Permission', - path_permissions : 'Permissions', - path_set_public : 'Make path public', - path_set_private : 'Make path private', - path_set_permission : 'Set Permission', - path_remove_permission : 'Remove Permission', - path_delete : 'Delete Path', - path_not_found_1 : 'This method was not found in the Controller but a record of it exists in the database.', - path_not_found_2 : 'You may delete the record of this path.', - - // Session List - session_username : 'Username', - session_last_activity : 'Last Activity', - session_last_page : 'Last Page', - session_ip_address : 'IP Address', - session_last_page : 'Last Page', - session_user_agent : 'User Agent', // User-Agent string returned by user's browser - session_view_all : 'Show all sessions', - session_view_logged_in : 'Show only logged in sessions', - session_delete : 'Delete Session', - session_delete_confirm : 'Are you sure you want to delete this session?', - session_delete_user : 'user', // used in delete confirmation window title eg: "user: Bob Jones" - - - // dummy val so I don't forget to remove trailing comma - dummy : '' - -}); diff --git a/app/src/lib/proxy/CiReader.js b/app/src/lib/proxy/CiReader.js deleted file mode 100644 index be9bd15b..00000000 --- a/app/src/lib/proxy/CiReader.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * An override of Ext.data.reader.Json to be used by AppuntoAuth.lib.proxy.Codeigniter - * - * This override prevents an exception from being thrown by the Ext.decode statement in the - * event of invalid json. It also removes the warning. - * - * If the response is not valid JSON, we will still call the createReadError method which - * causes an exception to be thrown in the proxy and we will deal with the error there - * - * original method: - * - * getResponseData: function(response) { - * try { - * return Ext.decode(response.responseText); - * } catch (ex) { - * Ext.Logger.warn('Unable to parse the JSON returned by the server'); - * return this.createReadError(ex.message); - * } - * } - */ -Ext.define('AppuntoAuth.lib.proxy.CiReader', { - extend: 'Ext.data.reader.Json', - alias: 'reader.ci', - - getResponseData: function(response) - { - var res = Ext.decode(response.responseText,true); - - if (res != null) return res; - - return this.createReadError("You're trying to decode an invalid JSON String: "+response.responseText); - } - -}); diff --git a/app/src/lib/proxy/CiWriter.js b/app/src/lib/proxy/CiWriter.js deleted file mode 100644 index 30137cac..00000000 --- a/app/src/lib/proxy/CiWriter.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * An override of Ext.data.writer.Json to be used by AppuntoAuth.lib.proxy.Codeigniter - * - * This override sends data as POST parameters rather than as a JSON payload so you can use - * CodeIgniter's form validation library - */ -Ext.define('AppuntoAuth.lib.proxy.CiWriter', { - extend: 'Ext.data.writer.Json', - alias: 'writer.ci', - - writeRecords: function(request) - { - var record = request.getRecords()[0], - changes = record.getChanges(), - field; - - request.setParam('id', record.get('id')); - - for (field in changes) - { - request.setParam(field, changes[field]); - } - return request; - } - -}); diff --git a/app/src/lib/proxy/Codeigniter.js b/app/src/lib/proxy/Codeigniter.js deleted file mode 100644 index 75ef1d64..00000000 --- a/app/src/lib/proxy/Codeigniter.js +++ /dev/null @@ -1,279 +0,0 @@ -/** - * CodeigniterProxy: a data proxy - * - * An extension of {@link Ext.data.proxy.Ajax} with some useful modifications for use - * with the CodeIgniter PHP web application framework. - * - * @cfg {String} [siteurl='/auth/'] Application siteurl. Use a trailing slash. - * @cfg {boolean} [index_php=true] true to include the index.php in codeigniter URLs - */ -Ext.define('AppuntoAuth.lib.proxy.Codeigniter', { - extend: 'Ext.data.proxy.Ajax', - alias: 'proxy.ci', - - requires : [ - 'AppuntoAuth.lib.proxy.CiReader', - 'AppuntoAuth.lib.proxy.CiWriter', - 'AppuntoAuth.lib.lang.Default', - 'Ext.util.Cookies' - ], - - - /* - * These two values should reflect your deployment. - * - * ci_site_url should be set like this in your view: - * - * - * - * - * stripping the trailing slash, then adding a trailing slash on site_url - * ensures that we don't get a double slash or a missing trailing slash when - * removing or using index.php - * - */ - siteurl : ci_site_url, // has a trailing slash - - loginurl : ci_site_url+ci_login_url, - - /** - * If CSRF protection is turned on by setting $config['csrf_protection'] = TRUE the CodeIgniter config.php, - * you must set the values of these two variables to the match the variables set in the config.php - * - * csrf_token_name must match $config['csrf_token_name'] - * csrf_cookie_name must match $config['csrf_cookie_name'] - */ - csrf_token_name : ci_token, - csrf_cookie_name : ci_cookie, - - - config: { - ci_class : '', // leave this blank, for initialization only. - ci_method : '' // leave this blank, for initialization only. - }, - - timeout : 30 * 1000, - //noCache : false, - - actionMethods: { - create : 'POST', - read : 'POST', - update : 'POST', - destroy: 'POST' - }, - - reader: { - type : 'ci', //Alias defined in AppuntoAuth.lib.proxy.CiReader - rootProperty : 'rows', - messageProperty : 'msg' - }, - - writer: 'ci', //Alias defined in AppuntoAuth.lib.proxy.CiWriter - - errors: { - server_error_title : 'Server error', - server_error_unknown : 'Unknown error: The server did not send any information about the error.', - server_error_no_response: 'Unknown error: Server did not send a response.', - server_error_decode : 'Error decoding the response sent by the server.', - server_error_undefined : 'Undefined Server Error' - }, - - // Common http status codes to provide more information when codeigniter does not send an error - httpError: { - 400 : 'Bad Request', - 401 : 'Unauthorized', - 403 : 'Forbidden', - 404 : 'Not Found', - 405 : 'Method Not Allowed', - 408 : 'Request Timeout', - 414 : 'Request-URI Too Long', - 500 : 'Internal Server Error', - 501 : 'Not Implemented', - 502 : 'Bad Gateway', - 503 : 'Service Unavailable', - 504 : 'Gateway Timeout', - 505 : 'HTTP Version Not Supported', - 509 : 'Bandwidth Limit Exceeded', - 511 : 'Network Authentication Required' - }, - - /** - * Set the 'ci_method' for this url which corresponds to a codeigniter controller function taking into account the order of priority, - * - The request - * - The api - * - * @private - * @param {Ext.data.Request} request The request - * @return void - */ - setCi_methodString: function(request) - { - this.setCi_method( request.getOperation().config.ci_method || request.config.action ); - }, - - /** - * Build the URLs for this request in this format: siteurl/ci_class/op. - * - ci_class: Represents the codeigniter controller class that should be invoked. - * - op: Represents the codeigniter controller class function, or ci_method, that should be called. - * - * - * Overrides function in Ext.data.proxy.Ajax - * - * @private - * @param {Ext.data.Request} request The request - * @return void - */ - buildUrl : function(request) - { - this.setCi_methodString(request); - - return this.getSiteurl()+this.getCi_class()+'/'+this.getCi_method(); - }, - - /** - * Override the doRequest function in Ext.data.proxy.Ajax to add the CSRF parameter - */ - doRequest: function(operation) - { - this.setCSRFParam(); - this.callParent(arguments); - }, - - /** - * Add the CSRF parameter if retrieved by cookie - */ - setCSRFParam: function() - { - var csrf_token = this.csrf_token_name, - csrf_cookie = this.csrf_cookie_name, - csrf_value = Ext.util.Cookies.get(csrf_cookie); - - if (csrf_value != null) - { - this.setExtraParam(csrf_token,csrf_value); - } - }, - - // operation exception - listeners: - { - exception: function (proxy, request, operation) - { - var errors, error, login_redir = false; - - if (request.responseText != undefined) - { - // responseText was returned, decode it - responseObj = Ext.decode(request.responseText,true); // true to return null instead of throwing an exception if the JSON is invalid. - if (responseObj != null && responseObj.msg != undefined) - { - // message was returned - errors = (responseObj.errors != undefined) ? '
    '+responseObj.errors+'
' : ''; - error = '

' + responseObj.msg + '

' + errors; - login_redir = (responseObj.err != undefined) && (responseObj.err=='LOGIN') ? true : false ; - - this.alertError(this.getErrorMsg('server_error_title'),error,login_redir); - } - else - { - // response could not be decoded, check if it is a CodeIgniter message - error = this.getCodeigniterError(request); - - // response could not be decoded, check if it there is a defined http error code - if ((error == null) && (request.status != undefined && this.httpError[request.status] != undefined)) - { - error = '

'+request.status+'

'+this.httpError[request.status]+'

'; - this.alertError(this.getErrorMsg('server_error_title'),error); - } - - // If not a CodeIgniter error and no status code, then report json decoding error - if (error == null) error = this.getErrorMsg('server_error_decode') - - this.alertError(this.getErrorMsg('server_error_title'),error); - } - } - else - { - // no responseText sent - this.alertError(this.getErrorMsg('server_error_title'),this.getErrorMsg('server_error_no_response')); - } - } - }, - - getCodeigniterError: function (request) - { - var ci_error_el, - ci_error_div; - - if (request != undefined && request.responseText != undefined) - { - - ci_error_el = document.createElement('div'); - - ci_error_el.innerHTML = request.responseText; - ci_error_div = ci_error_el.getElementsByTagName('div')[0]; - - // send error found in div on codeigniter error page - if (ci_error_div != undefined) return ci_error_div.innerHTML; - } - return null; - }, - - alertError: function(title, msg, login_redir) - { - var login_url = this.loginurl, - handler = function(button) { button.up('window').close(); } - - if (login_redir == true) - { - handler = function(button) - { - button.up('window').close(); - location.href = login_url; - } - } - - Ext.create('Ext.window.Window', { - title : title, - iconCls : 'exclamation', - layout : 'fit', - modal : true, - items: { - xtype : 'container', - style : 'padding: 8px', - autoScroll : true, - html : msg, - border : 0 - }, - buttons : [ - { - text : 'Ok', - handler : handler - } - ] - }).show(); - }, - - getErrorMsg: function(type) - { - if ( - (typeof Lang !== 'undefined') && - (typeof Lang.localize == 'function') && - (Lang.localize(type) != undefined) - ) - { - return Lang.localize(type); - } - else - { - return this.errors[type]; - } - }, - - getSiteurl: function() { - return this.siteurl; - } - -}); diff --git a/app/src/lib/util/CustomVTypes.js b/app/src/lib/util/CustomVTypes.js deleted file mode 100644 index a1d29905..00000000 --- a/app/src/lib/util/CustomVTypes.js +++ /dev/null @@ -1,34 +0,0 @@ -Ext.define('AppuntoAuth.lib.util.CustomVTypes', { - - singleton : true, - - requires : [ - 'AppuntoAuth.lib.lang.Default', - 'Ext.form.field.VTypes' - ], - - constructor: function () - { - Ext.apply(Ext.form.field.VTypes, { - passformat: function(val ) - { - var format = new RegExp(pw_regex); - - return format.test(val); - }, - passformatText: Lang.localize('password_format'), - - passconfirm: function(val, field) - { - if (field.passField) { - var pwd = field.up('form').down('#' + field.passField); - return (val == pwd.getValue()); - } - return false; - return true; - }, - passconfirmText: Lang.localize('password_match') - }); - } - -}); diff --git a/app/src/lib/util/FakeConsole.js b/app/src/lib/util/FakeConsole.js deleted file mode 100644 index 29177c86..00000000 --- a/app/src/lib/util/FakeConsole.js +++ /dev/null @@ -1,21 +0,0 @@ -Ext.define('AppuntoAuth.lib.util.FakeConsole', -{ - singleton : true, - - constructor: function() - { - if (typeof console === "undefined") - { - console = - { - log : function () { }, - info : function () { }, - warn : function () { }, - error : function () { }, - time : function () { }, - timeEnd : function () { } - } - - } - } -}); diff --git a/app/src/lib/util/KeepAlive.js b/app/src/lib/util/KeepAlive.js deleted file mode 100644 index bc4f716e..00000000 --- a/app/src/lib/util/KeepAlive.js +++ /dev/null @@ -1,27 +0,0 @@ -Ext.define('AppuntoAuth.lib.util.KeepAlive', -{ - singleton : true, - - interval : 4*60*1000, - - constructor : function() - { - if (typeof(admin_keepalive) != 'undefined' && Ext.isNumber(admin_keepalive) && admin_keepalive> 0) - { - this.interval = admin_keepalive*1000; - } - setTimeout(Ext.bind(this.touch), this.interval); - }, - - touch: function() - { - var me = AppuntoAuth.lib.util.KeepAlive; - - Ext.Ajax.request({ - url: ci_site_url+'appunto-auth/ui/keep-alive' - }); - - setTimeout(Ext.bind(me.touch), me.interval); - } - -}); diff --git a/app/src/lib/util/SearchField.js b/app/src/lib/util/SearchField.js deleted file mode 100644 index fe64a72d..00000000 --- a/app/src/lib/util/SearchField.js +++ /dev/null @@ -1,84 +0,0 @@ -/* - *this is copied from http://dev.sencha.com/ext/5.0.1/examples/ux/form/SearchField.js - */ -Ext.define('AppuntoAuth.lib.util.SearchField', { - extend: 'Ext.form.field.Text', - - xtype: 'appunto-searchfield', - - triggers: { - clear: { - weight: 0, - cls: Ext.baseCSSPrefix + 'form-clear-trigger', - hidden: true, - handler: 'onClearClick', - scope: 'this' - }, - search: { - weight: 1, - cls: Ext.baseCSSPrefix + 'form-search-trigger', - handler: 'onSearchClick', - scope: 'this' - } - }, - - hasSearch : false, - paramName : 'search', - - initComponent: function() { - var me = this, - store = me.store, - proxy; - - me.callParent(arguments); - me.on('specialkey', function(f, e){ - if (e.getKey() == e.ENTER) { - me.onSearchClick(); - } - }); - - if (!store || !store.isStore) { - store = me.store = Ext.data.StoreManager.lookup(store); - } - - // We're going to use filtering - store.setRemoteFilter(true); - - // Set up the proxy to encode the filter in the simplest way as a name/value pair - proxy = me.store.getProxy(); - proxy.setFilterParam(me.paramName); - proxy.encodeFilters = function(filters) { - return filters[0].getValue(); - } - }, - - onClearClick : function(){ - var me = this, - activeFilter = me.activeFilter; - - if (activeFilter) { - me.setValue(''); - me.store.getFilters().remove(activeFilter); - me.activeFilter = null; - me.getTrigger('clear').hide(); - me.updateLayout(); - } - }, - - onSearchClick : function(){ - var me = this, - value = me.getValue(); - - if (value.length > 0) { - // Param name is ignored here since we use custom encoding in the proxy. - // id is used by the Store to replace any previous filter - me.activeFilter = new Ext.util.Filter({ - property: me.paramName, - value: value - }); - me.store.getFilters().add(me.activeFilter); - me.getTrigger('clear').show(); - me.updateLayout(); - } - } -}); diff --git a/app/src/model/Login.js b/app/src/model/Login.js deleted file mode 100644 index 31c9613e..00000000 --- a/app/src/model/Login.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Login Model - * - * @cfg {Array} fields An Array of {@link Ext.data.Field} defintions. - * @cfg {String/Object/Ext.data.proxy.Proxy} [proxy=ci] Uses {@link APPUNTO.lib.proxy.Codeigniter} defined by "ci" alias. - */ -Ext.define('AppuntoAuth.model.Login', -{ - extend: 'Ext.data.Model', - - requires: [ - 'AppuntoAuth.lib.proxy.Codeigniter' - ], - - fields: [ - {name: 'id', type: 'int'}, - {name: 'attempt_time', type: 'date', format: 'Y-m-d H:i:s'}, - {name: 'username', type: 'string'}, - {name: 'ip_address', type: 'string'}, - {name: 'user_agent', type: 'string'}, - {name: 'success', type: 'int'}, - {name: 'note', type: 'string'} - ], - - proxy: - { - type : 'ci', - ci_class: 'appunto-auth/user/login_attempts' - } -}); diff --git a/app/src/model/Path.js b/app/src/model/Path.js deleted file mode 100644 index 56b96e55..00000000 --- a/app/src/model/Path.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Path Model - * - * A data model that defines paths which are CodeIgniter URIs defined by controller/function - * - * @cfg {Array} fields An Array of {@link Ext.data.Field} defintions. - * @cfg {String/Object/Ext.data.proxy.Proxy} [proxy=ci] Uses {@link APPUNTO.lib.proxy.Codeigniter} defined by "ci" alias. - */ -Ext.define('AppuntoAuth.model.Path', -{ - extend: 'Ext.data.Model', - - requires: [ - 'AppuntoAuth.lib.proxy.Codeigniter' - ], - - fields: [ - {name: 'id', type: 'int'}, - {name: 'found', type: 'int'}, - {name: 'dir', type: 'string'}, - {name: 'full_path', type: 'string'}, - {name: 'ci_controller', type: 'string'}, - {name: 'ci_method', type: 'string'}, - {name: 'public_flag', type: 'int'}, - {name: 'permission_id', type: 'int'}, - {name: 'permission_name', type: 'string'}, - {name: 'note', type: 'string'} - ], - - proxy: - { - type : 'ci', - ci_class: 'appunto-auth/ui/path' - } -}); diff --git a/app/src/model/Permission.js b/app/src/model/Permission.js deleted file mode 100644 index 3d01b3b7..00000000 --- a/app/src/model/Permission.js +++ /dev/null @@ -1,22 +0,0 @@ -Ext.define('AppuntoAuth.model.Permission', -{ - extend : 'Ext.data.Model', - - requires: [ - 'AppuntoAuth.lib.proxy.Codeigniter' - ], - - fields: [ - {name: 'id', type: 'int'}, - {name: 'hasPermission', type: 'int'}, - {name: 'name', type: 'string'}, - {name: 'internal_name', type: 'string'}, - {name: 'description', type: 'string'} - ], - - proxy: - { - type : 'ci', - ci_class: 'appunto-auth/ui/permission' - } -}); diff --git a/app/src/model/Readme.md b/app/src/model/Readme.md deleted file mode 100644 index c0fe7623..00000000 --- a/app/src/model/Readme.md +++ /dev/null @@ -1 +0,0 @@ -This folder contains the Models for this application. diff --git a/app/src/model/Role.js b/app/src/model/Role.js deleted file mode 100644 index 92729b38..00000000 --- a/app/src/model/Role.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Role Model - * - * A data model that represents application roles. - * - * rolemodel lol :) - * - * @cfg {Array} fields An Array of {@link Ext.data.Field} defintions. - * @cfg {String/Object/Ext.data.proxy.Proxy} [proxy=ci] Uses {@link APPUNTO.lib.proxy.Codeigniter} defined by "ci" alias. - */ -Ext.define('AppuntoAuth.model.Role', -{ - extend: 'Ext.data.Model', - - requires: [ - 'AppuntoAuth.lib.proxy.Codeigniter' - ], - - fields: [ - {name: 'id', type: 'int'}, - {name: 'name', type: 'string'}, - {name: 'internal_name', type: 'string'}, - {name: 'description', type: 'string'} - ], - - proxy: - { - type : 'ci', - ci_class: 'appunto-auth/ui/role' - } -}); diff --git a/app/src/model/RolePermission.js b/app/src/model/RolePermission.js deleted file mode 100644 index 92958c9a..00000000 --- a/app/src/model/RolePermission.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * RolePermission - * - * A data model that represents permissions belonging to a specified Role. - * - * @cfg {Array} fields An Array of {@link Ext.data.Field} defintions. - * @cfg {String/Object/Ext.data.proxy.Proxy} [proxy=ci] Uses {@link APPUNTO.lib.proxy.Codeigniter} defined by "ci" alias. - */ -Ext.define('AppuntoAuth.model.RolePermission', -{ - extend: 'Ext.data.Model', - - requires: [ - 'AppuntoAuth.lib.proxy.Codeigniter' - ], - - fields: [ - {name: 'id', type: 'int'}, - {name: 'name', type: 'string'}, - {name: 'inRole', type: 'int'}, - {name: 'description', type: 'string'} - ], - - proxy: - { - type : 'ci', - ci_class: 'appunto-auth/ui/role' - } -}); diff --git a/app/src/model/Session.js b/app/src/model/Session.js deleted file mode 100644 index ed1780f5..00000000 --- a/app/src/model/Session.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Session model - * - * A data model that represents entries in the CodeIgniter ci_sessions table. - * - * @cfg {Array} fields An Array of {@link Ext.data.Field} defintions. - * @cfg {String/Object/Ext.data.proxy.Proxy} [proxy=ci] Uses {@link APPUNTO.lib.proxy.Codeigniter} defined by "ci" alias. - */ -Ext.define('AppuntoAuth.model.Session', -{ - extend: 'Ext.data.Model', - - requires: [ - 'AppuntoAuth.lib.proxy.Codeigniter' - ], - - fields: [ - {name: 'id', type: 'string'}, - {name: 'username', type: 'string'}, - {name: 'last_activity', type:'date', dateFormat: 'Y-m-d H:i:s'}, - {name: 'last_page', type: 'string'}, - {name: 'ip_address', type: 'string'}, - {name: 'user_agent', type: 'string'} - ], - - proxy: - { - type : 'ci', - ci_class: 'appunto-auth/ui/session' - } -}); diff --git a/app/src/model/StatusInfo.js b/app/src/model/StatusInfo.js deleted file mode 100644 index 6ff2a5b3..00000000 --- a/app/src/model/StatusInfo.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * StatusInfo model - * - * A data model that represents name/value pair items of application information - * - * @cfg {Array} fields An Array of {@link Ext.data.Field} defintions. - * @cfg {String/Object/Ext.data.proxy.Proxy} [proxy=ci] Uses {@link APPUNTO.lib.proxy.Codeigniter} defined by "ci" alias. - */ -Ext.define('AppuntoAuth.model.StatusInfo', -{ - extend: 'Ext.data.Model', - - requires: [ - 'AppuntoAuth.lib.proxy.Codeigniter' - ], - - fields: [ - {name: 'info_item', type: 'string'}, - {name: 'info_val', type: 'string'}, - {name: 'info_note', type: 'string'} - ], - - proxy: - { - type : 'ci', - ci_class: 'appunto-auth/ui/statusinfo' - } -}); diff --git a/app/src/model/User.js b/app/src/model/User.js deleted file mode 100644 index 3a6d0d82..00000000 --- a/app/src/model/User.js +++ /dev/null @@ -1,26 +0,0 @@ -Ext.define('AppuntoAuth.model.User', - { - extend: 'Ext.data.Model', - - requires: [ - 'AppuntoAuth.lib.proxy.Codeigniter' - ], - - fields: [ - {name: 'id', type: 'int'}, - {name: 'username', type: 'string'}, - {name: 'name', type: 'string'}, - {name: 'surname', type: 'string'}, - {name: 'email', type: 'string'}, - {name: 'active', type: 'int'}, - {name: 'last_login', type: 'string'}, - {name: 'created', type: 'string'}, - {name: 'modified', type: 'string'} - ], - - proxy: - { - type : 'ci', - ci_class: 'appunto-auth/ui/user' - } -}); diff --git a/app/src/model/UserPermission.js b/app/src/model/UserPermission.js deleted file mode 100644 index 6c564d25..00000000 --- a/app/src/model/UserPermission.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * UserPermission model - * - * - * A data model that represents permissions granted to the user personally or through the user's role. - * - * @cfg {Array} fields An Array of {@link Ext.data.Field} defintions. - * @cfg {String/Object/Ext.data.proxy.Proxy} [proxy=ci] Uses {@link APPUNTO.lib.proxy.Codeigniter} defined by "ci" alias. - */ -Ext.define('AppuntoAuth.model.UserPermission', -{ - extend: 'Ext.data.Model', - - requires: [ - 'AppuntoAuth.lib.proxy.Codeigniter' - ], - - fields: [ - {name: 'id', type: 'int'}, - {name: 'hasPermission', type: 'int'}, - {name: 'userRoleHasPermission', type: 'int'}, - {name: 'userHasPermission', type: 'int'}, - {name: 'name', type: 'string'}, - {name: 'description', type: 'string'} - ], - - proxy: - { - type : 'ci', - ci_class : 'appunto-auth/ui/user' - } -}); diff --git a/app/src/model/UserRole.js b/app/src/model/UserRole.js deleted file mode 100644 index ffb5cbe3..00000000 --- a/app/src/model/UserRole.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * UserRole model - * - * - * A data model that represents roles belonging to a user. - * - * @cfg {Array} fields An Array of {@link Ext.data.Field} defintions. - * @cfg {String/Object/Ext.data.proxy.Proxy} [proxy=ci] Uses {@link APPUNTO.lib.proxy.Codeigniter} defined by "ci" alias. - */ -Ext.define('AppuntoAuth.model.UserRole', -{ - extend: 'Ext.data.Model', - - requires: [ - 'AppuntoAuth.lib.proxy.Codeigniter' - ], - - fields: [ - {name: 'id', type: 'int'}, - {name: 'hasRole', type: 'int'}, - {name: 'name', type: 'string'}, - {name: 'description', type: 'string'} - ], - - proxy: - { - type : 'ci', - ci_class : 'appunto-auth/ui/user' - } -}); diff --git a/app/src/store/Controllers.js b/app/src/store/Controllers.js deleted file mode 100644 index 25bc90c3..00000000 --- a/app/src/store/Controllers.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Controllers Store - */ -Ext.define('AppuntoAuth.store.Controllers', { - extend: 'Ext.data.Store', - - fields : [ - {name: 'ci_controller', type: 'string'}, - {name: 'dir', type: 'string'}, - {name: 'full_path', type: 'string'}, - {name: 'methods', type: 'int'}, - {name: 'public_methods', type: 'int'}, - {name: 'private_methods', type: 'int'} - ] -}); diff --git a/app/src/store/Logins.js b/app/src/store/Logins.js deleted file mode 100644 index be6bd106..00000000 --- a/app/src/store/Logins.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Role Store - * - * - * A store that uses the {@link AppuntoAuth.model.Role} model and contains application roles. - * - * @cfg {int} [pageSize=9999] Setting pageSize high since this store does not page. - * @cfg {boolean} [remoteSort=true] This store uses remote sorting. - * @cfg {boolean} [remoteFilter=true] This store uses remote filtering. - * @cfg {boolean} [autoLoad=false] Do not automatically load this store. - */ -Ext.define('AppuntoAuth.store.Logins', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.Login', - pageSize : 9999, - remoteSort: true, - remoteFilter: true, - autoLoad: false -}); diff --git a/app/src/store/PathItems.js b/app/src/store/PathItems.js deleted file mode 100644 index 339e2424..00000000 --- a/app/src/store/PathItems.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * PathItems Store - */ -Ext.define('AppuntoAuth.store.PathItems', { - extend: 'Ext.data.Store', - - fields : [ - {name: 'id', type: 'int'}, - {name: 'found', type: 'int'}, - {name: 'dir', type: 'string'}, - {name: 'full_path', type: 'string'}, - {name: 'ci_controller', type: 'string'}, - {name: 'ci_method', type: 'string'}, - {name: 'public_flag', type: 'int'}, - {name: 'permission_id', type: 'int'}, - {name: 'permission_name', type: 'string'}, - {name: 'note', type: 'string'} - ] -}); diff --git a/app/src/store/Paths.js b/app/src/store/Paths.js deleted file mode 100644 index 33ad5764..00000000 --- a/app/src/store/Paths.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Paths Store - * - * - * A grouping store that uses the {@link AppuntoAuth.model.Path} model and contains - * valid CodeIgniter paths defined by controller/function. - * - * @cfg {int} [pageSize=9999] Setting pageSize high since this store does not page. - * @cfg {boolean} [remoteSort=false] This store uses local sorting. - * @cfg {boolean} [remoteFilter=false] This store uses local filtering. - * @cfg {String} [groupField="ci_controller"] Sort by the "controller" field by default. - * @cfg {boolean} [autoLoad=false] Do not automatically load this store. - */ -Ext.require('Ext.data.Store'); -Ext.require('AppuntoAuth.model.Path'); - -Ext.define('AppuntoAuth.store.Paths', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.Path', - pageSize : 9999, - remoteSort: false, - remoteFilter: false, - groupField: 'ci_controller', - autoLoad: false -}); diff --git a/app/src/store/Permissions.js b/app/src/store/Permissions.js deleted file mode 100644 index 4bf414e5..00000000 --- a/app/src/store/Permissions.js +++ /dev/null @@ -1,11 +0,0 @@ -Ext.require('Ext.data.Store'); -Ext.require('AppuntoAuth.model.Permission'); - -Ext.define('AppuntoAuth.store.Permissions', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.Permission', - pageSize : 0, - remoteSort: true, - remoteFilter: true, - autoLoad: false -}); diff --git a/app/src/store/PermissionsSelection.js b/app/src/store/PermissionsSelection.js deleted file mode 100644 index 64b705ef..00000000 --- a/app/src/store/PermissionsSelection.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Permissions Store - * - * - * A store that uses the {@link AppuntoAuth.model.Permission} model and contains - * application permissions. - * - * @cfg {int} [pageSize=9999] Setting pageSize high since this store does not page. - * @cfg {boolean} [remoteSort=true] This store uses remote sorting. - * @cfg {boolean} [remoteFilter=true] This store uses remote filtering. - * @cfg {boolean} [autoLoad=false] Do not automatically load this store. - */ -Ext.define('AppuntoAuth.store.PermissionsSelection', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.Permission', - pageSize : 9999, - remoteSort: true, - remoteFilter: true, - autoLoad: false -}); diff --git a/app/src/store/Readme.md b/app/src/store/Readme.md deleted file mode 100644 index d18a54aa..00000000 --- a/app/src/store/Readme.md +++ /dev/null @@ -1,2 +0,0 @@ -This folder contains store instances (identified by storeId) and store types -(with "store.foo" aliases). diff --git a/app/src/store/RolePermissions.js b/app/src/store/RolePermissions.js deleted file mode 100644 index 1790ee5e..00000000 --- a/app/src/store/RolePermissions.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * RolePermissions Store - * - * - * A store that uses the {@link AppuntoAuth.model.RolePermission} model and contains - * permissions belonging to a role. - * - * @cfg {int} [pageSize=0] This store does not page. - * @cfg {boolean} [remoteSort=false] This store uses local sorting. - * @cfg {boolean} [remoteFilter=false] This store uses local filtering. - * @cfg {boolean} [autoLoad=false] Do not automatically load this store. - */ -Ext.require('Ext.data.Store'); -Ext.require('AppuntoAuth.model.RolePermission'); - -Ext.define('AppuntoAuth.store.RolePermissions', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.RolePermission', - pageSize : 0, - remoteSort: false, - remoteFilter: false, - autoLoad: false -}); diff --git a/app/src/store/Roles.js b/app/src/store/Roles.js deleted file mode 100644 index d639dc78..00000000 --- a/app/src/store/Roles.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Role Store - * - * - * A store that uses the {@link AppuntoAuth.model.Role} model and contains application roles. - * - * @cfg {int} [pageSize=0] This store does not page. - * @cfg {boolean} [remoteSort=true] This store uses remote sorting. - * @cfg {boolean} [remoteFilter=true] This store uses remote filtering. - * @cfg {boolean} [autoLoad=false] Do not automatically load this store. - */ -Ext.require('Ext.data.Store'); -Ext.require('AppuntoAuth.model.Role'); - -Ext.define('AppuntoAuth.store.Roles', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.Role', - pageSize : 0, - remoteSort: true, - remoteFilter: true, - autoLoad: false -}); diff --git a/app/src/store/Sessions.js b/app/src/store/Sessions.js deleted file mode 100644 index db8b7e82..00000000 --- a/app/src/store/Sessions.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Sessions Store - * - * - * A store that uses the {@link AppuntoAuth.model.Session} model and contains information from the - * CodeIgniter ci_sessions table. - * - * @cfg {int} [pageSize=20] This store pages. - * @cfg {boolean} [remoteSort=true] This store uses remote sorting. - * @cfg {boolean} [remoteFilter=true] This store uses remote filtering. - * @cfg {boolean} [autoLoad=false] Do not automatically load this store. - */ -Ext.require('Ext.data.Store'); -Ext.require('AppuntoAuth.model.Session'); - -Ext.define('AppuntoAuth.store.Sessions', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.Session', - pageSize : 0, - remoteSort: false, - remoteFilter: true, - autoLoad: false -}); diff --git a/app/src/store/StatusInfos.js b/app/src/store/StatusInfos.js deleted file mode 100644 index 7fe359bb..00000000 --- a/app/src/store/StatusInfos.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * StatusInfos Store - * - * - * A store that uses the {@link AppuntoAuth.model.StatusInfo} model and contains information - * about the application - * - * @cfg {int} [pageSize=20] This store pages. - * @cfg {boolean} [autoLoad=false] Do not automatically load this store. - */ -Ext.require('Ext.data.Store'); -Ext.require('AppuntoAuth.model.StatusInfo'); - -Ext.define('AppuntoAuth.store.StatusInfos', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.StatusInfo', - pageSize : 0, - autoLoad: false -}); diff --git a/app/src/store/UserPermissions.js b/app/src/store/UserPermissions.js deleted file mode 100644 index f701cf5c..00000000 --- a/app/src/store/UserPermissions.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * UserPermissions Store - * - * - * A store that uses the {@link AppuntoAuth.model.UserPermission} model and contains permissions for a user - * - * @cfg {int} [pageSize=9999] Setting pageSize high since this store does not page. - * @cfg {boolean} [remoteSort=false] This store uses local sorting. - * @cfg {boolean} [remoteFilter=false] This store uses local filtering. - * @cfg {boolean} [autoLoad=false] Do not automatically load this store. - */ -Ext.define('AppuntoAuth.store.UserPermissions', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.UserPermission', - pageSize : 9999, - remoteSort: false, - remoteFilter: false, - autoLoad: false -}); diff --git a/app/src/store/UserRoles.js b/app/src/store/UserRoles.js deleted file mode 100644 index de220fd9..00000000 --- a/app/src/store/UserRoles.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * UserRoles Store - * - * - * A store that uses the {@link AppuntoAuth.model.UserRole} model and contains roles for a user - * - * @cfg {int} [pageSize=9999] Setting pageSize high since this store does not page. - * @cfg {boolean} [remoteSort=false] This store uses local sorting. - * @cfg {boolean} [remoteFilter=false] This store uses local filtering. - * @cfg {boolean} [autoLoad=false] Do not automatically load this store. - */ -Ext.define('AppuntoAuth.store.UserRoles', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.UserRole', - pageSize : 9999, - remoteSort: false, - remoteFilter: false, - autoLoad: false -}); diff --git a/app/src/store/Users.js b/app/src/store/Users.js deleted file mode 100644 index b83310df..00000000 --- a/app/src/store/Users.js +++ /dev/null @@ -1,11 +0,0 @@ -Ext.require('Ext.data.Store'); -Ext.require('AppuntoAuth.model.User'); - -Ext.define('AppuntoAuth.store.Users', { - extend: 'Ext.data.Store', - model : 'AppuntoAuth.model.User', - pageSize : 20, - remoteSort: true, - remoteFilter: true, - autoLoad: false -}); diff --git a/app/src/view/main/Frame.js b/app/src/view/main/Frame.js deleted file mode 100644 index 365d00b7..00000000 --- a/app/src/view/main/Frame.js +++ /dev/null @@ -1,60 +0,0 @@ -Ext.define('AppuntoAuth.view.main.Frame' ,{ - extend : 'Ext.tab.Panel', - alias : 'widget.appa-main-frame', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - - /** - * Define the panel's items. - * @return void - */ - initComponent: function() - { - this.items = - [ - { - title : Lang.localize('tab_status'), - iconCls : 'transmit', - itemId : 'tab-status', - xtype : 'appa_status_view' - // xtype : 'container' - }, - { - title : Lang.localize('tab_users'), - iconCls : 'user', - itemId : 'tab-users', - xtype : 'appa_user_frame' - }, - { - title : Lang.localize('tab_user_roles'), - iconCls : 'shield', - itemId : 'tab-roles', - xtype : 'appa_role_frame' - }, - { - title : Lang.localize('tab_permissions'), - iconCls : 'lock', - itemId : 'tab-permissions', - xtype : 'appa_permission_list' - }, - { - title : Lang.localize('tab_paths'), - iconCls : 'map', - itemId : 'tab-paths', - xtype : 'appa_path_frame' - }, - { - title : Lang.localize('tab_sessions'), - iconCls : 'monitor', - itemId : 'tab-sessions', - xtype : 'appa_session_list' - } - ]; - - this.callParent(arguments); - } - -}); diff --git a/app/src/view/main/Login.js b/app/src/view/main/Login.js deleted file mode 100644 index 12b074ad..00000000 --- a/app/src/view/main/Login.js +++ /dev/null @@ -1,62 +0,0 @@ -Ext.define('AppuntoAuth.view.main.Login', -{ - extend : 'Ext.container.Container', - alias : 'widget.appa-main-login', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - autoScroll : true, - title : Lang.localize('perm_add'), - iconCls : 'lock-add', - layout : 'fit', - autoShow : true, - modal : true, - - items : [ - { - xtype: 'form', - baseCls: 'x-plain', - border: false, - layout: { - type: 'hbox', - align: 'stretch' - }, - bodyStyle: { - padding : '10px' - }, -/* - defaults: { - width : 180, - labelWidth : 60 - }, -*/ - items: [ - { - name : 'username', - fieldLabel : Lang.localize('username'), - labelCls : 'admin-login-label', - labelAlign : 'right', - xtype : 'textfield', - value : '' // initialzing field so changes will show it as dirty - }, - { - name : 'password', - fieldLabel : Lang.localize('password'), - labelCls : 'admin-login-label', - labelAlign : 'right', - xtype : 'textfield', - value : '' // initialzing field so changes will show it as dirty - }, - { - xtype : 'button', - text : Lang.localize('login'), - cls : 'admin-login-button', - action : 'login' - } - ] - } - ] - -}); diff --git a/app/src/view/main/Main.js b/app/src/view/main/Main.js deleted file mode 100644 index d3a9d5aa..00000000 --- a/app/src/view/main/Main.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * This class is the main view for the application. It is specified in app.js as the - * "autoCreateViewport" property. That setting automatically applies the "viewport" - * plugin to promote that instance of this class to the body element. - * - * TODO - Replace this content of this view to suite the needs of your application. - */ -Ext.define('AppuntoAuth.view.main.Main', { - extend: 'Ext.container.Container', - - xtype: 'appa-main', - - controller: 'main', - viewModel: { - type: 'main' - }, - - layout: { - type: 'border' - }, - - items: [ - { - // header area - xtype : 'container', - cls : 'app-header', - region : 'north', - height : 64, - border : 0, - layout : { - type : 'hbox', - pack : 'end' - }, - items : { - xtype : 'button', - text : 'logout', - action : 'logout', - cls : 'admin-logout-button' - } - }, - { - xtype : 'panel', - cls : 'app-main', - region : 'center', - layout : 'fit', - flex : 5, - border : 0, - items : [ - { - // xtype : 'container' - xtype : 'appa-main-frame' - } - ] - }] -}); diff --git a/app/src/view/main/MainController.js b/app/src/view/main/MainController.js deleted file mode 100644 index 67e9fcb1..00000000 --- a/app/src/view/main/MainController.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This class is the main view for the application. It is specified in app.js as the - * "autoCreateViewport" property. That setting automatically applies the "viewport" - * plugin to promote that instance of this class to the body element. - * - * TODO - Replace this content of this view to suite the needs of your application. - */ -Ext.define('AppuntoAuth.view.main.MainController', { - extend: 'Ext.app.ViewController', - - requires: [ - 'Ext.MessageBox' - ], - - alias: 'controller.main', - - onClickButton: function () { - Ext.Msg.confirm('Confirm', 'Are you sure?', 'onConfirm', this); - }, - - onConfirm: function (choice) { - if (choice === 'yes') { - // - } - } -}); diff --git a/app/src/view/main/MainModel.js b/app/src/view/main/MainModel.js deleted file mode 100644 index 9a8044d0..00000000 --- a/app/src/view/main/MainModel.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * This class is the view model for the Main view of the application. - */ -Ext.define('AppuntoAuth.view.main.MainModel', { - extend: 'Ext.app.ViewModel', - - alias: 'viewmodel.main', - - data: { - name: 'AppuntoAuth' - } - - //TODO - add data, formulas and/or methods to support your view -}); \ No newline at end of file diff --git a/app/src/view/path/ContextMenu.js b/app/src/view/path/ContextMenu.js deleted file mode 100644 index 22b4148f..00000000 --- a/app/src/view/path/ContextMenu.js +++ /dev/null @@ -1,44 +0,0 @@ -Ext.define('AppuntoAuth.view.path.ContextMenu' ,{ - extend : 'Ext.menu.Menu', - alias : 'widget.appa_path_contextmenu', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - config : { - record : null - }, - - items : [ - { - text : Lang.localize('path_set_private'), - action : 'set_private', - iconCls : 'page-delete' - }, - { - text : Lang.localize('path_set_public'), - action : 'set_public', - iconCls : 'world-link' - }, - { - text : Lang.localize('path_set_permission'), - action : 'set_permission', - itemId : 'permission-options', - iconCls : 'lock', - menu : [ - ''+Lang.localize('path_permissions')+'' - ] - }, - { - text : Lang.localize('path_remove_permission'), - action : 'remove_permission', - iconCls : 'lock-delete' - }, - { - text : Lang.localize('path_delete'), - action : 'delete', - iconCls : 'delete' - } - ] -}) diff --git a/app/src/view/path/ControllerView.js b/app/src/view/path/ControllerView.js deleted file mode 100644 index 4a20ba15..00000000 --- a/app/src/view/path/ControllerView.js +++ /dev/null @@ -1,40 +0,0 @@ -Ext.define('AppuntoAuth.view.path.ControllerView' ,{ - extend : 'Ext.view.View', - alias : 'widget.appa_path_controller_view', - - store : 'Controllers', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - cls : 'controller-view', - itemSelector : 'div.ci-controller', - selectedItemCls : 'controller-selected', - overItemCls : 'controller-rollover', - - initComponent: function() - { - this.tpl = new Ext.XTemplate( - '', - '
', - '
', - '
', - '
', - '', - '', - '', - '', - '
'+Lang.localize('controller_methods')+' : {methods}
'+Lang.localize('controller_public')+' : {public_methods}
'+Lang.localize('controller_private')+' : {private_methods}
', - '
', - '
', - '{ci_controller}', - '{full_path}', - '
', - '
', - '
' - ); - - this.callParent(arguments); - } -}); diff --git a/app/src/view/path/Frame.js b/app/src/view/path/Frame.js deleted file mode 100644 index cc61ebe5..00000000 --- a/app/src/view/path/Frame.js +++ /dev/null @@ -1,58 +0,0 @@ -Ext.define('AppuntoAuth.view.path.Frame' , -{ - extend : 'Ext.panel.Panel', - alias : 'widget.appa_path_frame', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - layout : { - type : 'hbox', - align : 'stretch' - }, - - defaults: { - collapsible: false - }, - - border : 0, - - createMenuItem: true, - - items : - [ - { - xtype : 'panel', - title : Lang.localize('path_tab_controllers'), - cls : 'controller-frame', - autoScroll : true, - items : [{xtype:'appa_path_controller_view'}], - border : 0, - flex : 6 - }, - { - xtype : 'panel', - title : Lang.localize('path_tab_paths'), - layout : 'fit', - items : [{xtype:'appa_path_path_view'}], - border : 0, - flex : 10 - } - ], - - bbar : [ - { - type : 'button', - text : Lang.localize('refresh'), - action : 'verify-paths', - iconCls : 'x-tbar-loading' - } - ], - - - initComponent: function() - { - this.callParent(arguments); - } -}); diff --git a/app/src/view/path/PathView.js b/app/src/view/path/PathView.js deleted file mode 100644 index cc433a7b..00000000 --- a/app/src/view/path/PathView.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * - */ -Ext.define('AppuntoAuth.view.path.PathView' ,{ - extend : 'Ext.grid.Panel', - alias : 'widget.appa_path_path_view', - store : 'PathItems', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - autoScroll : true, - border : 0, - - columns : [ - { - header : '', - dataIndex : 'found', - width : 24, - sortable : false, - menuDisabled : true, - align : 'center', - renderer : function(val,meta,rec) - { - var not_found_message; - - if (val == 0) - { - not_found_message = '

'+Lang.localize('path_not_found_1')+'

'; - not_found_message += '

'+Lang.localize('path_not_found_2')+'

'; - - meta.tdCls = 'path-not-found'; - meta.tdAttr = 'data-qtip="'+not_found_message+'"'; - } - //else if (rec.get('public') == 0 && rec.get('permission_id') == 0) - //{ - // meta.tdCls = 'path-not-found'; - // meta.tdAttr = 'data-qtip="private path with no permission is inaccessible"'; - //} - return ''; - } - }, - {header: 'Method', dataIndex: 'ci_method', flex: 1}, - { - header : Lang.localize('path_path'), - dataIndex : 'ci_method', - sortable : true, - menuDisabled : true, - flex : 2, - renderer : function(val,meta,rec) - { - var dir = rec.get('dir') - path = Ext.util.Format.lowercase(rec.get('ci_controller')+'/'+rec.get('ci_method')); - - if (dir != '.') path = dir+'/'+path; - - return path; - } - }, - { - header : Lang.localize('path_access'), - dataIndex : 'public_flag', - width : 90, - renderer : function(val,meta,rec) { - if (val == 0) { - meta.tdCls = 'path-private'; - return Lang.localize('path_private'); - } - else if (val == 1) - { - meta.tdCls = 'path-public'; - return Lang.localize('path_public'); - } - return 'unknown'; - } - }, - { - header : Lang.localize('path_permission'), - dataIndex : 'permission_name', - flex : 2 - } - ] - -}); diff --git a/app/src/view/permission/Add.js b/app/src/view/permission/Add.js deleted file mode 100644 index 2464d504..00000000 --- a/app/src/view/permission/Add.js +++ /dev/null @@ -1,65 +0,0 @@ -Ext.define('AppuntoAuth.view.permission.Add', -{ - extend : 'Ext.window.Window', - alias : 'widget.appa_permission_add', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - autoScroll : true, - title : Lang.localize('perm_add'), - iconCls : 'lock-add', - layout : 'fit', - autoShow : true, - modal : true, - - items : [ - { - xtype: 'form', - baseCls: 'x-plain', - border: false, - bodyStyle: { - padding : '10px' - }, - defaults: { - width : 320, - labelWidth : 90, - blankText : Lang.localize('field_required'), - msgTarget : 'under' - }, - items: [ - { - name : 'name', - fieldLabel : Lang.localize('name'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - minLength : 3, - maxLength : 32, - allowBlank : false - }, - { - name : 'description', - fieldLabel : Lang.localize('description'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - maxLength : 64, - allowBlank : true - } - ] - } - ], - - buttons : [ - { - text: Lang.localize('save'), - action: 'save' - }, - { - text: Lang.localize('cancel'), - handler : function () { this.up('.window').close(); } - } - ] - - -}); diff --git a/app/src/view/permission/ContextMenu.js b/app/src/view/permission/ContextMenu.js deleted file mode 100644 index 7e0ada22..00000000 --- a/app/src/view/permission/ContextMenu.js +++ /dev/null @@ -1,30 +0,0 @@ -Ext.define('AppuntoAuth.view.permission.ContextMenu' ,{ - extend : 'Ext.menu.Menu', - alias : 'widget.appa_permission_contextmenu', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - config : { - record : null - }, - - items : [ - { - text : Lang.localize('perm_add'), - action : 'add', - iconCls : 'lock-add' - }, - { - text : Lang.localize('perm_edit'), - action : 'edit', - iconCls : 'lock-edit' - }, - { - text : Lang.localize('perm_delete'), - action : 'delete', - iconCls : 'lock-delete' - } - ] -}) diff --git a/app/src/view/permission/Edit.js b/app/src/view/permission/Edit.js deleted file mode 100644 index 6540b392..00000000 --- a/app/src/view/permission/Edit.js +++ /dev/null @@ -1,73 +0,0 @@ -Ext.define('AppuntoAuth.view.permission.Edit', { - extend : 'Ext.window.Window', - alias : 'widget.appa_permission_edit', - - title : Lang.localize('perm_edit'), - iconCls : 'lock-edit', - layout : 'fit', - autoShow: false, - modal : true, - - items : [ - { - xtype: 'form', - baseCls: 'x-plain', - border: false, - bodyStyle: { - padding : '10px' - }, - defaults: { - width : 320, - labelWidth : 90, - blankText : Lang.localize('field_required'), - msgTarget : 'under' - }, - items: [ - { - name : 'id', - width : 0, - type : 'hidden' - }, - { - name : 'name', - fieldLabel : Lang.localize('name'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : false - }, - { - name : 'internal_name', - fieldLabel : Lang.localize('perm_internal_name'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : false - }, - { - name : 'description', - fieldLabel : Lang.localize('description'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : true - } - ] - } - ], - - buttons : [ - { - text: 'Save', - action: 'save' - }, - { - text: 'Cancel', - handler : function () { this.up('.window').close(); } - } - ], - - initComponent: function() - { - - this.callParent(arguments); - this.down('form').getForm().trackResetOnLoad = true; - } -}); diff --git a/app/src/view/permission/List.js b/app/src/view/permission/List.js deleted file mode 100644 index 997d5e75..00000000 --- a/app/src/view/permission/List.js +++ /dev/null @@ -1,41 +0,0 @@ -Ext.define('AppuntoAuth.view.permission.List' , -{ - extend : 'Ext.grid.Panel', - alias : 'widget.appa_permission_list', - store : 'Permissions', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - autoScroll : true, - - viewConfig: { - loadMask : { msg : Lang.localize('loading') } - }, - - columns : - [ - {header: Lang.localize('name'), dataIndex: 'name', flex: 1}, - {header: Lang.localize('perm_internal_name'), dataIndex: 'internal_name', flex: 1}, - {header: Lang.localize('name'), dataIndex: 'description', flex: 2} - ], - - tbar : - [{ - xtype : 'button', - text : Lang.localize('perm_add'), - action : 'add', - cls : 'view-selection-button', - iconCls : 'lock-add' - }], - - bbar : - [{ - type : 'button', - text : Lang.localize('refresh'), - action : 'refresh', - iconCls : 'x-tbar-loading' - }] - -}); diff --git a/app/src/view/role/Add.js b/app/src/view/role/Add.js deleted file mode 100644 index d549eaf4..00000000 --- a/app/src/view/role/Add.js +++ /dev/null @@ -1,68 +0,0 @@ -Ext.define('AppuntoAuth.view.role.Add', { - extend : 'Ext.window.Window', - alias : 'widget.appa_role_add', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - title : Lang.localize('role_add'), - iconCls : 'shield-add', - layout : 'fit', - autoShow: true, - modal : true, - - initComponent: function() - { - this.items = [ - { - xtype: 'form', - baseCls: 'x-plain', - border: false, - bodyStyle: { - padding : '10px' - }, - defaults: { - width : 460, - labelWidth : 120, - blankText : Lang.localize('field_required'), - msgTarget : 'under' - }, - items: [ - { - name : 'name', - fieldLabel : Lang.localize('name'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - minLength : 3, - maxLength : 32, - allowBlank : false - }, - { - name : 'description', - fieldLabel : Lang.localize('description'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - maxLength : 64, - allowBlank : true - } - ] - } - ]; - - this.buttons = [ - { - text: Lang.localize('save'), - action: 'save' - }, - { - text: Lang.localize('cancel'), - scope: this, - handler: this.close - } - ]; - - - this.callParent(arguments); - } -}); diff --git a/app/src/view/role/ContextMenu.js b/app/src/view/role/ContextMenu.js deleted file mode 100644 index 5d9b7f82..00000000 --- a/app/src/view/role/ContextMenu.js +++ /dev/null @@ -1,30 +0,0 @@ -Ext.define('AppuntoAuth.view.role.ContextMenu' ,{ - extend : 'Ext.menu.Menu', - alias : 'widget.appa_role_contextmenu', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - config : { - record : null - }, - - items : [ - { - text : Lang.localize('role_add'), - action : 'add', - iconCls : 'shield-add' - }, - { - text : Lang.localize('role_edit'), - action : 'edit', - iconCls : 'shield-go' - }, - { - text : Lang.localize('role_delete'), - action : 'delete', - iconCls : 'shield-delete' - } - ] -}) diff --git a/app/src/view/role/Edit.js b/app/src/view/role/Edit.js deleted file mode 100644 index bde4fecc..00000000 --- a/app/src/view/role/Edit.js +++ /dev/null @@ -1,70 +0,0 @@ -Ext.define('AppuntoAuth.view.role.Edit', { - extend : 'Ext.window.Window', - alias : 'widget.appa_role_edit', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - title : Lang.localize('role_edit'), - iconCls : 'shield-edit', - layout : 'fit', - autoShow: false, - modal : true, - - initComponent: function() - { - this.items = [ - { - xtype: 'form', - baseCls: 'x-plain', - border: false, - bodyStyle: { - padding : '10px' - }, - defaults: { - width : 320, - labelWidth : 90, - blankText : Lang.localize('field_required'), - msgTarget : 'under' - }, - items: [ - { - name : 'id', - width : 0, - type : 'hidden' - }, - { - name : 'name', - fieldLabel : Lang.localize('name'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : false - }, - { - name : 'description', - fieldLabel : Lang.localize('description'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : true - } - ] - } - ]; - - this.buttons = [ - { - text: Lang.localize('save'), - action: 'save' - }, - { - text: Lang.localize('cancel'), - scope: this, - handler: this.close - } - ]; - - this.callParent(arguments); - this.down('form').getForm().trackResetOnLoad = true; - } -}); diff --git a/app/src/view/role/Frame.js b/app/src/view/role/Frame.js deleted file mode 100644 index e2232fed..00000000 --- a/app/src/view/role/Frame.js +++ /dev/null @@ -1,33 +0,0 @@ -Ext.define('AppuntoAuth.view.role.Frame' ,{ - extend : 'Ext.container.Container', - alias : 'widget.appa_role_frame', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - layout : { - type : 'hbox', - align : 'stretch' - }, - - defaults: { - collapsible: false - }, - - border : 0, - - items : [ - { - xtype : 'appa_role_list', - flex : 1, - border : "0 1px 0 0", - minWidth : 120 - },{ - xtype : 'appa_role_permission_list', - border : "1px 0 0 1px", - flex : 1 - } - ] - -}); diff --git a/app/src/view/role/List.js b/app/src/view/role/List.js deleted file mode 100644 index 7830a661..00000000 --- a/app/src/view/role/List.js +++ /dev/null @@ -1,40 +0,0 @@ -Ext.define('AppuntoAuth.view.role.List' , -{ - extend : 'Ext.grid.Panel', - alias : 'widget.appa_role_list', - store : 'Roles', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - title : Lang.localize('tab_user_roles'), - iconCls : 'shield', - - viewConfig: { - loadMask : { msg : Lang.localize('loading') } - }, - - autoScroll : true, - - columns : [ - {header: Lang.localize('name'), dataIndex: 'name', hideable : false, flex: 2}, - {header: Lang.localize('description'), dataIndex: 'description', hideable : false, flex: 3} - ], - - tbar : [{ - xtype : 'button', - text : Lang.localize('role_add'), - action : 'add', - cls : 'view-selection-button', - iconCls : 'shield-add' - }], - - bbar : [{ - xtype : 'button', - text : Lang.localize('refresh'), - action : 'refresh', - iconCls : 'x-tbar-loading' - }] - -}); diff --git a/app/src/view/role/PermissionContextMenu.js b/app/src/view/role/PermissionContextMenu.js deleted file mode 100644 index 213d492a..00000000 --- a/app/src/view/role/PermissionContextMenu.js +++ /dev/null @@ -1,25 +0,0 @@ -Ext.define('AppuntoAuth.view.role.PermissionContextMenu' ,{ - extend : 'Ext.menu.Menu', - alias : 'widget.appa_role_permission_contextmenu', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - config : { - record : null - }, - - items : [ - { - text : Lang.localize('role_perm_add'), - action : 'add', - iconCls : 'lock-add' - }, - { - text : Lang.localize('role_perm_remove'), - action : 'remove', - iconCls : 'lock-delete' - } - ] -}) diff --git a/app/src/view/role/PermissionList.js b/app/src/view/role/PermissionList.js deleted file mode 100644 index a71fe015..00000000 --- a/app/src/view/role/PermissionList.js +++ /dev/null @@ -1,61 +0,0 @@ -Ext.define('AppuntoAuth.view.role.PermissionList' , -{ - extend : 'Ext.grid.Panel', - alias : 'widget.appa_role_permission_list', - store : 'RolePermissions', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - title : Lang.localize('tab_permissions'), - iconCls : 'lock', - cls : 'appunto-list', - - autoScroll : true, - - viewConfig: { - emptyText : '

'+Lang.localize('role_select')+'

', - deferEmptyText : false, - loadMask : { msg : Lang.localize('loading') } - }, - - - columns : [ - { - header : '', - dataIndex: 'hasRolePermission', - hideable : false, - width : 24, - sortable : true, - align : 'center', - renderer : function(val,meta,rec) { - if (rec.get('inRole') == 1) meta.tdCls = 'permission-in-role'; - return ''; - } - }, - {header: Lang.localize('name'), dataIndex: 'name', hideable : false, flex: 1}, - {header: Lang.localize('description'), dataIndex: 'description', hideable : false, flex: 2} - ], - - tbar : [{ - xtype : 'button', - itemId : 'permission-view-toggle', - text : Lang.localize('role_perm_view_all'), - cls : 'view-selection-button', - menu : [ - { - text : Lang.localize('role_perm_view_all'), - value : '1', - checked : true, - group : 'permission-view' - }, - { - text : Lang.localize('role_perm_view_selected'), - value : '0', - checked : false, - group : 'permission-view' - }] - }] - -}); diff --git a/app/src/view/session/ContextMenu.js b/app/src/view/session/ContextMenu.js deleted file mode 100644 index 05ebedac..00000000 --- a/app/src/view/session/ContextMenu.js +++ /dev/null @@ -1,19 +0,0 @@ -Ext.define('AppuntoAuth.view.session.ContextMenu' ,{ - extend : 'Ext.menu.Menu', - alias : 'widget.appa_session_contextmenu', - - requires : 'AppuntoAuth.view.session.ListController', - controller : 'session-list', - - config : { - record : null - }, - - items : [ - { - text : Lang.localize('session_delete'), - handler : 'confirmSessionDeletion', - iconCls : 'monitor-delete' - } - ] -}) diff --git a/app/src/view/session/List.js b/app/src/view/session/List.js deleted file mode 100644 index 170f17b3..00000000 --- a/app/src/view/session/List.js +++ /dev/null @@ -1,97 +0,0 @@ -Ext.define('AppuntoAuth.view.session.List' , -{ - extend : 'Ext.grid.Panel', - alias : 'widget.appa_session_list', - store : 'Sessions', - - requires : [ - 'AppuntoAuth.lib.lang.Default', - 'AppuntoAuth.view.session.ListController' - ], - - controller : 'session-list', - - autoScroll : true, - - viewConfig: { - loadMask : { msg : Lang.localize('loading') } - }, - - columns : [ - { - header : Lang.localize('session_username'), - flex : 3, - sortable : true, - dataIndex: 'username' - }, - { - header : Lang.localize('session_last_activity'), - flex : 3, - sortable : true, - renderer : function(val,metaData,record) { - // empty dates return an empty string for date.format('y') - return (Ext.util.Format.date(val,'y')) ? Ext.util.Format.date(val,'M d, Y h:i:s A') : 'unknown'; - }, - dataIndex: 'last_activity' - }, - { - header : Lang.localize('session_last_page'), - flex : 3, - sortable : true, - dataIndex: 'last_page' - }, - { - header : Lang.localize('session_ip_address'), - flex : 2, - sortable : true, - dataIndex: 'ip_address' - }, - { - header : Lang.localize('session_user_agent'), - flex : 8, - sortable : true, - dataIndex: 'user_agent' - } - ], - - tbar : [ - { - xtype : 'button', - itemId : 'session-view-toggle', - text : Lang.localize('session_view_all'), - cls : 'view-selection-button', - menu : [ - { - text : Lang.localize('session_view_all'), - value : '1', - checked : true, - handler : 'toggleView', - group : 'session-view' - }, - { - text : Lang.localize('session_view_logged_in'), - value : '0', - checked : false, - handler : 'toggleView', - group : 'session-view' - }] - }], - - bbar : [{ - xtype : 'button', - text : Lang.localize('refresh'), - iconCls : 'x-tbar-loading', - handler : 'refreshList' - }], - - initComponent: function() { - - this.callParent(arguments); - - this.addListener('activate', this.getController().refreshList); - this.addListener('itemcontextmenu', this.getController().showContextMenu); - this.addListener('containercontextmenu', function(view, e) { e.preventDefault(); } ); - this.addListener('contextmenu', function(view, e) { e.preventDefault(); } ); - } - -}); diff --git a/app/src/view/session/ListController.js b/app/src/view/session/ListController.js deleted file mode 100644 index f5e9b936..00000000 --- a/app/src/view/session/ListController.js +++ /dev/null @@ -1,71 +0,0 @@ -Ext.define('AppuntoAuth.view.session.ListController' ,{ - extend : 'Ext.app.ViewController', - alias : 'controller.session-list', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - showContextMenu: function(view, rec, item, idx, e) - { - e.preventDefault(); - - var menu = Ext.widget('appa_session_contextmenu'); - - // pass the contextmenu the record so we don't have to worry about a selection change - menu.setRecord(rec); - - // select the record that was context-clicked - view.getSelectionModel().select(rec,false,true); // keepExisting=false, suppressEvent=true - - menu.showAt(e.getXY()); - }, - - refreshList: function(button) - { - Ext.getStore('Sessions').load(); - }, - - confirmSessionDeletion: function(menuitem) - { - var rec = menuitem.up('menu').getRecord(), - store = Ext.getStore('Sessions'), - title = 'Delete session'; - - if (rec.data.username != '') title = title + ' (' + Lang.localize('session_delete_user') + ': '+rec.data.username+')'; - - Ext.MessageBox.confirm(title, Lang.localize('session_delete_confirm'), Ext.bind(this.deleteSession,this,[rec,store],true)); - }, - - deleteSession: function(button, dummy, msgbox, record, store) - { - if (button == "yes") - { - record.erase( - { - success: function() { store.remove(record); } - } - ); - } - }, - - toggleView: function(menuitem) - { - var sessions = menuitem.up('appa_session_list'), - store = sessions.getStore(); - button = sessions.down('#session-view-toggle'); - - if (menuitem.value == 1) - { - store.clearFilter(); - button.setText(Lang.localize('session_view_all')); - } - else - { - store.filter('show_all',0); - button.setText(Lang.localize('session_view_logged_in')); - } - } - -}); - diff --git a/app/src/view/status/View.js b/app/src/view/status/View.js deleted file mode 100644 index ae41856a..00000000 --- a/app/src/view/status/View.js +++ /dev/null @@ -1,46 +0,0 @@ -Ext.define('AppuntoAuth.view.status.View' , -{ - extend : 'Ext.panel.Panel', - alias : 'widget.appa_status_view', - - requires : [ - 'AppuntoAuth.lib.lang.Default', - 'Ext.XTemplate' - ], - - items : [ - { - xtype : 'dataview', - store : 'StatusInfos', - viewConfig : { loadMask : { msg : Lang.localize('loading') } }, - tpl : new Ext.XTemplate( - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '
{info_item}{info_val}{info_note}
', - { - noteExists: function(note) - { - return note != ''; - } - } - ), - itemSelector: 'div.info-item' - } - ], - - bbar : [{ - xtype : 'button', - text : Lang.localize('refresh'), - action : 'refresh', - iconCls : 'x-tbar-loading' - }] - -}); diff --git a/app/src/view/user/Add.js b/app/src/view/user/Add.js deleted file mode 100644 index 85b04407..00000000 --- a/app/src/view/user/Add.js +++ /dev/null @@ -1,106 +0,0 @@ -Ext.define('AppuntoAuth.view.user.Add', -{ - extend : 'Ext.window.Window', - alias : 'widget.appa_user_add', - - requires : [ - 'AppuntoAuth.lib.lang.Default', - 'Ext.form.field.Checkbox', - 'AppuntoAuth.lib.util.CustomVTypes' - ], - - title : Lang.localize('user_add'), - iconCls : 'user-add', - layout : 'fit', - autoShow : true, - modal : true, - - items : [ - { - xtype: 'form', - baseCls: 'x-plain', - border: false, - bodyStyle: { - padding : '10px' - }, - defaults: { - width : 460, - labelWidth : 180, - blankText : Lang.localize('field_required'), - msgTarget : 'under' - }, - items: [ - { - name : 'username', - fieldLabel : Lang.localize('username'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : false - },{ - name : 'email', - fieldLabel : Lang.localize('email'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - vtype : 'email', - vtypeText : Lang.localize('email_format'), - allowBlank : false - },{ - name : 'name', - fieldLabel : Lang.localize('name'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : true - },{ - name : 'surname', - fieldLabel : Lang.localize('surname'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : true - },{ - id : 'pass', - name : 'password', - fieldLabel : Lang.localize('password'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - inputType : 'password', - vtype : 'passformat', - style: { - marginTop: '18px' - }, - allowBlank : false - },{ - name : 'password2', - fieldLabel : Lang.localize('password_confirm'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - inputType : 'password', - vtype : 'passconfirm', - passField : 'pass', - allowBlank : false - },{ - name : 'active', - fieldLabel : Lang.localize('user_set_active'), - inputValue : '1', - uncheckedValue : '0', - style: { - marginTop: '18px' - }, - xtype : 'checkbox', - checked : true - } - ] - } - ], - - buttons : [ - { - text : Lang.localize('save'), - action : 'save' - }, - { - text : Lang.localize('cancel'), - handler : function () { this.up('.window').close(); } - } - ] - -}); diff --git a/app/src/view/user/ChangePassword.js b/app/src/view/user/ChangePassword.js deleted file mode 100644 index 5e594089..00000000 --- a/app/src/view/user/ChangePassword.js +++ /dev/null @@ -1,74 +0,0 @@ -Ext.define('AppuntoAuth.view.user.ChangePassword', { - extend : 'Ext.window.Window', - alias : 'widget.appa_user_changepassword', - - title : Lang.localize('password_change'), - iconCls : 'key', - layout : 'fit', - autoShow: true, - modal : true, - - initComponent: function() - { - this.items = [ - { - xtype: 'form', - baseCls: 'x-plain', - border: false, - bodyStyle: { - padding : '10px' - }, - defaults: { - width : 460, - labelWidth : 160, - blankText : Lang.localize('field_required'), - msgTarget : 'under' - }, - items: [ - { - name : 'username', - fieldLabel : Lang.localize('username'), - xtype : 'displayfield' - },{ - name : 'email', - fieldLabel : Lang.localize('email'), - xtype : 'displayfield' - },{ - id : 'pass', - name : 'password', - fieldLabel : Lang.localize('password'), - xtype : 'textfield', - inputType : 'password', - vtype : 'passformat', - style: { - marginTop: '18px' - }, - allowBlank : false - },{ - name : 'password2', - fieldLabel : Lang.localize('password_confirm'), - xtype : 'textfield', - inputType : 'password', - vtype : 'passconfirm', - passField : 'pass', - allowBlank : false - } - ] - } - ]; - - this.buttons = [ - { - text : Lang.localize('save'), - action : 'save' - }, - { - text : Lang.localize('cancel'), - handler : function () { this.up('.window').close(); } - } - ]; - - this.callParent(arguments); - this.down('form').getForm().trackResetOnLoad = true; - } -}); diff --git a/app/src/view/user/ContextMenu.js b/app/src/view/user/ContextMenu.js deleted file mode 100644 index 059813a5..00000000 --- a/app/src/view/user/ContextMenu.js +++ /dev/null @@ -1,41 +0,0 @@ -Ext.define('AppuntoAuth.view.user.ContextMenu' ,{ - extend : 'Ext.menu.Menu', - alias : 'widget.appa_user_contextmenu', - - config : { - record : null - }, - - items : [ - { - text : Lang.localize('user_add'), - action : 'add', - iconCls : 'user-add' - }, - { - text : Lang.localize('user_edit'), - action : 'edit', - iconCls : 'user-edit' - }, - { - text : Lang.localize('user_delete'), - action : 'delete', - iconCls : 'user-delete' - }, - { - text : Lang.localize('password_change'), - action : 'change_password', - iconCls : 'key' - }, - { - text : Lang.localize('user_activate'), - action : 'activate', - iconCls : 'accept' - }, - { - text : Lang.localize('user_deactivate'), - action : 'deactivate', - iconCls : 'delete' - } - ] -}) diff --git a/app/src/view/user/Edit.js b/app/src/view/user/Edit.js deleted file mode 100644 index 35bb47ea..00000000 --- a/app/src/view/user/Edit.js +++ /dev/null @@ -1,88 +0,0 @@ -Ext.define('AppuntoAuth.view.user.Edit', { - extend : 'Ext.window.Window', - alias : 'widget.appa_user_edit', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - title : Lang.localize('user_edit'), - iconCls : 'user-edit', - layout : 'fit', - autoShow: false, - modal : true, - - initComponent: function() - { - this.items = [ - { - xtype: 'form', - baseCls: 'x-plain', - border: false, - bodyStyle: { - padding : '10px' - }, - defaults: { - width : 460, - labelWidth : 120, - blankText : Lang.localize('field_required'), - msgTarget : 'under' - }, - items: [ - { - name : 'username', - fieldLabel : Lang.localize('username'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : false - },{ - name : 'email', - fieldLabel : Lang.localize('email'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - vtype : 'email', - vtypeText : Lang.localize('email_format'), - allowBlank : false - },{ - name : 'name', - fieldLabel : Lang.localize('name'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : true - },{ - name : 'surname', - fieldLabel : Lang.localize('surname'), - xtype : 'textfield', - value : '', // initialzing field so changes will show it as dirty - allowBlank : true - },{ - name : 'active', - fieldLabel : Lang.localize('active'), - labelAlign : 'left', - inputValue : '1', - uncheckedValue : '0', - style: { - marginTop: '18px' - }, - xtype : 'checkbox', - checked : true - } - ] - } - ]; - - this.buttons = [ - { - text : Lang.localize('save'), - action : 'save' - }, - { - text : Lang.localize('cancel'), - handler : function () { this.up('.window').close(); } - } - ]; - - this.callParent(arguments); - this.down('form').getForm().trackResetOnLoad = true; - } -}); diff --git a/app/src/view/user/Frame.js b/app/src/view/user/Frame.js deleted file mode 100644 index e445f949..00000000 --- a/app/src/view/user/Frame.js +++ /dev/null @@ -1,62 +0,0 @@ -Ext.define('AppuntoAuth.view.user.Frame', -{ - extend : 'Ext.container.Container', - alias : 'widget.appa_user_frame', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - -// autoScroll : false, - - - layout : { - type : 'border' -// align : 'stretch' - }, - - bodyBorder: false, - - defaults: { - collapsible : false -// split : true - }, - - border : 0, - - createMenuItem: true, - - items : - [ - { - xtype : 'appa_user_list', - region : 'center', - flex : 1 - },{ - xtype : 'panel', - title : Lang.localize('user_role_list'), - itemId : 'role-permission-frame', - hideCollapseTool : true, - iconCls : 'shield', - region : 'east', - collapsible : true, - flex : 1, - border : "1px 0 0 1px", - layout : { - type : 'vbox', - align : 'stretch' - }, - items : [ - { - xtype : 'appa_user_role_list', - flex : 1 - }, - { - title : 'Permission List', - xtype : 'appa_user_permission_list', - flex : 1 - } - ] - } - ] -}); diff --git a/app/src/view/user/List.js b/app/src/view/user/List.js deleted file mode 100644 index 80b4f572..00000000 --- a/app/src/view/user/List.js +++ /dev/null @@ -1,98 +0,0 @@ -Ext.define('AppuntoAuth.view.user.List' ,{ - extend : 'Ext.grid.Panel', - alias : 'widget.appa_user_list', - store : 'Users', - - requires : [ - 'AppuntoAuth.lib.lang.Default', - 'AppuntoAuth.lib.util.SearchField', - 'Ext.grid.column.Date', - 'Ext.toolbar.Paging' - ], - - autoScroll : true, - - border : 0, - - viewConfig: { - emptyText: 'No results found', - loadMask : { msg : Lang.localize('loading') } - }, - - columns : [ - {header: Lang.localize('username'), dataIndex: 'username', menuDisabled: true, flex: 4}, - {header: Lang.localize('name'), dataIndex: 'name', menuDisabled: true, flex: 3}, - {header: Lang.localize('surname'), dataIndex: 'surname', menuDisabled: true, flex: 3}, - {header: Lang.localize('email'), dataIndex: 'email', menuDisabled: true, flex: 6}, - { - header : Lang.localize('active'), - dataIndex: 'active', - width : 48, - sortable : true, - align : 'center', - menuDisabled: true, - renderer : function(val,meta,rec) { - meta.tdCls = (rec.get('active') == 0) ? 'user-inactive' : 'user-active'; - return ''; - } - }, - {header: Lang.localize('last_ip'), dataIndex: 'last_ip', hidden: true, flex: 3}, - { - header : Lang.localize('last_login'), - dataIndex : 'last_login', - menuDisabled: true, - hidden : true, - flex : 4, - renderer : function(val) { - if (val == '0000-00-00 00:00:00') return Lang.localize('never'); - return Ext.util.Format.date(val, datetime_format); - } - },{ - header : Lang.localize('created'), - dataIndex : 'created', - menuDisabled: true, - hidden : true, - flex : 4, - renderer : function(val) { - return Ext.util.Format.date(val, datetime_format); - } - },{ - header : Lang.localize('modified'), - dataIndex : 'modified', - menuDisabled: true, - hidden : true, - flex : 4, - renderer : function(val) { - return Ext.util.Format.date(val, datetime_format); - } - } - ], - - tbar : [{ - xtype : 'button', - text : Lang.localize('user_add'), - action : 'add', - cls : 'view-selection-button', - iconCls : 'user-add' - },{ - xtype : 'tbspacer', - width : 24 - },{ - xtype : 'appunto-searchfield', - store : 'Users' - },{ - xtype : 'tbfill' - },{ - xtype : 'tool', - type : 'next' - }], - - bbar : [{ - xtype : 'pagingtoolbar', - store : 'Users', - displayInfo : true, - displayMsg : Lang.localize('paging_message') - }] - - -}); diff --git a/app/src/view/user/LoginsWidget.js b/app/src/view/user/LoginsWidget.js deleted file mode 100644 index 905bd3a1..00000000 --- a/app/src/view/user/LoginsWidget.js +++ /dev/null @@ -1,57 +0,0 @@ -Ext.define('AppuntoAuth.view.user.LoginsWidget' ,{ - extend : 'Ext.grid.Panel', - alias : 'widget.appa_user_logins_widget', - store : 'AppuntoAuth.store.Logins', - - title : 'Recent Login Attempts', - iconCls : 'shield', - - autoScroll : true, - - viewConfig: { - emptyText : '

no recent login attempts found

', - deferEmptyText : false - }, - - initComponent: function() { - - this.columns = [ - { - header : '', - dataIndex : 'success', - width : 24, - sortable : true, - menuDisabled : true, - align : 'center', - renderer : function(val,meta,rec) { - if (rec.get('success') == 1) { - meta.tdCls = 'login-success'; - meta.tdAttr = 'data-qtip="'+rec.get('note')+'"'; - } - else if (rec.get('success') == 0) { - meta.tdCls = 'login-fail'; - meta.tdAttr = 'data-qtip="'+rec.get('note')+'"'; - } - else { - meta.tdCls = 'login-failure'; - meta.tdAttr = 'data-qtip="'+rec.get('note')+'"'; - } - return ''; - } - }, - {header: 'Date', dataIndex: 'attempt_time', width: 80, align:'right', xtype:'datecolumn', format:'m/d/Y'}, - {header: 'Time', dataIndex: 'attempt_time', width: 60, align:'right', xtype:'datecolumn', format:'H:i:s'}, - {header: 'Username', dataIndex: 'username', menuDisabled: true, flex: 1}, - {header: 'IP Address', dataIndex: 'ip_address', menuDisabled: true, flex: 1} - ]; - - this.tools = [ - { - type : 'refresh', - itemId : 'refresh' - } - ]; - - this.callParent(arguments); - } -}); diff --git a/app/src/view/user/PermissionContextMenu.js b/app/src/view/user/PermissionContextMenu.js deleted file mode 100644 index c706ce79..00000000 --- a/app/src/view/user/PermissionContextMenu.js +++ /dev/null @@ -1,21 +0,0 @@ -Ext.define('AppuntoAuth.view.user.PermissionContextMenu' ,{ - extend : 'Ext.menu.Menu', - alias : 'widget.appa_user_permission_contextmenu', - - config : { - record : null - }, - - items : [ - { - text : Lang.localize('user_perm_add'), - action : 'add', - iconCls : 'lock-add' - }, - { - text : Lang.localize('user_perm_remove'), - action : 'remove', - iconCls : 'lock-delete' - } - ] -}) diff --git a/app/src/view/user/PermissionList.js b/app/src/view/user/PermissionList.js deleted file mode 100644 index 486d6250..00000000 --- a/app/src/view/user/PermissionList.js +++ /dev/null @@ -1,107 +0,0 @@ -Ext.define('AppuntoAuth.view.user.PermissionList' ,{ - extend : 'Ext.grid.Panel', - alias : 'widget.appa_user_permission_list', - store : 'UserPermissions', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - title : Lang.localize('user_perm_list'), - iconCls : 'lock', - cls : 'appunto-list', - - autoScroll : true, - border : 0, - - viewConfig: { - emptyText : '

'+Lang.localize('user_select_or')+'

', - deferEmptyText : false, - loadMask : { msg : Lang.localize('loading') } - }, - - initComponent: function() { - - this.columns = [ - { - header : '', - dataIndex: 'hasPermission', - hideable : false, - width : 24, - sortable : true, - menuDisabled : true, - align : 'center', - renderer : function(val,meta,rec) { - if (val == 1) - { - meta.tdCls = 'has-permission'; - } - return ''; - } - }, - {header: Lang.localize('name'), dataIndex: 'name', menuDisabled: true, flex: 1}, - { - text : Lang.localize('granted_to'), - menuDisabled : true, - id : 'permission-granted-to-header', - columns: [ - { - header : Lang.localize('grant_role'), - dataIndex: 'userRoleHasPermission', - width : 60, - sortable : true, - menuDisabled : true, - align : 'center', - renderer : function(val,meta,rec) { - if (val == 1) - { - meta.tdCls = 'user-role-has-permission'; - meta.tdAttr = 'data-qtip="' + Lang.localize('user_perm_granted_role') + '"'; - } - return ''; - } - }, - { - header : Lang.localize('grant_user'), - dataIndex: 'userHasPermission', - width : 60, - sortable : true, - menuDisabled : true, - align : 'center', - renderer : function(val,meta,rec) { - if (val == 1) - { - meta.tdCls = 'user-has-permission'; - meta.tdAttr = 'data-qtip="' + Lang.localize('user_perm_granted_user') + '"'; - } - return ''; - } - }] - }, - {header: Lang.localize('description'), dataIndex: 'description', menuDisabled: true, flex: 2} - ]; - - this.tbar = [ - { - xtype : 'button', - itemId : 'permission-view-toggle', - text : Lang.localize('user_perm_view_all'), - cls : 'view-selection-button', - menu : [ - { - text : Lang.localize('user_perm_view_all'), - value : '1', - checked : true, - group : 'permission-view' - }, - { - text : Lang.localize('user_perm_view_selected'), - value : '0', - checked : false, - group : 'permission-view' - }] - }]; - - this.callParent(arguments); - } -}); diff --git a/app/src/view/user/RoleContextMenu.js b/app/src/view/user/RoleContextMenu.js deleted file mode 100644 index 90cea568..00000000 --- a/app/src/view/user/RoleContextMenu.js +++ /dev/null @@ -1,21 +0,0 @@ -Ext.define('AppuntoAuth.view.user.RoleContextMenu' ,{ - extend : 'Ext.menu.Menu', - alias : 'widget.appa_user_role_contextmenu', - - config : { - record : null - }, - - items : [ - { - text : Lang.localize('user_role_add'), - action : 'add', - iconCls : 'shield-add' - }, - { - text : Lang.localize('user_role_remove'), - action : 'remove', - iconCls : 'shield-delete' - } - ] -}) diff --git a/app/src/view/user/RoleList.js b/app/src/view/user/RoleList.js deleted file mode 100644 index 02f41042..00000000 --- a/app/src/view/user/RoleList.js +++ /dev/null @@ -1,63 +0,0 @@ -Ext.define('AppuntoAuth.view.user.RoleList' ,{ - extend : 'Ext.grid.Panel', - alias : 'widget.appa_user_role_list', - store : 'UserRoles', - - requires : [ - 'AppuntoAuth.lib.lang.Default' - ], - - cls : 'appunto-list', - - autoScroll : true, - border : 0, - - viewConfig: { - emptyText : '

'+Lang.localize('user_select_or')+'

', - deferEmptyText : false, - loadMask : { msg : Lang.localize('loading') } - }, - - initComponent: function() { - - this.columns = [ - { - header : '', - dataIndex : 'hasRole', - width : 24, - sortable : true, - menuDisabled : true, - align : 'center', - renderer : function(val,meta,rec) { - if (rec.get('hasRole') == 1) meta.tdCls = 'user-has-role'; - return ''; - } - }, - {header: Lang.localize('name'), dataIndex: 'name', menuDisabled: true, flex: 1}, - {header: Lang.localize('description'), dataIndex: 'description', menuDisabled: true, flex: 2} - ]; - - this.tbar = [ - { - xtype : 'button', - itemId : 'role-view-toggle', - text : Lang.localize('user_role_view_all'), - cls : 'view-selection-button', - menu : [ - { - text : Lang.localize('user_role_view_all'), - value : '1', - checked : true, - group : 'role-view' - }, - { - text : Lang.localize('user_role_view_selected'), - value : '0', - checked : false, - group : 'role-view' - }] - }]; - - this.callParent(arguments); - } -}); diff --git a/application/config/routes.php b/application/config/routes.php index a391b1e6..cb9004d2 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -42,39 +42,108 @@ $route['default_controller'] = "login"; $route['404_override'] = 'error'; -/*********** USER DEFINED ROUTES *******************/ +/*********** Siddharth DEFINED ROUTES *******************/ $route['loginMe'] = 'login/loginMe'; $route['dashboard'] = 'user'; $route['logout'] = 'user/logout'; + +//<-----------Application listing Routes------------> + $route['userListing'] = 'user/userListing'; $route['userListing/(:num)'] = "user/userListing/$1"; +$route['purchaseorderListing'] = 'purchaseorder/purchaseorderListing'; +$route['purchaseorderListing/(:num)'] = "purchaseorder/purchaseorderListing/$1"; +$route['supplierListing'] = 'supplier/supplierListing'; +$route['supplierListing/(:num)'] = "supplier/supplierListing/$1"; + +$route['rawmaterialListing'] = 'rawmaterialdetails/rawmaterialListing'; +$route['rawmaterialListing/(:num)'] = "rawmaterialdetails/rawmaterialListing/$1"; + +$route['costListing'] = 'CostCenter/costListing'; +$route['costListing/(:num)'] = "CostCenter/costListing/$1"; + +$route['assetListing'] = 'assetdetails/assetListing'; +$route['assetListing/(:num)'] = "assetdetails/assetListing/$1"; + +$route['employeeListing'] = 'Employeedetails/employeeListing'; +$route['employeeListing/(:num)'] = "Employeedetails/employeeListing/$1"; + + + + + +//<-----------Application Add Routes------------> $route['addNew'] = "user/addNew"; -$route['addPO'] = "purchaseorder/addPO"; -$route['PurchaseOrderList'] = "purchaseorder/purchaseorderListing"; -$route['supplierList'] = "supplier/Supplierlist"; -//$route['Mainpage'] = "pages/AssetDetails"; -//$route['Mainpage'] = "pages/CostDetails"; - - $route['addNewUser'] = "user/addNewUser"; + +$route['addPO'] = "purchaseorder/addPO"; +$route['addNewPO'] = "purchaseorder/addNewPO"; + +$route['addsupplier'] = "supplier/addsupplier"; +$route['addNewsupplier'] = "supplier/addNewsupplier"; + +$route['addcost'] = "CostCenter/addCost"; +$route['addNewcost'] = "CostCenter/addNewCost"; + +$route['addasset'] = "assetdetails/addasset"; +$route['addNewasset'] = "assetdetails/addNewasset"; + +$route['addemployee'] = "Employeedetails/addemployee"; +$route['addNewemployee'] = "Employeedetils/addNewemployee"; + +$route['addRawmaterial'] = "rawmaterialdetails/addRawMaterial"; +$route['addNewRawmaterial'] = "rawmaterialdetails/addNewRawMaterial"; + +//<-----------Application Edit Routes------------> + $route['editOld'] = "user/editOld"; $route['editOld/(:num)'] = "user/editOld/$1"; $route['editUser'] = "user/editUser"; +$route['editOldPO'] = "purchaseorder/editOldPO"; +$route['editOldPO/(:num)'] = "purchaseorder/editOldPO/$1"; +$route['editPO'] = "purchaseorder/editPO"; +$route['editOldsupplier'] = "supplier/editOldsupplier"; +$route['editOldsupplier/(:num)'] = "supplier/editOldsupplier/$1"; +$route['editsupplier'] = "supplier/editsupplier"; + +$route['editOldcost'] = "CostCenter/editOldcost"; +$route['editOldcost/(:num)'] = "CostCenter/editOldcost/$1"; +$route['editcost'] = "CostCenter/editcost"; + +$route['editOldasset'] = "assetdetails/editOldasset"; +$route['editOldasset/(:num)'] = "assetdetails/editOldasset/$1"; +$route['editasset'] = "assetdetails/editasset"; + +$route['editOldemployee'] = "employeedetails/editOldemployee"; +$route['editOldemployee/(:num)'] = "employeedetails/editOldemployee/$1"; +$route['editemployee'] = "employeedetils/editemployee"; + +$route['editOldRawmaterial/(:num)'] = "rawmaterialdetails/editOldRawmaterial/$1"; +$route['editOldRawmaterial'] = "rawmaterialdetails/editOldRawmaterial"; +$route['editrawmaterial'] = "rawmaterialdetails/editemployee"; + +//<-----------Application Delete Routes------------> + $route['deleteUser'] = "user/deleteUser"; +$route['deletecost'] = "CostCenter/deletecost"; + + +//<-----------Application User Change Password Routes------------> $route['loadChangePass'] = "user/loadChangePass"; $route['changePassword'] = "user/changePassword"; + + +//<-----------Application Page Not Found Routes------------> $route['pageNotFound'] = "user/pageNotFound"; + +//<-----------Application Email & ForgetPassword Routes------------> + $route['checkEmailExists'] = "user/checkEmailExists"; $route['forgotPassword'] = "login/forgotPassword"; -$route['PO'] = 'PO'; -$route['PO/addPO'] = 'PO/addPO'; - -$route['PO/edit/(:any)'] = 'PO/edit/$1'; - -$route['PO/view/(:any)'] = 'PO/view/$1'; -$route['PO/(:any)'] = 'PO/view/$1'; + + /* End of file routes.php */ /* Location: ./application/config/routes.php */ \ No newline at end of file diff --git a/application/controllers/Controller.php b/application/controllers/Controller.php new file mode 100644 index 00000000..0dc76a12 --- /dev/null +++ b/application/controllers/Controller.php @@ -0,0 +1,266 @@ +load->database(); + $this->load->helper('url'); + + $this->load->library('grocery_CRUD'); + + + + } + + /* This function used to show the main page of the screen */ + public function _controller_output($output = null) + { + $this->load->view('AssetDetails',(array)$output); + + } + + public function home($ouput =null) + { + + $this->config->load('grocery_crud'); + $crud = new grocery_CRUD(); + + + $crud->set_table('T_PurchaseOrderDetails'); + $crud->required_fields('PONO'); + $crud->columns('PONO','POType','PODate','SpecialOrder','UserID'); + + $crud->unset_add(); + $crud->unset_read(); + $crud->unset_edit(); + $crud->unset_delete(); + $crud->unset_export(); + $crud->unset_print(); + + $output = $crud->render(); + + + $this->_controller_output($output); + + } + + public function offices() + { + $output = $this->grocery_crud->render(); + + $this->_controller_output($output); + } + + public function index() + { + + $this->_controller_output((object)array('output' => '' , 'js_files' => array() , 'css_files' => array())); + } + + + public function purchase_order() + { + try{ + $crud = new grocery_CRUD(); + + + $crud->set_table('T_PurchaseOrderDetails'); + $crud->set_subject('Purchase Order'); + $crud->required_fields('PONO'); + $crud->columns('PONO','POType','PODate','SpecialOrder','UserID', 'RequesterEmail','RequesterPh','RequestedDate','BudgetManager','BudgetManagerDepartment','PurchasingCategory','PurchasingJustification','OrderValue','DiscountType','DiscountValue','PackagingType','PackagingValue','ExciseDuty','Vat','Freight','CreatedOn','Create_By'); + /* These functions to hide add , view(read) ,edit , delete in form */ + $crud->unset_add(); + $crud->unset_read(); + $crud->unset_edit(); + $crud->unset_delete(); + $crud->unset_export(); + $crud->unset_print(); + + $output = $crud->render(); + + if($crud->getState() != 'list') { + $this->_controller_output($output); + } else { + return $output; + } + + + }catch(Exception $e){ + show_error($e->getMessage().' --- '.$e->getTraceAsString()); + } + } + public function purchase_order2() + { + try{ + $crud = new grocery_CRUD(); + + + $crud->set_table('T_PurchaseOrderDetails'); + $crud->set_subject('Purchase Order'); + $crud->required_fields('PONO'); + $crud->columns('PONO','POType','PODate','SpecialOrder','UserID', 'RequesterEmail','RequesterPh','RequestedDate','BudgetManager','BudgetManagerDepartment','PurchasingCategory','PurchasingJustification','OrderValue','DiscountType','DiscountValue','PackagingType','PackagingValue','ExciseDuty','Vat','Freight','CreatedOn','Create_By'); + $output = $crud->render(); + + $this->_controller_output($output); + } + catch(Exception $e){ + show_error($e->getMessage().' --- '.$e->getTraceAsString()); + } + + } + + public function Purchase_Order_Line_Item() + { + try{ + $crud = new grocery_CRUD(); + + + $crud->set_table('T_PurchaseOrderLineItem'); + $crud->set_subject('Purchase Order Line Item'); + $crud->required_fields('POLine'); + $crud->columns('POLineNo','PONO','Material_ID','UOM','Quantity','UnitPrice','ModifiedOn'); + + $output = $crud->render(); + + if($crud->getState() != 'list') { + //$this->_controller_output($output); + $this->load->view('Mainpage.php',(array)$output); + } else { + return $output; + } + }catch(Exception $e){ + show_error($e->getMessage().' --- '.$e->getTraceAsString()); + } + } + + + +public function Supplier_Details() + { + try{ + $crud = new grocery_CRUD(); + + + $crud->set_table('T_SupplierDetails'); + $crud->set_subject('Supplier Details'); + $crud->required_fields('Supplierid'); + $crud->columns('SupplierID','SupplierName','Address','Contactnumber','AlternateContactNumber','EmailAddress','TIN','PAN'); + /* These functions to hide add , view(read) ,edit , delete in form */ + $crud->unset_add(); + $crud->unset_read(); + $crud->unset_edit(); + $crud->unset_delete(); + $crud->unset_export(); + $crud->unset_print(); + + $output = $crud->render(); + + /* if else should be use , if we are using the same function in many screen*/ + if($crud->getState() != 'list') { + $this->_controller_output($output); + } else { + return $output; + } + }catch(Exception $e){ + show_error($e->getMessage().' --- '.$e->getTraceAsString()); + } + } + + public function Supplier_Details2() + { + try{ + $crud = new grocery_CRUD(); + + + $crud->set_table('T_SupplierDetails'); + $crud->set_subject('Supplier Details'); + $crud->required_fields('Supplierid'); + $crud->columns('SupplierID','SupplierName','Address','Contactnumber','AlternateContactNumber','EmailAddress','TIN','PAN'); + + $output = $crud->render(); + + + $this->_controller_output($output); + + }catch(Exception $e){ + show_error($e->getMessage().' --- '.$e->getTraceAsString()); + } + } + public function RawMaterial() + { + try{ + $crud = new grocery_CRUD(); + + + $crud->set_table('T_RawMaterialDetails'); + $crud->set_subject('RawMaterialDetails'); + $crud->required_fields('Metarial_ID'); + $crud->columns('Metarial_ID','Material_Name','Material_Type','SuplierID','Create_date'); + + /* These functions to hide add , view(read) ,edit , delete in form */ + $crud->unset_add(); + $crud->unset_read(); + $crud->unset_edit(); + $crud->unset_delete(); + $crud->unset_export(); + $crud->unset_print(); + + $output = $crud->render(); + + if($crud->getState() != 'list') { + $this->_controller_output($output); + } else { + return $output; + } + }catch(Exception $e){ + show_error($e->getMessage().' --- '.$e->getTraceAsString()); + } + } + public function RawMaterial2() + { + try{ + $crud = new grocery_CRUD(); + + + $crud->set_table('T_RawMaterialDetails'); + $crud->set_subject('RawMaterialDetails'); + $crud->required_fields('Metarial_ID'); + $crud->columns('Metarial_ID','Material_Name','Material_Type','SuplierID','Create_date'); + + $output = $crud->render(); + + $this->_controller_output($output); + + }catch(Exception $e){ + show_error($e->getMessage().' --- '.$e->getTraceAsString()); + } + } + + /* To call AssetDetail details */ + public function AssetDetails() + { + try{ + $crud = new grocery_CRUD(); + + + $crud->set_table('T_AssetDetails'); + $crud->set_subject('AssetDetails'); + $crud->required_fields('Asset_Code'); + $crud->columns('Asset_Code','Asset_Name','Description','Department','Location','AssetOwner','SupplierName','DateOfPurchase','DateOfCommissioning','SupportVendor','SupportFrom','SupportTo','Created_date'); + + $output = $crud->render(); + + $this->_controller_output($output); + // $this->load->view('AssetDetails.php',(array)$output); + + }catch(Exception $e){ + show_error($e->getMessage().' --- '.$e->getTraceAsString()); + } + + } + + +} \ No newline at end of file diff --git a/application/controllers/CostCenter.php b/application/controllers/CostCenter.php index dfd77470..f9f5749b 100644 --- a/application/controllers/CostCenter.php +++ b/application/controllers/CostCenter.php @@ -17,7 +17,7 @@ class CostCenter extends BaseController public function __construct() { parent::__construct(); - $this->load->model('supplier_model'); + $this->load->model('costcenter_model'); $this->isLoggedIn(); } /** @@ -25,22 +25,17 @@ class CostCenter extends BaseController */ public function index() { - $this->global['pageTitle'] = 'Siddharth : Supplier'; + $this->global['pageTitle'] = 'Siddharth : Cost'; - $this->loadViews("supplierlisting", $this->global, NULL , NULL); + $this->loadViews("costListing", $this->global, NULL , NULL); } /** - * This function is used to load the Supplier list + * This function is used to load the Cost list */ function CostListing() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { + $this->load->model('costcenter_model'); $searchText = $this->input->post('searchText'); @@ -57,44 +52,32 @@ class CostCenter extends BaseController $this->global['pageTitle'] = 'Siddharth : Cost Listing'; $this->loadViews("costListing", $this->global, $data, NULL); - } + } /** - * This function is used to load the add new supplier */ + * This function is used to load the add new cost */ function addcost() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { - $this->load->model('supplier_model'); - //$data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); + + $this->load->model('costcenter_model'); + //$data['costName'] = $this->purchaseorder_model->getcostName(); //$data['users'] = $this->purchaseorder_model->getusers(); - $this->global['pageTitle'] = 'siddharth : AddNew Supplier'; + $this->global['pageTitle'] = 'siddharth : AddNew cost'; $this->loadViews("addcost", $this->global, NULL); - } + } /** - * This function is used to add new user to the system + * This function is used to add new Cost to the system */ function addNewcost() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { + $this->load->library('form_validation'); - $PO = $this->input->post('SupplierID'); - - //$this->form_validation->set_rules('CostCenterID','Supplier Name','trim'); + $this->form_validation->set_rules('CostName','Address','trim|required|'); $this->form_validation->set_rules('Description','Contact Number','trim'); @@ -102,11 +85,11 @@ class CostCenter extends BaseController if($this->form_validation->run() == FALSE) { - $this->addsupplier(); + $this->addcost(); } else { - $CostName = ucwords(strtolower($this->input->post('CostName'))); + $CostName = ($this->input->post('CostName')); $Description = $this->input->post('Description'); @@ -119,16 +102,18 @@ class CostCenter extends BaseController if($result > 0) { - $this->session->set_flashdata('success', 'New PO created successfully'); + $this->session->set_flashdata('success', 'New Cost created successfully'); } else { - $this->session->set_flashdata('error', 'PO Not Create'); + $this->session->set_flashdata('error', 'Cost creation failed'); } - - redirect('codeListing'); + echo $result; + + + redirect('addcost'); } - } + } /** * This function is used load user edit information @@ -136,40 +121,39 @@ class CostCenter extends BaseController */ function editOldcost($CostCenterID = NULL) { - if($this->isAdmin() == TRUE || $CostCenterID == 1) - { - $this->loadThis(); - } - else - { + if($CostCenterID == null) { redirect('costListing'); } - //$data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); + $data['Cost'] = $this->costcenter_model->getuserinfo($CostCenterID); //$data['users'] = $this->purchaseorder_model->getusers(); - $this->global['pageTitle'] = 'Siddharth : Edit User'; + $this->global['pageTitle'] = 'Siddharth : Edit Cost'; - $this->loadViews("editOldcost", $this->global, NULL); - } + $this->loadViews("editOldcost", $this->global, $data,NULL); + } + function ech() + { + + echo $this->input->post('CostCentreID'); + echo $this->input->post('CostName'); + echo $this->input->post('Description'); + + } + /** * This function is used to edit the user information */ function editcost() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { + $this->load->library('form_validation'); - //$PO = $this->input->post('PO'); + $CostCenterID = $this->input->post('CostCentreID'); $this->form_validation->set_rules('CostName','Cost Name','trim|required|'); $this->form_validation->set_rules('Description','Description','trim|required|'); @@ -177,40 +161,64 @@ class CostCenter extends BaseController if($this->form_validation->run() == FALSE) { - $this->editPO(); + $this->editcost($CostCenterID); } else { + $CostCenterID = $this->input->post('CostCentreID'); $CostName = ucwords(strtolower($this->input->post('CostName'))); $Description = $this->input->post('Description'); + + + + //$this->costcenter_model->editcost($Cost); - $Cost = array('CostName'=>$CostName, 'Description'=>$Description,'createdDtm'=>date('Y-m-d H:i:sa')); + $cost = array(); + + + $Cost = array('CostCentreID'=>$CostCenterID,'CostName'=>$CostName, 'Description'=>$Description,'createdDate'=>date('Y-m-d H:i:sa')); + + - $Cost = array(); - - $result = $this->costcenter_model->editcost($Cost, $CostCentreID); + $result = $this->costcenter_model->editcost($Cost, $CostCenterID); if($result == true) { - $this->session->set_flashdata('success', 'PO updated successfully'); + $this->session->set_flashdata('success', 'Cost updated successfully'); } else { - $this->session->set_flashdata('error', 'PO updation failed'); + $this->session->set_flashdata('error', 'Cost updation failed'); } redirect('costListing'); } - } + + } + function viewcost($CostCenterID = NULL) + { + + if($CostCenterID == null) + { + redirect('costListing'); + } + + $data['Cost'] = $this->costcenter_model->getuserinfo($CostCenterID); + //$data['users'] = $this->purchaseorder_model->getusers(); + + $this->global['pageTitle'] = 'Siddharth : Edit Cost'; + + $this->loadViews("viewcost", $this->global, $data,NULL); + } /** * This function is used to delete the user using userId * @return boolean $result : TRUE / FALSE */ - function deleteUser() + function deletecost() { if($this->isAdmin() == TRUE) { @@ -218,10 +226,10 @@ class CostCenter extends BaseController } else { - $userId = $this->input->post('userId'); - $userInfo = array('isDeleted'=>1,'updatedBy'=>$this->vendorId, 'updatedDtm'=>date('Y-m-d H:i:sa')); + $CostCenterID = $this->input->Costst('CostCentreID'); + $cost = array('CreateDate'=>date('Y-m-d H:i:sa')); - $result = $this->user_model->deleteUser($userId, $userInfo); + $result = $this->costcenter_model->deletecost($Cost, $CostCenterID); if ($result > 0) { echo(json_encode(array('status'=>TRUE))); } else { echo(json_encode(array('status'=>FALSE))); } diff --git a/application/controllers/Employeedetails.php b/application/controllers/Employeedetails.php new file mode 100644 index 00000000..bd503b81 --- /dev/null +++ b/application/controllers/Employeedetails.php @@ -0,0 +1,304 @@ +load->model('employeedetails_model'); + $this->isLoggedIn(); + } + /** + * This function used to load the first screen of the user + */ + public function index() + { + $this->global['pageTitle'] = 'Siddharth : Employee Details'; + + $this->loadViews("employeeListing", $this->global, NULL , NULL); + } + + /** + * This function is used to load the Supplier list + */ + function employeeListing() + { + if($this->isAdmin() == TRUE) + { + $this->loadThis(); + } + else + { + $this->load->model('Employeedetails_model'); + + $searchText = $this->input->post('searchText'); + $data['searchText'] = $searchText; + + $this->load->library('pagination'); + + $count = $this->Employeedetails_model->employeeListingCount($searchText); + + $returns = $this->paginationCompress ( "employeeListing/", $count, 5 ); + + $data['userRecords'] = $this->employeedetails_model->employeeListing($searchText, $returns["page"], $returns["segment"]); + + $this->global['pageTitle'] = 'Siddharth : Employee Listing'; + + $this->loadViews("employeeListing", $this->global, $data, NULL); + } + } + /** + * This function is used to load the add new supplier */ + function addemployee() + { + if($this->isAdmin() == TRUE) + { + $this->loadThis(); + } + else + { + $this->load->model('employeedetails_model'); + + + $data['roles'] = $this->employeedetails_model->getUserRoles(); + + + $this->global['pageTitle'] = 'siddharth : AddNew Employee'; + + $this->loadViews("addemployee", $this->global, $data, NULL); + } + } + + /** + * This function is used to add new user to the system + */ + function addNewemployee() + { + if($this->isAdmin() == TRUE) + { + $this->loadThis(); + } + else + { + $this->load->library('form_validation'); + + //$PO = $this->input->post('SupplierID'); + + + $this->form_validation->set_rules('FirstName','FirstName','trim|required|'); + $this->form_validation->set_rules('LastName','LastName','trim|required'); + $this->form_validation->set_rules('DateofBirth','DateofBirth','trim'); + $this->form_validation->set_rules('ContactNumber','ContactNumber','trim'); + $this->form_validation->set_rules('EmailId','EmailId','trim|email|xss_clean'); + $this->form_validation->set_rules('DateofJoining','DateofJoining','trim|required'); + $this->form_validation->set_rules('role','role','trim|required'); + $this->form_validation->set_rules('Address1','Address1','trim|required'); + $this->form_validation->set_rules('Address2','Address2','trim|required'); + $this->form_validation->set_rules('Place','Place','trim|required'); + $this->form_validation->set_rules('City','City','trim|required'); + $this->form_validation->set_rules('State','State','trim|required'); + $this->form_validation->set_rules('Pin','Pin','trim|required'); + $this->form_validation->set_rules('DepartmentName','DepartmentName','trim|required'); + $this->form_validation->set_rules('User_Comments','User Comments','trim|required'); + + + + if($this->form_validation->run() == FALSE) + { + $this->addemployee(); + } + else + { + $FirstName = ucwords(strtolower($this->input->post('FirstName'))); + $LastName = $this->input->post('LastName'); + $DateofBirth = $this->input->post('DateofBirth'); + $ContactNumber = $this->input->post('ContactNumber'); + $EmailId = $this->input->post('EmailId'); + $DateofJoining = $this->input->post('DateofJoining'); + $role = $this->input->post('role'); + $Address1 = $this->input->post('Address1'); + $Address2 = $this->input->post('Address2'); + $Place = $this->input->post('Place'); + $City = $this->input->post('City'); + $State = $this->input->post('State'); + $Pin = $this->input->post('Pin'); + $DepartmentName = $this->input->post('DepartmentName'); + $User_Comments = $this->input->post('User_Comments'); + + + + + + $Employee = array('FirstName'=>$FirstName, 'LastName'=>$LastName,'DateofBirth'=>$DateofBirth,'ContactNumber'=>$ContactNumber,'EmailId'=>$EmailId,'DateofJoining'=>$DateofJoining,'role'=>$role,'Address1'=>$Address1,'Address2'=>$Address2,'Place'=>$Place,'City'=>$City,'State'=>$State,'Pin'=>$Pin,'DepartmentName'=>$DepartmentName,'User_Comments'=>$User_Comments,'Created_date'=>date('Y-m-d H:i:sa')); + + $this->load->model('Employeedetails_model'); + $result = $this->Employeedetails_model->addNewemployee($Employee); + + if($result > 0) + { + $this->session->set_flashdata('success', 'New Employee created successfully'); + } + else + { + $this->session->set_flashdata('error', 'Employee Not Create'); + } + + redirect('employeeListing'); + } + } + } + /** + * This function is used load user edit information + * @param number $userId : Optional : This is user id + */ + function editOldemployee($EmployeeID = NULL) + { + if($this->isAdmin() == TRUE ) + { + $this->loadThis(); + } + else + { + if($EmployeeID == null) + { + redirect('employeeListing'); + } + + //$data['roles'] = $this->Employeedetails_model->getUserRoles(); + $data['userRecords'] = $this->employeedetails_model->getuserInfo($EmployeeID); + $data['roles'] = $this->employeedetails_model->getUserRoles(); + + $this->global['pageTitle'] = 'Siddharth : Edit Employee'; + + $this->loadViews("editOldemployee", $this->global,$data, NULL); + } + } + + /** + * This function is used to edit the user information + */ + function editemployee() + { + if($this->isAdmin() == TRUE) + { + $this->loadThis(); + } + else + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules('EmpID','Employee ID','trim'); + $this->form_validation->set_rules('FirstName','FirstName','trim|required|'); + $this->form_validation->set_rules('LastName','LastName','trim'); + $this->form_validation->set_rules('DateofBirth','DateofBirth','trim'); + $this->form_validation->set_rules('ContactNumber','ContactNumber','trim'); + $this->form_validation->set_rules('EmailId','EmailId','trim'); + $this->form_validation->set_rules('DateofJoining','DateofJoining','trim'); + $this->form_validation->set_rules('role','role','trim'); + $this->form_validation->set_rules('Address1','Address1','trim'); + $this->form_validation->set_rules('Address2','Address2','trim'); + $this->form_validation->set_rules('Place','Place','trim'); + $this->form_validation->set_rules('City','City','trim'); + $this->form_validation->set_rules('State','State','trim'); + $this->form_validation->set_rules('Pin','Pin','trim'); + $this->form_validation->set_rules('DepartmentName','DepartmentName','trim'); + $this->form_validation->set_rules('User_Comments','User_Comments','trim'); + + + if($this->form_validation->run() == FALSE) + { + $this->editemployee($EmpID); + } + else + { + $EmpID = $this->input->post('EmpID'); + $FirstName = ucwords(strtolower($this->input->post('FirstName'))); + $LastName = $this->input->post('LastName'); + $DateofBirth = $this->input->post('DateofBirth'); + $ContactNumber = $this->input->post('ContactNumber'); + $EmailId = $this->input->post('EmailId'); + $DateofJoining = $this->input->post('DateofJoining'); + $role = $this->input->post('role'); + $Address1 = $this->input->post('Address1'); + $Address2 = $this->input->post('Address2'); + $Place = $this->input->post('Place'); + $City = $this->input->post('City'); + $State = $this->input->post('State'); + $Pin = $this->input->post('Pin'); + $DepartmentName = $this->input->post('DepartmentName'); + $User_Comments = $this->input->post('User_Comments'); + + echo 'validation completed'; + + $Emp = array(); + + + + $Emp = array('EmpID'=>$EmpID,'FirstName'=>$FirstName, 'LastName'=>$LastName,'DateofBirth'=>$DateofBirth,'ContactNumber'=>$ContactNumber,'EmailId'=>$EmailId,'DateofJoining'=>$DateofJoining,'role'=>$role,'Address1'=>$Address1,'Address2'=>$Address2,'Place'=>$Place,'City'=>$City,'State'=>$State,'Pin'=>$Pin,'DepartmentName'=>$DepartmentName,'User_Comments'=>$User_Comments,'created_Date'=>date('Y-m-d H:i:sa')); + echo 'pass'; + + + //echo $Emp; + + + + $result = $this->employeedetails_model->editemployee($Emp, $EmpID); + echo'insert'; + if($result == true) + { + $this->session->set_flashdata('success', 'Employee updated successfully'); + } + else + { + $this->session->set_flashdata('error', 'Employee updation failed'); + } + + //redirect('employeeListing'); + } + } + } + + /** + * This function is used to delete the user using userId + * @return boolean $result : TRUE / FALSE + + function deleteUser() + { + if($this->isAdmin() == TRUE) + { + echo(json_encode(array('status'=>'access'))); + } + else + { + $userId = $this->input->post('userId'); + $userInfo = array('isDeleted'=>1,'updatedBy'=>$this->vendorId, 'updatedDtm'=>date('Y-m-d H:i:sa')); + + $result = $this->user_model->deleteUser($userId, $userInfo); + + if ($result > 0) { echo(json_encode(array('status'=>TRUE))); } + else { echo(json_encode(array('status'=>FALSE))); } + } + }*/ + + + function pageNotFound() + { + $this->global['pageTitle'] = 'CodeInsect : 404 - Page Not Found'; + + $this->loadViews("404", $this->global, NULL, NULL); + } +} + +?> \ No newline at end of file diff --git a/application/controllers/assetdetails.php b/application/controllers/assetdetails.php index caa8d950..d5250349 100644 --- a/application/controllers/assetdetails.php +++ b/application/controllers/assetdetails.php @@ -27,7 +27,7 @@ class assetdetails extends BaseController { $this->global['pageTitle'] = 'Siddharth : Asset Details'; - $this->loadViews("assetlisting", $this->global, NULL , NULL); + $this->loadViews("assetListing", $this->global, NULL , NULL); } /** @@ -35,87 +35,90 @@ class assetdetails extends BaseController */ function assetListing() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { - $this->load->model('costcenter_model'); + + $this->load->model('assetdetails_model'); $searchText = $this->input->post('searchText'); $data['searchText'] = $searchText; $this->load->library('pagination'); - $count = $this->costcenter_model->costListingCount($searchText); + $count = $this->assetdetails_model->assetListingCount($searchText); - $returns = $this->paginationCompress ( "assetListing/", $count, 5 ); + $returns = $this->paginationCompress ( "assetListing/", $count ,5); $data['userRecords'] = $this->assetdetails_model->assetListing($searchText, $returns["page"], $returns["segment"]); - $this->global['pageTitle'] = 'Siddharth : Cost Listing'; + $this->global['pageTitle'] = 'Siddharth : Asset Listing'; - $this->loadViews("costListing", $this->global, $data, NULL); - } + $this->loadViews("assetListing", $this->global, $data, NULL); + } /** * This function is used to load the add new supplier */ - function addcost() + function addasset() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { - $this->load->model('supplier_model'); - //$data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); - //$data['users'] = $this->purchaseorder_model->getusers(); + + $this->load->model('assetdetails_model'); + $data['SupplierName'] = $this->assetdetails_model->getSupplierName(); + //$data['POdate'] = $this->assetdetails_model->getPODate(); - $this->global['pageTitle'] = 'siddharth : AddNew Supplier'; + $this->global['pageTitle'] = 'siddharth : AddNew Asset'; - $this->loadViews("addcost", $this->global, NULL); - } + $this->loadViews("addasset", $this->global, $data, NULL); + } /** * This function is used to add new user to the system */ - function addNewcost() + function addNewasset() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { + $this->load->library('form_validation'); - $PO = $this->input->post('SupplierID'); + //$PO = $this->input->post('SupplierID'); //$this->form_validation->set_rules('CostCenterID','Supplier Name','trim'); - $this->form_validation->set_rules('CostName','Address','trim|required|'); - $this->form_validation->set_rules('Description','Contact Number','trim'); + $this->form_validation->set_rules('Asset_Name','AssetName','trim'); + $this->form_validation->set_rules('Description','Description','trim'); + $this->form_validation->set_rules('Department','Department','trim'); + $this->form_validation->set_rules('Location','Location','trim'); + $this->form_validation->set_rules('AssetOwner','AssetOwner','trim'); + $this->form_validation->set_rules('SupplierName','SupplierName','trim'); + $this->form_validation->set_rules('DateOfPurchase','DateOfPurchase','trim'); + $this->form_validation->set_rules('DateOfCommission','DateOfCommission','trim'); + $this->form_validation->set_rules('SupportVendor','SupportVendor','trim'); + $this->form_validation->set_rules('SupportFrom','SupportFrom','trim'); + $this->form_validation->set_rules('SupportTo','SupportTo','trim'); if($this->form_validation->run() == FALSE) { - $this->addsupplier(); + $this->addasset(); } else { - $CostName = ucwords(strtolower($this->input->post('CostName'))); + $AssetName = ucwords(strtolower($this->input->post('Asset_Name'))); $Description = $this->input->post('Description'); + $Department = $this->input->post('Department'); + $Location = $this->input->post('Location'); + $AssetOwner = $this->input->post('AssetOwner'); + $SupplierName = $this->input->post('SupplierName'); + $DateOfPurchase = $this->input->post('DateOfPurchase'); + $DateOfCommission = $this->input->post('DateOfCommission'); + $SupportVendor = $this->input->post('SupportVendor'); + $SupportFrom = $this->input->post('SupportFrom'); + $SupportTo = $this->input->post('SupportTo'); - $Cost = array('CostName'=>$CostName, 'Description'=>$Description,'createdDate'=>date('Y-m-d H:i:sa')); + $asset = array('Asset_Name'=>$AssetName, 'Description'=>$Description,'Department'=>$Department,'Location'=>$Location,'AssetOwner'=>$AssetOwner,'SupplierName'=>$SupplierName,'DateOfPurchase'=>$DateOfPurchase,'DateOfCommission'=>$DateOfCommission,'SupportVendor'=>$SupportVendor,'SupportFrom'=>$SupportFrom,'SupportTo'=>$SupportTo,'createdDate'=>date('Y-m-d H:i:sa')); - $this->load->model('costcenter_model'); - $result = $this->costcenter_model->addNewcost($Cost); + $this->load->model('assetdetails_model'); + $result = $this->assetdetails_model->addNewasset($asset); if($result > 0) { @@ -126,90 +129,109 @@ class assetdetails extends BaseController $this->session->set_flashdata('error', 'PO Not Create'); } - redirect('codeListing'); + redirect('assetdetails/assetListing'); } - } + } /** * This function is used load user edit information * @param number $userId : Optional : This is user id - */ - function editOldcost($CostCenterID = NULL) + + + function ech(){ + + echo $this->input->post('Asset_Code'); + }*/ + function editOldasset($assetcode = NULL) { - if($this->isAdmin() == TRUE || $CostCenterID == 1) - { - $this->loadThis(); - } - else - { - if($CostCenterID == null) + + + if($assetcode == null) { - redirect('costListing'); + + redirect('assetListing'); } - //$data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); - //$data['users'] = $this->purchaseorder_model->getusers(); + $data['asset'] = $this->assetdetails_model->getUserInfo($assetcode); + $data['SupplierName'] = $this->assetdetails_model->getSupplierName(); $this->global['pageTitle'] = 'Siddharth : Edit User'; - $this->loadViews("editOldcost", $this->global, NULL); - } + $this->loadViews("editOldasset", $this->global, $data,NULL); + } /** * This function is used to edit the user information */ - function editcost() + function editasset() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { + $this->load->library('form_validation'); - //$PO = $this->input->post('PO'); + $Asset_Code = $this->input->post('Asset_Code'); - $this->form_validation->set_rules('CostName','Cost Name','trim|required|'); - $this->form_validation->set_rules('Description','Description','trim|required|'); + $this->form_validation->set_rules('Asset_Name','AssetName','trim|required'); + $this->form_validation->set_rules('Description','Description','trim|required'); + $this->form_validation->set_rules('Department','Department','trim|required'); + $this->form_validation->set_rules('Location','Location','trim'); + $this->form_validation->set_rules('AssetOwner','AssetOwner','trim'); + $this->form_validation->set_rules('SupplierName','SupplierName','trim|required'); + $this->form_validation->set_rules('DateOfPurchase','DateOfPurchase','trim'); + $this->form_validation->set_rules('DateOfCommission','DateOfCommission','trim'); + $this->form_validation->set_rules('SupportVendor','SupportVendor','trim'); + $this->form_validation->set_rules('SupportFrom','SupportFrom','trim'); + $this->form_validation->set_rules('SupportTo','SupportTo','trim'); if($this->form_validation->run() == FALSE) { - $this->editPO(); + + $this->editasset($Asset_Code); } else { - $CostName = ucwords(strtolower($this->input->post('CostName'))); + $Asset_Code = $this->input->post('Asset_Code'); + $AssetName = ucwords(strtolower($this->input->post('Asset_Name'))); $Description = $this->input->post('Description'); + $Department = $this->input->post('Department'); + $Location = $this->input->post('Location'); + $AssetOwner = $this->input->post('AssetOwner'); + $SupplierName = $this->input->post('SupplierName'); + $DateOfPurchase = $this->input->post('DateOfPurchase'); + $DateOfCommission = $this->input->post('DateOfCommission'); + $SupportVendor = $this->input->post('SupportVendor'); + $SupportFrom = $this->input->post('SupportFrom'); + $SupportTo = $this->input->post('SupportTo'); - $Cost = array('CostName'=>$CostName, 'Description'=>$Description,'createdDtm'=>date('Y-m-d H:i:sa')); + $asset = array(); + + + + $asset = array('Asset_Code'=>$Asset_Code,'Asset_Name'=>$AssetName, 'Description'=>$Description,'Department'=>$Department,'Location'=>$Location,'AssetOwner'=>$AssetOwner,'SupplierName'=>$SupplierName,'DateOfPurchase'=>$DateOfPurchase,'DateOfCommission'=>$DateOfCommission,'SupportVendor'=>$SupportVendor,'SupportFrom'=>$SupportFrom,'SupportTo'=>$SupportTo,'createdDate'=>date('Y-m-d H:i:sa')); + + - - - $Cost = array(); - - $result = $this->costcenter_model->editcost($Cost, $CostCentreID); + $result = $this->assetdetails_model->editasset($asset, $Asset_Code); if($result == true) { - $this->session->set_flashdata('success', 'PO updated successfully'); + $this->session->set_flashdata('success', 'Asset updated successfully'); } else { - $this->session->set_flashdata('error', 'PO updation failed'); + $this->session->set_flashdata('error', 'Asset updation failed'); } - redirect('costListing'); + redirect('assetListing'); } - } + } /** * This function is used to delete the user using userId * @return boolean $result : TRUE / FALSE - */ + function deleteUser() { if($this->isAdmin() == TRUE) @@ -227,8 +249,25 @@ class assetdetails extends BaseController else { echo(json_encode(array('status'=>FALSE))); } } } - - + */ + function viewasset($Asset_code = NULL) + { + + + if($Asset_code == null) + { + + redirect('assetListing'); + } + + $data['asset'] = $this->assetdetails_model->getUserInfo($Asset_code); + $data['SupplierName'] = $this->assetdetails_model->getSupplierName(); + + $this->global['pageTitle'] = 'Siddharth : View User'; + + $this->loadViews("viewasset", $this->global, $data,NULL); + + } function pageNotFound() { $this->global['pageTitle'] = 'CodeInsect : 404 - Page Not Found'; diff --git a/application/controllers/c_test.php b/application/controllers/c_test.php new file mode 100644 index 00000000..ba5f639a --- /dev/null +++ b/application/controllers/c_test.php @@ -0,0 +1,51 @@ +load->model('purchaseorder_model'); + $this->load->library('session'); + $this->isLoggedIn(); + //$this->load->library('grocery_CRUD'); + } + + public function create_pdf() { + // Load all views as normal + + + $PONO = $_GET['PO']; + + $data['PODetail'] = $this->purchaseorder_model->getPurchaseOrder($PONO); + $data['POLineItem'] = $this->purchaseorder_model->getPOLineItem($PONO); + //$this->global['pageTitle'] = 'Purchase Order Report'; + + // Add header to pdf + $this->load->view('includes/pdfheader'); + + // Load the pdf page with multiviews + $this->load->View("create_pdf", $data, NULL); + + // Add header to pdf + $this->load->view('includes/pdffooter'); + + // Get output html + $php = $this->output->get_output(); + + // Load library + $this->load->library('dompdf_gen'); + + // Convert to PDF + $this->dompdf->load_html($php); + $this->dompdf->render(); + $data['Attachment'] = FALSE; + $this->dompdf->stream("PurchaseOrderreport.pdf",$data,$php); + +} + +} + \ No newline at end of file diff --git a/application/controllers/purchaseorder.php b/application/controllers/purchaseorder.php index d88c0b10..3ba9c032 100644 --- a/application/controllers/purchaseorder.php +++ b/application/controllers/purchaseorder.php @@ -18,6 +18,10 @@ class purchaseorder extends BaseController { parent::__construct(); $this->load->model('purchaseorder_model'); + + $this->load->library('session'); + $this->load->library('form_validation'); + $this->isLoggedIn(); } @@ -27,10 +31,14 @@ class purchaseorder extends BaseController public function index() { $this->global['pageTitle'] = 'Siddharth : AddPO'; + + $this->loadViews("addPO", $this->global, NULL , NULL); } + + /** * This function is used to load the purchaseorder list */ @@ -54,86 +62,102 @@ class purchaseorder extends BaseController $returns = $this->paginationCompress ( "purchaseorderListing/", $count, 5 ); $data['userRecords'] = $this->purchaseorder_model->purchaseorderListing($searchText, $returns["page"], $returns["segment"]); + + $this->global['pageTitle'] = 'Siddharth : PO Listing'; $this->loadViews("POlist", $this->global, $data, NULL); } } - + + + function ViewPurchaseOrder() + { + if($this->isAdmin() == TRUE) + { + $this->loadThis(); + } + else + { + $data = $_GET['PONO']; + + $this->load->model('purchaseorder_model'); + $result['PODetail'] = $this->purchaseorder_model->getPurchaseOrder($data); + $result['POLineItem'] = $this->purchaseorder_model->getPOLineItem($data); + $this->loadViews("EditPurchaseOrder", $this->global, $result, NULL); + + } + } /** * This function is used to load the add new PO */ function addPO() { + if($this->isAdmin() == TRUE) + { + + $this->loadThis(); + } + else { - $this->loadThis(); - } - else - { + $this->load->helper('form'); + $this->load->model('purchaseorder_model'); - $data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); - $data['users'] = $this->purchaseorder_model->getusers(); - + $data['users'] = $this->purchaseorder_model->getusers(); + $data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); + $data['RawMaterials'] = $this->purchaseorder_model->getRawMaterialList(); + $data['UOM'] = $this->purchaseorder_model->getUOM(); + $data['POType'] = $this->purchaseorder_model->getPOType(); + $data['PurchasingCategory'] = $this->purchaseorder_model->getPurchasingCategory(); + + $data['EmpList'] = $this->purchaseorder_model->getEmployeeList(); + $this->global['pageTitle'] = 'siddharth : AddNew PO'; $this->loadViews("addPO", $this->global, $data, NULL); - } + } } - - /** - * This function is used to check whether email already exist or not - - function checkEmailExists() - { - $userId = $this->input->post("userId"); - $email = $this->input->post("email"); - - if(empty($userId)){ - $result = $this->user_model->checkEmailExists($email); - } else { - $result = $this->user_model->checkEmailExists($email, $userId); - } - - if(empty($result)){ echo("true"); } - else { echo("false"); } - }*/ + function UpdatePO() + { + $PONO = $this->session->userdata('PONO'); + + $DiscountType = $this->input->post('DiscountType'); + $DiscountValue = $this->input->post('txtDiscount'); + $PackagingType = $this->input->post('PackagingType'); + $PackagingValue = $this->input->post('txtPackaging'); + $Exciseduty = $this->input->post('Exciseduty'); + $Vat = $this->input->post('txtVat'); + $Freight = $this->input->post('txtFreight'); + $TotalOrderValue = $this->input->post('txtOrderValue'); + + echo $PONO ; + echo $DiscountType; + echo $PackagingType; + + $this->load->model('purchaseorder_model'); + + + + } /** * This function is used to add new user to the system */ function addNewPO() - { - if($this->isAdmin() == TRUE) + { + + + if($this->isAdmin() == TRUE) { - $this->loadThis(); + $this->loadThis(); } else - { - $this->load->library('form_validation'); + { - $PO = $this->input->post('PO'); - - $this->form_validation->set_rules('PO_Type','PO Type','trim|required|'); - $this->form_validation->set_rules('PO_Date','PO Date','trim|required|'); - $this->form_validation->set_rules('SupplierID','SupplierID','trim|required|'); - $this->form_validation->set_rules('SpecialOrder','Special Requirement of order','|max_length[20]'); - $this->form_validation->set_rules('role','UserID','trim||numeric'); - $this->form_validation->set_rules('re_email','Requester email','trim|valid_email|xss_clean|max_length[128]'); - $this->form_validation->set_rules('re_phone','Requester ph','required|min_length[10]|xss_clean'); - $this->form_validation->set_rules('re_Date','Requested Date','required'); - $this->form_validation->set_rules('bug_manager','Budget Manager'); - $this->form_validation->set_rules('bud_manager_de','Budget Manager Department','trim'); - $this->form_validation->set_rules('Pur_category','Purchasing Category','trim|required'); - - if($this->form_validation->run() == FALSE) - { - $this->addPO(); - } - else - { - $POType = ucwords(strtolower($this->input->post('PO_Type'))); + + $POType = $this->input->post('PO_Type'); $PODate = $this->input->post('PO_Date'); $SupplierID = $this->input->post('SupplierID'); $SpecialOrder = $this->input->post('SpecialOrder'); @@ -141,31 +165,64 @@ class purchaseorder extends BaseController $re_email = $this->input->post('re_email'); $re_phone = $this->input->post('re_phone'); $re_Date = $this->input->post('re_Date'); - $bug_manager = $this->input->post('bug_manager'); - $bud_manager_de = $this->input->post('bud_manager_de'); - $Pur_category = $this->input->post('Pur_category'); - - - $POInfo = array('POType'=>$POType, 'PODate'=>$PODate, 'SupplierID'=>$SupplierID, 'SpecialOrder'=> $SpecialOrder,'UserID'=>$role,'RequestedDate'=>$re_Date,'RequesterEmail'=>$re_email,'RequesterPh'=>$re_phone, 'PurchasingCategory'=>$Pur_category,'BudgetManager'=>$bug_manager,'BudgetManagerDepartment'=>$bud_manager_de,'createdBy'=>$this->vendorId, 'createdDtm'=>date('Y-m-d H:i:sa')); - + $bud_manager =$this->input->post('bud_manager'); + $bud_manager_de = $this->input->post('BudgetManagerDepartment'); + $Pur_category = $this->input->post('Pur_category'); + $Justification = $this->input->post('Justification'); + $SupplierAddress = $this->input->post('SupplierAddress'); + $CreatedBy= $this->session->userdata('role'); + $DiscountType = $this->input->post('DiscountType'); + $txtDiscount = $this->input->post('txtDiscount'); + $PackagingType = $this->input->post('PackagingType'); + $txtPackaging = $this->input->post('txtPackaging'); + $Exciseduty = $this->input->post('Exciseduty'); + $txtVat = $this->input->post('txtVat'); + $txtFreight = $this->input->post('txtFreight'); + $txtOrderValue = $this->input->post('txtOrderValue'); + $BasicValue = $this->input->post('BasicValue'); + $AfterDiscount = $this->input->post('AfterDiscount'); + $AfterPackaging = $this->input->post('AfterPackaging'); + $AferExciseduty = $this->input->post('AferExciseduty'); + $txtAfterVat = $this->input->post('txtAfterVat'); + + + $PODate = date('m-d-Y H:i:s', strtotime(str_replace('/', '-', $PODate))); + $re_Date = date('m-d-Y H:i:s', strtotime(str_replace('/', '-', $re_Date))); + $this->load->model('purchaseorder_model'); - $result = $this->purchaseorder_model->addNewPO($POInfo); - - if($result > 0) - { - $this->session->set_flashdata('success', 'New PO created successfully'); - } - else - { - $this->session->set_flashdata('error', 'PO Not Create'); - } - - redirect('addPO'); - } - } - } + + $data['PONO'] = $this->purchaseorder_model->addNewPO($POType,$PODate, $SupplierID,$SpecialOrder,$role,$re_email,$re_phone, + $re_Date,$bud_manager,$bud_manager_de,$Pur_category, $Justification,$CreatedBy,$BasicValue,$DiscountType,$txtDiscount,$PackagingType,$txtPackaging,$Exciseduty,$txtVat,$txtFreight,$AfterDiscount,$AfterPackaging,$AferExciseduty,$txtAfterVat,$txtOrderValue); + + - + $data = array_shift($data); + + $PO = $data[0]['PONO']; + + + $RowCount = $this->input->post('txtRowCount'); + + // Inserting PO Line item + + + for ($i = 1; $i <= $RowCount; $i++) + { + $Material_ID = $this->input->post('ProductDescription'.$i); + $UOM = $this->input->post('UOM'.$i); + $Quantity = $this->input->post('Quantity'.$i); + $UnitPrice = $this->input->post('UnitPrice'.$i); + $data['POLineItem']= $this->purchaseorder_model-> addNewPOLineItem($PO,$Material_ID,$UOM,$Quantity,$UnitPrice); + + } + + Print_r($PO); + return $PO; + + } + } + + /** * This function is used load user edit information * @param number $userId : Optional : This is user id @@ -258,32 +315,43 @@ class purchaseorder extends BaseController } } } - - - - /** - * This function is used to delete the user using userId - * @return boolean $result : TRUE / FALSE - - function deleteUser() - { - if($this->isAdmin() == TRUE) - { - echo(json_encode(array('status'=>'access'))); - } - else - { - $userId = $this->input->post('userId'); - $userInfo = array('isDeleted'=>1,'updatedBy'=>$this->vendorId, 'updatedDtm'=>date('Y-m-d H:i:sa')); - - $result = $this->user_model->deleteUser($userId, $userInfo); - - if ($result > 0) { echo(json_encode(array('status'=>TRUE))); } - else { echo(json_encode(array('status'=>FALSE))); } - } - }*/ - - + + function GetSupplier() + { + $id = $this->input->post('id'); + + $this->load->model('supplier_model'); + + $result['Address'] = $this->supplier_model->GetSupplierAddress($id ); + + $result = array_shift($result); + + $Address = $result[0]['Address']; + + + print $Address; + return $Address; + + } + + function GetBudgetManagerDepartment() + { + $id = $this->input->post('id'); + + $this->load->model('Employeedetails_model'); + + $result['DepartmentName'] = $this->Employeedetails_model->GetEmployeeDepartment($id ); + + $result = array_shift($result); + + $DepartmentName = $result[0]['DepartmentName']; + + + print $DepartmentName; + return $DepartmentName; + + } + function pageNotFound() { $this->global['pageTitle'] = 'CodeInsect : 404 - Page Not Found'; diff --git a/application/controllers/rawmaterialdetails.php b/application/controllers/rawmaterialdetails.php new file mode 100644 index 00000000..7e797e5c --- /dev/null +++ b/application/controllers/rawmaterialdetails.php @@ -0,0 +1,292 @@ +load->model('rawmaterialdetails_model'); + $this->isLoggedIn(); + } + /** + * This function used to load the first screen of the user + */ + public function index() + { + $this->global['pageTitle'] = 'Siddharth : RawMaterialDetails'; + + $this->loadViews("rawmaterialListing", $this->global, NULL , NULL); + } + + /** + * This function is used to load the RawMaterialDetails list + */ + function rawmaterialListing() + { + + $this->load->model('rawmaterialdetails_model'); + + $searchText = $this->input->post('searchText'); + $data['searchText'] = $searchText; + + $this->load->library('pagination'); + + $count = $this->rawmaterialdetails_model->rawmaterialListingCount($searchText); + + $returns = $this->paginationCompress ( "rawmaterialListing/", $count, 5 ); + + $data['userRecords'] = $this->rawmaterialdetails_model->rawmaterialListing($searchText, $returns["page"], $returns["segment"]); + + $this->global['pageTitle'] = 'Siddharth : RawMaterial Listing'; + + $this->loadViews("rawmaterialListing", $this->global, $data, NULL); + + } + /** + * This function is used to load the add new cost */ + function addRawMaterial() + { + if($this->isAdmin() == TRUE) + { + $this->loadThis(); + } + else + { + $this->load->model('rawmaterialdetails_model'); + $data['SupplierName'] = $this->rawmaterialdetails_model->getSupplierName(); + $data['material'] = $this->rawmaterialdetails_model->getmaterial(); + + + $this->global['pageTitle'] = 'siddharth : AddNew RawMaterial'; + + $this->loadViews("addRawmaterial", $this->global, $data, NULL); + } + } + + /** + * This function is used to add new Cost to the system + */ + function addNewRawMaterial() + { + echo 'allowed edit'; + if($this->isAdmin() == TRUE) + { + $this->loadThis(); + } + else + { + $this->load->library('form_validation'); + + //$PO = $this->input->post('costID'); + + //$this->form_validation->set_rules('CostCenterID','cost Name','trim'); + $this->form_validation->set_rules('MaterialName','Material Name','trim|required|'); + $this->form_validation->set_rules('MaterialType','MaterialType','trim'); + $this->form_validation->set_rules('SupplierID','SupplierID','trim'); + + + + if($this->form_validation->run() == FALSE) + { + $this->addcost(); + } + else + { + $MaterialName = ucwords(strtolower($this->input->post('MaterialName'))); + $MaterialType = $this->input->post('MaterialType'); + $SupplierID = $this->input->post('SupplierID'); + + + + + $RawMaterial = array('MaterialName'=>$MaterialName, 'MaterialType'=>$MaterialType, 'SupplierID'=>$SupplierID,'createdDate'=>date('Y-m-d H:i:sa')); + + $this->load->model('rawmaterialdetails_model'); + $result = $this->rawmaterialdetails_model->addNewRawMaterial($RawMaterial); + + if($result > 0) + { + $this->session->set_flashdata('success', 'New RawMaterial created successfully'); + } + else + { + $this->session->set_flashdata('error', 'RawMaterial Not Create'); + } + + redirect('rawmaterialListing'); + } + } + } + + + function viewRawmaterial($RawMaterialID = NULL) + { + //echo 'allowed edit'; + + if($this->isAdmin() == TRUE || $RawMaterialID == 1) + { + //echo 'allowed Admin'; + $this->loadThis(); + } + else + { + //echo 'allowed Update'; + if($RawMaterialID == null) + { + //echo 'Before Update'; + redirect('rawmaterialListing'); + } + + //echo 'Before Update'; + //$data['costName'] = $this->purchaseorder_model->getcostName(); + $data['SupplierName'] = $this->rawmaterialdetails_model->getSupplierName(); + $data['userRecords'] = $this->rawmaterialdetails_model->getuserInfo($RawMaterialID); + $data['material'] = $this->rawmaterialdetails_model->getmaterial(); + $this->global['pageTitle'] = 'Siddharth : Edit RawMaterial'; + + $this->loadViews("viewrawmaterial", $this->global,$data, NULL); + } + } + /** + * This function is used load user edit information + * @param number $userId : Optional : This is user id + */ + function editOldRawmaterial($RawMaterialID = NULL) + { + //echo 'allowed edit'; + + if($this->isAdmin() == TRUE || $RawMaterialID == 1) + { + //echo 'allowed Admin'; + $this->loadThis(); + } + else + { + //echo 'allowed Update'; + if($RawMaterialID == null) + { + //echo 'Before Update'; + redirect('rawmaterialListing'); + } + + //echo 'Before Update'; + //$data['costName'] = $this->purchaseorder_model->getcostName(); + $data['SupplierName'] = $this->rawmaterialdetails_model->getSupplierName(); + $data['userRecords'] = $this->rawmaterialdetails_model->getuserInfo($RawMaterialID); + $data['material'] = $this->rawmaterialdetails_model->getmaterial(); + $this->global['pageTitle'] = 'Siddharth : Edit RawMaterial'; + + $this->loadViews("editOldrawmaterial", $this->global,$data, NULL); + } + } + + + /** + * This function is used to edit the user information + */ + function editRawmaterial() + { + + + + + if($this->isAdmin() == TRUE) + { + echo 'allowed admin'; + $this->loadThis(); + + } + else + { + //echo 'allowed data'; + $this->load->library('form_validation'); + + $MaterialCode = $this->input->post('MaterialCode'); + + $this->form_validation->set_rules('MaterialName','Material Name','trim|required|'); + $this->form_validation->set_rules('MaterialType','MaterialType','trim'); + $this->form_validation->set_rules('SupplierID','SupplierID','trim'); + + if($this->form_validation->run() == FALSE) + { + $this->editRawmaterial($RawmaterialID); + + } + else + { + $MaterialCode = $this->input->post('MaterialCode'); + $MaterialName = ucwords(strtolower($this->input->post('MaterialName'))); + $MaterialType = $this->input->post('MaterialType'); + $SupplierID = $this->input->post('SupplierID'); + + //echo $MaterialCode; + + //echo 'passed model'; + $RawMaterial = array(); + + $RawMaterial = array('MaterialName'=>$MaterialName,'MaterialType'=>$MaterialType, 'SupplierID'=>$SupplierID, 'MaterialCode'=>$MaterialCode, 'createdDate'=>date('Y-m-d H:i:sa')); + + // echo ' before db Call'; + $result = $this->rawmaterialdetails_model->editRawmaterial($RawMaterial, $MaterialCode); + // echo ' After db Call'; + + if($result == true) + { + $this->session->set_flashdata('success', 'RawMaterial updated successfully'); + } + else + { + $this->session->set_flashdata('error', 'RawMaterial updation failed'); + } + + redirect('rawmaterialListing'); + } + } + } + + /** + * This function is used to delete the user using userId + * @return boolean $result : TRUE / FALSE + + function deleteUser() + { + if($this->isAdmin() == TRUE) + { + echo(json_encode(array('status'=>'access'))); + } + else + { + $userId = $this->input->post('userId'); + $userInfo = array('isDeleted'=>1,'updatedBy'=>$this->vendorId, 'updatedDtm'=>date('Y-m-d H:i:sa')); + + $result = $this->user_model->deleteUser($userId, $userInfo); + + if ($result > 0) { echo(json_encode(array('status'=>TRUE))); } + else { echo(json_encode(array('status'=>FALSE))); } + } + }*/ + + + + + function pageNotFound() + { + $this->global['pageTitle'] = 'Siddharth : 404 - Page Not Found'; + + $this->loadViews("404", $this->global, NULL, NULL); + } +} + +?> \ No newline at end of file diff --git a/application/controllers/supplier.php b/application/controllers/supplier.php index 2a6c2db9..1415028b 100644 --- a/application/controllers/supplier.php +++ b/application/controllers/supplier.php @@ -27,7 +27,7 @@ class supplier extends BaseController { $this->global['pageTitle'] = 'Siddharth : Supplier'; - $this->loadViews("supplierlisting", $this->global, NULL , NULL); + $this->loadViews("supplierListing", $this->global, NULL , NULL); } /** @@ -35,12 +35,7 @@ class supplier extends BaseController */ function supplierListing() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { + $this->load->model('supplier_model'); $searchText = $this->input->post('searchText'); @@ -50,25 +45,19 @@ class supplier extends BaseController $count = $this->supplier_model->supplierListingCount($searchText); - $returns = $this->paginationCompress ( "supplierListing/", $count, 5 ); + $returns = $this->paginationCompress ( "supplierListing/", $count, 15 ); $data['userRecords'] = $this->supplier_model->supplierListing($searchText, $returns["page"], $returns["segment"]); $this->global['pageTitle'] = 'Siddharth : Supplier Listing'; $this->loadViews("supplierListing", $this->global, $data, NULL); - } + } /** * This function is used to load the add new supplier */ function addsupplier() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { $this->load->model('supplier_model'); //$data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); //$data['users'] = $this->purchaseorder_model->getusers(); @@ -76,7 +65,7 @@ class supplier extends BaseController $this->global['pageTitle'] = 'siddharth : AddNew Supplier'; $this->loadViews("addsupplier", $this->global, NULL); - } + } /** @@ -84,17 +73,12 @@ class supplier extends BaseController */ function addNewsupplier() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { + $this->load->library('form_validation'); - $PO = $this->input->post('SupplierID'); + $SupplierID = $this->input->post('SupplierID'); - $this->form_validation->set_rules('SupplierName','Supplier Name','trim'); + $this->form_validation->set_rules('SupplierName','Supplier Name','trim|'); $this->form_validation->set_rules('Address','Address','trim|required|'); $this->form_validation->set_rules('ContactNumber','Contact Number','trim||numeric'); $this->form_validation->set_rules('AlternateContactNumber','Alternate Contact Number','trim||numeric'); @@ -126,16 +110,16 @@ class supplier extends BaseController if($result > 0) { - $this->session->set_flashdata('success', 'New PO created successfully'); + $this->session->set_flashdata('success', 'New Supplier created successfully'); } else { - $this->session->set_flashdata('error', 'PO Not Create'); + $this->session->set_flashdata('error', 'Supplier Not Create'); } - redirect('supplierlisting'); + redirect('addsupplier'); } - } + } /** * This function is used load user edit information @@ -143,24 +127,16 @@ class supplier extends BaseController */ function editOldsupplier($supplierID = NULL) { - if($this->isAdmin() == TRUE || $supplierID == 1) - { - $this->loadThis(); - } - else - { - if($supplierID == null) - { - redirect(''); - } + + //$data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); - //$data['users'] = $this->purchaseorder_model->getusers(); + $data['supplier'] = $this->supplier_model->getUserInfo($supplierID); - $this->global['pageTitle'] = 'Siddharth : Edit User'; + $this->global['pageTitle'] = 'Siddharth : Edit Supplier'; - $this->loadViews("editOldsupplier", $this->global, NULL); - } + $this->loadViews("editOldsupplier", $this->global,$data, NULL); + } /** @@ -168,71 +144,87 @@ class supplier extends BaseController */ function editsupplier() { - if($this->isAdmin() == TRUE) - { - $this->loadThis(); - } - else - { + + + + + + $this->load->library('form_validation'); - $PO = $this->input->post('PO'); + $supplierID = $this->input->post('supplierID'); - $this->form_validation->set_rules('POType','PO Type','trim|required|'); - $this->form_validation->set_rules('PODate','PO Date','trim|required|'); - $this->form_validation->set_rules('SupplierID','SupplierID','trim|required|'); - $this->form_validation->set_rules('SpecialOrder','Special Requirement of order','|max_length[20]'); - $this->form_validation->set_rules('role','UserID','trim||numeric'); - $this->form_validation->set_rules('reemail','Requester email','trim|valid_email|xss_clean|max_length[128]'); - $this->form_validation->set_rules('rephone','Requester ph','required|min_length[10]|xss_clean'); - $this->form_validation->set_rules('reDate','Requested Date','required'); - $this->form_validation->set_rules('budmanager','Budget Manager'); - $this->form_validation->set_rules('budmanagerde','Budget Manager Department','trim'); - $this->form_validation->set_rules('PurchasingCategory','Purchasing Category','trim'); + $this->form_validation->set_rules('SupplierName','Supplier Name','trim'); + $this->form_validation->set_rules('Address','Address','trim|required|'); + $this->form_validation->set_rules('ContactNumber','Contact Number','trim||numeric'); + $this->form_validation->set_rules('AlternateContactNumber','Alternate Contact Number','trim||numeric'); + $this->form_validation->set_rules('EmailAddress','Email Address|valid_email|xss_clean|max_length[128]'); + $this->form_validation->set_rules('TIN','TIN','trim|required'); + $this->form_validation->set_rules('PAN','PAN','required'); if($this->form_validation->run() == FALSE) { - $this->editPO(); + $this->editsupplier($supplierID); } else { - $POType = ucwords(strtolower($this->input->post('POType'))); - $PODate = $this->input->post('PODate'); - $SupplierID = $this->input->post('SupplierID'); - $SpecialOrder = $this->input->post('SpecialOrder'); - $role = $this->input->post('role'); - $reemail = $this->input->post('reemail'); - $rephone = $this->input->post('rephone'); - $reDate = $this->input->post('reDate'); - $budmanager = $this->input->post('budmanager'); - $budmanagerde = $this->input->post('budmanagerde'); - $Purcategory = $this->input->post('PurchasingCategory'); + $supplierID = $this->input->post('SupplierID'); + $SupplierName = ucwords(strtolower($this->input->post('SupplierName'))); + $Address = $this->input->post('Address'); + $ContactNumber = $this->input->post('ContactNumber'); + $AlternateContactNumber = $this->input->post('AlternateContactNumber'); + $EmailAddress = $this->input->post('EmailAddress'); + $TIN = $this->input->post('TIN'); + $PAN = $this->input->post('PAN'); + $supplier = array(); + + if(empty($ContactNumber)) + { + $supplier = array('SupplierID'=>$SupplierID,'SupplierName'=>$SupplierName, 'Address'=>$Address, 'ContactNumber'=>$ContactNumber, 'AlternateContactNumber'=> $AlternateContactNumber,'EmailAddress'=>$EmailAddress,'TIN'=>$TIN,'PAN'=>$PAN,'createdDate'=>date('Y-m-d H:i:sa')); + } + else{ + $supplier = array('SupplierName'=>$SupplierName, 'Address'=>$Address, 'ContactNumber'=>$ContactNumber, 'AlternateContactNumber'=> $AlternateContactNumber,'EmailAddress'=>$EmailAddress,'TIN'=>$TIN,'PAN'=>$PAN,'createdDate'=>date('Y-m-d H:i:sa')); + } - $supplier = array('POType'=>$POType, 'PODate'=>$PODate, 'SupplierID'=>$SupplierID, 'SpecialOrder'=> $SpecialOrder,'UserID'=>$role,'RequestedDate'=>$reDate,'RequesterEmail'=>$reemail,'RequesterPh'=>$rephone, 'PurchasingCategory'=>$Purcategory,'BudgetManager'=>$budmanager,'BudgetManagerDepartment'=>$budmanagerde,'createdBy'=>$this->vendorId, 'createdDtm'=>date('Y-m-d H:i:sa')); - - $supplier = array(); - - $result = $this->supplier_model->editPO($supplier, $supplierID); + $result = $this->supplier_model->editsupplier($supplier, $supplierID); + + if($result == true) { - $this->session->set_flashdata('success', 'PO updated successfully'); + $this->session->set_flashdata('success', 'supplier updated successfully'); } else { - $this->session->set_flashdata('error', 'PO updation failed'); + $this->session->set_flashdata('error', 'supplier updation failed'); } redirect('supplierListing'); } - } + } + function viewsupplier($supplierID = NULL) + { + + + + + //$data['SupplierName'] = $this->purchaseorder_model->getSupplierName(); + $data['supplier'] = $this->supplier_model->getuserInfo($supplierID); + + $this->global['pageTitle'] = 'Siddharth : view Supplier'; + + $this->loadViews("viewsupplier", $this->global,$data, NULL); + + } + + /** * This function is used to delete the user using userId * @return boolean $result : TRUE / FALSE - */ + function deleteUser() { if($this->isAdmin() == TRUE) @@ -249,12 +241,12 @@ class supplier extends BaseController if ($result > 0) { echo(json_encode(array('status'=>TRUE))); } else { echo(json_encode(array('status'=>FALSE))); } } - } + }*/ function pageNotFound() { - $this->global['pageTitle'] = 'CodeInsect : 404 - Page Not Found'; + $this->global['pageTitle'] = 'Siddharth : 404 - Page Not Found'; $this->loadViews("404", $this->global, NULL, NULL); } diff --git a/application/controllers/user.php b/application/controllers/user.php index afff6310..6bef43f4 100644 --- a/application/controllers/user.php +++ b/application/controllers/user.php @@ -55,7 +55,7 @@ class User extends BaseController $data['userRecords'] = $this->user_model->userListing($searchText, $returns["page"], $returns["segment"]); - $this->global['pageTitle'] = 'CodeInsect : User Listing'; + $this->global['pageTitle'] = 'Siddharth : User Listing'; $this->loadViews("users", $this->global, $data, NULL); } @@ -76,7 +76,7 @@ class User extends BaseController $this->load->model('user_model'); $data['roles'] = $this->user_model->getUserRoles(); - $this->global['pageTitle'] = 'CodeInsect : Add New User'; + $this->global['pageTitle'] = 'Siddharth : Add New User'; $this->loadViews("addNew", $this->global, $data, NULL); } @@ -146,7 +146,7 @@ class User extends BaseController { $this->session->set_flashdata('error', 'User creation failed'); } - + echo $result; redirect('addNew'); } } @@ -272,7 +272,7 @@ class User extends BaseController */ function loadChangePass() { - $this->global['pageTitle'] = 'CodeInsect : Change Password'; + $this->global['pageTitle'] = 'Siddharth : Change Password'; $this->loadViews("changePassword", $this->global, NULL, NULL); } @@ -322,7 +322,7 @@ class User extends BaseController function pageNotFound() { - $this->global['pageTitle'] = 'CodeInsect : 404 - Page Not Found'; + $this->global['pageTitle'] = 'Siddharth : 404 - Page Not Found'; $this->loadViews("404", $this->global, NULL, NULL); } diff --git a/application/libraries/Grocery_CRUD.php b/application/libraries/Grocery_CRUD.php deleted file mode 100644 index 5850e98a..00000000 --- a/application/libraries/Grocery_CRUD.php +++ /dev/null @@ -1,5628 +0,0 @@ - - */ - -// ------------------------------------------------------------------------ - -/** - * grocery Field Types - * - * The types of the fields and the default reactions - * - * @package grocery CRUD - * @author John Skoumbourdis - * @license https://github.com/scoumbourdis/grocery-crud/blob/master/license-grocery-crud.txt - * @link http://www.grocerycrud.com/documentation - */ -class grocery_CRUD_Field_Types -{ - /** - * Gets the field types of the main table. - * @return array - */ - public function get_field_types() - { - if ($this->field_types !== null) { - return $this->field_types; - } - - $types = array(); - foreach($this->basic_model->get_field_types_basic_table() as $field_info) - { - $field_info->required = !empty($this->required_fields) && in_array($field_info->name,$this->required_fields) ? true : false; - - $field_info->display_as = - isset($this->display_as[$field_info->name]) ? - $this->display_as[$field_info->name] : - ucfirst(str_replace("_"," ",$field_info->name)); - - if($this->change_field_type !== null && isset($this->change_field_type[$field_info->name])) - { - $field_type = $this->change_field_type[$field_info->name]; - - if (isset($this->relation[$field_info->name])) { - $field_info->crud_type = "relation_".$field_type->type; - } - elseif (isset($this->upload_fields[$field_info->name])) { - $field_info->crud_type = "upload_file_".$field_type->type; - } else { - $field_info->crud_type = $field_type->type; - $field_info->extras = $field_type->extras; - } - - $real_type = $field_info->crud_type; - } - elseif(isset($this->relation[$field_info->name])) - { - $real_type = 'relation'; - $field_info->crud_type = 'relation'; - } - elseif(isset($this->upload_fields[$field_info->name])) - { - $real_type = 'upload_file'; - $field_info->crud_type = 'upload_file'; - } - else - { - $real_type = $this->get_type($field_info); - $field_info->crud_type = $real_type; - } - - switch ($real_type) { - case 'text': - if(!empty($this->unset_texteditor) && in_array($field_info->name,$this->unset_texteditor)) - $field_info->extras = false; - else - $field_info->extras = 'text_editor'; - break; - - case 'relation': - case 'relation_readonly': - $field_info->extras = $this->relation[$field_info->name]; - break; - - case 'upload_file': - case 'upload_file_readonly': - $field_info->extras = $this->upload_fields[$field_info->name]; - break; - - default: - if(empty($field_info->extras)) - $field_info->extras = false; - break; - } - - $types[$field_info->name] = $field_info; - } - - if(!empty($this->relation_n_n)) - { - foreach($this->relation_n_n as $field_name => $field_extras) - { - $is_read_only = $this->change_field_type !== null - && isset($this->change_field_type[$field_name]) - && $this->change_field_type[$field_name]->type == 'readonly' - ? true : false; - $field_info = (object)array(); - $field_info->name = $field_name; - $field_info->crud_type = $is_read_only ? 'readonly' : 'relation_n_n'; - $field_info->extras = $field_extras; - $field_info->required = !empty($this->required_fields) && in_array($field_name,$this->required_fields) ? true : false;; - $field_info->display_as = - isset($this->display_as[$field_name]) ? - $this->display_as[$field_name] : - ucfirst(str_replace("_"," ",$field_name)); - - $types[$field_name] = $field_info; - } - } - - if(!empty($this->add_fields)) - foreach($this->add_fields as $field_object) - { - $field_name = isset($field_object->field_name) ? $field_object->field_name : $field_object; - - if(!isset($types[$field_name]))//Doesn't exist in the database? Create it for the CRUD - { - $extras = false; - if($this->change_field_type !== null && isset($this->change_field_type[$field_name])) - { - $field_type = $this->change_field_type[$field_name]; - $extras = $field_type->extras; - } - - $field_info = (object)array( - 'name' => $field_name, - 'crud_type' => $this->change_field_type !== null && isset($this->change_field_type[$field_name]) ? - $this->change_field_type[$field_name]->type : - 'string', - 'display_as' => isset($this->display_as[$field_name]) ? - $this->display_as[$field_name] : - ucfirst(str_replace("_"," ",$field_name)), - 'required' => !empty($this->required_fields) && in_array($field_name,$this->required_fields) ? true : false, - 'extras' => $extras - ); - - $types[$field_name] = $field_info; - } - } - - if(!empty($this->edit_fields)) - foreach($this->edit_fields as $field_object) - { - $field_name = isset($field_object->field_name) ? $field_object->field_name : $field_object; - - if(!isset($types[$field_name]))//Doesn't exist in the database? Create it for the CRUD - { - $extras = false; - if($this->change_field_type !== null && isset($this->change_field_type[$field_name])) - { - $field_type = $this->change_field_type[$field_name]; - $extras = $field_type->extras; - } - - $field_info = (object)array( - 'name' => $field_name, - 'crud_type' => $this->change_field_type !== null && isset($this->change_field_type[$field_name]) ? - $this->change_field_type[$field_name]->type : - 'string', - 'display_as' => isset($this->display_as[$field_name]) ? - $this->display_as[$field_name] : - ucfirst(str_replace("_"," ",$field_name)), - 'required' => in_array($field_name,$this->required_fields) ? true : false, - 'extras' => $extras - ); - - $types[$field_name] = $field_info; - } - } - - $this->field_types = $types; - - return $this->field_types; - } - - public function get_primary_key() - { - return $this->basic_model->get_primary_key(); - } - - /** - * Get the html input for the specific field with the - * current value - * - * @param object $field_info - * @param string $value - * @return object - */ - protected function get_field_input($field_info, $value = null) - { - $real_type = $field_info->crud_type; - - $types_array = array( - 'integer', - 'text', - 'true_false', - 'string', - 'date', - 'datetime', - 'enum', - 'set', - 'relation', - 'relation_readonly', - 'relation_n_n', - 'upload_file', - 'upload_file_readonly', - 'hidden', - 'password', - 'readonly', - 'dropdown', - 'multiselect' - ); - - if (in_array($real_type,$types_array)) { - /* A quick way to go to an internal method of type $this->get_{type}_input . - * For example if the real type is integer then we will use the method - * $this->get_integer_input - * */ - $field_info->input = $this->{"get_".$real_type."_input"}($field_info,$value); - } - else - { - $field_info->input = $this->get_string_input($field_info,$value); - } - - return $field_info; - } - - protected function change_list_value($field_info, $value = null) - { - $real_type = $field_info->crud_type; - - switch ($real_type) { - case 'hidden': - case 'invisible': - case 'integer': - - break; - case 'true_false': - if(is_array($field_info->extras) && array_key_exists($value,$field_info->extras)) { - $value = $field_info->extras[$value]; - } else if(isset($this->default_true_false_text[$value])) { - $value = $this->default_true_false_text[$value]; - } - break; - case 'string': - $value = $this->character_limiter($value,$this->character_limiter,"..."); - break; - case 'text': - $value = $this->character_limiter(strip_tags($value),$this->character_limiter,"..."); - break; - case 'date': - if(!empty($value) && $value != '0000-00-00' && $value != '1970-01-01') - { - list($year,$month,$day) = explode("-",$value); - - $value = date($this->php_date_format, mktime (0, 0, 0, (int)$month , (int)$day , (int)$year)); - } - else - { - $value = ''; - } - break; - case 'datetime': - if(!empty($value) && $value != '0000-00-00 00:00:00' && $value != '1970-01-01 00:00:00') - { - list($year,$month,$day) = explode("-",$value); - list($hours,$minutes) = explode(":",substr($value,11)); - - $value = date($this->php_date_format." - H:i", mktime ((int)$hours , (int)$minutes , 0, (int)$month , (int)$day ,(int)$year)); - } - else - { - $value = ''; - } - break; - case 'enum': - $value = $this->character_limiter($value,$this->character_limiter,"..."); - break; - - case 'multiselect': - $value_as_array = array(); - foreach(explode(",",$value) as $row_value) - { - $value_as_array[] = array_key_exists($row_value,$field_info->extras) ? $field_info->extras[$row_value] : $row_value; - } - $value = implode(",",$value_as_array); - break; - - case 'relation_n_n': - $value = $this->character_limiter(str_replace(',',', ',$value),$this->character_limiter,"..."); - break; - - case 'password': - $value = '******'; - break; - - case 'dropdown': - $value = array_key_exists($value,$field_info->extras) ? $field_info->extras[$value] : $value; - break; - - case 'upload_file': - if(empty($value)) - { - $value = ""; - } - else - { - $is_image = !empty($value) && - ( substr($value,-4) == '.jpg' - || substr($value,-4) == '.png' - || substr($value,-5) == '.jpeg' - || substr($value,-4) == '.gif' - || substr($value,-5) == '.tiff') - ? true : false; - - $file_url = base_url().$field_info->extras->upload_path."/$value"; - - $file_url_anchor = ''; - } - else - { - $file_url_anchor .= ' target="_blank">'.$this->character_limiter($value,$this->character_limiter,'...',true); - } - $file_url_anchor .= ''; - - $value = $file_url_anchor; - } - break; - - default: - $value = $this->character_limiter($value,$this->character_limiter,"..."); - break; - } - - return $value; - } - - /** - * Character Limiter of codeigniter (I just don't want to load the helper ) - * - * Limits the string based on the character count. Preserves complete words - * so the character count may not be exactly as specified. - * - * @access public - * @param string - * @param integer - * @param string the end character. Usually an ellipsis - * @return string - */ - function character_limiter($str, $n = 500, $end_char = '…') - { - if (strlen($str) < $n) - { - return $str; - } - - // a bit complicated, but faster than preg_replace with \s+ - $str = preg_replace('/ {2,}/', ' ', str_replace(array("\r", "\n", "\t", "\x0B", "\x0C"), ' ', $str)); - - if (strlen($str) <= $n) - { - return $str; - } - - $out = ''; - foreach (explode(' ', trim($str)) as $val) - { - $out .= $val.' '; - - if (strlen($out) >= $n) - { - $out = trim($out); - return (strlen($out) === strlen($str)) ? $out : $out.$end_char; - } - } - } - - protected function get_type($db_type) - { - $type = false; - if(!empty($db_type->type)) - { - switch ($db_type->type) { - case '1': - case '3': - case 'int': - case 'tinyint': - case 'mediumint': - case 'longint': - if( $db_type->db_type == 'tinyint' && $db_type->db_max_length == 1) - $type = 'true_false'; - else - $type = 'integer'; - break; - case '254': - case 'string': - case 'enum': - if($db_type->db_type != 'enum') - $type = 'string'; - else - $type = 'enum'; - break; - case 'set': - if($db_type->db_type != 'set') - $type = 'string'; - else - $type = 'set'; - break; - case '252': - case 'blob': - case 'text': - case 'mediumtext': - case 'longtext': - $type = 'text'; - break; - case '10': - case 'date': - $type = 'date'; - break; - case '12': - case 'datetime': - case 'timestamp': - $type = 'datetime'; - break; - } - } - return $type; - } -} - -// ------------------------------------------------------------------------ - -/** - * Grocery Model Driver - * - * Drives the model - I'ts so easy like you drive a bicycle :-) - * - * @package grocery CRUD - * @author John Skoumbourdis - * @version 1.5.8 - * @link http://www.grocerycrud.com/documentation - */ -class grocery_CRUD_Model_Driver extends grocery_CRUD_Field_Types -{ - /** - * @var Grocery_crud_model - */ - public $basic_model = null; - - protected function set_default_Model() - { - $ci = &get_instance(); - $ci->load->model('Grocery_crud_model'); - - $this->basic_model = new Grocery_crud_model(); - } - - protected function get_total_results() - { - if(!empty($this->where)) - foreach($this->where as $where) - $this->basic_model->where($where[0],$where[1],$where[2]); - - if(!empty($this->or_where)) - foreach($this->or_where as $or_where) - $this->basic_model->or_where($or_where[0],$or_where[1],$or_where[2]); - - if(!empty($this->like)) - foreach($this->like as $like) - $this->basic_model->like($like[0],$like[1],$like[2]); - - if(!empty($this->or_like)) - foreach($this->or_like as $or_like) - $this->basic_model->or_like($or_like[0],$or_like[1],$or_like[2]); - - if(!empty($this->having)) - foreach($this->having as $having) - $this->basic_model->having($having[0],$having[1],$having[2]); - - if(!empty($this->or_having)) - foreach($this->or_having as $or_having) - $this->basic_model->or_having($or_having[0],$or_having[1],$or_having[2]); - - if(!empty($this->relation)) - foreach($this->relation as $relation) - $this->basic_model->join_relation($relation[0],$relation[1],$relation[2]); - - if(!empty($this->relation_n_n)) - { - $columns = $this->get_columns(); - foreach($columns as $column) - { - //Use the relation_n_n ONLY if the column is called . The set_relation_n_n are slow and it will make the table slower without any reason as we don't need those queries. - if(isset($this->relation_n_n[$column->field_name])) - { - $this->basic_model->set_relation_n_n_field($this->relation_n_n[$column->field_name]); - } - } - - } - - return $this->basic_model->get_total_results(); - } - - protected function filter_data_from_xss($post_data) { - foreach ($post_data as $field_name => $rawData) { - if (!is_array($rawData)) { - $post_data[$field_name] = filter_var(strip_tags($rawData)); - } - } - return $post_data; - } - - public function set_model($model_name) - { - $ci = &get_instance(); - $ci->load->model('Grocery_crud_model'); - - $ci->load->model($model_name); - - $temp = explode('/',$model_name); - krsort($temp); - foreach($temp as $t) - { - $real_model_name = $t; - break; - } - - $this->basic_model = $ci->$real_model_name; - } - - protected function set_ajax_list_queries($state_info = null) - { - if(!empty($state_info->per_page)) - { - if(empty($state_info->page) || !is_numeric($state_info->page) ) - $this->limit($state_info->per_page); - else - { - $limit_page = ( ($state_info->page-1) * $state_info->per_page ); - $this->limit($state_info->per_page, $limit_page); - } - } - - if(!empty($state_info->order_by)) - { - $this->order_by($state_info->order_by[0],$state_info->order_by[1]); - } - - if(!empty($state_info->search)) - { - if (!empty($this->relation)) { - foreach ($this->relation as $relation_name => $relation_values) { - $temp_relation[$this->_unique_field_name($relation_name)] = $this->_get_field_names_to_search($relation_values); - } - } - - if (is_array($state_info->search)) { - foreach ($state_info->search as $search_field => $search_text) { - - - if (isset($temp_relation[$search_field])) { - if (is_array($temp_relation[$search_field])) { - foreach ($temp_relation[$search_field] as $relation_field) { - $this->or_like($relation_field , $search_text); - } - } else { - $this->like($temp_relation[$search_field] , $search_text); - } - } elseif(isset($this->relation_n_n[$search_field])) { - $escaped_text = $this->basic_model->escape_str($search_text); - $this->having($search_field." LIKE '%".$escaped_text."%'"); - } else { - $this->like($search_field, $search_text); - } - - - - } - } elseif ($state_info->search->field !== null) { - if (isset($temp_relation[$state_info->search->field])) { - if (is_array($temp_relation[$state_info->search->field])) { - foreach ($temp_relation[$state_info->search->field] as $search_field) { - $this->or_like($search_field , $state_info->search->text); - } - } else { - $this->like($temp_relation[$state_info->search->field] , $state_info->search->text); - } - } elseif(isset($this->relation_n_n[$state_info->search->field])) { - $escaped_text = $this->basic_model->escape_str($state_info->search->text); - $this->having($state_info->search->field." LIKE '%".$escaped_text."%'"); - } else { - $this->like($state_info->search->field , $state_info->search->text); - } - } - else - { - $columns = $this->get_columns(); - - $search_text = $state_info->search->text; - - if(!empty($this->where)) - foreach($this->where as $where) - $this->basic_model->having($where[0],$where[1],$where[2]); - - foreach($columns as $column) - { - if(isset($temp_relation[$column->field_name])) - { - if(is_array($temp_relation[$column->field_name])) - { - foreach($temp_relation[$column->field_name] as $search_field) - { - $this->or_like($search_field, $search_text); - } - } - else - { - $this->or_like($temp_relation[$column->field_name], $search_text); - } - } - elseif(isset($this->relation_n_n[$column->field_name])) - { - //@todo have a where for the relation_n_n statement - } - else - { - $this->or_like($column->field_name, $search_text); - } - } - } - } - } - - protected function table_exists($table_name = null) - { - if($this->basic_model->db_table_exists($table_name)) - return true; - return false; - } - - protected function get_relation_array($relation_info, $primary_key_value = null, $limit = null) - { - list($field_name , $related_table , $related_field_title, $where_clause, $order_by) = $relation_info; - - if($primary_key_value !== null) - { - $primary_key = $this->basic_model->get_primary_key($related_table); - - //A where clause with the primary key is enough to take the selected key row - $where_clause = array($primary_key => $primary_key_value); - } - - $relation_array = $this->basic_model->get_relation_array($field_name , $related_table , $related_field_title, $where_clause, $order_by, $limit); - - return $relation_array; - } - - protected function get_relation_total_rows($relation_info) - { - list($field_name , $related_table , $related_field_title, $where_clause) = $relation_info; - - $relation_array = $this->basic_model->get_relation_total_rows($field_name , $related_table , $related_field_title, $where_clause); - - return $relation_array; - } - - protected function db_insert_validation() - { - $validation_result = (object)array('success'=>false); - - $field_types = $this->get_field_types(); - $required_fields = $this->required_fields; - $unique_fields = $this->_unique_fields; - $add_fields = $this->get_add_fields(); - - if(!empty($required_fields)) - { - foreach($add_fields as $add_field) - { - $field_name = $add_field->field_name; - if(!isset($this->validation_rules[$field_name]) && in_array( $field_name, $required_fields) ) - { - $this->set_rules( $field_name, $field_types[$field_name]->display_as, 'required'); - } - } - } - - /** Checking for unique fields. If the field value is not unique then - * return a validation error straight away, if not continue... */ - if(!empty($unique_fields)) - { - $form_validation = $this->form_validation(); - - foreach($add_fields as $add_field) - { - $field_name = $add_field->field_name; - if(in_array( $field_name, $unique_fields) ) - { - $form_validation->set_rules( $field_name, - $field_types[$field_name]->display_as, - 'is_unique['.$this->basic_db_table.'.'.$field_name.']'); - } - } - - if(!$form_validation->run()) - { - $validation_result->error_message = $form_validation->error_string(); - $validation_result->error_fields = $form_validation->_error_array; - - return $validation_result; - } - } - - if(!empty($this->validation_rules)) - { - $form_validation = $this->form_validation(); - - $add_fields = $this->get_add_fields(); - - foreach($add_fields as $add_field) - { - $field_name = $add_field->field_name; - if(isset($this->validation_rules[$field_name])) - { - $rule = $this->validation_rules[$field_name]; - $form_validation->set_rules($rule['field'],$rule['label'],$rule['rules'],$rule['errors']); - } - } - - if($form_validation->run()) - { - $validation_result->success = true; - } - else - { - $validation_result->error_message = $form_validation->error_string(); - $validation_result->error_fields = $form_validation->_error_array; - } - } - else - { - $validation_result->success = true; - } - - return $validation_result; - } - - protected function form_validation() - { - if($this->form_validation === null) - { - $this->form_validation = new grocery_CRUD_Form_validation(); - $ci = &get_instance(); - $ci->load->library('form_validation'); - $ci->form_validation = $this->form_validation; - } - return $this->form_validation; - } - - protected function db_update_validation() - { - $validation_result = (object)array('success'=>false); - - $field_types = $this->get_field_types(); - $required_fields = $this->required_fields; - $unique_fields = $this->_unique_fields; - $edit_fields = $this->get_edit_fields(); - - if(!empty($required_fields)) - { - foreach($edit_fields as $edit_field) - { - $field_name = $edit_field->field_name; - if(!isset($this->validation_rules[$field_name]) && in_array( $field_name, $required_fields) ) - { - $this->set_rules( $field_name, $field_types[$field_name]->display_as, 'required'); - } - } - } - - - /** Checking for unique fields. If the field value is not unique then - * return a validation error straight away, if not continue... */ - if(!empty($unique_fields)) - { - $form_validation = $this->form_validation(); - - $form_validation_check = false; - - foreach($edit_fields as $edit_field) - { - $field_name = $edit_field->field_name; - if(in_array( $field_name, $unique_fields) ) - { - $state_info = $this->getStateInfo(); - $primary_key = $this->get_primary_key(); - $field_name_value = $_POST[$field_name]; - - $this->basic_model->where($primary_key,$state_info->primary_key); - $row = $this->basic_model->get_row(); - - if(!isset($row->$field_name)) { - throw new Exception("The field name doesn't exist in the database. ". - "Please use the unique fields only for fields ". - "that exist in the database"); - } - - $previous_field_name_value = $row->$field_name; - - if(!empty($previous_field_name_value) && $previous_field_name_value != $field_name_value) { - $form_validation->set_rules( $field_name, - $field_types[$field_name]->display_as, - 'is_unique['.$this->basic_db_table.'.'.$field_name.']'); - - $form_validation_check = true; - } - } - } - - if($form_validation_check && !$form_validation->run()) - { - $validation_result->error_message = $form_validation->error_string(); - $validation_result->error_fields = $form_validation->_error_array; - - return $validation_result; - } - } - - if(!empty($this->validation_rules)) - { - $form_validation = $this->form_validation(); - - $edit_fields = $this->get_edit_fields(); - - foreach($edit_fields as $edit_field) - { - $field_name = $edit_field->field_name; - if(isset($this->validation_rules[$field_name])) - { - $rule = $this->validation_rules[$field_name]; - $form_validation->set_rules($rule['field'],$rule['label'],$rule['rules'],$rule['errors']); - } - } - - if($form_validation->run()) - { - $validation_result->success = true; - } - else - { - $validation_result->error_message = $form_validation->error_string(); - $validation_result->error_fields = $form_validation->_error_array; - } - } - else - { - $validation_result->success = true; - } - - return $validation_result; - } - - protected function db_insert($state_info) - { - $validation_result = $this->db_insert_validation(); - - if($validation_result->success) - { - $post_data = $state_info->unwrapped_data; - - if ($this->config->xss_clean) { - $post_data = $this->filter_data_from_xss($post_data); - } - - $add_fields = $this->get_add_fields(); - - if($this->callback_insert === null) - { - if($this->callback_before_insert !== null) - { - $callback_return = call_user_func($this->callback_before_insert, $post_data); - - if(!empty($callback_return) && is_array($callback_return)) - $post_data = $callback_return; - elseif($callback_return === false) - return false; - } - - $insert_data = array(); - $types = $this->get_field_types(); - foreach($add_fields as $num_row => $field) - { - /* If the multiselect or the set is empty then the browser doesn't send an empty array. Instead it sends nothing */ - if(isset($types[$field->field_name]->crud_type) && ($types[$field->field_name]->crud_type == 'set' || $types[$field->field_name]->crud_type == 'multiselect') && !isset($post_data[$field->field_name])) - { - $post_data[$field->field_name] = array(); - } - - if(isset($post_data[$field->field_name]) && !isset($this->relation_n_n[$field->field_name])) - { - if(isset($types[$field->field_name]->db_null) && $types[$field->field_name]->db_null && is_array($post_data[$field->field_name]) && empty($post_data[$field->field_name])) - { - $insert_data[$field->field_name] = null; - } - elseif(isset($types[$field->field_name]->db_null) && $types[$field->field_name]->db_null && $post_data[$field->field_name] === '') - { - $insert_data[$field->field_name] = null; - } - elseif(isset($types[$field->field_name]->crud_type) && $types[$field->field_name]->crud_type == 'date') - { - $insert_data[$field->field_name] = $this->_convert_date_to_sql_date($post_data[$field->field_name]); - } - elseif(isset($types[$field->field_name]->crud_type) && $types[$field->field_name]->crud_type == 'readonly') - { - //This empty if statement is to make sure that a readonly field will never inserted/updated - } - elseif(isset($types[$field->field_name]->crud_type) && ($types[$field->field_name]->crud_type == 'set' || $types[$field->field_name]->crud_type == 'multiselect')) - { - $insert_data[$field->field_name] = !empty($post_data[$field->field_name]) ? implode(',',$post_data[$field->field_name]) : ''; - } - elseif(isset($types[$field->field_name]->crud_type) && $types[$field->field_name]->crud_type == 'datetime'){ - $insert_data[$field->field_name] = $this->_convert_date_to_sql_date(substr($post_data[$field->field_name],0,10)). - substr($post_data[$field->field_name],10); - } - else - { - $insert_data[$field->field_name] = $post_data[$field->field_name]; - } - } - } - - $insert_result = $this->basic_model->db_insert($insert_data); - - if($insert_result !== false) - { - $insert_primary_key = $insert_result; - } - else - { - return false; - } - - if(!empty($this->relation_n_n)) - { - foreach($this->relation_n_n as $field_name => $field_info) - { - $relation_data = isset( $post_data[$field_name] ) ? $post_data[$field_name] : array() ; - $this->db_relation_n_n_update($field_info, $relation_data ,$insert_primary_key); - } - } - - if($this->callback_after_insert !== null) - { - $callback_return = call_user_func($this->callback_after_insert, $post_data, $insert_primary_key); - - if($callback_return === false) - { - return false; - } - - } - }else - { - $callback_return = call_user_func($this->callback_insert, $post_data); - - if($callback_return === false) - { - return false; - } - } - - if(isset($insert_primary_key)) - return $insert_primary_key; - else - return true; - } - - return false; - - } - - protected function db_update($state_info) - { - $validation_result = $this->db_update_validation(); - - $edit_fields = $this->get_edit_fields(); - - if($validation_result->success) - { - $post_data = $state_info->unwrapped_data; - $primary_key = $state_info->primary_key; - - if ($this->config->xss_clean) { - $post_data = $this->filter_data_from_xss($post_data); - } - - if($this->callback_update === null) - { - if($this->callback_before_update !== null) - { - $callback_return = call_user_func($this->callback_before_update, $post_data, $primary_key); - - if(!empty($callback_return) && is_array($callback_return)) - { - $post_data = $callback_return; - } - elseif($callback_return === false) - { - return false; - } - - } - - $update_data = array(); - $types = $this->get_field_types(); - foreach($edit_fields as $num_row => $field) - { - /* If the multiselect or the set is empty then the browser doesn't send an empty array. Instead it sends nothing */ - if(isset($types[$field->field_name]->crud_type) && ($types[$field->field_name]->crud_type == 'set' || $types[$field->field_name]->crud_type == 'multiselect') && !isset($post_data[$field->field_name])) - { - $post_data[$field->field_name] = array(); - } - - if(isset($post_data[$field->field_name]) && !isset($this->relation_n_n[$field->field_name])) - { - if(isset($types[$field->field_name]->db_null) && $types[$field->field_name]->db_null && is_array($post_data[$field->field_name]) && empty($post_data[$field->field_name])) - { - $update_data[$field->field_name] = null; - } - elseif(isset($types[$field->field_name]->db_null) && $types[$field->field_name]->db_null && $post_data[$field->field_name] === '') - { - $update_data[$field->field_name] = null; - } - elseif(isset($types[$field->field_name]->crud_type) && $types[$field->field_name]->crud_type == 'date') - { - $update_data[$field->field_name] = $this->_convert_date_to_sql_date($post_data[$field->field_name]); - } - elseif(isset($types[$field->field_name]->crud_type) && $types[$field->field_name]->crud_type == 'readonly') - { - //This empty if statement is to make sure that a readonly field will never inserted/updated - } - elseif(isset($types[$field->field_name]->crud_type) && ($types[$field->field_name]->crud_type == 'set' || $types[$field->field_name]->crud_type == 'multiselect')) - { - $update_data[$field->field_name] = !empty($post_data[$field->field_name]) ? implode(',',$post_data[$field->field_name]) : ''; - } - elseif(isset($types[$field->field_name]->crud_type) && $types[$field->field_name]->crud_type == 'datetime'){ - $update_data[$field->field_name] = $this->_convert_date_to_sql_date(substr($post_data[$field->field_name],0,10)). - substr($post_data[$field->field_name],10); - } - else - { - $update_data[$field->field_name] = $post_data[$field->field_name]; - } - } - } - - if($this->basic_model->db_update($update_data, $primary_key) === false) - { - return false; - } - - if(!empty($this->relation_n_n)) - { - foreach($this->relation_n_n as $field_name => $field_info) - { - if ( $this->unset_edit_fields !== null - && is_array($this->unset_edit_fields) - && in_array($field_name,$this->unset_edit_fields) - ) { - continue; - } - - $relation_data = isset( $post_data[$field_name] ) ? $post_data[$field_name] : array() ; - $this->db_relation_n_n_update($field_info, $relation_data ,$primary_key); - } - } - - if($this->callback_after_update !== null) - { - $callback_return = call_user_func($this->callback_after_update, $post_data, $primary_key); - - if($callback_return === false) - { - return false; - } - - } - } - else - { - $callback_return = call_user_func($this->callback_update, $post_data, $primary_key); - - if($callback_return === false) - { - return false; - } - } - - return true; - } - else - { - return false; - } - } - - protected function _convert_date_to_sql_date($date) - { - $date = substr($date,0,10); - if(preg_match('/\d{4}-\d{2}-\d{2}/',$date)) - { - //If it's already a sql-date don't convert it! - return $date; - }elseif(empty($date)) - { - return ''; - } - - $date_array = preg_split( '/[-\.\/ ]/', $date); - if($this->php_date_format == 'd/m/Y') - { - $sql_date = date('Y-m-d',mktime(0,0,0,$date_array[1],$date_array[0],$date_array[2])); - } - elseif($this->php_date_format == 'm/d/Y') - { - $sql_date = date('Y-m-d',mktime(0,0,0,$date_array[0],$date_array[1],$date_array[2])); - } - else - { - $sql_date = $date; - } - - return $sql_date; - } - - protected function _get_field_names_to_search(array $relation_values) - { - if(!strstr($relation_values[2],'{')) - return $this->_unique_join_name($relation_values[0]).'.'.$relation_values[2]; - else - { - $relation_values[2] = ' '.$relation_values[2].' '; - $temp1 = explode('{',$relation_values[2]); - unset($temp1[0]); - - $field_names_array = array(); - foreach($temp1 as $field) - list($field_names_array[]) = explode('}',$field); - - return $field_names_array; - } - } - - protected function _unique_join_name($field_name) - { - return 'j'.substr(md5($field_name),0,8); //This j is because is better for a string to begin with a letter and not a number - } - - protected function _unique_field_name($field_name) - { - return 's'.substr(md5($field_name),0,8); //This s is because is better for a string to begin with a letter and not a number - } - - protected function db_multiple_delete($state_info) - { - foreach ($state_info->ids as $delete_id) { - $result = $this->db_delete((object)array('primary_key' => $delete_id)); - if (!$result) { - return false; - } - } - - return true; - } - - protected function db_delete($state_info) - { - $primary_key_value = $state_info->primary_key; - - if($this->callback_delete === null) - { - if($this->callback_before_delete !== null) - { - $callback_return = call_user_func($this->callback_before_delete, $primary_key_value); - - if($callback_return === false) - { - return false; - } - - } - - if(!empty($this->relation_n_n)) - { - foreach($this->relation_n_n as $field_name => $field_info) - { - $this->db_relation_n_n_delete( $field_info, $primary_key_value ); - } - } - - $delete_result = $this->basic_model->db_delete($primary_key_value); - - if($delete_result === false) - { - return false; - } - - if($this->callback_after_delete !== null) - { - $callback_return = call_user_func($this->callback_after_delete, $primary_key_value); - - if($callback_return === false) - { - return false; - } - - } - } - else - { - $callback_return = call_user_func($this->callback_delete, $primary_key_value); - - if($callback_return === false) - { - return false; - } - } - - return true; - } - - protected function db_relation_n_n_update($field_info, $post_data , $primary_key_value) - { - $this->basic_model->db_relation_n_n_update($field_info, $post_data , $primary_key_value); - } - - protected function db_relation_n_n_delete($field_info, $primary_key_value) - { - $this->basic_model->db_relation_n_n_delete($field_info, $primary_key_value); - } - - protected function get_list() - { - if(!empty($this->order_by)) - $this->basic_model->order_by($this->order_by[0],$this->order_by[1]); - - if(!empty($this->where)) - foreach($this->where as $where) - $this->basic_model->where($where[0],$where[1],$where[2]); - - if(!empty($this->or_where)) - foreach($this->or_where as $or_where) - $this->basic_model->or_where($or_where[0],$or_where[1],$or_where[2]); - - if(!empty($this->like)) - foreach($this->like as $like) - $this->basic_model->like($like[0],$like[1],$like[2]); - - if(!empty($this->or_like)) - foreach($this->or_like as $or_like) - $this->basic_model->or_like($or_like[0],$or_like[1],$or_like[2]); - - if(!empty($this->having)) - foreach($this->having as $having) - $this->basic_model->having($having[0],$having[1],$having[2]); - - if(!empty($this->or_having)) - foreach($this->or_having as $or_having) - $this->basic_model->or_having($or_having[0],$or_having[1],$or_having[2]); - - if(!empty($this->relation)) - foreach($this->relation as $relation) - $this->basic_model->join_relation($relation[0],$relation[1],$relation[2]); - - if(!empty($this->relation_n_n)) - { - $columns = $this->get_columns(); - foreach($columns as $column) - { - //Use the relation_n_n ONLY if the column is called . The set_relation_n_n are slow and it will make the table slower without any reason as we don't need those queries. - if(isset($this->relation_n_n[$column->field_name])) - { - $this->basic_model->set_relation_n_n_field($this->relation_n_n[$column->field_name]); - } - } - - } - - if($this->theme_config['crud_paging'] === true) - { - if($this->limit === null) - { - $default_per_page = $this->config->default_per_page; - if(is_numeric($default_per_page) && $default_per_page >1) - { - $this->basic_model->limit($default_per_page); - } - else - { - $this->basic_model->limit(10); - } - } - else - { - $this->basic_model->limit($this->limit[0],$this->limit[1]); - } - } - - $results = $this->basic_model->get_list(); - - return $results; - } - - protected function get_edit_values($primary_key_value) - { - $values = $this->basic_model->get_edit_values($primary_key_value); - - if(!empty($this->relation_n_n)) - { - foreach($this->relation_n_n as $field_name => $field_info) - { - $values->$field_name = $this->get_relation_n_n_selection_array($primary_key_value, $field_info); - } - } - - return $values; - } - - protected function get_relation_n_n_selection_array($primary_key_value, $field_info) - { - return $this->basic_model->get_relation_n_n_selection_array($primary_key_value, $field_info); - } - - protected function get_relation_n_n_unselected_array($field_info, $selected_values) - { - return $this->basic_model->get_relation_n_n_unselected_array($field_info, $selected_values); - } - - protected function set_basic_db_table($table_name = null) - { - $this->basic_model->set_basic_table($table_name); - } - - protected function upload_file($state_info) - { - if(isset($this->upload_fields[$state_info->field_name]) ) - { - if($this->callback_upload === null) - { - if($this->callback_before_upload !== null) - { - $callback_before_upload_response = call_user_func($this->callback_before_upload, $_FILES, $this->upload_fields[$state_info->field_name]); - - if($callback_before_upload_response === false) - return false; - elseif(is_string($callback_before_upload_response)) - return $callback_before_upload_response; - } - - $upload_info = $this->upload_fields[$state_info->field_name]; - - header('Pragma: no-cache'); - header('Cache-Control: private, no-cache'); - header('Content-Disposition: inline; filename="files.json"'); - header('X-Content-Type-Options: nosniff'); - header('Access-Control-Allow-Origin: *'); - header('Access-Control-Allow-Methods: OPTIONS, HEAD, GET, POST, PUT, DELETE'); - header('Access-Control-Allow-Headers: X-File-Name, X-File-Type, X-File-Size'); - - $allowed_files = $this->config->file_upload_allow_file_types; - - $reg_exp = ''; - if(!empty($upload_info->allowed_file_types)){ - $reg_exp = '/(\\.|\\/)('.$upload_info->allowed_file_types.')$/i'; - }else{ - $reg_exp = '/(\\.|\\/)('.$allowed_files.')$/i'; - } - - $max_file_size_ui = $this->config->file_upload_max_file_size; - $max_file_size_bytes = $this->_convert_bytes_ui_to_bytes($max_file_size_ui); - - $options = array( - 'upload_dir' => $upload_info->upload_path.'/', - 'param_name' => $this->_unique_field_name($state_info->field_name), - 'upload_url' => base_url().$upload_info->upload_path.'/', - 'accept_file_types' => $reg_exp, - 'max_file_size' => $max_file_size_bytes - ); - $upload_handler = new UploadHandler($options); - $upload_handler->default_config_path = $this->default_config_path; - $uploader_response = $upload_handler->post(); - - if(is_array($uploader_response)) - { - foreach($uploader_response as &$response) - { - unset($response->delete_url); - unset($response->delete_type); - } - } - - if($this->callback_after_upload !== null) - { - $callback_after_upload_response = call_user_func($this->callback_after_upload, $uploader_response , $this->upload_fields[$state_info->field_name] , $_FILES ); - - if($callback_after_upload_response === false) - return false; - elseif(is_string($callback_after_upload_response)) - return $callback_after_upload_response; - elseif(is_array($callback_after_upload_response)) - $uploader_response = $callback_after_upload_response; - } - - return $uploader_response; - } - else - { - $upload_response = call_user_func($this->callback_upload, $_FILES, $this->upload_fields[$state_info->field_name] ); - - if($upload_response === false) - { - return false; - } - else - { - return $upload_response; - } - } - } - else - { - return false; - } - } - - protected function delete_file($state_info) - { - - if(isset($state_info->field_name) && isset($this->upload_fields[$state_info->field_name])) - { - $upload_info = $this->upload_fields[$state_info->field_name]; - - if(file_exists("{$upload_info->upload_path}/{$state_info->file_name}")) - { - if( unlink("{$upload_info->upload_path}/{$state_info->file_name}") ) - { - $this->basic_model->db_file_delete($state_info->field_name, $state_info->file_name); - - return true; - } - else - { - return false; - } - } - else - { - $this->basic_model->db_file_delete($state_info->field_name, $state_info->file_name); - return true; - } - } - else - { - return false; - } - } - - protected function ajax_relation($state_info) - { - if(!isset($this->relation[$state_info->field_name])) - return false; - - list($field_name, $related_table, $related_field_title, $where_clause, $order_by) = $this->relation[$state_info->field_name]; - - return $this->basic_model->get_ajax_relation_array($state_info->search, $field_name, $related_table, $related_field_title, $where_clause, $order_by); - } -} - - -/** - * PHP grocery CRUD - * - * LICENSE - * - * Grocery CRUD is released with dual licensing, using the GPL v3 (license-gpl3.txt) and the MIT license (license-mit.txt). - * You don't have to do anything special to choose one license or the other and you don't have to notify anyone which license you are using. - * Please see the corresponding license file for details of these licenses. - * You are free to use, modify and distribute this software, but all copyright information must remain. - * - * @package grocery CRUD - * @copyright Copyright (c) 2010 through 2014, John Skoumbourdis - * @license https://github.com/scoumbourdis/grocery-crud/blob/master/license-grocery-crud.txt - * @author John Skoumbourdis - */ - -// ------------------------------------------------------------------------ - -/** - * PHP grocery Layout - * - * Here you manage all the HTML Layout - * - * @package grocery CRUD - * @author John Skoumbourdis - * @version 1.5.8 - */ -class grocery_CRUD_Layout extends grocery_CRUD_Model_Driver -{ - private $theme_path = null; - private $views_as_string = ''; - private $echo_and_die = false; - protected $theme = null; - protected $default_true_false_text = array('inactive' , 'active'); - - protected $css_files = array(); - protected $js_files = array(); - protected $js_lib_files = array(); - protected $js_config_files = array(); - - protected function set_basic_Layout() - { - if(!file_exists($this->theme_path.$this->theme.'/views/list_template.php')) - { - throw new Exception('The template does not exist. Please check your files and try again.', 12); - die(); - } - } - - protected function showList($ajax = false, $state_info = null) - { - $data = $this->get_common_data(); - - $data->order_by = $this->order_by; - - $data->types = $this->get_field_types(); - - $data->list = $this->get_list(); - $data->list = $this->change_list($data->list , $data->types); - $data->list = $this->change_list_add_actions($data->list); - - $data->total_results = $this->get_total_results(); - - $data->columns = $this->get_columns(); - - $data->success_message = $this->get_success_message_at_list($state_info); - - $data->primary_key = $this->get_primary_key(); - $data->add_url = $this->getAddUrl(); - $data->edit_url = $this->getEditUrl(); - $data->delete_url = $this->getDeleteUrl(); - $data->delete_multiple_url = $this->getDeleteMultipleUrl(); - $data->read_url = $this->getReadUrl(); - $data->ajax_list_url = $this->getAjaxListUrl(); - $data->ajax_list_info_url = $this->getAjaxListInfoUrl(); - $data->export_url = $this->getExportToExcelUrl(); - $data->print_url = $this->getPrintUrl(); - $data->actions = $this->actions; - $data->unique_hash = $this->get_method_hash(); - $data->order_by = $this->order_by; - - $data->unset_add = $this->unset_add; - $data->unset_edit = $this->unset_edit; - $data->unset_read = $this->unset_read; - $data->unset_delete = $this->unset_delete; - $data->unset_export = $this->unset_export; - $data->unset_print = $this->unset_print; - - $default_per_page = $this->config->default_per_page; - $data->paging_options = $this->config->paging_options; - $data->default_per_page = is_numeric($default_per_page) && $default_per_page >1 && in_array($default_per_page,$data->paging_options)? $default_per_page : 25; - - if($data->list === false) - { - throw new Exception('It is impossible to get data. Please check your model and try again.', 13); - $data->list = array(); - } - - foreach($data->list as $num_row => $row) - { - $data->list[$num_row]->primary_key_value = $row->{$data->primary_key}; - $data->list[$num_row]->edit_url = $data->edit_url.'/'.$row->{$data->primary_key}; - $data->list[$num_row]->delete_url = $data->delete_url.'/'.$row->{$data->primary_key}; - $data->list[$num_row]->read_url = $data->read_url.'/'.$row->{$data->primary_key}; - } - - if(!$ajax) - { - $this->_add_js_vars(array('dialog_forms' => $this->config->dialog_forms)); - - $data->list_view = $this->_theme_view('list.php',$data,true); - $this->_theme_view('list_template.php',$data); - } - else - { - $this->set_echo_and_die(); - $this->_theme_view('list.php',$data); - } - } - - protected function exportToExcel($state_info = null) - { - $data = $this->get_common_data(); - - $data->order_by = $this->order_by; - $data->types = $this->get_field_types(); - - $data->list = $this->get_list(); - $data->list = $this->change_list($data->list , $data->types); - $data->list = $this->change_list_add_actions($data->list); - - $data->total_results = $this->get_total_results(); - - $data->columns = $this->get_columns(); - $data->primary_key = $this->get_primary_key(); - - @ob_end_clean(); - $this->_export_to_excel($data); - } - - protected function _export_to_excel($data) - { - /** - * No need to use an external library here. The only bad thing without using external library is that Microsoft Excel is complaining - * that the file is in a different format than specified by the file extension. If you press "Yes" everything will be just fine. - * */ - - $string_to_export = ""; - foreach($data->columns as $column){ - $string_to_export .= $column->display_as."\t"; - } - $string_to_export .= "\n"; - - foreach($data->list as $num_row => $row){ - foreach($data->columns as $column){ - $string_to_export .= $this->_trim_export_string($row->{$column->field_name})."\t"; - } - $string_to_export .= "\n"; - } - - // Convert to UTF-16LE and Prepend BOM - $string_to_export = "\xFF\xFE" .mb_convert_encoding($string_to_export, 'UTF-16LE', 'UTF-8'); - - $filename = "export-".date("Y-m-d_H:i:s").".xls"; - - header('Content-type: application/vnd.ms-excel;charset=UTF-16LE'); - header('Content-Disposition: attachment; filename='.$filename); - header("Cache-Control: no-cache"); - echo $string_to_export; - die(); - } - - protected function print_webpage($state_info = null) - { - $data = $this->get_common_data(); - - $data->order_by = $this->order_by; - $data->types = $this->get_field_types(); - - $data->list = $this->get_list(); - $data->list = $this->change_list($data->list , $data->types); - $data->list = $this->change_list_add_actions($data->list); - - $data->total_results = $this->get_total_results(); - - $data->columns = $this->get_columns(); - $data->primary_key = $this->get_primary_key(); - - @ob_end_clean(); - $this->_print_webpage($data); - } - - protected function _print_webpage($data) - { - $string_to_print = ""; - $string_to_print .= ""; - - echo $string_to_print; - die(); - } - - protected function _trim_export_string($value) - { - $value = str_replace(array(" ","&",">","<"),array(" ","&",">","<"),$value); - return strip_tags(str_replace(array("\t","\n","\r"),"",$value)); - } - - protected function _trim_print_string($value) - { - $value = str_replace(array(" ","&",">","<"),array(" ","&",">","<"),$value); - - //If the value has only spaces and nothing more then add the whitespace html character - if(str_replace(" ","",$value) == "") - $value = " "; - - return strip_tags($value); - } - - protected function set_echo_and_die() - { - $this->echo_and_die = true; - } - - protected function unset_echo_and_die() - { - $this->echo_and_die = false; - } - - protected function showListInfo() - { - $this->set_echo_and_die(); - - $total_results = (int)$this->get_total_results(); - @ob_end_clean(); - echo json_encode(array('total_results' => $total_results)); - die(); - } - - protected function change_list_add_actions($list) - { - if(empty($this->actions)) - return $list; - - $primary_key = $this->get_primary_key(); - - foreach($list as $num_row => $row) - { - $actions_urls = array(); - foreach($this->actions as $unique_id => $action) - { - if(!empty($action->url_callback)) - { - $actions_urls[$unique_id] = call_user_func($action->url_callback, $row->$primary_key, $row); - } - else - { - $actions_urls[$unique_id] = - $action->url_has_http ? - $action->link_url.$row->$primary_key : - site_url($action->link_url.'/'.$row->$primary_key); - } - } - $row->action_urls = $actions_urls; - } - - return $list; - } - - protected function change_list($list,$types) - { - $primary_key = $this->get_primary_key(); - $has_callbacks = !empty($this->callback_column) ? true : false; - $output_columns = $this->get_columns(); - foreach($list as $num_row => $row) - { - foreach($output_columns as $column) - { - $field_name = $column->field_name; - $field_value = isset( $row->{$column->field_name} ) ? $row->{$column->field_name} : null; - if( $has_callbacks && isset($this->callback_column[$field_name]) ) - $list[$num_row]->$field_name = call_user_func($this->callback_column[$field_name], $field_value, $row); - elseif(isset($types[$field_name])) - $list[$num_row]->$field_name = $this->change_list_value($types[$field_name] , $field_value); - else - $list[$num_row]->$field_name = $field_value; - } - } - - return $list; - } - - protected function showAddForm() - { - $this->set_js_lib($this->default_javascript_path.'/'.grocery_CRUD::JQUERY); - - $data = $this->get_common_data(); - $data->types = $this->get_field_types(); - - $data->list_url = $this->getListUrl(); - $data->insert_url = $this->getInsertUrl(); - $data->validation_url = $this->getValidationInsertUrl(); - $data->input_fields = $this->get_add_input_fields(); - - $data->fields = $this->get_add_fields(); - $data->hidden_fields = $this->get_add_hidden_fields(); - $data->unset_back_to_list = $this->unset_back_to_list; - $data->unique_hash = $this->get_method_hash(); - $data->is_ajax = $this->_is_ajax(); - - $this->_theme_view('add.php',$data); - $this->_inline_js("var js_date_format = '".$this->js_date_format."';"); - - $this->_get_ajax_results(); - } - - protected function showEditForm($state_info) - { - $this->set_js_lib($this->default_javascript_path.'/'.grocery_CRUD::JQUERY); - - $data = $this->get_common_data(); - $data->types = $this->get_field_types(); - - $data->field_values = $this->get_edit_values($state_info->primary_key); - - $data->add_url = $this->getAddUrl(); - - $data->list_url = $this->getListUrl(); - $data->update_url = $this->getUpdateUrl($state_info); - $data->delete_url = $this->getDeleteUrl($state_info); - $data->read_url = $this->getReadUrl($state_info->primary_key); - $data->input_fields = $this->get_edit_input_fields($data->field_values); - $data->unique_hash = $this->get_method_hash(); - - $data->fields = $this->get_edit_fields(); - $data->hidden_fields = $this->get_edit_hidden_fields(); - $data->unset_back_to_list = $this->unset_back_to_list; - - $data->validation_url = $this->getValidationUpdateUrl($state_info->primary_key); - $data->is_ajax = $this->_is_ajax(); - - $this->_theme_view('edit.php',$data); - $this->_inline_js("var js_date_format = '".$this->js_date_format."';"); - - $this->_get_ajax_results(); - } - - protected function showReadForm($state_info) - { - $this->set_js_lib($this->default_javascript_path.'/'.grocery_CRUD::JQUERY); - - $data = $this->get_common_data(); - $data->types = $this->get_field_types(); - - $data->field_values = $this->get_edit_values($state_info->primary_key); - - $data->add_url = $this->getAddUrl(); - - $data->list_url = $this->getListUrl(); - $data->update_url = $this->getUpdateUrl($state_info); - $data->delete_url = $this->getDeleteUrl($state_info); - $data->read_url = $this->getReadUrl($state_info->primary_key); - $data->input_fields = $this->get_read_input_fields($data->field_values); - $data->unique_hash = $this->get_method_hash(); - - $data->fields = $this->get_read_fields(); - $data->hidden_fields = $this->get_edit_hidden_fields(); - $data->unset_back_to_list = $this->unset_back_to_list; - - $data->validation_url = $this->getValidationUpdateUrl($state_info->primary_key); - $data->is_ajax = $this->_is_ajax(); - - $this->_theme_view('read.php',$data); - $this->_inline_js("var js_date_format = '".$this->js_date_format."';"); - - $this->_get_ajax_results(); - } - - protected function delete_layout($delete_result = true) - { - @ob_end_clean(); - if($delete_result === false) - { - $error_message = '

'.$this->l('delete_error_message').'

'; - - echo json_encode(array('success' => $delete_result ,'error_message' => $error_message)); - } - else - { - $success_message = '

'.$this->l('delete_success_message').'

'; - - echo json_encode(array('success' => true , 'success_message' => $success_message)); - } - $this->set_echo_and_die(); - } - - protected function get_success_message_at_list($field_info = null) - { - if($field_info !== null && isset($field_info->success_message) && $field_info->success_message) - { - if(!empty($field_info->primary_key) && !$this->unset_edit) - { - return $this->l('insert_success_message')." ".$this->l('form_edit')." {$this->subject} "; - } - else - { - return $this->l('insert_success_message'); - } - } - else - { - return null; - } - } - - protected function insert_layout($insert_result = false) - { - @ob_end_clean(); - if($insert_result === false) - { - echo json_encode(array('success' => false)); - } - else - { - $success_message = '

'.$this->l('insert_success_message'); - - if(!$this->unset_back_to_list && !empty($insert_result) && !$this->unset_edit) - { - $success_message .= " ".$this->l('form_edit')." {$this->subject} "; - - if (!$this->_is_ajax()) { - $success_message .= $this->l('form_or'); - } - } - - if(!$this->unset_back_to_list && !$this->_is_ajax()) - { - $success_message .= " ".$this->l('form_go_back_to_list').""; - } - - $success_message .= '

'; - - echo json_encode(array( - 'success' => true , - 'insert_primary_key' => $insert_result, - 'success_message' => $success_message, - 'success_list_url' => $this->getListSuccessUrl($insert_result) - )); - } - $this->set_echo_and_die(); - } - - protected function validation_layout($validation_result) - { - @ob_end_clean(); - echo json_encode($validation_result); - $this->set_echo_and_die(); - } - - protected function upload_layout($upload_result, $field_name) - { - @ob_end_clean(); - if($upload_result !== false && !is_string($upload_result) && empty($upload_result[0]->error)) - { - echo json_encode( - (object)array( - 'success' => true, - 'files' => $upload_result - )); - } - else - { - $result = (object)array('success' => false); - if(is_string($upload_result)) - $result->message = $upload_result; - if(!empty($upload_result[0]->error)) - $result->message = $upload_result[0]->error; - - echo json_encode($result); - } - - $this->set_echo_and_die(); - } - - protected function delete_file_layout($upload_result) - { - @ob_end_clean(); - if($upload_result !== false) - { - echo json_encode( (object)array( 'success' => true ) ); - } - else - { - echo json_encode((object)array('success' => false)); - } - - $this->set_echo_and_die(); - } - - public function set_css($css_file) - { - $this->css_files[sha1($css_file)] = base_url().$css_file; - } - - public function set_js($js_file) - { - $this->js_files[sha1($js_file)] = base_url().$js_file; - } - - public function set_js_lib($js_file) - { - $this->js_lib_files[sha1($js_file)] = base_url().$js_file; - $this->js_files[sha1($js_file)] = base_url().$js_file; - } - - public function set_js_config($js_file) - { - $this->js_config_files[sha1($js_file)] = base_url().$js_file; - $this->js_files[sha1($js_file)] = base_url().$js_file; - } - - public function is_IE7() - { - return isset($_SERVER['HTTP_USER_AGENT']) - && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7') !== false) - ? true : false; - } - - public function get_css_files() - { - return $this->css_files; - } - - public function get_js_files() - { - return $this->js_files; - } - - public function get_js_lib_files() - { - return $this->js_lib_files; - } - - public function get_js_config_files() - { - return $this->js_config_files; - } - - /** - * Load Javascripts - **/ - protected function load_js_fancybox() - { - $this->set_css($this->default_css_path.'/jquery_plugins/fancybox/jquery.fancybox.css'); - - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.fancybox-1.3.4.js'); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.easing-1.3.pack.js'); - } - - protected function load_js_chosen() - { - $this->set_css($this->default_css_path.'/jquery_plugins/chosen/chosen.css'); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.chosen.min.js'); - } - - protected function load_js_jqueryui() - { - $this->set_css($this->default_css_path.'/ui/simple/'.grocery_CRUD::JQUERY_UI_CSS); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/ui/'.grocery_CRUD::JQUERY_UI_JS); - } - - protected function load_js_uploader() - { - $this->set_css($this->default_css_path.'/ui/simple/'.grocery_CRUD::JQUERY_UI_CSS); - $this->set_css($this->default_css_path.'/jquery_plugins/file_upload/file-uploader.css'); - $this->set_css($this->default_css_path.'/jquery_plugins/file_upload/jquery.fileupload-ui.css'); - - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/ui/'.grocery_CRUD::JQUERY_UI_JS); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/tmpl.min.js'); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/load-image.min.js'); - - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.iframe-transport.js'); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.fileupload.js'); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.fileupload.config.js'); - } - - protected function get_layout() - { - $js_files = $this->get_js_files(); - $css_files = $this->get_css_files(); - - $js_lib_files = $this->get_js_lib_files(); - $js_config_files = $this->get_js_config_files(); - - if ($this->unset_jquery) { - unset($js_files[sha1($this->default_javascript_path.'/'.grocery_CRUD::JQUERY)]); - } - - if ($this->unset_jquery_ui) { - unset($css_files[sha1($this->default_css_path.'/ui/simple/'.grocery_CRUD::JQUERY_UI_CSS)]); - unset($js_files[sha1($this->default_javascript_path.'/jquery_plugins/ui/'.grocery_CRUD::JQUERY_UI_JS)]); - } - - if ($this->unset_bootstrap) { - unset($js_files[sha1($this->default_theme_path.'/bootstrap/js/bootstrap/dropdown.js')]); - unset($js_files[sha1($this->default_theme_path.'/bootstrap/js/bootstrap/modal.js')]); - unset($js_files[sha1($this->default_theme_path.'/bootstrap/js/bootstrap/dropdown.min.js')]); - unset($js_files[sha1($this->default_theme_path.'/bootstrap/js/bootstrap/modal.min.js')]); - unset($css_files[sha1($this->default_theme_path.'/bootstrap/css/bootstrap/bootstrap.css')]); - unset($css_files[sha1($this->default_theme_path.'/bootstrap/css/bootstrap/bootstrap.min.css')]); - unset($css_files[sha1($this->default_theme_path.'/bootstrap-v4/css/bootstrap/bootstrap.css')]); - unset($css_files[sha1($this->default_theme_path.'/bootstrap-v4/css/bootstrap/bootstrap.min.css')]); - } - - if($this->echo_and_die === false) - { - /** Initialize JavaScript variables */ - $js_vars = array( - 'default_javascript_path' => base_url().$this->default_javascript_path, - 'default_css_path' => base_url().$this->default_css_path, - 'default_texteditor_path' => base_url().$this->default_texteditor_path, - 'default_theme_path' => base_url().$this->default_theme_path, - 'base_url' => base_url() - ); - $this->_add_js_vars($js_vars); - - return (object)array( - 'js_files' => $js_files, - 'js_lib_files' => $js_lib_files, - 'js_config_files' => $js_config_files, - 'css_files' => $css_files, - 'output' => $this->views_as_string, - ); - } - elseif($this->echo_and_die === true) - { - echo $this->views_as_string; - die(); - } - } - - protected function update_layout($update_result = false, $state_info = null) - { - @ob_end_clean(); - if($update_result === false) - { - echo json_encode(array('success' => $update_result)); - } - else - { - $success_message = '

'.$this->l('update_success_message'); - if(!$this->unset_back_to_list && !$this->_is_ajax()) - { - $success_message .= " ".$this->l('form_go_back_to_list').""; - } - $success_message .= '

'; - - echo json_encode(array( - 'success' => true , - 'insert_primary_key' => $update_result, - 'success_message' => $success_message, - 'success_list_url' => $this->getListSuccessUrl($state_info->primary_key) - )); - } - $this->set_echo_and_die(); - } - - protected function get_integer_input($field_info,$value) - { - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.numeric.min.js'); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.numeric.config.js'); - $extra_attributes = ''; - if(!empty($field_info->db_max_length)) - $extra_attributes .= "maxlength='{$field_info->db_max_length}'"; - $input = ""; - return $input; - } - - protected function get_true_false_input($field_info,$value) - { - $value_is_null = empty($value) && $value !== '0' && $value !== 0 ? true : false; - - $input = "
"; - - $true_string = is_array($field_info->extras) && array_key_exists(1,$field_info->extras) ? $field_info->extras[1] : $this->default_true_false_text[1]; - $checked = $value === '1' || ($value_is_null && $field_info->default === '1') ? "checked = 'checked'" : ""; - $input .= - "
"; - - $false_string = is_array($field_info->extras) && array_key_exists(0,$field_info->extras) ? $field_info->extras[0] : $this->default_true_false_text[0]; - $checked = $value === '0' || ($value_is_null && $field_info->default === '0') ? "checked = 'checked'" : ""; - $input .= - "
"; - - $input .= "
"; - - return $input; - } - - protected function get_string_input($field_info,$value) - { - $value = !is_string($value) ? '' : str_replace('"',""",$value); - - $extra_attributes = ''; - if (!empty($field_info->db_max_length)) { - - if (in_array($field_info->type, array("decimal", "float"))) { - $decimal_lentgh = explode(",", $field_info->db_max_length); - $decimal_lentgh = ((int)$decimal_lentgh[0]) + 1; - - $extra_attributes .= "maxlength='" . $decimal_lentgh . "'"; - } else { - $extra_attributes .= "maxlength='{$field_info->db_max_length}'"; - } - - } - $input = ""; - return $input; - } - - protected function get_text_input($field_info,$value) - { - if($field_info->extras == 'text_editor') - { - $editor = $this->config->default_text_editor; - switch ($editor) { - case 'ckeditor': - $this->set_js_lib($this->default_texteditor_path.'/ckeditor/ckeditor.js'); - $this->set_js_lib($this->default_texteditor_path.'/ckeditor/adapters/jquery.js'); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.ckeditor.config.js'); - break; - - case 'tinymce': - $this->set_js_lib($this->default_texteditor_path.'/tiny_mce/jquery.tinymce.js'); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.tine_mce.config.js'); - break; - - case 'markitup': - $this->set_css($this->default_texteditor_path.'/markitup/skins/markitup/style.css'); - $this->set_css($this->default_texteditor_path.'/markitup/sets/default/style.css'); - - $this->set_js_lib($this->default_texteditor_path.'/markitup/jquery.markitup.js'); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.markitup.config.js'); - break; - } - - $class_name = $this->config->text_editor_type == 'minimal' ? 'mini-texteditor' : 'texteditor'; - - $input = ""; - } - else - { - $input = ""; - } - return $input; - } - - protected function get_datetime_input($field_info,$value) - { - $this->set_css($this->default_css_path.'/ui/simple/'.grocery_CRUD::JQUERY_UI_CSS); - $this->set_css($this->default_css_path.'/jquery_plugins/jquery.ui.datetime.css'); - $this->set_css($this->default_css_path.'/jquery_plugins/jquery-ui-timepicker-addon.css'); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/ui/'.grocery_CRUD::JQUERY_UI_JS); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery-ui-timepicker-addon.js'); - - if($this->language !== 'english') - { - include($this->default_config_path.'/language_alias.php'); - if(array_key_exists($this->language, $language_alias)) - { - $i18n_date_js_file = $this->default_javascript_path.'/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-'.$language_alias[$this->language].'.js'; - if(file_exists($i18n_date_js_file)) - { - $this->set_js_lib($i18n_date_js_file); - } - - $i18n_datetime_js_file = $this->default_javascript_path.'/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-'.$language_alias[$this->language].'.js'; - if(file_exists($i18n_datetime_js_file)) - { - $this->set_js_lib($i18n_datetime_js_file); - } - } - } - - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery-ui-timepicker-addon.config.js'); - - if(!empty($value) && $value != '0000-00-00 00:00:00' && $value != '1970-01-01 00:00:00'){ - list($year,$month,$day) = explode('-',substr($value,0,10)); - $date = date($this->php_date_format, mktime(0,0,0,$month,$day,$year)); - $datetime = $date.substr($value,10); - } - else - { - $datetime = ''; - } - $input = " - ".$this->l('form_button_clear')." - ({$this->ui_date_format}) hh:mm:ss"; - return $input; - } - - protected function get_hidden_input($field_info,$value) - { - if($field_info->extras !== null && $field_info->extras != false) - $value = $field_info->extras; - $input = ""; - return $input; - } - - protected function get_password_input($field_info,$value) - { - $value = !is_string($value) ? '' : $value; - - $extra_attributes = ''; - if(!empty($field_info->db_max_length)) - $extra_attributes .= "maxlength='{$field_info->db_max_length}'"; - $input = ""; - return $input; - } - - protected function get_date_input($field_info,$value) - { - $this->set_css($this->default_css_path.'/ui/simple/'.grocery_CRUD::JQUERY_UI_CSS); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/ui/'.grocery_CRUD::JQUERY_UI_JS); - - if($this->language !== 'english') - { - include($this->default_config_path.'/language_alias.php'); - if(array_key_exists($this->language, $language_alias)) - { - $i18n_date_js_file = $this->default_javascript_path.'/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-'.$language_alias[$this->language].'.js'; - if(file_exists($i18n_date_js_file)) - { - $this->set_js_lib($i18n_date_js_file); - } - } - } - - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.datepicker.config.js'); - - if(!empty($value) && $value != '0000-00-00' && $value != '1970-01-01') - { - list($year,$month,$day) = explode('-',substr($value,0,10)); - $date = date($this->php_date_format, mktime(0,0,0,$month,$day,$year)); - } - else - { - $date = ''; - } - - $input = " - ".$this->l('form_button_clear')." (".$this->ui_date_format.")"; - return $input; - } - - protected function get_dropdown_input($field_info,$value) - { - $this->load_js_chosen(); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.chosen.config.js'); - - $select_title = str_replace('{field_display_as}',$field_info->display_as,$this->l('set_relation_title')); - - $input = ""; - return $input; - } - - protected function get_enum_input($field_info,$value) - { - $this->load_js_chosen(); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.chosen.config.js'); - - $select_title = str_replace('{field_display_as}',$field_info->display_as,$this->l('set_relation_title')); - - $input = ""; - return $input; - } - - protected function get_readonly_input($field_info, $value) - { - $read_only_value = " "; - - if (!empty($value) && !is_array($value)) { - $read_only_value = $value; - } elseif (is_array($value)) { - $all_values = array_values($value); - $read_only_value = implode(", ",$all_values); - } - - return '
'.$read_only_value.'
'; - } - - protected function get_set_input($field_info,$value) - { - $this->load_js_chosen(); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.chosen.config.js'); - - $options_array = $field_info->extras !== false && is_array($field_info->extras)? $field_info->extras : explode("','",substr($field_info->db_max_length,1,-1)); - $selected_values = !empty($value) ? explode(",",$value) : array(); - - $select_title = str_replace('{field_display_as}',$field_info->display_as,$this->l('set_relation_title')); - $input = ""; - - return $input; - } - - protected function get_multiselect_input($field_info,$value) - { - $this->load_js_chosen(); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.chosen.config.js'); - - $options_array = $field_info->extras; - $selected_values = !empty($value) ? explode(",",$value) : array(); - - $select_title = str_replace('{field_display_as}',$field_info->display_as,$this->l('set_relation_title')); - $input = ""; - - return $input; - } - - protected function get_relation_input($field_info,$value) - { - $this->load_js_chosen(); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.chosen.config.js'); - - $ajax_limitation = 10000; - $total_rows = $this->get_relation_total_rows($field_info->extras); - - - //Check if we will use ajax for our queries or just clien-side javascript - $using_ajax = $total_rows > $ajax_limitation ? true : false; - - //We will not use it for now. It is not ready yet. Probably we will have this functionality at version 1.4 - $using_ajax = false; - - //If total rows are more than the limitation, use the ajax plugin - $ajax_or_not_class = $using_ajax ? 'chosen-select' : 'chosen-select'; - - $this->_inline_js("var ajax_relation_url = '".$this->getAjaxRelationUrl()."';\n"); - - $select_title = str_replace('{field_display_as}',$field_info->display_as,$this->l('set_relation_title')); - $input = ""; - return $input; - } - - protected function get_relation_readonly_input($field_info,$value) - { - $options_array = $this->get_relation_array($field_info->extras); - - $value = isset($options_array[$value]) ? $options_array[$value] : ''; - - return $this->get_readonly_input($field_info, $value); - } - - protected function get_upload_file_readonly_input($field_info,$value) - { - $file = $file_url = base_url().$field_info->extras->upload_path.'/'.$value; - - $value = !empty($value) ? ''.$value.'' : ''; - - return $this->get_readonly_input($field_info, $value); - } - - protected function get_relation_n_n_input($field_info_type, $selected_values) - { - $has_priority_field = !empty($field_info_type->extras->priority_field_relation_table) ? true : false; - $is_ie_7 = isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7') !== false) ? true : false; - - if($has_priority_field || $is_ie_7) - { - $this->set_css($this->default_css_path.'/ui/simple/'.grocery_CRUD::JQUERY_UI_CSS); - $this->set_css($this->default_css_path.'/jquery_plugins/ui.multiselect.css'); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/ui/'.grocery_CRUD::JQUERY_UI_JS); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/ui.multiselect.min.js'); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.multiselect.js'); - - if($this->language !== 'english') - { - include($this->default_config_path.'/language_alias.php'); - if(array_key_exists($this->language, $language_alias)) - { - $i18n_date_js_file = $this->default_javascript_path.'/jquery_plugins/ui/i18n/multiselect/ui-multiselect-'.$language_alias[$this->language].'.js'; - if(file_exists($i18n_date_js_file)) - { - $this->set_js_lib($i18n_date_js_file); - } - } - } - } - else - { - $this->set_css($this->default_css_path.'/jquery_plugins/chosen/chosen.css'); - $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.chosen.min.js'); - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.chosen.config.js'); - } - - $this->_inline_js("var ajax_relation_url = '".$this->getAjaxRelationUrl()."';\n"); - - $field_info = $this->relation_n_n[$field_info_type->name]; //As we use this function the relation_n_n exists, so don't need to check - $unselected_values = $this->get_relation_n_n_unselected_array($field_info, $selected_values); - - if(empty($unselected_values) && empty($selected_values)) - { - $input = "Please add {$field_info_type->display_as} first"; - } - else - { - $css_class = $has_priority_field || $is_ie_7 ? 'multiselect': 'chosen-multiple-select'; - $width_style = $has_priority_field || $is_ie_7 ? '' : 'width:510px;'; - - $select_title = str_replace('{field_display_as}',$field_info_type->display_as,$this->l('set_relation_title')); - $input = ""; - } - - return $input; - } - - protected function _convert_bytes_ui_to_bytes($bytes_ui) - { - $bytes_ui = str_replace(' ','',$bytes_ui); - if(strstr($bytes_ui,'MB')) - $bytes = (int)(str_replace('MB','',$bytes_ui))*1024*1024; - elseif(strstr($bytes_ui,'KB')) - $bytes = (int)(str_replace('KB','',$bytes_ui))*1024; - elseif(strstr($bytes_ui,'B')) - $bytes = (int)(str_replace('B','',$bytes_ui)); - else - $bytes = (int)($bytes_ui); - - return $bytes; - } - - protected function get_upload_file_input($field_info, $value) - { - $this->load_js_uploader(); - - //Fancybox - $this->load_js_fancybox(); - - $this->set_js_config($this->default_javascript_path.'/jquery_plugins/config/jquery.fancybox.config.js'); - - $unique = mt_rand(); - - $allowed_files = $this->config->file_upload_allow_file_types; - $allowed_files_ui = '.'.str_replace('|',',.',$allowed_files); - $max_file_size_ui = $this->config->file_upload_max_file_size; - $max_file_size_bytes = $this->_convert_bytes_ui_to_bytes($max_file_size_ui); - - $this->_inline_js(' - var upload_info_'.$unique.' = { - accepted_file_types: /(\\.|\\/)('.$allowed_files.')$/i, - accepted_file_types_ui : "'.$allowed_files_ui.'", - max_file_size: '.$max_file_size_bytes.', - max_file_size_ui: "'.$max_file_size_ui.'" - }; - - var string_upload_file = "'.$this->l('form_upload_a_file').'"; - var string_delete_file = "'.$this->l('string_delete_file').'"; - var string_progress = "'.$this->l('string_progress').'"; - var error_on_uploading = "'.$this->l('error_on_uploading').'"; - var message_prompt_delete_file = "'.$this->l('message_prompt_delete_file').'"; - - var error_max_number_of_files = "'.$this->l('error_max_number_of_files').'"; - var error_accept_file_types = "'.$this->l('error_accept_file_types').'"; - var error_max_file_size = "'.str_replace("{max_file_size}",$max_file_size_ui,$this->l('error_max_file_size')).'"; - var error_min_file_size = "'.$this->l('error_min_file_size').'"; - - var base_url = "'.base_url().'"; - var upload_a_file_string = "'.$this->l('form_upload_a_file').'"; - '); - - $uploader_display_none = empty($value) ? "" : "display:none;"; - $file_display_none = empty($value) ? "display:none;" : ""; - - $is_image = !empty($value) && - ( substr($value,-4) == '.jpg' - || substr($value,-4) == '.png' - || substr($value,-5) == '.jpeg' - || substr($value,-4) == '.gif' - || substr($value,-5) == '.tiff') - ? true : false; - - $image_class = $is_image ? 'image-thumbnail' : ''; - - $input = ' - '.$this->l('form_upload_a_file').' - - - '; - - $this->set_css($this->default_css_path.'/jquery_plugins/file_upload/fileuploader.css'); - - $file_url = base_url().$field_info->extras->upload_path.'/'.$value; - - $input .= "
"; - $input .= "
"; - $input .= ""; - $input .= "
"; - $input .= "
"; - - return $input; - } - - protected function get_add_hidden_fields() - { - return $this->add_hidden_fields; - } - - protected function get_edit_hidden_fields() - { - return $this->edit_hidden_fields; - } - - protected function get_add_input_fields($field_values = null) - { - $fields = $this->get_add_fields(); - $types = $this->get_field_types(); - - $input_fields = array(); - - foreach($fields as $field_num => $field) - { - $field_info = $types[$field->field_name]; - - $field_value = !empty($field_values) && isset($field_values->{$field->field_name}) ? $field_values->{$field->field_name} : null; - - if(!isset($this->callback_add_field[$field->field_name])) - { - $field_input = $this->get_field_input($field_info, $field_value); - } - else - { - $field_input = $field_info; - $field_input->input = call_user_func($this->callback_add_field[$field->field_name], $field_value, null, $field_info); - } - - switch ($field_info->crud_type) { - case 'invisible': - unset($this->add_fields[$field_num]); - unset($fields[$field_num]); - continue; - break; - case 'hidden': - $this->add_hidden_fields[] = $field_input; - unset($this->add_fields[$field_num]); - unset($fields[$field_num]); - continue; - break; - } - - $input_fields[$field->field_name] = $field_input; - } - - return $input_fields; - } - - protected function get_edit_input_fields($field_values = null) - { - $fields = $this->get_edit_fields(); - $types = $this->get_field_types(); - - $input_fields = array(); - - foreach($fields as $field_num => $field) - { - $field_info = $types[$field->field_name]; - - $field_value = !empty($field_values) && isset($field_values->{$field->field_name}) ? $field_values->{$field->field_name} : null; - if(!isset($this->callback_edit_field[$field->field_name])) - { - $field_input = $this->get_field_input($field_info, $field_value); - } - else - { - $primary_key = $this->getStateInfo()->primary_key; - $field_input = $field_info; - $field_input->input = call_user_func($this->callback_edit_field[$field->field_name], $field_value, $primary_key, $field_info, $field_values); - } - - switch ($field_info->crud_type) { - case 'invisible': - unset($this->edit_fields[$field_num]); - unset($fields[$field_num]); - continue; - break; - case 'hidden': - $this->edit_hidden_fields[] = $field_input; - unset($this->edit_fields[$field_num]); - unset($fields[$field_num]); - continue; - break; - } - - $input_fields[$field->field_name] = $field_input; - } - - return $input_fields; - } - - protected function get_read_input_fields($field_values = null) - { - $read_fields = $this->get_read_fields(); - - $this->field_types = null; - $this->required_fields = null; - - $read_inputs = array(); - foreach ($read_fields as $field) { - if (!empty($this->change_field_type) - && isset($this->change_field_type[$field->field_name]) - && $this->change_field_type[$field->field_name]->type == 'hidden') { - continue; - } - $this->field_type($field->field_name, 'readonly'); - } - - $fields = $this->get_read_fields(); - $types = $this->get_field_types(); - - $input_fields = array(); - - foreach($fields as $field_num => $field) - { - $field_info = $types[$field->field_name]; - - $field_value = !empty($field_values) && isset($field_values->{$field->field_name}) ? $field_values->{$field->field_name} : null; - if(!isset($this->callback_read_field[$field->field_name])) - { - $field_input = $this->get_field_input($field_info, $field_value); - } - else - { - $primary_key = $this->getStateInfo()->primary_key; - $field_input = $field_info; - $field_input->input = call_user_func($this->callback_read_field[$field->field_name], $field_value, $primary_key, $field_info, $field_values); - } - - switch ($field_info->crud_type) { - case 'invisible': - unset($this->read_fields[$field_num]); - unset($fields[$field_num]); - continue; - break; - case 'hidden': - $this->read_hidden_fields[] = $field_input; - unset($this->read_fields[$field_num]); - unset($fields[$field_num]); - continue; - break; - } - - $input_fields[$field->field_name] = $field_input; - } - - return $input_fields; - } - - protected function setThemeBasics() - { - $this->theme_path = $this->default_theme_path; - if(substr($this->theme_path,-1) != '/') - $this->theme_path = $this->theme_path.'/'; - - include($this->theme_path.$this->theme.'/config.php'); - - $this->theme_config = $config; - } - - public function set_theme($theme = null) - { - $this->theme = $theme; - - return $this; - } - - protected function _get_ajax_results() - { - //This is a $_POST request rather that $_GET request , because - //Codeigniter doesn't like the $_GET requests so much! - if ($this->_is_ajax()) { - @ob_end_clean(); - $results= (object)array( - 'output' => $this->views_as_string, - 'js_files' => array_values($this->get_js_files()), - 'js_lib_files' => array_values($this->get_js_lib_files()), - 'js_config_files' => array_values($this->get_js_config_files()), - 'css_files' => array_values($this->get_css_files()) - ); - - echo json_encode($results); - die; - } - //else just continue - } - - protected function _is_ajax() - { - return array_key_exists('is_ajax', $_POST) && $_POST['is_ajax'] == 'true' ? true: false; - } - - protected function _theme_view($view, $vars = array(), $return = FALSE) - { - $vars = (is_object($vars)) ? get_object_vars($vars) : $vars; - - $file_exists = FALSE; - - $ext = pathinfo($view, PATHINFO_EXTENSION); - $file = ($ext == '') ? $view.'.php' : $view; - - $view_file = $this->theme_path.$this->theme.'/views/'; - - if (file_exists($view_file.$file)) - { - $path = $view_file.$file; - $file_exists = TRUE; - } - - if ( ! $file_exists) - { - throw new Exception('Unable to load the requested file: '.$file, 16); - } - - extract($vars); - - #region buffering... - ob_start(); - - include($path); - - $buffer = ob_get_contents(); - @ob_end_clean(); - #endregion - - if ($return === TRUE) - { - return $buffer; - } - - $this->views_as_string .= $buffer; - } - - protected function _inline_js($inline_js = '') - { - $this->views_as_string .= "\n"; - } - - protected function _add_js_vars($js_vars = array()) - { - $javascript_as_string = "\n"; - $this->views_as_string .= $javascript_as_string; - } - - protected function get_views_as_string() - { - if(!empty($this->views_as_string)) - return $this->views_as_string; - else - return null; - } -} - - -/** - * PHP grocery CRUD - * - * LICENSE - * - * Grocery CRUD is released with dual licensing, using the GPL v3 (license-gpl3.txt) and the MIT license (license-mit.txt). - * You don't have to do anything special to choose one license or the other and you don't have to notify anyone which license you are using. - * Please see the corresponding license file for details of these licenses. - * You are free to use, modify and distribute this software, but all copyright information must remain. - * - * @package grocery CRUD - * @copyright Copyright (c) 2010 through 2014, John Skoumbourdis - * @license https://github.com/scoumbourdis/grocery-crud/blob/master/license-grocery-crud.txt - * @author John Skoumbourdis - */ - -// ------------------------------------------------------------------------ - -/** - * PHP grocery States - * - * States of grocery CRUD - * - * @package grocery CRUD - * @author John Skoumbourdis - * @version 1.5.8 - */ -class grocery_CRUD_States extends grocery_CRUD_Layout -{ - const STATE_UNKNOWN = 0; - const STATE_LIST = 1; - const STATE_ADD = 2; - const STATE_EDIT = 3; - const STATE_DELETE = 4; - const STATE_INSERT = 5; - - const STATE_READ = 18; - const STATE_DELETE_MULTIPLE = '19'; - - protected $states = array( - 0 => 'unknown', - 1 => 'list', - 2 => 'add', - 3 => 'edit', - 4 => 'delete', - 5 => 'insert', - 6 => 'update', - 7 => 'ajax_list', - 8 => 'ajax_list_info', - 9 => 'insert_validation', - 10 => 'update_validation', - 11 => 'upload_file', - 12 => 'delete_file', - 13 => 'ajax_relation', - 14 => 'ajax_relation_n_n', - 15 => 'success', - 16 => 'export', - 17 => 'print', - 18 => 'read', - 19 => 'delete_multiple' - ); - - public function getStateInfo() - { - $state_code = $this->getStateCode(); - $segment_object = $this->get_state_info_from_url(); - - $first_parameter = $segment_object->first_parameter; - $second_parameter = $segment_object->second_parameter; - - $state_info = (object)array(); - - switch ($state_code) { - case self::STATE_LIST: - case self::STATE_ADD: - //for now... do nothing! Keeping this switch here in case we need any information at the future. - break; - - case self::STATE_EDIT: - case self::STATE_READ: - if ($first_parameter !== null) { - $state_info = (object) array('primary_key' => $first_parameter); - } else { - throw new Exception('On the state "edit" the Primary key cannot be null', 6); - die(); - } - break; - - case self::STATE_DELETE: - if ($first_parameter !== null) { - $state_info = (object) array('primary_key' => $first_parameter); - } else { - throw new Exception('On the state "delete" the Primary key cannot be null',7); - die(); - } - break; - - case self::STATE_DELETE_MULTIPLE: - if (!empty($_POST) && !empty($_POST['ids']) && is_array($_POST['ids'])) { - $state_info = (object) array('ids' => $_POST['ids']); - } else { - throw new Exception('On the state "Delete Multiple" you need send the ids as a post array.'); - die(); - } - break; - - case self::STATE_INSERT: - if(!empty($_POST)) - { - $state_info = (object)array('unwrapped_data' => $_POST); - } - else - { - throw new Exception('On the state "insert" you must have post data',8); - die(); - } - break; - - case 6: - if(!empty($_POST) && $first_parameter !== null) - { - $state_info = (object)array('primary_key' => $first_parameter,'unwrapped_data' => $_POST); - } - elseif(empty($_POST)) - { - throw new Exception('On the state "update" you must have post data',9); - die(); - } - else - { - throw new Exception('On the state "update" the Primary key cannot be null',10); - die(); - } - break; - - case 7: - case 8: - case 16: //export to excel - case 17: //print - $state_info = (object)array(); - if(!empty($_POST['per_page'])) - { - $state_info->per_page = is_numeric($_POST['per_page']) ? $_POST['per_page'] : null; - } - if(!empty($_POST['page'])) - { - $state_info->page = is_numeric($_POST['page']) ? $_POST['page'] : null; - } - //If we request an export or a print we don't care about what page we are - if($state_code === 16 || $state_code === 17) - { - $state_info->page = 1; - $state_info->per_page = 1000000; //a very big number! - } - if(!empty($_POST['order_by'][0])) - { - $state_info->order_by = $_POST['order_by']; - } - if(!empty($_POST['search_text'])) - { - if(empty($_POST['search_field'])) - { - $search_text = strip_tags($_POST['search_field']); - $state_info->search = (object)array('field' => null , 'text' => $_POST['search_text']); - } - else - { - if (is_array($_POST['search_field'])) { - $search_array = array(); - foreach ($_POST['search_field'] as $search_key => $search_field_name) { - $search_array[$search_field_name] = !empty($_POST['search_text'][$search_key]) ? $_POST['search_text'][$search_key] : ''; - } - $state_info->search = $search_array; - } else { - $state_info->search = (object)array( - 'field' => strip_tags($_POST['search_field']) , - 'text' => $_POST['search_text'] ); - } - } - } - break; - - case 9: - - break; - - case 10: - if($first_parameter !== null) - { - $state_info = (object)array('primary_key' => $first_parameter); - } - break; - - case 11: - $state_info->field_name = $first_parameter; - break; - - case 12: - $state_info->field_name = $first_parameter; - $state_info->file_name = $second_parameter; - break; - - case 13: - $state_info->field_name = $_POST['field_name']; - $state_info->search = $_POST['term']; - break; - - case 14: - $state_info->field_name = $_POST['field_name']; - $state_info->search = $_POST['term']; - break; - - case 15: - $state_info = (object)array( - 'primary_key' => $first_parameter, - 'success_message' => true - ); - break; - } - - return $state_info; - } - - protected function getStateCode() - { - $state_string = $this->get_state_info_from_url()->operation; - - if( $state_string != 'unknown' && in_array( $state_string, $this->states ) ) - $state_code = array_search($state_string, $this->states); - else - $state_code = 0; - - return $state_code; - } - - protected function state_url($url = '', $is_list_page = false) - { - //Easy scenario, we had set the crud_url_path - if (!empty($this->crud_url_path)) { - $state_url = !empty($this->list_url_path) && $is_list_page? - $this->list_url_path : - $this->crud_url_path.'/'.$url ; - } else { - //Complicated scenario. The crud_url_path is not specified so we are - //trying to understand what is going on from the URL. - $ci = &get_instance(); - - $segment_object = $this->get_state_info_from_url(); - $method_name = $this->get_method_name(); - $segment_position = $segment_object->segment_position; - - $state_url_array = array(); - - if( sizeof($ci->uri->segments) > 0 ) { - foreach($ci->uri->segments as $num => $value) - { - $state_url_array[$num] = $value; - if($num == ($segment_position - 1)) - break; - } - - if( $method_name == 'index' && !in_array( 'index', $state_url_array ) ) //there is a scenario that you don't have the index to your url - $state_url_array[$num+1] = 'index'; - } - - $state_url = site_url(implode('/',$state_url_array).'/'.$url); - } - - return $state_url; - } - - protected function get_state_info_from_url() - { - $ci = &get_instance(); - - $segment_position = count($ci->uri->segments) + 1; - $operation = 'list'; - - $segements = $ci->uri->segments; - foreach($segements as $num => $value) - { - if($value != 'unknown' && in_array($value, $this->states)) - { - $segment_position = (int)$num; - $operation = $value; //I don't have a "break" here because I want to ensure that is the LAST segment with name that is in the array. - } - } - - $function_name = $this->get_method_name(); - - if($function_name == 'index' && !in_array('index',$ci->uri->segments)) - $segment_position++; - - $first_parameter = isset($segements[$segment_position+1]) ? $segements[$segment_position+1] : null; - $second_parameter = isset($segements[$segment_position+2]) ? $segements[$segment_position+2] : null; - - return (object)array('segment_position' => $segment_position, 'operation' => $operation, 'first_parameter' => $first_parameter, 'second_parameter' => $second_parameter); - } - - protected function get_method_hash() - { - $ci = &get_instance(); - - $state_info = $this->get_state_info_from_url(); - $extra_values = $ci->uri->segment($state_info->segment_position - 1) != $this->get_method_name() ? $ci->uri->segment($state_info->segment_position - 1) : ''; - - return $this->crud_url_path !== null - ? md5($this->crud_url_path) - : md5($this->get_controller_name().$this->get_method_name().$extra_values); - } - - protected function get_method_name() - { - $ci = &get_instance(); - return $ci->router->method; - } - - protected function get_controller_name() - { - $ci = &get_instance(); - return $ci->router->class; - } - - public function getState() - { - return $this->states[$this->getStateCode()]; - } - - protected function getListUrl() - { - return $this->state_url('',true); - } - - protected function getAjaxListUrl() - { - return $this->state_url('ajax_list'); - } - - protected function getExportToExcelUrl() - { - return $this->state_url('export'); - } - - protected function getPrintUrl() - { - return $this->state_url('print'); - } - - protected function getAjaxListInfoUrl() - { - return $this->state_url('ajax_list_info'); - } - - protected function getAddUrl() - { - return $this->state_url('add'); - } - - protected function getInsertUrl() - { - return $this->state_url('insert'); - } - - protected function getValidationInsertUrl() - { - return $this->state_url('insert_validation'); - } - - protected function getValidationUpdateUrl($primary_key = null) - { - if($primary_key === null) - return $this->state_url('update_validation'); - else - return $this->state_url('update_validation/'.$primary_key); - } - - protected function getEditUrl($primary_key = null) - { - if($primary_key === null) - return $this->state_url('edit'); - else - return $this->state_url('edit/'.$primary_key); - } - - protected function getReadUrl($primary_key = null) - { - if($primary_key === null) - return $this->state_url('read'); - else - return $this->state_url('read/'.$primary_key); - } - - protected function getUpdateUrl($state_info) - { - return $this->state_url('update/'.$state_info->primary_key); - } - - protected function getDeleteUrl($state_info = null) - { - if (empty($state_info)) { - return $this->state_url('delete'); - } else { - return $this->state_url('delete/'.$state_info->primary_key); - } - } - - protected function getDeleteMultipleUrl() - { - return $this->state_url('delete_multiple'); - } - - protected function getListSuccessUrl($primary_key = null) - { - if(empty($primary_key)) - return $this->state_url('success',true); - else - return $this->state_url('success/'.$primary_key,true); - } - - protected function getUploadUrl($field_name) - { - return $this->state_url('upload_file/'.$field_name); - } - - protected function getFileDeleteUrl($field_name) - { - return $this->state_url('delete_file/'.$field_name); - } - - protected function getAjaxRelationUrl() - { - return $this->state_url('ajax_relation'); - } - - protected function getAjaxRelationManytoManyUrl() - { - return $this->state_url('ajax_relation_n_n'); - } -} - - -/** - * PHP grocery CRUD - * - * LICENSE - * - * Grocery CRUD is released with dual licensing, using the GPL v3 (license-gpl3.txt) and the MIT license (license-mit.txt). - * You don't have to do anything special to choose one license or the other and you don't have to notify anyone which license you are using. - * Please see the corresponding license file for details of these licenses. - * You are free to use, modify and distribute this software, but all copyright information must remain. - * - * @package grocery CRUD - * @copyright Copyright (c) 2010 through 2014, John Skoumbourdis - * @license https://github.com/scoumbourdis/grocery-crud/blob/master/license-grocery-crud.txt - * @version 1.5.8 - * @author John Skoumbourdis - */ - -// ------------------------------------------------------------------------ - -/** - * PHP grocery CRUD - * - * Creates a full functional CRUD with few lines of code. - * - * @package grocery CRUD - * @author John Skoumbourdis - * @license https://github.com/scoumbourdis/grocery-crud/blob/master/license-grocery-crud.txt - * @link http://www.grocerycrud.com/documentation - */ -class Grocery_CRUD extends grocery_CRUD_States -{ - /** - * Grocery CRUD version - * - * @var string - */ - const VERSION = "1.5.8"; - - const JQUERY = "jquery-1.11.1.min.js"; - const JQUERY_UI_JS = "jquery-ui-1.10.3.custom.min.js"; - const JQUERY_UI_CSS = "jquery-ui-1.10.1.custom.min.css"; - - protected $state_code = null; - protected $state_info = null; - protected $columns = null; - - private $basic_db_table_checked = false; - private $columns_checked = false; - private $add_fields_checked = false; - private $edit_fields_checked = false; - private $read_fields_checked = false; - - protected $default_theme = 'flexigrid'; - protected $language = null; - protected $lang_strings = array(); - protected $php_date_format = null; - protected $js_date_format = null; - protected $ui_date_format = null; - protected $character_limiter = null; - protected $config = null; - - protected $add_fields = null; - protected $edit_fields = null; - protected $read_fields = null; - protected $add_hidden_fields = array(); - protected $edit_hidden_fields = array(); - protected $field_types = null; - protected $basic_db_table = null; - protected $theme_config = array(); - protected $subject = null; - protected $subject_plural = null; - protected $display_as = array(); - protected $order_by = null; - protected $where = array(); - protected $like = array(); - protected $having = array(); - protected $or_having = array(); - protected $limit = null; - protected $required_fields = array(); - protected $_unique_fields = array(); - protected $validation_rules = array(); - protected $relation = array(); - protected $relation_n_n = array(); - protected $upload_fields = array(); - protected $actions = array(); - - protected $form_validation = null; - protected $change_field_type = null; - protected $primary_keys = array(); - protected $crud_url_path = null; - protected $list_url_path = null; - - /* The unsetters */ - protected $unset_texteditor = array(); - protected $unset_add = false; - protected $unset_edit = false; - protected $unset_delete = false; - protected $unset_read = false; - protected $unset_jquery = false; - protected $unset_jquery_ui = false; - protected $unset_bootstrap = false; - protected $unset_list = false; - protected $unset_export = false; - protected $unset_print = false; - protected $unset_back_to_list = false; - protected $unset_columns = null; - protected $unset_add_fields = null; - protected $unset_edit_fields = null; - protected $unset_read_fields = null; - - /* Callbacks */ - protected $callback_before_insert = null; - protected $callback_after_insert = null; - protected $callback_insert = null; - protected $callback_before_update = null; - protected $callback_after_update = null; - protected $callback_update = null; - protected $callback_before_delete = null; - protected $callback_after_delete = null; - protected $callback_delete = null; - protected $callback_column = array(); - protected $callback_add_field = array(); - protected $callback_edit_field = array(); - protected $callback_upload = null; - protected $callback_before_upload = null; - protected $callback_after_upload = null; - - protected $default_javascript_path = null; //autogenerate, please do not modify - protected $default_css_path = null; //autogenerate, please do not modify - protected $default_texteditor_path = null; //autogenerate, please do not modify - protected $default_theme_path = null; //autogenerate, please do not modify - protected $default_language_path = 'assets/grocery_crud/languages'; - protected $default_config_path = 'assets/grocery_crud/config'; - protected $default_assets_path = 'assets/grocery_crud'; - - /** - * - * Constructor - * - * @access public - */ - public function __construct() - { - - } - - /** - * The displayed columns that user see - * - * @access public - * @param string - * @param array - * @return void - */ - public function columns() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->columns = $args; - - return $this; - } - - - /** - * Set Validation Rules - * - * Important note: If the $field is an array then no automated crud fields will take apart - * - * @access public - * @param mixed - * @param string - * @oaram array - * @return void - */ - function set_rules($field, $label = '', $rules = '', $errors = array()) - { - if(is_string($field)) - { - $this->validation_rules[$field] = array('field' => $field, 'label' => $label, 'rules' => $rules, 'errors' => $errors); - }elseif(is_array($field)) - { - foreach($field as $num_field => $field_array) - { - $this->validation_rules[$field_array['field']] = $field_array; - } - } - return $this; - } - - /** - * - * Changes the default field type - * @param string $field - * @param string $type - * @param array|string $extras - */ - public function change_field_type($field , $type, $extras = null) - { - $field_type = (object)array('type' => $type); - - $field_type->extras = $extras; - - $this->change_field_type[$field] = $field_type; - - return $this; - } - - /** - * - * Just an alias to the change_field_type method - * @param string $field - * @param string $type - * @param array|string $extras - */ - public function field_type($field , $type, $extras = null) - { - return $this->change_field_type($field , $type, $extras); - } - - /** - * Change the default primary key for a specific table. - * If the $table_name is NULL then the primary key is for the default table name that we added at the set_table method - * - * @param string $primary_key_field - * @param string $table_name - */ - public function set_primary_key($primary_key_field, $table_name = null) - { - $this->primary_keys[] = array('field_name' => $primary_key_field, 'table_name' => $table_name); - - return $this; - } - - /** - * Unsets the texteditor of the selected fields - * - * @access public - * @param string - * @param array - * @return void - */ - public function unset_texteditor() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - foreach($args as $arg) - { - $this->unset_texteditor[] = $arg; - } - - return $this; - } - - /** - * Unsets just the jquery library from the js. This function can be used if there is already a jquery included - * in the main template. This will avoid all jquery conflicts. - * - * @return void - */ - public function unset_jquery() - { - $this->unset_jquery = true; - - return $this; - } - - /** - * Unsets the jquery UI Javascript and CSS. This function is really useful - * when the jquery UI JavaScript and CSS are already included in the main template. - * This will avoid all jquery UI conflicts. - * - * @return void - */ - public function unset_jquery_ui() - { - $this->unset_jquery_ui = true; - - return $this; - } - - /** - * Unsets just the twitter bootstrap libraries from the js and css. This function can be used if there is already twitter bootstrap files included - * in the main template. If you are already using a bootstrap template then it's not necessary to load the files again. - * - * @return void - */ - public function unset_bootstrap() - { - $this->unset_bootstrap = true; - - return $this; - } - - /** - * Unsets the add operation from the list - * - * @return void - */ - public function unset_add() - { - $this->unset_add = true; - - return $this; - } - - /** - * Unsets the edit operation from the list - * - * @return void - */ - public function unset_edit() - { - $this->unset_edit = true; - - return $this; - } - - /** - * Unsets the delete operation from the list - * - * @return void - */ - public function unset_delete() - { - $this->unset_delete = true; - - return $this; - } - - /** - * Unsets the read operation from the list - * - * @return void - */ - public function unset_read() - { - $this->unset_read = true; - - return $this; - } - - /** - * Just an alias to unset_read - * - * @return void - * */ - public function unset_view() - { - return unset_read(); - } - - /** - * Unsets the export button and functionality from the list - * - * @return void - */ - public function unset_export() - { - $this->unset_export = true; - - return $this; - } - - - /** - * Unsets the print button and functionality from the list - * - * @return void - */ - public function unset_print() - { - $this->unset_print = true; - - return $this; - } - - /** - * Unsets all the operations from the list - * - * @return void - */ - public function unset_operations() - { - $this->unset_add = true; - $this->unset_edit = true; - $this->unset_delete = true; - $this->unset_read = true; - $this->unset_export = true; - $this->unset_print = true; - - return $this; - } - - /** - * Unsets a column from the list - * - * @return void. - */ - public function unset_columns() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->unset_columns = $args; - - return $this; - } - - public function unset_list() - { - $this->unset_list = true; - - return $this; - } - - public function unset_fields() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->unset_add_fields = $args; - $this->unset_edit_fields = $args; - $this->unset_read_fields = $args; - - return $this; - } - - public function unset_add_fields() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->unset_add_fields = $args; - - return $this; - } - - public function unset_edit_fields() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->unset_edit_fields = $args; - - return $this; - } - - public function unset_read_fields() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->unset_read_fields = $args; - - return $this; - } - - - /** - * Unsets everything that has to do with buttons or links with go back to list message - * @access public - * @return void - */ - public function unset_back_to_list() - { - $this->unset_back_to_list = true; - - return $this; - } - - /** - * - * The fields that user will see on add/edit - * - * @access public - * @param string - * @param array - * @return void - */ - public function fields() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->add_fields = $args; - $this->edit_fields = $args; - - return $this; - } - - /** - * - * The fields that user can see . It is only for the add form - */ - public function add_fields() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->add_fields = $args; - - return $this; - } - - /** - * - * The fields that user can see . It is only for the edit form - */ - public function edit_fields() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->edit_fields = $args; - - return $this; - } - - public function set_read_fields() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) { - $args = $args[0]; - } - - $this->read_fields = $args; - - return $this;$args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) { - $args = $args[0]; - } - - $this->read_fields = $args; - - return $this; - } - - /** - * - * Changes the displaying label of the field - * @param $field_name - * @param $display_as - * @return void - */ - public function display_as($field_name, $display_as = null) - { - if(is_array($field_name)) - { - foreach($field_name as $field => $display_as) - { - $this->display_as[$field] = $display_as; - } - } - elseif($display_as !== null) - { - $this->display_as[$field_name] = $display_as; - } - return $this; - } - - /** - * - * Load the language strings array from the language file - */ - protected function _load_language() - { - if($this->language === null) - { - $this->language = strtolower($this->config->default_language); - } - include($this->default_language_path.'/'.$this->language.'.php'); - - foreach($lang as $handle => $lang_string) - if(!isset($this->lang_strings[$handle])) - $this->lang_strings[$handle] = $lang_string; - - $this->default_true_false_text = array( $this->l('form_inactive') , $this->l('form_active')); - $this->subject = $this->subject === null ? $this->l('list_record') : $this->subject; - - } - - protected function _load_date_format() - { - list($php_day, $php_month, $php_year) = array('d','m','Y'); - list($js_day, $js_month, $js_year) = array('dd','mm','yy'); - list($ui_day, $ui_month, $ui_year) = array($this->l('ui_day'), $this->l('ui_month'), $this->l('ui_year')); - - $date_format = $this->config->date_format; - switch ($date_format) { - case 'uk-date': - $this->php_date_format = "$php_day/$php_month/$php_year"; - $this->js_date_format = "$js_day/$js_month/$js_year"; - $this->ui_date_format = "$ui_day/$ui_month/$ui_year"; - break; - - case 'us-date': - $this->php_date_format = "$php_month/$php_day/$php_year"; - $this->js_date_format = "$js_month/$js_day/$js_year"; - $this->ui_date_format = "$ui_month/$ui_day/$ui_year"; - break; - - case 'sql-date': - default: - $this->php_date_format = "$php_year-$php_month-$php_day"; - $this->js_date_format = "$js_year-$js_month-$js_day"; - $this->ui_date_format = "$ui_year-$ui_month-$ui_day"; - break; - } - } - - /** - * - * Set a language string directly - * @param string $handle - * @param string $string - */ - public function set_lang_string($handle, $lang_string){ - $this->lang_strings[$handle] = $lang_string; - - return $this; - } - - /** - * - * Just an alias to get_lang_string method - * @param string $handle - */ - public function l($handle) - { - return $this->get_lang_string($handle); - } - - /** - * - * Get the language string of the inserted string handle - * @param string $handle - */ - public function get_lang_string($handle) - { - return $this->lang_strings[$handle]; - } - - /** - * - * Simply set the language - * @example english - * @param string $language - */ - public function set_language($language) - { - $this->language = $language; - - return $this; - } - - /** - * - * Enter description here ... - */ - protected function get_columns() - { - if($this->columns_checked === false) - { - $field_types = $this->get_field_types(); - if(empty($this->columns)) - { - $this->columns = array(); - foreach($field_types as $field) - { - if( !isset($field->db_extra) || $field->db_extra != 'auto_increment' ) - $this->columns[] = $field->name; - } - } - - foreach($this->columns as $col_num => $column) - { - - if(isset($this->relation[$column])) - { - - $new_column = $this->_unique_field_name($this->relation[$column][0]); - $this->columns[$col_num] = $new_column; - - if(isset($this->display_as[$column])) - { - $display_as = $this->display_as[$column]; - unset($this->display_as[$column]); - $this->display_as[$new_column] = $display_as; - } - else - { - $this->display_as[$new_column] = ucfirst(str_replace('_',' ',$column)); - } - - $column = $new_column; - $this->columns[$col_num] = $new_column; - } - else - { - if(!empty($this->relation)) - { - $table_name = $this->get_table(); - foreach($this->relation as $relation) - { - if( $relation[2] == $column ) - { - $new_column = $table_name.'.'.$column; - if(isset($this->display_as[$column])) - { - $display_as = $this->display_as[$column]; - unset($this->display_as[$column]); - $this->display_as[$new_column] = $display_as; - } - else - { - $this->display_as[$new_column] = ucfirst(str_replace('_',' ',$column)); - } - - $column = $new_column; - $this->columns[$col_num] = $new_column; - } - } - } - - } - - if(isset($this->display_as[$column])) - $this->columns[$col_num] = (object)array('field_name' => $column, 'display_as' => $this->display_as[$column]); - elseif(isset($field_types[$column])) - $this->columns[$col_num] = (object)array('field_name' => $column, 'display_as' => $field_types[$column]->display_as); - else - $this->columns[$col_num] = (object)array('field_name' => $column, 'display_as' => - ucfirst(str_replace('_',' ',$column))); - - if(!empty($this->unset_columns) && in_array($column,$this->unset_columns)) - { - unset($this->columns[$col_num]); - } - } - - $this->columns_checked = true; - - } - - return $this->columns; - } - - /** - * - * Enter description here ... - */ - protected function get_add_fields() - { - if($this->add_fields_checked === false) - { - $field_types = $this->get_field_types(); - if(!empty($this->add_fields)) - { - foreach($this->add_fields as $field_num => $field) - { - if(isset($this->display_as[$field])) - $this->add_fields[$field_num] = (object)array('field_name' => $field, 'display_as' => $this->display_as[$field]); - elseif(isset($field_types[$field]->display_as)) - $this->add_fields[$field_num] = (object)array('field_name' => $field, 'display_as' => $field_types[$field]->display_as); - else - $this->add_fields[$field_num] = (object)array('field_name' => $field, 'display_as' => ucfirst(str_replace('_',' ',$field))); - } - } - else - { - $this->add_fields = array(); - foreach($field_types as $field) - { - //Check if an unset_add_field is initialize for this field name - if($this->unset_add_fields !== null && is_array($this->unset_add_fields) && in_array($field->name,$this->unset_add_fields)) - continue; - - if( (!isset($field->db_extra) || $field->db_extra != 'auto_increment') ) - { - if(isset($this->display_as[$field->name])) - $this->add_fields[] = (object)array('field_name' => $field->name, 'display_as' => $this->display_as[$field->name]); - else - $this->add_fields[] = (object)array('field_name' => $field->name, 'display_as' => $field->display_as); - } - } - } - - $this->add_fields_checked = true; - } - return $this->add_fields; - } - - /** - * - * Enter description here ... - */ - protected function get_edit_fields() - { - if($this->edit_fields_checked === false) - { - $field_types = $this->get_field_types(); - if(!empty($this->edit_fields)) - { - foreach($this->edit_fields as $field_num => $field) - { - if(isset($this->display_as[$field])) - $this->edit_fields[$field_num] = (object)array('field_name' => $field, 'display_as' => $this->display_as[$field]); - else - $this->edit_fields[$field_num] = (object)array('field_name' => $field, 'display_as' => $field_types[$field]->display_as); - } - } - else - { - $this->edit_fields = array(); - foreach($field_types as $field) - { - //Check if an unset_edit_field is initialize for this field name - if($this->unset_edit_fields !== null && is_array($this->unset_edit_fields) && in_array($field->name,$this->unset_edit_fields)) - continue; - - if(!isset($field->db_extra) || $field->db_extra != 'auto_increment') - { - if(isset($this->display_as[$field->name])) - $this->edit_fields[] = (object)array('field_name' => $field->name, 'display_as' => $this->display_as[$field->name]); - else - $this->edit_fields[] = (object)array('field_name' => $field->name, 'display_as' => $field->display_as); - } - } - } - - $this->edit_fields_checked = true; - } - return $this->edit_fields; - } - - /** - * - * Enter description here ... - */ - protected function get_read_fields() - { - if($this->read_fields_checked === false) - { - $field_types = $this->get_field_types(); - if(!empty($this->read_fields)) - { - foreach($this->read_fields as $field_num => $field) - { - if(isset($this->display_as[$field])) - $this->read_fields[$field_num] = (object)array('field_name' => $field, 'display_as' => $this->display_as[$field]); - else - $this->read_fields[$field_num] = (object)array('field_name' => $field, 'display_as' => $field_types[$field]->display_as); - } - } - else - { - $this->read_fields = array(); - foreach($field_types as $field) - { - //Check if an unset_read_field is initialize for this field name - if($this->unset_read_fields !== null && is_array($this->unset_read_fields) && in_array($field->name,$this->unset_read_fields)) - continue; - - if(!isset($field->db_extra) || $field->db_extra != 'auto_increment') - { - if(isset($this->display_as[$field->name])) - $this->read_fields[] = (object)array('field_name' => $field->name, 'display_as' => $this->display_as[$field->name]); - else - $this->read_fields[] = (object)array('field_name' => $field->name, 'display_as' => $field->display_as); - } - } - } - - $this->read_fields_checked = true; - } - return $this->read_fields; - } - - public function order_by($order_by, $direction = 'asc') - { - $this->order_by = array($order_by,$direction); - - return $this; - } - - public function where($key, $value = NULL, $escape = TRUE) - { - $this->where[] = array($key,$value,$escape); - - return $this; - } - - public function or_where($key, $value = NULL, $escape = TRUE) - { - $this->or_where[] = array($key,$value,$escape); - - return $this; - } - - public function like($field, $match = '', $side = 'both') - { - $this->like[] = array($field, $match, $side); - - return $this; - } - - protected function having($key, $value = '', $escape = TRUE) - { - $this->having[] = array($key, $value, $escape); - - return $this; - } - - protected function or_having($key, $value = '', $escape = TRUE) - { - $this->or_having[] = array($key, $value, $escape); - - return $this; - } - - public function or_like($field, $match = '', $side = 'both') - { - $this->or_like[] = array($field, $match, $side); - - return $this; - } - - public function limit($limit, $offset = '') - { - $this->limit = array($limit,$offset); - - return $this; - } - - protected function _initialize_helpers() - { - $ci = &get_instance(); - - $ci->load->helper('url'); - $ci->load->helper('form'); - } - - protected function _initialize_variables() - { - $ci = &get_instance(); - $ci->load->config('grocery_crud'); - - $this->config = (object)array(); - - /** Initialize all the config variables into this object */ - $this->config->default_language = $ci->config->item('grocery_crud_default_language'); - $this->config->date_format = $ci->config->item('grocery_crud_date_format'); - $this->config->default_per_page = $ci->config->item('grocery_crud_default_per_page'); - $this->config->file_upload_allow_file_types = $ci->config->item('grocery_crud_file_upload_allow_file_types'); - $this->config->file_upload_max_file_size = $ci->config->item('grocery_crud_file_upload_max_file_size'); - $this->config->default_text_editor = $ci->config->item('grocery_crud_default_text_editor'); - $this->config->text_editor_type = $ci->config->item('grocery_crud_text_editor_type'); - $this->config->character_limiter = $ci->config->item('grocery_crud_character_limiter'); - $this->config->dialog_forms = $ci->config->item('grocery_crud_dialog_forms'); - $this->config->paging_options = $ci->config->item('grocery_crud_paging_options'); - $this->config->default_theme = $ci->config->item('grocery_crud_default_theme'); - $this->config->environment = $ci->config->item('grocery_crud_environment'); - $this->config->xss_clean = $ci->config->item('grocery_crud_xss_clean'); - - /** Initialize default paths */ - $this->default_javascript_path = $this->default_assets_path.'/js'; - $this->default_css_path = $this->default_assets_path.'/css'; - $this->default_texteditor_path = $this->default_assets_path.'/texteditor'; - $this->default_theme_path = $this->default_assets_path.'/themes'; - - $this->character_limiter = $this->config->character_limiter; - - if ($this->character_limiter === 0 || $this->character_limiter === '0') { - $this->character_limiter = 1000000; //a very big number - } elseif($this->character_limiter === null || $this->character_limiter === false) { - $this->character_limiter = 30; //is better to have the number 30 rather than the 0 value - } - - if ($this->theme === null && !empty($this->config->default_theme)) { - $this->set_theme($this->config->default_theme); - } - } - - protected function _set_primary_keys_to_model() - { - if(!empty($this->primary_keys)) - { - foreach($this->primary_keys as $primary_key) - { - $this->basic_model->set_primary_key($primary_key['field_name'],$primary_key['table_name']); - } - } - } - - /** - * Initialize all the required libraries and variables before rendering - */ - protected function pre_render() - { - $this->_initialize_variables(); - $this->_initialize_helpers(); - $this->_load_language(); - $this->state_code = $this->getStateCode(); - - if($this->basic_model === null) - $this->set_default_Model(); - - $this->set_basic_db_table($this->get_table()); - - $this->_load_date_format(); - - $this->_set_primary_keys_to_model(); - } - - /** - * - * Or else ... make it work! The web application takes decision of what to do and show it to the final user. - * Without this function nothing works. Here is the core of grocery CRUD project. - * - * @access public - */ - public function render() - { - $this->pre_render(); - - if( $this->state_code != 0 ) - { - $this->state_info = $this->getStateInfo(); - } - else - { - throw new Exception('The state is unknown , I don\'t know what I will do with your data!', 4); - die(); - } - - switch ($this->state_code) { - case 15://success - case 1://list - if($this->unset_list) - { - throw new Exception('You don\'t have permissions for this operation', 14); - die(); - } - - if($this->theme === null) - $this->set_theme($this->default_theme); - $this->setThemeBasics(); - - $this->set_basic_Layout(); - - $state_info = $this->getStateInfo(); - - $this->showList(false,$state_info); - - break; - - case 2://add - if($this->unset_add) - { - throw new Exception('You don\'t have permissions for this operation', 14); - die(); - } - - if($this->theme === null) - $this->set_theme($this->default_theme); - $this->setThemeBasics(); - - $this->set_basic_Layout(); - - $this->showAddForm(); - - break; - - case 3://edit - if($this->unset_edit) - { - throw new Exception('You don\'t have permissions for this operation', 14); - die(); - } - - if($this->theme === null) - $this->set_theme($this->default_theme); - $this->setThemeBasics(); - - $this->set_basic_Layout(); - - $state_info = $this->getStateInfo(); - - $this->showEditForm($state_info); - - break; - - case 4://delete - if($this->unset_delete) - { - throw new Exception('This user is not allowed to do this operation', 14); - die(); - } - - $state_info = $this->getStateInfo(); - $delete_result = $this->db_delete($state_info); - - $this->delete_layout( $delete_result ); - break; - - case 5://insert - if($this->unset_add) - { - throw new Exception('This user is not allowed to do this operation', 14); - die(); - } - - $state_info = $this->getStateInfo(); - $insert_result = $this->db_insert($state_info); - - $this->insert_layout($insert_result); - break; - - case 6://update - if($this->unset_edit) - { - throw new Exception('This user is not allowed to do this operation', 14); - die(); - } - - $state_info = $this->getStateInfo(); - $update_result = $this->db_update($state_info); - - $this->update_layout( $update_result,$state_info); - break; - - case 7://ajax_list - - if($this->unset_list) - { - throw new Exception('You don\'t have permissions for this operation', 14); - die(); - } - - if($this->theme === null) - $this->set_theme($this->default_theme); - $this->setThemeBasics(); - - $this->set_basic_Layout(); - - $state_info = $this->getStateInfo(); - $this->set_ajax_list_queries($state_info); - - $this->showList(true); - - break; - - case 8://ajax_list_info - - if($this->theme === null) - $this->set_theme($this->default_theme); - $this->setThemeBasics(); - - $this->set_basic_Layout(); - - $state_info = $this->getStateInfo(); - $this->set_ajax_list_queries($state_info); - - $this->showListInfo(); - break; - - case 9://insert_validation - - $validation_result = $this->db_insert_validation(); - - $this->validation_layout($validation_result); - break; - - case 10://update_validation - - $validation_result = $this->db_update_validation(); - - $this->validation_layout($validation_result); - break; - - case 11://upload_file - - $state_info = $this->getStateInfo(); - - $upload_result = $this->upload_file($state_info); - - $this->upload_layout($upload_result, $state_info->field_name); - break; - - case 12://delete_file - $state_info = $this->getStateInfo(); - - $delete_file_result = $this->delete_file($state_info); - - $this->delete_file_layout($delete_file_result); - break; - /* - case 13: //ajax_relation - $state_info = $this->getStateInfo(); - - $ajax_relation_result = $this->ajax_relation($state_info); - - $ajax_relation_result[""] = ""; - - echo json_encode($ajax_relation_result); - die(); - break; - - case 14: //ajax_relation_n_n - echo json_encode(array("34" => 'Johnny' , "78" => "Test")); - die(); - break; - */ - case 16: //export to excel - //a big number just to ensure that the table characters will not be cutted. - $this->character_limiter = 1000000; - - if($this->unset_export) - { - throw new Exception('You don\'t have permissions for this operation', 15); - die(); - } - - if($this->theme === null) - $this->set_theme($this->default_theme); - $this->setThemeBasics(); - - $this->set_basic_Layout(); - - $state_info = $this->getStateInfo(); - $this->set_ajax_list_queries($state_info); - $this->exportToExcel($state_info); - break; - - case 17: //print - //a big number just to ensure that the table characters will not be cutted. - $this->character_limiter = 1000000; - - if($this->unset_print) - { - throw new Exception('You don\'t have permissions for this operation', 15); - die(); - } - - if($this->theme === null) - $this->set_theme($this->default_theme); - $this->setThemeBasics(); - - $this->set_basic_Layout(); - - $state_info = $this->getStateInfo(); - $this->set_ajax_list_queries($state_info); - $this->print_webpage($state_info); - break; - - case grocery_CRUD_States::STATE_READ: - if($this->unset_read) - { - throw new Exception('You don\'t have permissions for this operation', 14); - die(); - } - - if($this->theme === null) - $this->set_theme($this->default_theme); - $this->setThemeBasics(); - - $this->set_basic_Layout(); - - $state_info = $this->getStateInfo(); - - $this->showReadForm($state_info); - - break; - - case grocery_CRUD_States::STATE_DELETE_MULTIPLE: - - if($this->unset_delete) - { - throw new Exception('This user is not allowed to do this operation'); - die(); - } - - $state_info = $this->getStateInfo(); - $delete_result = $this->db_multiple_delete($state_info); - - $this->delete_layout($delete_result); - - break; - - } - - return $this->get_layout(); - } - - protected function get_common_data() - { - $data = (object)array(); - - $data->subject = $this->subject; - $data->subject_plural = $this->subject_plural; - - return $data; - } - - /** - * - * Enter description here ... - */ - public function callback_before_insert($callback = null) - { - $this->callback_before_insert = $callback; - - return $this; - } - - /** - * - * Enter description here ... - */ - public function callback_after_insert($callback = null) - { - $this->callback_after_insert = $callback; - - return $this; - } - - /** - * - * Enter description here ... - */ - public function callback_insert($callback = null) - { - $this->callback_insert = $callback; - - return $this; - } - - - /** - * - * Enter description here ... - */ - public function callback_before_update($callback = null) - { - $this->callback_before_update = $callback; - - return $this; - } - - /** - * - * Enter description here ... - */ - public function callback_after_update($callback = null) - { - $this->callback_after_update = $callback; - - return $this; - } - - - /** - * - * Enter description here ... - * @param mixed $callback - */ - public function callback_update($callback = null) - { - $this->callback_update = $callback; - - return $this; - } - - /** - * - * Enter description here ... - */ - public function callback_before_delete($callback = null) - { - $this->callback_before_delete = $callback; - - return $this; - } - - /** - * - * Enter description here ... - */ - public function callback_after_delete($callback = null) - { - $this->callback_after_delete = $callback; - - return $this; - } - - /** - * - * Enter description here ... - */ - public function callback_delete($callback = null) - { - $this->callback_delete = $callback; - - return $this; - } - - /** - * - * Enter description here ... - * @param string $column - * @param mixed $callback - */ - public function callback_column($column ,$callback = null) - { - $this->callback_column[$column] = $callback; - - return $this; - } - - /** - * - * Enter description here ... - * @param string $field - * @param mixed $callback - */ - public function callback_field($field, $callback = null) - { - $this->callback_add_field[$field] = $callback; - $this->callback_edit_field[$field] = $callback; - - return $this; - } - - /** - * - * Enter description here ... - * @param string $field - * @param mixed $callback - */ - public function callback_add_field($field, $callback = null) - { - $this->callback_add_field[$field] = $callback; - - return $this; - } - - /** - * - * Enter description here ... - * @param string $field - * @param mixed $callback - */ - public function callback_edit_field($field, $callback = null) - { - $this->callback_edit_field[$field] = $callback; - - return $this; - } - - /** - * - * Callback that replace the default auto uploader - * - * @param mixed $callback - * @return grocery_CRUD - */ - public function callback_upload($callback = null) - { - $this->callback_upload = $callback; - - return $this; - } - - /** - * - * A callback that triggered before the upload functionality. This callback is suggested for validation checks - * @param mixed $callback - * @return grocery_CRUD - */ - public function callback_before_upload($callback = null) - { - $this->callback_before_upload = $callback; - - return $this; - } - - /** - * - * A callback that triggered after the upload functionality - * @param mixed $callback - * @return grocery_CRUD - */ - public function callback_after_upload($callback = null) - { - $this->callback_after_upload = $callback; - - return $this; - - } - - /** - * - * Gets the basic database table of our crud. - * @return string - */ - public function get_table() - { - if($this->basic_db_table_checked) - { - return $this->basic_db_table; - } - elseif( $this->basic_db_table !== null ) - { - if(!$this->table_exists($this->basic_db_table)) - { - throw new Exception('The table name does not exist. Please check you database and try again.',11); - die(); - } - $this->basic_db_table_checked = true; - return $this->basic_db_table; - } - else - { - //Last try , try to find the table from your view / function name!!! Not suggested but it works . - $last_chance_table_name = $this->get_method_name(); - if($this->table_exists($last_chance_table_name)) - { - $this->set_table($last_chance_table_name); - } - $this->basic_db_table_checked = true; - return $this->basic_db_table; - - } - - return false; - } - - /** - * - * The field names of the required fields - */ - public function required_fields() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->required_fields = $args; - - return $this; - } - - /** - * Add the fields that they are as UNIQUE in the database structure - * - * @return grocery_CRUD - */ - public function unique_fields() - { - $args = func_get_args(); - - if(isset($args[0]) && is_array($args[0])) - { - $args = $args[0]; - } - - $this->_unique_fields = $args; - - return $this; - } - - /** - * - * Sets the basic database table that we will get our data. - * @param string $table_name - * @return grocery_CRUD - */ - public function set_table($table_name) - { - if(!empty($table_name) && $this->basic_db_table === null) - { - $this->basic_db_table = $table_name; - } - elseif(!empty($table_name)) - { - throw new Exception('You have already insert a table name once...', 1); - } - else - { - throw new Exception('The table name cannot be empty.', 2); - die(); - } - - return $this; - } - - /** - * Set a full URL path to this method. - * - * This method is useful when the path is not specified correctly. - * Especially when we are using routes. - * For example: - * Let's say we have the path http://www.example.com/ however the original url path is - * http://www.example.com/example/index . We have to specify the url so we can have - * all the CRUD operations correctly. - * The url path has to be set from this method like this: - * - * $crud->set_crud_url_path(site_url('example/index')); - * - * - * @param string $crud_url_path - * @param string $list_url_path - * @return grocery_CRUD - */ - public function set_crud_url_path($crud_url_path, $list_url_path = null) - { - $this->crud_url_path = $crud_url_path; - - //If the list_url_path is empty so we are guessing that the list_url_path - //will be the same with crud_url_path - $this->list_url_path = !empty($list_url_path) ? $list_url_path : $crud_url_path; - - return $this; - } - - /** - * - * Set a subject to understand what type of CRUD you use. - * ---------------------------------------------------------------------------------------------- - * Subject_plural: Sets the subject to its plural form. For example the plural - * of "Customer" is "Customers", "Product" is "Products"... e.t.c. - * @example In this CRUD we work with the table db_categories. The $subject will be the 'Category' - * and the $subject_plural will be 'Categories' - * @param string $subject - * @param string $subject_plural - * @return grocery_CRUD - */ - public function set_subject($subject, $subject_plural = null) - { - $this->subject = $subject; - $this->subject_plural = $subject_plural === null ? $subject : $subject_plural; - - return $this; - } - - /** - * - * Enter description here ... - * @param $title - * @param $image_url - * @param $url - * @param $css_class - * @param $url_callback - */ - public function add_action( $label, $image_url = '', $link_url = '', $css_class = '', $url_callback = null) - { - $unique_id = substr($label,0,1).substr(md5($label.$link_url),-8); //The unique id is used for class name so it must begin with a string - - $this->actions[$unique_id] = (object)array( - 'label' => $label, - 'image_url' => $image_url, - 'link_url' => $link_url, - 'css_class' => $css_class, - 'url_callback' => $url_callback, - 'url_has_http' => substr($link_url,0,7) == 'http://' || substr($link_url,0,8) == 'https://' ? true : false - ); - - return $this; - } - - /** - * - * Set a simple 1-n foreign key relation - * @param string $field_name - * @param string $related_table - * @param string $related_title_field - * @param mixed $where_clause - * @param string $order_by - * @return Grocery_CRUD - */ - public function set_relation($field_name , $related_table, $related_title_field, $where_clause = null, $order_by = null) - { - $this->relation[$field_name] = array($field_name, $related_table,$related_title_field, $where_clause, $order_by); - return $this; - } - - /** - * - * Sets a relation with n-n relationship. - * @param string $field_name - * @param string $relation_table - * @param string $selection_table - * @param string $primary_key_alias_to_this_table - * @param string $primary_key_alias_to_selection_table - * @param string $title_field_selection_table - * @param string $priority_field_relation_table - * @param mixed $where_clause - * @return Grocery_CRUD - */ - public function set_relation_n_n($field_name, $relation_table, $selection_table, $primary_key_alias_to_this_table, $primary_key_alias_to_selection_table , $title_field_selection_table , $priority_field_relation_table = null, $where_clause = null) - { - $this->relation_n_n[$field_name] = - (object)array( - 'field_name' => $field_name, - 'relation_table' => $relation_table, - 'selection_table' => $selection_table, - 'primary_key_alias_to_this_table' => $primary_key_alias_to_this_table, - 'primary_key_alias_to_selection_table' => $primary_key_alias_to_selection_table , - 'title_field_selection_table' => $title_field_selection_table , - 'priority_field_relation_table' => $priority_field_relation_table, - 'where_clause' => $where_clause - ); - - return $this; - } - - /** - * - * Transform a field to an upload field - * - * @param string $field_name - * @param string $upload_path - * @return Grocery_CRUD - */ - public function set_field_upload($field_name, $upload_dir = '', $allowed_file_types = '') - { - $upload_dir = !empty($upload_dir) && substr($upload_dir,-1,1) == '/' - ? substr($upload_dir,0,-1) - : $upload_dir; - $upload_dir = !empty($upload_dir) ? $upload_dir : 'assets/uploads/files'; - - /** Check if the upload Url folder exists. If not then throw an exception **/ - if (!is_dir(FCPATH.$upload_dir)) { - throw new Exception("It seems that the folder \"".FCPATH.$upload_dir."\" for the field name - \"".$field_name."\" doesn't exists. Please create the folder and try again."); - } - - $this->upload_fields[$field_name] = (object) array( - 'field_name' => $field_name, - 'upload_path' => $upload_dir, - 'allowed_file_types' => $allowed_file_types, - 'encrypted_field_name' => $this->_unique_field_name($field_name)); - return $this; - } -} - -if(defined('CI_VERSION')) -{ - $ci = &get_instance(); - $ci->load->library('Form_validation'); - - class grocery_CRUD_Form_validation extends CI_Form_validation{ - - public $CI; - public $_field_data = array(); - public $_config_rules = array(); - public $_error_array = array(); - public $_error_messages = array(); - public $_error_prefix = '

'; - public $_error_suffix = '

'; - public $error_string = ''; - public $_safe_form_data = FALSE; - } -} - -/* - * jQuery File Upload Plugin PHP Example 5.5 - * https://github.com/blueimp/jQuery-File-Upload - * - * Copyright 2010, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * http://www.opensource.org/licenses/MIT - */ - -class UploadHandler -{ - private $options; - public $default_config_path = null; - - function __construct($options=null) { - $this->options = array( - 'script_url' => $this->getFullUrl().'/'.basename(__FILE__), - 'upload_dir' => dirname(__FILE__).'/files/', - 'upload_url' => $this->getFullUrl().'/files/', - 'param_name' => 'files', - // The php.ini settings upload_max_filesize and post_max_size - // take precedence over the following max_file_size setting: - 'max_file_size' => null, - 'min_file_size' => 1, - 'accept_file_types' => '/.+$/i', - 'max_number_of_files' => null, - // Set the following option to false to enable non-multipart uploads: - 'discard_aborted_uploads' => true, - // Set to true to rotate images based on EXIF meta data, if available: - 'orient_image' => false, - 'image_versions' => array( - // Uncomment the following version to restrict the size of - // uploaded images. You can also add additional versions with - // their own upload directories: - /* - 'large' => array( - 'upload_dir' => dirname(__FILE__).'/files/', - 'upload_url' => dirname($_SERVER['PHP_SELF']).'/files/', - 'max_width' => 1920, - 'max_height' => 1200 - ), - - 'thumbnail' => array( - 'upload_dir' => dirname(__FILE__).'/thumbnails/', - 'upload_url' => $this->getFullUrl().'/thumbnails/', - 'max_width' => 80, - 'max_height' => 80 - ) - */ - ) - ); - if ($options) { - // Or else for PHP >= 5.3.0 use: $this->options = array_replace_recursive($this->options, $options); - foreach($options as $option_name => $option) - { - $this->options[$option_name] = $option; - } - } - } - - function getFullUrl() { - return - (isset($_SERVER['HTTPS']) ? 'https://' : 'http://'). - (isset($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : ''). - (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME']. - (isset($_SERVER['HTTPS']) && $_SERVER['SERVER_PORT'] === 443 || - $_SERVER['SERVER_PORT'] === 80 ? '' : ':'.$_SERVER['SERVER_PORT']))). - substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/')); - } - - private function get_file_object($file_name) { - $file_path = $this->options['upload_dir'].$file_name; - if (is_file($file_path) && $file_name[0] !== '.') { - $file = new stdClass(); - $file->name = $file_name; - $file->size = filesize($file_path); - $file->url = $this->options['upload_url'].rawurlencode($file->name); - foreach($this->options['image_versions'] as $version => $options) { - if (is_file($options['upload_dir'].$file_name)) { - $file->{$version.'_url'} = $options['upload_url'] - .rawurlencode($file->name); - } - } - $file->delete_url = $this->options['script_url'] - .'?file='.rawurlencode($file->name); - $file->delete_type = 'DELETE'; - return $file; - } - return null; - } - - private function get_file_objects() { - return array_values(array_filter(array_map( - array($this, 'get_file_object'), - scandir($this->options['upload_dir']) - ))); - } - - private function create_scaled_image($file_name, $options) { - $file_path = $this->options['upload_dir'].$file_name; - $new_file_path = $options['upload_dir'].$file_name; - list($img_width, $img_height) = @getimagesize($file_path); - if (!$img_width || !$img_height) { - return false; - } - $scale = min( - $options['max_width'] / $img_width, - $options['max_height'] / $img_height - ); - if ($scale > 1) { - $scale = 1; - } - $new_width = $img_width * $scale; - $new_height = $img_height * $scale; - $new_img = @imagecreatetruecolor($new_width, $new_height); - switch (strtolower(substr(strrchr($file_name, '.'), 1))) { - case 'jpg': - case 'jpeg': - $src_img = @imagecreatefromjpeg($file_path); - $write_image = 'imagejpeg'; - break; - case 'gif': - @imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0)); - $src_img = @imagecreatefromgif($file_path); - $write_image = 'imagegif'; - break; - case 'png': - @imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0)); - @imagealphablending($new_img, false); - @imagesavealpha($new_img, true); - $src_img = @imagecreatefrompng($file_path); - $write_image = 'imagepng'; - break; - default: - $src_img = $image_method = null; - } - $success = $src_img && @imagecopyresampled( - $new_img, - $src_img, - 0, 0, 0, 0, - $new_width, - $new_height, - $img_width, - $img_height - ) && $write_image($new_img, $new_file_path); - // Free up memory (imagedestroy does not delete files): - @imagedestroy($src_img); - @imagedestroy($new_img); - return $success; - } - - private function has_error($uploaded_file, $file, $error) { - if ($error) { - switch($error) { - case UPLOAD_ERR_INI_SIZE: - return 'The uploaded file exceeds the upload_max_filesize directive in php.ini.'; - break; - case UPLOAD_ERR_PARTIAL: - return 'The uploaded file was only partially uploaded.'; - break; - case UPLOAD_ERR_NO_FILE: - return 'No file was uploaded.'; - break; - case UPLOAD_ERR_CANT_WRITE: - return 'Failed to write file to disk.'; - break; - case UPLOAD_ERR_EXTENSION: - return 'File upload stopped by extension.'; - break; - default: - return $error; - break; - } - } - if (!preg_match($this->options['accept_file_types'], $file->name)) { - return 'acceptFileTypes'; - } - if ($uploaded_file && is_uploaded_file($uploaded_file)) { - $file_size = filesize($uploaded_file); - } else { - $file_size = $_SERVER['CONTENT_LENGTH']; - } - - if ($this->options['max_file_size'] && ( - $file_size > $this->options['max_file_size'] || - $file->size > $this->options['max_file_size']) - ) { - return 'maxFileSize'; - } - if ($this->options['min_file_size'] && - $file_size < $this->options['min_file_size']) { - return 'minFileSize'; - } - if (is_int($this->options['max_number_of_files']) && ( - count($this->get_file_objects()) >= $this->options['max_number_of_files']) - ) { - return 'maxNumberOfFiles'; - } - return $error; - } - - private function trim_file_name($name, $type) { - // Remove path information and dots around the filename, to prevent uploading - // into different directories or replacing hidden system files. - // Also remove control characters and spaces (\x00..\x20) around the filename: - $file_name = trim(basename(stripslashes($name)), ".\x00..\x20"); - // Add missing file extension for known image types: - if (strpos($file_name, '.') === false && - preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) { - $file_name .= '.'.$matches[1]; - } - - //Ensure that we don't have disallowed characters and add a unique id just to ensure that the file name will be unique - $file_name = substr(uniqid(),-5).'-'.$this->_transliterate_characters($file_name); - - //all the characters has to be lowercase - $file_name = strtolower($file_name); - - return $file_name; - } - - private function _transliterate_characters($file_name) - { - include($this->default_config_path.'/translit_chars.php'); - if ( isset($translit_characters)) - { - $file_name = preg_replace(array_keys($translit_characters), array_values($translit_characters), $file_name); - } - - $file_name = preg_replace("/([^a-zA-Z0-9\.\-\_]+?){1}/i", '-', $file_name); - $file_name = str_replace(" ", "-", $file_name); - - return preg_replace('/\-+/', '-', trim($file_name, '-')); - } - - private function orient_image($file_path) { - $exif = exif_read_data($file_path); - $orientation = intval(@$exif['Orientation']); - if (!in_array($orientation, array(3, 6, 8))) { - return false; - } - $image = @imagecreatefromjpeg($file_path); - switch ($orientation) { - case 3: - $image = @imagerotate($image, 180, 0); - break; - case 6: - $image = @imagerotate($image, 270, 0); - break; - case 8: - $image = @imagerotate($image, 90, 0); - break; - default: - return false; - } - $success = imagejpeg($image, $file_path); - // Free up memory (imagedestroy does not delete files): - @imagedestroy($image); - return $success; - } - - private function handle_file_upload($uploaded_file, $name, $size, $type, $error) { - $file = new stdClass(); - $file->name = $this->trim_file_name($name, $type); - $file->size = intval($size); - $file->type = $type; - $error = $this->has_error($uploaded_file, $file, $error); - if (!$error && $file->name) { - $file_path = $this->options['upload_dir'].$file->name; - $append_file = !$this->options['discard_aborted_uploads'] && - is_file($file_path) && $file->size > filesize($file_path); - clearstatcache(); - if ($uploaded_file && is_uploaded_file($uploaded_file)) { - // multipart/formdata uploads (POST method uploads) - if ($append_file) { - file_put_contents( - $file_path, - fopen($uploaded_file, 'r'), - FILE_APPEND - ); - } else { - move_uploaded_file($uploaded_file, $file_path); - } - } else { - // Non-multipart uploads (PUT method support) - file_put_contents( - $file_path, - fopen('php://input', 'r'), - $append_file ? FILE_APPEND : 0 - ); - } - $file_size = filesize($file_path); - if ($file_size === $file->size) { - if ($this->options['orient_image']) { - $this->orient_image($file_path); - } - $file->url = $this->options['upload_url'].rawurlencode($file->name); - foreach($this->options['image_versions'] as $version => $options) { - if ($this->create_scaled_image($file->name, $options)) { - $file->{$version.'_url'} = $options['upload_url'] - .rawurlencode($file->name); - } - } - } else if ($this->options['discard_aborted_uploads']) { - unlink($file_path); - $file->error = "It seems that this user doesn't have permissions to upload to this folder"; - } - $file->size = $file_size; - $file->delete_url = $this->options['script_url'] - .'?file='.rawurlencode($file->name); - $file->delete_type = 'DELETE'; - } else { - $file->error = $error; - } - return $file; - } - - public function get() { - $file_name = isset($_REQUEST['file']) ? - basename(stripslashes($_REQUEST['file'])) : null; - if ($file_name) { - $info = $this->get_file_object($file_name); - } else { - $info = $this->get_file_objects(); - } - header('Content-type: application/json'); - echo json_encode($info); - } - - public function post() { - if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') { - return $this->delete(); - } - $upload = isset($_FILES[$this->options['param_name']]) ? - $_FILES[$this->options['param_name']] : null; - $info = array(); - if ($upload && is_array($upload['tmp_name'])) { - foreach ($upload['tmp_name'] as $index => $value) { - $info[] = $this->handle_file_upload( - $upload['tmp_name'][$index], - isset($_SERVER['HTTP_X_FILE_NAME']) ? - $_SERVER['HTTP_X_FILE_NAME'] : $upload['name'][$index], - isset($_SERVER['HTTP_X_FILE_SIZE']) ? - $_SERVER['HTTP_X_FILE_SIZE'] : $upload['size'][$index], - isset($_SERVER['HTTP_X_FILE_TYPE']) ? - $_SERVER['HTTP_X_FILE_TYPE'] : $upload['type'][$index], - $upload['error'][$index] - ); - } - } elseif ($upload || isset($_SERVER['HTTP_X_FILE_NAME'])) { - $info[] = $this->handle_file_upload( - isset($upload['tmp_name']) ? $upload['tmp_name'] : null, - isset($_SERVER['HTTP_X_FILE_NAME']) ? - $_SERVER['HTTP_X_FILE_NAME'] : $upload['name'], - isset($_SERVER['HTTP_X_FILE_SIZE']) ? - $_SERVER['HTTP_X_FILE_SIZE'] : $upload['size'], - isset($_SERVER['HTTP_X_FILE_TYPE']) ? - $_SERVER['HTTP_X_FILE_TYPE'] : $upload['type'], - isset($upload['error']) ? $upload['error'] : null - ); - } - header('Vary: Accept'); - - $redirect = isset($_REQUEST['redirect']) ? - stripslashes($_REQUEST['redirect']) : null; - if ($redirect) { - header('Location: '.sprintf($redirect, rawurlencode($json))); - return; - } - if (isset($_SERVER['HTTP_ACCEPT']) && - (strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false)) { - header('Content-type: application/json'); - } else { - header('Content-type: text/plain'); - } - return $info; - } - - public function delete() { - $file_name = isset($_REQUEST['file']) ? - basename(stripslashes($_REQUEST['file'])) : null; - $file_path = $this->options['upload_dir'].$file_name; - $success = is_file($file_path) && $file_name[0] !== '.' && unlink($file_path); - if ($success) { - foreach($this->options['image_versions'] as $version => $options) { - $file = $options['upload_dir'].$file_name; - if (is_file($file)) { - unlink($file); - } - } - } - header('Content-type: application/json'); - echo json_encode($success); - } - -} diff --git a/application/libraries/dompdf_gen.php b/application/libraries/dompdf_gen.php new file mode 100644 index 00000000..f2637a82 --- /dev/null +++ b/application/libraries/dompdf_gen.php @@ -0,0 +1,34 @@ +dompdf = $pdf; + + } + +} \ No newline at end of file diff --git a/application/libraries/pdf.php b/application/libraries/pdf.php new file mode 100644 index 00000000..ae496f3d --- /dev/null +++ b/application/libraries/pdf.php @@ -0,0 +1,44 @@ +ci()->load->view($view, $data, TRUE); + + $this->load_html($html); + } +} \ No newline at end of file diff --git a/application/models/Employeedetails_model.php b/application/models/Employeedetails_model.php new file mode 100644 index 00000000..3d06e5b3 --- /dev/null +++ b/application/models/Employeedetails_model.php @@ -0,0 +1,165 @@ +db->select('BaseT.EmpID, BaseT.FirstName, BaseT.LastName, BaseT.DateofBirth,BaseT.ContactNumber, BaseT.EmailId,BaseT.DateofJoining,BaseT.Address1,BaseT.Address2,BaseT.Place,BaseT.City,BaseT.State,BaseT.Pin +,BaseT.DepartmentName,BaseT.User_Comments,role.role'); + $this->db->from('T_EmpDetails as BaseT'); + + + + $this->db->join('tbl_roles as role', 'role.Role = BaseT.role','left'); + + if(!empty($searchText)) { + $likeCriteria = "(BaseT.EmpID LIKE '%".$searchText."%' + OR BaseT.FirstName LIKE '%".$searchText."%' + OR BaseT.LastName LIKE '%".$searchText."%' + OR BaseT.DateofBirth LIKE '%".$searchText."%' + OR BaseT.ContactNumber LIKE '%".$searchText."%' + OR BaseT.EmailId LIKE '%".$searchText."%' + OR BaseT.DateofJoining LIKE '%".$searchText."%' + OR BaseT.Role LIKE '%".$searchText."%' + OR BaseT.Address1 LIKE '%".$searchText."%' + OR BaseT.Address2 LIKE '%".$searchText."%' + OR BaseT.Place LIKE '%".$searchText."%' + OR BaseT.City LIKE '%".$searchText."%' + OR BaseT.State LIKE '%".$searchText."%' + OR BaseT.DepartmentName LIKE '%".$searchText."%' + OR BaseT.User_Comments LIKE '%".$searchText."%' + + OR BaseT.Pin LIKE '%".$searchText."%' + )"; + $this->db->where($likeCriteria); + } + //$this->db->where('BaseT.userId !=', 1); + $query = $this->db->get(); + + return count($query->result()); + } + /** + * This function is used to get the user listing count + * @param string $searchText : This is optional search text + * @param number $page : This is pagination offset + * @param number $segment : This is pagination limit + * @return array $result : This is result + */ + function employeeListing($searchText = '', $page, $segment) + { + $this->db->select('BaseT.EmpID, BaseT.FirstName, BaseT.LastName, BaseT.DateofBirth,BaseT.ContactNumber, BaseT.EmailId,BaseT.DateofJoining,BaseT.Address1,BaseT.Address2,BaseT.Place,BaseT.City,BaseT.State,BaseT.Pin,BaseT.DepartmentName,BaseT.User_Comments,role.role'); + $this->db->from('T_EmpDetails as BaseT'); + + $this->db->join('tbl_roles as role', 'role.Role = BaseT.Role','left'); + + if(!empty($searchText)) { + $likeCriteria = "(BaseT.EmpID LIKE '%".$searchText."%' + OR BaseT.FirstName LIKE '%".$searchText."%' + OR BaseT.LastName LIKE '%".$searchText."%' + OR BaseT.DateofBirth LIKE '%".$searchText."%' + OR BaseT.ContactNumber LIKE '%".$searchText."%' + OR BaseT.EmailId LIKE '%".$searchText."%' + OR BaseT.DateofJoining LIKE '%".$searchText."%' + OR BaseT.Role LIKE '%".$searchText."%' + OR BaseT.Address1 LIKE '%".$searchText."%' + OR BaseT.Address2 LIKE '%".$searchText."%' + OR BaseT.Place LIKE '%".$searchText."%' + OR BaseT.City LIKE '%".$searchText."%' + OR BaseT.State LIKE '%".$searchText."%' + OR BaseT.DepartmentName LIKE '%".$searchText."%' + OR BaseT.User_Comments LIKE '%".$searchText."%' + + OR BaseT.Pin LIKE '%".$searchText."%' + )"; + $this->db->where($likeCriteria); + } + //$this->db->where('BaseT.isDeleted', 0); + //$this->db->where('BaseT.userId !=', 1); + $this->db->limit($page, $segment); + $query = $this->db->get(); + + $result = $query->result(); + return $result; + } + + + function getUserRoles() + { + $this->db->select('roleId, role'); + $this->db->from('tbl_roles'); + $this->db->where('roleId !=', 1); + $query = $this->db->get(); + + return $query->result(); + } + + + /** + * This function used to get user information by id + * @param number $userId : This is user id + * @return array $result : This is user information + */ + +function addNewemployee($Employee) + { + $this->db->trans_start(); + $this->db->insert('T_EmpDetails', $Employee); + + $Asset_Code = $this->db->insert_id(); + + $this->db->trans_complete(); + + return $EmpID; + } + + /** + * This function used to get user information by id + * @param number $userId : This is user id + * @return array $result : This is user information + */ + function getuserInfo($EmpID) + { + $this->db->select('EmpID,FirstName,LastName,DateofBirth,ContactNumber,EmailId,DateofJoining,Role,Address1,Address2, + Place,City,State,Pin,DepartmentName,User_Comments,Created_date'); + $this->db->from('T_EmpDetails'); + //$this->db->where('isDeleted', 0); + //$this->db->where('roleId !=', 1); + $this->db->where('EmpID', $EmpID); + $query = $this->db->get(); + + return $query->result(); + } + function editemployee($Emp, $EmpID) + { + echo $EmpID; + $this->db->where('EmpID', $EmpID); + $this->db->update('T_EmpDetails', $Emp); + + return TRUE; + } + + function viewemployee($Emp, $EmpID) + { + echo $EmpID; + $this->db->where('EmpID', $EmpID); + $this->db->update('T_EmpDetails', $Emp); + + return TRUE; + } + + /* This function to get the Employee department on respective Employee */ + function GetEmployeeDepartment($EmployeeID) + { + $this->db->select('DepartmentName'); + $this->db->from('T_EmployeeDetails'); + $this->db->where('EmpID', $EmployeeID); + $query = $this->db->get(); + return $query->result_array(); + } +} +?> \ No newline at end of file diff --git a/application/models/Grocery_crud_model.php b/application/models/Grocery_crud_model.php deleted file mode 100644 index 24930055..00000000 --- a/application/models/Grocery_crud_model.php +++ /dev/null @@ -1,587 +0,0 @@ - - */ - -// ------------------------------------------------------------------------ - -/** - * Grocery CRUD Model - * - * - * @package grocery CRUD - * @author John Skoumbourdis - * @version 1.5.6 - * @link http://www.grocerycrud.com/documentation - */ -class Grocery_crud_model extends CI_Model { - - protected $primary_key = null; - protected $table_name = null; - protected $relation = array(); - protected $relation_n_n = array(); - protected $primary_keys = array(); - - function __construct() - { - parent::__construct(); - } - - function db_table_exists($table_name = null) - { - return $this->db->table_exists($table_name); - } - - function get_list() - { - if($this->table_name === null) - return false; - - $select = "`{$this->table_name}`.*"; - - //set_relation special queries - if(!empty($this->relation)) - { - foreach($this->relation as $relation) - { - list($field_name , $related_table , $related_field_title) = $relation; - $unique_join_name = $this->_unique_join_name($field_name); - $unique_field_name = $this->_unique_field_name($field_name); - - if(strstr($related_field_title,'{')) - { - $related_field_title = str_replace(" "," ",$related_field_title); - $select .= ", CONCAT('".str_replace(array('{','}'),array("',COALESCE({$unique_join_name}.",", ''),'"),str_replace("'","\\'",$related_field_title))."') as $unique_field_name"; - } - else - { - $select .= ", $unique_join_name.$related_field_title AS $unique_field_name"; - } - - if($this->field_exists($related_field_title)) - $select .= ", `{$this->table_name}`.$related_field_title AS '{$this->table_name}.$related_field_title'"; - } - } - - //set_relation_n_n special queries. We prefer sub queries from a simple join for the relation_n_n as it is faster and more stable on big tables. - if(!empty($this->relation_n_n)) - { - $select = $this->relation_n_n_queries($select); - } - - $this->db->select($select, false); - - $results = $this->db->get($this->table_name)->result(); - - return $results; - } - - public function get_row($table_name = null) - { - $table_name = $table_name === null ? $this->table_name : $table_name; - - return $this->db->get($table_name)->row(); - } - - public function set_primary_key($field_name, $table_name = null) - { - $table_name = $table_name === null ? $this->table_name : $table_name; - - $this->primary_keys[$table_name] = $field_name; - } - - protected function relation_n_n_queries($select) - { - $this_table_primary_key = $this->get_primary_key(); - foreach($this->relation_n_n as $relation_n_n) - { - list($field_name, $relation_table, $selection_table, $primary_key_alias_to_this_table, - $primary_key_alias_to_selection_table, $title_field_selection_table, $priority_field_relation_table) = array_values((array)$relation_n_n); - - $primary_key_selection_table = $this->get_primary_key($selection_table); - - $field = ""; - $use_template = strpos($title_field_selection_table,'{') !== false; - $field_name_hash = $this->_unique_field_name($title_field_selection_table); - if($use_template) - { - $title_field_selection_table = str_replace(" ", " ", $title_field_selection_table); - $field .= "CONCAT('".str_replace(array('{','}'),array("',COALESCE(",", ''),'"),str_replace("'","\\'",$title_field_selection_table))."')"; - } - else - { - $field .= "$selection_table.$title_field_selection_table"; - } - - //Sorry Codeigniter but you cannot help me with the subquery! - $select .= ", (SELECT GROUP_CONCAT(DISTINCT $field) FROM $selection_table " - ."LEFT JOIN $relation_table ON $relation_table.$primary_key_alias_to_selection_table = $selection_table.$primary_key_selection_table " - ."WHERE $relation_table.$primary_key_alias_to_this_table = `{$this->table_name}`.$this_table_primary_key GROUP BY $relation_table.$primary_key_alias_to_this_table) AS $field_name"; - } - - return $select; - } - - function order_by($order_by , $direction) - { - $this->db->order_by( $order_by , $direction ); - } - - function where($key, $value = NULL, $escape = TRUE) - { - $this->db->where( $key, $value, $escape); - } - - function or_where($key, $value = NULL, $escape = TRUE) - { - $this->db->or_where( $key, $value, $escape); - } - - function having($key, $value = NULL, $escape = TRUE) - { - $this->db->having( $key, $value, $escape); - } - - function or_having($key, $value = NULL, $escape = TRUE) - { - $this->db->or_having( $key, $value, $escape); - } - - function like($field, $match = '', $side = 'both') - { - $this->db->like($field, $match, $side); - } - - function or_like($field, $match = '', $side = 'both') - { - $this->db->or_like($field, $match, $side); - } - - function limit($value, $offset = '') - { - $this->db->limit( $value , $offset ); - } - - function get_total_results() - { - // A fast way to calculate the total results - $key = $this->get_primary_key(); - - //set_relation_n_n special queries. We prefer sub queries from a simple join for the relation_n_n as it is faster and more stable on big tables. - if(!empty($this->relation_n_n)) - { - $select = "{$this->table_name}." . $key; - $select = $this->relation_n_n_queries($select); - - $this->db->select($select,false); - } else { - $this->db->select($this->table_name . '.' . $key); - } - - return $this->db->get($this->table_name)->num_rows(); - } - - function set_basic_table($table_name = null) - { - if( !($this->db->table_exists($table_name)) ) - return false; - - $this->table_name = $table_name; - - return true; - } - - function get_edit_values($primary_key_value) - { - $primary_key_field = $this->get_primary_key(); - $this->db->where($primary_key_field,$primary_key_value); - $result = $this->db->get($this->table_name)->row(); - return $result; - } - - function join_relation($field_name , $related_table , $related_field_title) - { - $related_primary_key = $this->get_primary_key($related_table); - - if($related_primary_key !== false) - { - $unique_name = $this->_unique_join_name($field_name); - $this->db->join( $related_table.' as '.$unique_name , "$unique_name.$related_primary_key = {$this->table_name}.$field_name",'left'); - - $this->relation[$field_name] = array($field_name , $related_table , $related_field_title); - - return true; - } - - return false; - } - - function set_relation_n_n_field($field_info) - { - $this->relation_n_n[$field_info->field_name] = $field_info; - } - - protected function _unique_join_name($field_name) - { - return 'j'.substr(md5($field_name),0,8); //This j is because is better for a string to begin with a letter and not with a number - } - - protected function _unique_field_name($field_name) - { - return 's'.substr(md5($field_name),0,8); //This s is because is better for a string to begin with a letter and not with a number - } - - function get_relation_array($field_name , $related_table , $related_field_title, $where_clause, $order_by, $limit = null, $search_like = null) - { - $relation_array = array(); - $field_name_hash = $this->_unique_field_name($field_name); - - $related_primary_key = $this->get_primary_key($related_table); - - $select = "$related_table.$related_primary_key, "; - - if(strstr($related_field_title,'{')) - { - $related_field_title = str_replace(" ", " ", $related_field_title); - $select .= "CONCAT('".str_replace(array('{','}'),array("',COALESCE(",", ''),'"),str_replace("'","\\'",$related_field_title))."') as $field_name_hash"; - } - else - { - $select .= "$related_table.$related_field_title as $field_name_hash"; - } - - $this->db->select($select,false); - if($where_clause !== null) - $this->db->where($where_clause); - - if($where_clause !== null) - $this->db->where($where_clause); - - if($limit !== null) - $this->db->limit($limit); - - if($search_like !== null) - $this->db->having("$field_name_hash LIKE '%".$this->db->escape_like_str($search_like)."%'"); - - $order_by !== null - ? $this->db->order_by($order_by) - : $this->db->order_by($field_name_hash); - - $results = $this->db->get($related_table)->result(); - - foreach($results as $row) - { - $relation_array[$row->$related_primary_key] = $row->$field_name_hash; - } - - return $relation_array; - } - - function get_ajax_relation_array($search, $field_name , $related_table , $related_field_title, $where_clause, $order_by) - { - return $this->get_relation_array($field_name , $related_table , $related_field_title, $where_clause, $order_by, 10 , $search); - } - - function get_relation_total_rows($field_name , $related_table , $related_field_title, $where_clause) - { - if($where_clause !== null) - $this->db->where($where_clause); - - return $this->db->count_all_results($related_table); - } - - function get_relation_n_n_selection_array($primary_key_value, $field_info) - { - $select = ""; - $related_field_title = $field_info->title_field_selection_table; - $use_template = strpos($related_field_title,'{') !== false;; - $field_name_hash = $this->_unique_field_name($related_field_title); - if($use_template) - { - $related_field_title = str_replace(" ", " ", $related_field_title); - $select .= "CONCAT('".str_replace(array('{','}'),array("',COALESCE(",", ''),'"),str_replace("'","\\'",$related_field_title))."') as $field_name_hash"; - } - else - { - $select .= "$related_field_title as $field_name_hash"; - } - $this->db->select('*, '.$select,false); - - $selection_primary_key = $this->get_primary_key($field_info->selection_table); - - if(empty($field_info->priority_field_relation_table)) - { - if(!$use_template){ - $this->db->order_by("{$field_info->selection_table}.{$field_info->title_field_selection_table}"); - } - } - else - { - $this->db->order_by("{$field_info->relation_table}.{$field_info->priority_field_relation_table}"); - } - $this->db->where($field_info->primary_key_alias_to_this_table, $primary_key_value); - $this->db->join( - $field_info->selection_table, - "{$field_info->relation_table}.{$field_info->primary_key_alias_to_selection_table} = {$field_info->selection_table}.{$selection_primary_key}" - ); - $results = $this->db->get($field_info->relation_table)->result(); - - $results_array = array(); - foreach($results as $row) - { - $results_array[$row->{$field_info->primary_key_alias_to_selection_table}] = $row->{$field_name_hash}; - } - - return $results_array; - } - - function get_relation_n_n_unselected_array($field_info, $selected_values) - { - $use_where_clause = !empty($field_info->where_clause); - - $select = ""; - $related_field_title = $field_info->title_field_selection_table; - $use_template = strpos($related_field_title,'{') !== false; - $field_name_hash = $this->_unique_field_name($related_field_title); - - if($use_template) - { - $related_field_title = str_replace(" ", " ", $related_field_title); - $select .= "CONCAT('".str_replace(array('{','}'),array("',COALESCE(",", ''),'"),str_replace("'","\\'",$related_field_title))."') as $field_name_hash"; - } - else - { - $select .= "$related_field_title as $field_name_hash"; - } - $this->db->select('*, '.$select,false); - - if($use_where_clause){ - $this->db->where($field_info->where_clause); - } - - $selection_primary_key = $this->get_primary_key($field_info->selection_table); - if(!$use_template) - $this->db->order_by("{$field_info->selection_table}.{$field_info->title_field_selection_table}"); - $results = $this->db->get($field_info->selection_table)->result(); - - $results_array = array(); - foreach($results as $row) - { - if(!isset($selected_values[$row->$selection_primary_key])) - $results_array[$row->$selection_primary_key] = $row->{$field_name_hash}; - } - - return $results_array; - } - - function db_relation_n_n_update($field_info, $post_data ,$main_primary_key) - { - $this->db->where($field_info->primary_key_alias_to_this_table, $main_primary_key); - if(!empty($post_data)) - $this->db->where_not_in($field_info->primary_key_alias_to_selection_table , $post_data); - $this->db->delete($field_info->relation_table); - - $counter = 0; - if(!empty($post_data)) - { - foreach($post_data as $primary_key_value) - { - $where_array = array( - $field_info->primary_key_alias_to_this_table => $main_primary_key, - $field_info->primary_key_alias_to_selection_table => $primary_key_value, - ); - - $this->db->where($where_array); - $count = $this->db->from($field_info->relation_table)->count_all_results(); - - if($count == 0) - { - if(!empty($field_info->priority_field_relation_table)) - $where_array[$field_info->priority_field_relation_table] = $counter; - - $this->db->insert($field_info->relation_table, $where_array); - - }elseif($count >= 1 && !empty($field_info->priority_field_relation_table)) - { - $this->db->update( $field_info->relation_table, array($field_info->priority_field_relation_table => $counter) , $where_array); - } - - $counter++; - } - } - } - - function db_relation_n_n_delete($field_info, $main_primary_key) - { - $this->db->where($field_info->primary_key_alias_to_this_table, $main_primary_key); - $this->db->delete($field_info->relation_table); - } - - function get_field_types_basic_table() - { - $db_field_types = array(); - foreach($this->db->query("SHOW COLUMNS FROM `{$this->table_name}`")->result() as $db_field_type) - { - $type = explode("(",$db_field_type->Type); - $db_type = $type[0]; - - if(isset($type[1])) - { - if(substr($type[1],-1) == ')') - { - $length = substr($type[1],0,-1); - } - else - { - list($length) = explode(" ",$type[1]); - $length = substr($length,0,-1); - } - } - else - { - $length = ''; - } - $db_field_types[$db_field_type->Field]['db_max_length'] = $length; - $db_field_types[$db_field_type->Field]['db_type'] = $db_type; - $db_field_types[$db_field_type->Field]['db_null'] = $db_field_type->Null == 'YES' ? true : false; - $db_field_types[$db_field_type->Field]['db_extra'] = $db_field_type->Extra; - } - - $results = $this->db->field_data($this->table_name); - foreach($results as $num => $row) - { - $row = (array)$row; - $results[$num] = (object)( array_merge($row, $db_field_types[$row['name']]) ); - } - - return $results; - } - - function get_field_types($table_name) - { - $results = $this->db->field_data($table_name); - - return $results; - } - - function db_update($post_array, $primary_key_value) - { - $primary_key_field = $this->get_primary_key(); - return $this->db->update($this->table_name,$post_array, array( $primary_key_field => $primary_key_value)); - } - - function db_insert($post_array) - { - $insert = $this->db->insert($this->table_name,$post_array); - if($insert) - { - return $this->db->insert_id(); - } - return false; - } - - function db_delete($primary_key_value) - { - $primary_key_field = $this->get_primary_key(); - - if($primary_key_field === false) - return false; - - $this->db->limit(1); - $this->db->delete($this->table_name,array( $primary_key_field => $primary_key_value)); - if( $this->db->affected_rows() != 1) - return false; - else - return true; - } - - function db_file_delete($field_name, $filename) - { - if( $this->db->update($this->table_name,array($field_name => ''),array($field_name => $filename)) ) - { - return true; - } - else - { - return false; - } - } - - function field_exists($field,$table_name = null) - { - if(empty($table_name)) - { - $table_name = $this->table_name; - } - return $this->db->field_exists($field,$table_name); - } - - function get_primary_key($table_name = null) - { - if($table_name == null) - { - if(isset($this->primary_keys[$this->table_name])) - { - return $this->primary_keys[$this->table_name]; - } - - if(empty($this->primary_key)) - { - $fields = $this->get_field_types_basic_table(); - - foreach($fields as $field) - { - if($field->primary_key == 1) - { - return $field->name; - } - } - - return false; - } - else - { - return $this->primary_key; - } - } - else - { - if(isset($this->primary_keys[$table_name])) - { - return $this->primary_keys[$table_name]; - } - - $fields = $this->get_field_types($table_name); - - foreach($fields as $field) - { - if($field->primary_key == 1) - { - return $field->name; - } - } - - return false; - } - - } - - function escape_str($value) - { - return $this->db->escape_str($value); - } - -} diff --git a/application/models/Purchaseorder_model.php b/application/models/Purchaseorder_model.php index 8e30f2ef..af90e01f 100644 --- a/application/models/Purchaseorder_model.php +++ b/application/models/Purchaseorder_model.php @@ -78,7 +78,7 @@ class purchaseorder_model extends CI_Model */ function getSupplierName() { - $this->db->select('SupplierID, SupplierName'); + $this->db->select('SupplierID, SupplierName,Address'); $this->db->from('T_SupplierDetailsN'); //$this->db->where('roleId !=', 1); $query = $this->db->get(); @@ -99,43 +99,155 @@ class purchaseorder_model extends CI_Model return $query->result(); } - /** - * This function is used to check whether email id is already exist or not - * @param {string} $email : This is email id - * @param {number} $userId : This is user id - * @return {mixed} $result : This is searched result - - function checkEmailExists($email, $userId = 0) + /** + * This function is used to get the Raw Material information + * @return array $result : This is result of the query + */ + function getRawMaterialList() { - $this->db->select("email"); - $this->db->from("tbl_users"); - $this->db->where("email", $email); - $this->db->where("isDeleted", 0); - if($userId != 0){ - $this->db->where("userId !=", $userId); - } + + $this->db->select('MaterialCode, MaterialName'); + $this->db->from('T_RawMaterialDetailsN'); $query = $this->db->get(); - + return $query->result(); - }*/ + } + + /** + * This function is used to get the Unit of Measure information + * @return array $result : This is result of the query + */ + function getUOM() + { + $ConfigID = 'C001'; + $this->db->select('ConfigValue'); + $this->db->from('T_ConfigDetails'); + $this->db->where('Config_id ',$ConfigID ); + $query = $this->db->get(); + + return $query->result(); + } + + /** + * This function is used to get the Purchase order Type + * @return array $result : This is result of the query + */ + function getPOType() + { + $ConfigID = 'C004'; + $this->db->select('ConfigValue'); + $this->db->from('T_ConfigDetails'); + $this->db->where('Config_id ',$ConfigID ); + $query = $this->db->get(); + + return $query->result(); + } + + /** + * This function is used to get the Purchase order Type + * @return array $result : This is result of the query + */ + function getPurchasingCategory() + { + $ConfigID = 'C007'; + $this->db->select('ConfigValue'); + $this->db->from('T_ConfigDetails'); + $this->db->where('Config_id ',$ConfigID ); + $query = $this->db->get(); + + return $query->result(); + } + + /** + * This function is used to get the Purchase order Type + * @return array $result : This is result of the query + */ + function getEmployeeList() + { + $this->db->select('EmpID,FirstName,LastName,Role,DepartmentName'); + $this->db->from('T_EmployeeDetails'); + $query = $this->db->get(); + + return $query->result(); + } + /** - * This function is used to add new user to system + * This function is used to add New Purchase order to the system + + */ + function addNewPO($PO_Type,$PO_Date,$Supplier_ID,$Special_Order,$User_ID,$Requester_Email,$Requester_Ph,$Requested_Date,$Budget_Manager, + $Budget_Manager_Department,$Purchasing_Category,$Purchasing_Justification,$Created_By,$BasicValue,$DiscountType,$txtDiscount,$PackagingType, + $txtPackaging,$Exciseduty,$txtVat,$txtFreight,$AfterDiscount,$AfterPackaging,$AferExciseduty,$txtAfterVat,$txtOrderValue) + { + + $result = $this->db-> query("CALL P_PURCHASEORDER_DETAILS('".$PO_Type."',STR_TO_DATE('".$PO_Date."','%m-%d-%Y %H:%i:%s'),'".$Supplier_ID."','".$Special_Order."','".$User_ID."' + ,'".$Requester_Email."','".$Requester_Ph."',STR_TO_DATE('".$Requested_Date."','%m-%d-%Y %H:%i:%s'),'".$Budget_Manager."','".$Budget_Manager_Department."','".$Purchasing_Category."','".$Purchasing_Justification."','".$Created_By."','".$BasicValue."','".$DiscountType."','".$txtDiscount."','".$PackagingType."','".$txtPackaging."','".$Exciseduty."','".$txtVat."','".$txtFreight."','".$AfterDiscount."','".$AfterPackaging."','".$AferExciseduty."','".$txtAfterVat."','".$txtOrderValue."')") or die(mysql_error()); + + // print_r($this->db->last_query()); + + $result ->next_result(); + + if ($result->num_rows > 0) { + //echo $result->num_rows; + return $result->result_array(); + } + + } + + + /** + * This function is used to add new PO Line Item to T_PurchaseOrderLineItem table * @return number $insert_id : This is last inserted id */ - function addNewPO($POInfo) + + function addNewPOLineItem($PONO,$Material_ID,$UOM,$Quantity,$UnitPrice) { - $this->db->trans_start(); - $this->db->insert('T_PurchaseOrderDetails', $POInfo); + //echo 'addNewPOLineItem Model called'; + + $result = $this->db-> query("CALL P_LINEITEM('".$PONO."','".$Material_ID."','".$UOM."',".$Quantity.",".$UnitPrice.")") or die(mysql_error()); + + $result ->next_result(); + + //print_r($this->db->last_query()); + + if ($result->num_rows > 0) + { + //echo 'PO Line item Inserted successfully'; + return $result->result_array(); + } + + return $result ->result_array(); ; + } + + /** + * This function used to get user information by id + * @param number $userId : This is user id + * @return array $result : This is user information + */ + function getPOLineItem($PO = '') + { + $this->db->select('POline.POLineNo as POLineNo,Raw.MaterialName as materialName ,POline.UOM as UOM,POline.Quantity as Quantity,POline.UnitPrice as UnitPrice, (POline.Quantity * POline.UnitPrice) as ProductPrice'); + $this->db->from('T_POLineItem as POline '); + $this->db->join('T_RawMaterialDetailsN as Raw', 'POline.Material_ID = Raw.MaterialCode'); + if(!empty($PO)) { + + $this->db->where('POline.PONO', $PO); + } + else + { + $likeCriteria = "(POline.PONO is null)"; + $this->db->where($likeCriteria); + } + + $query = $this->db->get(); + // print_r($query); + $result = $query->result(); - $PO_id = $this->db->insert_id(); - - $this->db->trans_complete(); - - return $PO_id; - } - + return $result; + } + /** * This function used to get user information by id * @param number $userId : This is user id @@ -145,49 +257,44 @@ class purchaseorder_model extends CI_Model { $this->db->select('POType, PODate, SupplierID,SpecialOrder,UserID,RequestedDate,RequesterEmail,RequesterPh,PurchasingCategory,BudgetManager,BudgetManagerDepartment,'); $this->db->from('T_PurchaseOrderDetails'); - //$this->db->where('isDeleted', 0); - //$this->db->where('roleId !=', 1); + $this->db->where('PONO', $PO); $query = $this->db->get(); return $query->result(); } + + function getPurchaseOrder($PONO) + { + $this->db->select('PODetail.*,Supplier.SupplierName,Supplier.Address,usr.name as usrName'); + $this->db->from('T_PurchaseOrderDetails AS PODetail'); + $this->db->join('T_SupplierDetailsN as Supplier', 'PODetail.SupplierID = Supplier.SupplierID'); + $this->db->join('tbl_users as usr', 'usr.userId = PODetail.UserID'); + $this->db->where('PODetail.PONO', $PONO); + $query = $this->db->get(); + + $result = $query->result(); + + // print_r($this->db->last_query()); + return $result; + } - - /** - * This function is used to update the user information - * @param array $userInfo : This is users updated information - * @param number $userId : This is user id - */ - function editPO($POInfo, $PO) - { - $this->db->where('PONO', $PO); - $this->db->update('T_PurchaseOrderDetails', $PO); + function getLastInsertedPO() + { + $this->db->select('max(PONO) as PO'); + $this->db->from('T_PurchaseOrderDetails'); + + $query = $this->db->get(); + + return $query->result_array(); + } + function updatePODetails($PO,$PODetails) + { + $this->db->where('PONO', $PO); + $this->db->update('T_PurchaseOrderDetails', $PODetails); return TRUE; - } - - - - /** - * This function is used to delete the user information - * @param number $userId : This is user id - * @return boolean $result : TRUE / FALSE - - function deletePO($PO, $POinfo) - { - $this->db->where('PO', $PO); - $this->db->update('T_PurchaseOrderDetails', $POInfo); - - return $this->db->affected_rows(); - }*/ - - - /** - * This function is used to match users password for change password - * @param number $userId : This is user id - */ - + } } \ No newline at end of file diff --git a/Not working Asset code/assetdetails_model.php b/application/models/assetdetails_model.php similarity index 64% rename from Not working Asset code/assetdetails_model.php rename to application/models/assetdetails_model.php index 12d6c1e6..53dcc25f 100644 --- a/Not working Asset code/assetdetails_model.php +++ b/application/models/assetdetails_model.php @@ -1,37 +1,43 @@ db->select('BaseT.Asset_Code, BaseT.Asset_Name, BaseT.Description, ID.SupplierID,BaseT.Department, users.UserID,BaseT.Location,BaseT.AssetOwner,BaseT.DateOfCommission,BaseT.SupportVendor,BaseT.SupportFrom,BaseT.SupportTo,BaseT.CreatedDate,PO.PODate'); + function assetListingCount($searchText = ''){ + + $this->db->select('BaseT.Asset_Code, BaseT.Asset_Name, BaseT.Description, ID.SupplierName,BaseT.Department, BaseT.Location,BaseT.AssetOwner,BaseT.DateOfCommission,BaseT.SupportVendor,BaseT.SupportFrom,BaseT.SupportTo,BaseT.DateOfPurchase'); $this->db->from('T_AssetDetails as BaseT'); - $this->db->join('tbl_users as users', 'users.userId = BaseT.userId','left'); - $this->db->join('T_SupplierDetails as ID', 'ID.SupplierID = BaseT.SupplierID','left'); - $this->db->join('T_PurchaseOrderDetails as PO', 'PO.PODate = BaseT.PODate','left'); - if(!empty($searchText)) { + + $this->db->join('T_SupplierDetailsN as ID', 'ID.SupplierName = BaseT.SupplierName','left'); + //$this->db->join('T_PurchaseOrderDetails as PO', 'PO.PODate = BaseT.PODate','left'); + //$this->db->join('tbl_users as users', 'users.userId = BaseT.userId','left'); + //$this->db->join('T_SupplierDetails as ID', 'ID.SupplierID = BaseT.SupplierID','left'); + if(!empty($searchText)) { $likeCriteria = "(BaseT.Asset_Code LIKE '%".$searchText."%' OR BaseT.Asset_Name LIKE '%".$searchText."%' OR BaseT.Description LIKE '%".$searchText."%' - OR BaseT.SupplierID LIKE '%".$searchText."%' + OR BaseT.SupplierName LIKE '%".$searchText."%' OR BaseT.Department LIKE '%".$searchText."%' - OR BaseT.UserID LIKE '%".$searchText."%' + OR BaseT.DateOfPurchase LIKE '%".$searchText."%' OR BaseT.Location LIKE '%".$searchText."%' OR BaseT.AssetOwner LIKE '%".$searchText."%' OR BaseT.DateOfCommission LIKE '%".$searchText."%' + OR BaseT.DateOfPurchase LIKE '%".$searchText."%' OR BaseT.SupportVendor LIKE '%".$searchText."%' OR BaseT.SupportFrom LIKE '%".$searchText."%' OR BaseT.SupportTo LIKE '%".$searchText."%' OR BaseT.CreatedDate LIKE '%".$searchText."%' - OR BaseT.PurchasingCategory LIKE '%".$searchText."%' - OR BaseT.PODate LIKE '%".$searchText."%')"; + )"; $this->db->where($likeCriteria); } + //$this->db->where('BaseT.userId !=', 1); + $query = $this->db->get(); + + return count($query->result()); } /** * This function is used to get the user listing count @@ -42,27 +48,27 @@ class supplier_model extends CI_Model */ function assetListing($searchText = '', $page, $segment) { - $this->db->select('BaseT.Asset_Code, BaseT.Asset_Name, BaseT.Description, ID.SupplierID,BaseT.Department, users.UserID,BaseT.Location,BaseT.AssetOwner,BaseT.DateOfCommission,BaseT.SupportVendor,BaseT.SupportFrom,BaseT.SupportTo,BaseT.CreatedDate,PO.PODate'); + $this->db->select('BaseT.Asset_Code, BaseT.Asset_Name, BaseT.Description, BaseT.Department, BaseT.Location,BaseT.AssetOwner,BaseT.DateOfCommission,BaseT.DateOfPurchase,BaseT.SupportVendor,BaseT.SupportFrom,BaseT.SupportTo,BaseT.CreatedDate,BaseT.SupplierName'); $this->db->from('T_AssetDetails as BaseT'); - $this->db->join('tbl_users as users', 'users.userId = BaseT.userId','left'); - $this->db->join('T_SupplierDetails as ID', 'ID.SupplierID = BaseT.SupplierID','left'); - $this->db->join('T_PurchaseOrderDetails as PO', 'PO.PODate = BaseT.PODate','left'); + + //$this->db->join('T_SupplierDetailsN as ID', 'ID.SupplierName = BaseT.SupplierName','left'); + if(!empty($searchText)) { $likeCriteria = "(BaseT.Asset_Code LIKE '%".$searchText."%' OR BaseT.Asset_Name LIKE '%".$searchText."%' OR BaseT.Description LIKE '%".$searchText."%' - OR BaseT.SupplierID LIKE '%".$searchText."%' + OR BaseT.SupplierName LIKE '%".$searchText."%' OR BaseT.Department LIKE '%".$searchText."%' - OR BaseT.UserID LIKE '%".$searchText."%' + OR BaseT.DateOfPurchase LIKE '%".$searchText."%' OR BaseT.Location LIKE '%".$searchText."%' OR BaseT.AssetOwner LIKE '%".$searchText."%' OR BaseT.DateOfCommission LIKE '%".$searchText."%' + OR BaseT.DateOfPurchase LIKE '%".$searchText."%' OR BaseT.SupportVendor LIKE '%".$searchText."%' OR BaseT.SupportFrom LIKE '%".$searchText."%' OR BaseT.SupportTo LIKE '%".$searchText."%' OR BaseT.CreatedDate LIKE '%".$searchText."%' - OR BaseT.PurchasingCategory LIKE '%".$searchText."%' - OR BaseT.PODate LIKE '%".$searchText."%')"; + )"; $this->db->where($likeCriteria); } //$this->db->where('BaseT.isDeleted', 0); @@ -73,6 +79,19 @@ class supplier_model extends CI_Model $result = $query->result(); return $result; } + + + function getSupplierName() + { + $this->db->select('SupplierID, SupplierName'); + $this->db->from('T_SupplierDetailsN'); + //$this->db->where('roleId !=', 1); + $query = $this->db->get(); + + return $query->result(); + } + + /** * This function used to get user information by id * @param number $userId : This is user id @@ -96,20 +115,29 @@ function addNewasset($asset) * @param number $userId : This is user id * @return array $result : This is user information */ - function getuserInfo($assetcode) + function getuserInfo($Asset_Code) { $this->db->select('Asset_Code, Asset_Name,Description,Department,Location,AssetOwner,SupplierName,DateOfPurchase,DateOfCommission,SupportVendor,SupportFrom,SupportTo,CreatedDate'); $this->db->from('T_AssetDetails'); //$this->db->where('isDeleted', 0); //$this->db->where('roleId !=', 1); - $this->db->where('Asset_Code', $assetcode); + $this->db->where('Asset_Code', $Asset_Code); $query = $this->db->get(); return $query->result(); } - function editPO($asset, $assetcode) + function editasset($asset, $Asset_Code) { - $this->db->where('Asset_Code', $assetcode); + $this->db->where('Asset_Code', $Asset_Code); + $this->db->update('T_AssetDetails', $asset); + + return TRUE; + } + + + function viewasset($asset, $Asset_Code) + { + $this->db->where('Asset_Code', $Asset_Code); $this->db->update('T_AssetDetails', $asset); return TRUE; diff --git a/application/models/costcenter_model.php b/application/models/costcenter_model.php index 27f83742..7d31050f 100644 --- a/application/models/costcenter_model.php +++ b/application/models/costcenter_model.php @@ -64,11 +64,11 @@ function addNewcost($Cost) $this->db->trans_start(); $this->db->insert('T_CostCentre', $Cost); - $PO_id = $this->db->insert_id(); + $insert_id = $this->db->insert_id(); $this->db->trans_complete(); - return $PO_id; + return $insert_id; } /** @@ -78,33 +78,35 @@ function addNewcost($Cost) */ function getuserInfo($CostCenterID) { - $this->db->select('CostCenterID, CostName,Description,CreatedDate'); + $this->db->select('CostCentreID, CostName,Description,CreatedDate'); $this->db->from('T_CostCentre'); - //$this->db->where('isDeleted', 0); - //$this->db->where('roleId !=', 1); - $this->db->where('CostCenterID', $CostCenterID); + + $this->db->where('CostCentreID', $CostCenterID); $query = $this->db->get(); return $query->result(); } + + function editcost($Cost, $CostCenterID) { - $this->db->where('CostCenterID', $CostCenterID); + $this->db->where('CostCentreID', $CostCenterID); $this->db->update('T_CostCentre', $Cost); return TRUE; } + /** * This function is used to delete the user information * @param number $userId : This is user id * @return boolean $result : TRUE / FALSE - - function deletePO($PO, $POinfo) + */ + function deletecost($Cost, $CostCenterID) { - $this->db->where('PO', $PO); - $this->db->update('T_PurchaseOrderDetails', $POInfo); + $this->db->where('CostCentreID', $CostCenterID); + $this->db->update('T_CostCentre', $Cost); return $this->db->affected_rows(); - }*/ + } } ?> \ No newline at end of file diff --git a/application/models/rawmaterialdetails_model.php b/application/models/rawmaterialdetails_model.php new file mode 100644 index 00000000..7ca8f479 --- /dev/null +++ b/application/models/rawmaterialdetails_model.php @@ -0,0 +1,147 @@ +db->select('BaseT.MaterialCode, BaseT.MaterialName, BaseT.MaterialType, ID.SupplierID, BaseT.CreatedDate'); + $this->db->from('T_RawMaterialDetailsN as BaseT'); + //$this->db->join('tbl_users as users', 'users.userId = BaseT.userId','left'); + $this->db->join('T_SupplierDetailsN as ID', 'ID.SupplierID = BaseT.SupplierID','left'); + if(!empty($searchText)) { + $likeCriteria = "(BaseT.MaterialCode LIKE '%".$searchText."%' + OR BaseT.MaterialName LIKE '%".$searchText."%' + OR BaseT.MaterialType LIKE '%".$searchText."%' + OR BaseT.SupplierID LIKE '%".$searchText."%')"; + $this->db->where($likeCriteria); + } + //$this->db->where('BaseT.isDeleted', 0); + //$this->db->where('BaseT.userId !=', 1); + $query = $this->db->get(); + + return count($query->result()); + } + /** + * This function is used to get the user listing count + * @param string $searchText : This is optional search text + * @param number $page : This is pagination offset + * @param number $segment : This is pagination limit + * @return array $result : This is result + */ + function rawmaterialListing($searchText = '', $page, $segment) + { + $this->db->select('BaseT.MaterialCode, BaseT.MaterialName, BaseT.MaterialType, BaseT.SupplierID ,BaseT.CreatedDate'); + $this->db->from('T_RawMaterialDetailsN as BaseT'); + + //$this->db->join('T_SupplierDetailsN as ID', 'ID.SupplierID = BaseT.SupplierID','left'); + if(!empty($searchText)) { + $likeCriteria = "(BaseT.MaterialCode LIKE '%".$searchText."%' + OR BaseT.MaterialName LIKE '%".$searchText."%' + OR BaseT.MaterialType LIKE '%".$searchText."%' + OR BaseT.SupplierID LIKE '%".$searchText."%')"; + $this->db->where($likeCriteria); + } + //$this->db->where('BaseT.isDeleted', 0); + //$this->db->where('BaseT.userId !=', 1); + $this->db->limit($page, $segment); + $query = $this->db->get(); + + $result = $query->result(); + return $result; + } + + function getSupplierName() + { + + $this->db->select('SupplierID, SupplierName'); + $this->db->from('T_SupplierDetailsN'); + $query = $this->db->get(); + + return $query->result(); + } + + function getmaterial() + { + $Config_ID = 'C003'; + + $this->db->select('Config_ID,ConfigValue'); + $this->db->from('T_ConfigDetails'); + $this->db->where('Config_id',$Config_ID ); + $query = $this->db->get(); + + return $query->result(); + } + /** + * This function used to get user information by id + * @param number $userId : This is user id + * @return array $result : This is user information + */ + +function addNewRawMaterial($RawMaterial) + { + $this->db->trans_start(); + $this->db->insert('T_RawMaterialDetailsN', $RawMaterial); + + $MaterialCode = $this->db->insert_id(); + + $this->db->trans_complete(); + + return $MaterialCode; + } + + /** + * This function used to get user information by id + * @param number $userId : This is user id + * @return array $result : This is user information + */ + function getuserInfo($MaterialCode) + { + $this->db->select('MaterialCode, MaterialName,MaterialType,SupplierID,CreatedDate'); + $this->db->from('T_RawMaterialDetailsN'); + //$this->db->where('isDeleted', 0); + //$this->db->where('roleId !=', 1); + $this->db->where('MaterialCode', $MaterialCode); + $query = $this->db->get(); + + return $query->result(); + } + function editRawmaterial($RawMaterial, $MaterialCode) + { + + + + $this->db->where('MaterialCode', $MaterialCode); + $this->db->update('T_RawMaterialDetailsN', $RawMaterial); + + return TRUE; + } + + function viewrawmaterial($RawMaterial, $MaterialCode) + { + echo $MaterialCode; //."and".$RawMaterial ; + + + $this->db->where('MaterialCode', $MaterialCode); + $this->db->update('T_RawMaterialDetailsN', $RawMaterial); + + return TRUE; + } + /** + * This function is used to delete the user information + * @param number $userId : This is user id + * @return boolean $result : TRUE / FALSE + + function deletePO($PO, $POinfo) + { + $this->db->where('PO', $PO); + $this->db->update('T_PurchaseOrderDetails', $POInfo); + + return $this->db->affected_rows(); + }*/ +} +?> \ No newline at end of file diff --git a/application/models/supplier_model.php b/application/models/supplier_model.php index 49125945..9215681a 100644 --- a/application/models/supplier_model.php +++ b/application/models/supplier_model.php @@ -44,7 +44,7 @@ class supplier_model extends CI_Model //$this->db->join('tbl_users as users', 'users.userId = BaseT.userId','left'); //$this->db->join('T_SupplierDetails as ID', 'ID.SupplierID = BaseT.SupplierID','left'); if(!empty($searchText)) { - $likeCriteria = "(BaseT.SupplierID LIKE '%".$searchfield."%' + $likeCriteria = "(BaseT.SupplierID LIKE '%".$searchText."%' OR BaseT.SupplierName LIKE '%".$searchText."%' OR BaseT.Address LIKE '%".$searchText."%' OR BaseT.ContactNumber LIKE '%".$searchText."%' @@ -97,7 +97,24 @@ function addNewsupplier($supplier) return $query->result(); } - function editPO($supplier, $supplierID) + /* This function to get the Supplier Address on respective Supplier ID */ + function GetSupplierAddress($supplierID) + { + $this->db->select('Address'); + $this->db->from('T_SupplierDetailsN'); + $this->db->where('SupplierID', $supplierID); + $query = $this->db->get(); + return $query->result_array(); + } + function editsupplier($supplier, $supplierID) + { + $this->db->where('SupplierID', $supplierID); + $this->db->update('T_SupplierDetailsN', $supplier); + + return TRUE; + } + + function viewsupplier($supplier, $supplierID) { $this->db->where('SupplierID', $supplierID); $this->db->update('T_SupplierDetailsN', $supplier); diff --git a/application/models/user_model.php b/application/models/user_model.php index 74effecf..8b8a1b2d 100644 --- a/application/models/user_model.php +++ b/application/models/user_model.php @@ -9,7 +9,7 @@ class User_model extends CI_Model */ function userListingCount($searchText = '') { - $this->db->select('BaseTbl.userId, BaseTbl.email, BaseTbl.name, BaseTbl.mobile, Role.role'); + $this->db->select('BaseTbl.userId, BaseTbl.email, BaseTbl.name, BaseTbl.mobile, Role.role,BaseTbl.isDeleted'); $this->db->from('tbl_users as BaseTbl'); $this->db->join('tbl_roles as Role', 'Role.roleId = BaseTbl.roleId','left'); if(!empty($searchText)) { @@ -18,7 +18,7 @@ class User_model extends CI_Model OR BaseTbl.mobile LIKE '%".$searchText."%')"; $this->db->where($likeCriteria); } - $this->db->where('BaseTbl.isDeleted', 0); + //$this->db->where('BaseTbl.isDeleted', 0); $this->db->where('BaseTbl.roleId !=', 1); $query = $this->db->get(); @@ -34,7 +34,7 @@ class User_model extends CI_Model */ function userListing($searchText = '', $page, $segment) { - $this->db->select('BaseTbl.userId, BaseTbl.email, BaseTbl.name, BaseTbl.mobile, Role.role'); + $this->db->select('BaseTbl.userId, BaseTbl.email, BaseTbl.name, BaseTbl.mobile, Role.role, BaseTbl.isDeleted'); $this->db->from('tbl_users as BaseTbl'); $this->db->join('tbl_roles as Role', 'Role.roleId = BaseTbl.roleId','left'); if(!empty($searchText)) { @@ -43,7 +43,8 @@ class User_model extends CI_Model OR BaseTbl.mobile LIKE '%".$searchText."%')"; $this->db->where($likeCriteria); } - $this->db->where('BaseTbl.isDeleted', 0); + + //$this->db->where('BaseTbl.isDeleted', 0); $this->db->where('BaseTbl.roleId !=', 1); $this->db->limit($page, $segment); $query = $this->db->get(); @@ -60,7 +61,7 @@ class User_model extends CI_Model { $this->db->select('roleId, role'); $this->db->from('tbl_roles'); - $this->db->where('roleId !=', 1); + //$this->db->where('roleId !=', 1); $query = $this->db->get(); return $query->result(); @@ -110,7 +111,7 @@ class User_model extends CI_Model */ function getUserInfo($userId) { - $this->db->select('userId, name, email, mobile, roleId'); + $this->db->select('userId, name, email, mobile, roleId,isDeleted'); $this->db->from('tbl_users'); $this->db->where('isDeleted', 0); $this->db->where('roleId !=', 1); diff --git a/application/third_party/dompdf/LICENSE.LGPL b/application/third_party/dompdf/LICENSE.LGPL new file mode 100644 index 00000000..6ef5de82 --- /dev/null +++ b/application/third_party/dompdf/LICENSE.LGPL @@ -0,0 +1,456 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. \ No newline at end of file diff --git a/application/third_party/dompdf/dompdf.php b/application/third_party/dompdf/dompdf.php new file mode 100644 index 00000000..73310f25 --- /dev/null +++ b/application/third_party/dompdf/dompdf.php @@ -0,0 +1,328 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * dompdf.php is a simple script to drive DOMPDF. It can be executed from + * a browser or from the command line. + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: dompdf.php 301 2010-08-23 21:00:51Z fabien.menager $ */ + +/** + * Display command line usage: + * + * Usage: ./dompdf.php [options] html_file + * + * html_file can be a filename, a url if fopen_wrappers are enabled, or the '-' + * character to read from standard input. + * + * Options: + * -h Show this message + * -l list available paper sizes + * -p size paper size; something like 'letter', 'A4', 'legal', etc. The default is + * 'letter' + * -o orientation either 'portrait' or 'landscape'. Default is 'portrait'. + * -b path set the 'document root' of the html_file. Relative urls (for + * stylesheets) are resolved using this directory. Default is the + * directory of html_file. + * -f file the output filename. Default is the input [html_file].pdf. + * -v verbose: display html parsing warnings and file not found errors. + * -d very verbose: display oodles of debugging output: every frame in the + * tree is printed to stdout. + * -t comma separated list of debugging types (page-break,reflow,split) + * -r write the render time to the log file + * + * + */ +function dompdf_usage() { + echo + "\nUsage: {$_SERVER["argv"][0]} [options] html_file\n\n". + "html_file can be a filename, a url if fopen_wrappers are enabled, or the '-' \n". + "character to read from standard input.\n\n". + "Options:\n". + " -h\t\tShow this message\n". + " -l\t\tlist available paper sizes\n". + " -p size\tpaper size; something like 'letter', 'A4', 'legal', etc. The default is\n". + " \t\t'" . DOMPDF_DEFAULT_PAPER_SIZE . "'\n". + " -o orientation\teither 'portrait' or 'landscape'. Default is 'portrait'.\n". + " -b path\tset the 'document root' of the html_file. Relative urls (for \n". + " \tstylesheets) are resolved using this directory. Default is the \n". + " \tdirectory of html_file.\n". + " -f file\tthe output filename. Default is the input [html_file].pdf.\n". + " -v \tverbose: display html parsing warnings and file not found errors.\n". + " -d \tvery verbose: display oodles of debugging output: every frame\n". + " \tin the tree printed to stdout.\n". + " -t comma separated list of debugging types (page-break,reflow,split)\n\n"; +} + +function getoptions() { + + $opts = array(); + + if ( $_SERVER["argc"] == 1 ) + return $opts; + + $i = 1; + while ($i < $_SERVER["argc"]) { + + switch ($_SERVER["argv"][$i]) { + + case "--help": + case "-h": + $opts["h"] = true; + $i++; + break; + + case "-l": + $opts["l"] = true; + $i++; + break; + + case "-p": + if ( !isset($_SERVER["argv"][$i+1]) ) + die("-p switch requires a size parameter\n"); + $opts["p"] = $_SERVER["argv"][$i+1]; + $i += 2; + break; + + case "-o": + if ( !isset($_SERVER["argv"][$i+1]) ) + die("-o switch requires an orientation parameter\n"); + $opts["o"] = $_SERVER["argv"][$i+1]; + $i += 2; + break; + + case "-b": + if ( !isset($_SERVER["argv"][$i+1]) ) + die("-b switch requires a path parameter\n"); + $opts["b"] = $_SERVER["argv"][$i+1]; + $i += 2; + break; + + case "-f": + if ( !isset($_SERVER["argv"][$i+1]) ) + die("-f switch requires a filename parameter\n"); + $opts["f"] = $_SERVER["argv"][$i+1]; + $i += 2; + break; + + case "-v": + $opts["v"] = true; + $i++; + break; + + case "-d": + $opts["d"] = true; + $i++; + break; + + case "-t": + if ( !isset($_SERVER['argv'][$i + 1]) ) + die("-t switch requires a comma separated list of types\n"); + $opts["t"] = $_SERVER['argv'][$i+1]; + $i += 2; + break; + + default: + $opts["filename"] = $_SERVER["argv"][$i]; + $i++; + break; + } + + } + return $opts; +} + +require_once("dompdf_config.inc.php"); +global $_dompdf_show_warnings, $_dompdf_debug, $_DOMPDF_DEBUG_TYPES; + +$sapi = php_sapi_name(); +$options = array(); + +switch ( $sapi ) { + + case "cli": + + $opts = getoptions(); + + if ( isset($opts["h"]) || (!isset($opts["filename"]) && !isset($opts["l"])) ) { + dompdf_usage(); + exit; + } + + if ( isset($opts["l"]) ) { + echo "\nUnderstood paper sizes:\n"; + + foreach (array_keys(CPDF_Adapter::$PAPER_SIZES) as $size) + echo " " . mb_strtoupper($size) . "\n"; + exit; + } + $file = $opts["filename"]; + + if ( isset($opts["p"]) ) + $paper = $opts["p"]; + else + $paper = DOMPDF_DEFAULT_PAPER_SIZE; + + if ( isset($opts["o"]) ) + $orientation = $opts["o"]; + else + $orientation = "portrait"; + + if ( isset($opts["b"]) ) + $base_path = $opts["b"]; + + if ( isset($opts["f"]) ) + $outfile = $opts["f"]; + else { + if ( $file === "-" ) + $outfile = "dompdf_out.pdf"; + else + $outfile = str_ireplace(array(".html", ".htm", ".php"), "", $file) . ".pdf"; + } + + if ( isset($opts["v"]) ) + $_dompdf_show_warnings = true; + + if ( isset($opts["d"]) ) { + $_dompdf_show_warnings = true; + $_dompdf_debug = true; + } + + if ( isset($opts['t']) ) { + $arr = split(',',$opts['t']); + $types = array(); + foreach ($arr as $type) + $types[ trim($type) ] = 1; + $_DOMPDF_DEBUG_TYPES = $types; + } + + $save_file = true; + + break; + + default: + + if ( isset($_GET["input_file"]) ) + $file = rawurldecode($_GET["input_file"]); + else + throw new DOMPDF_Exception("An input file is required (i.e. input_file _GET variable)."); + + if ( isset($_GET["paper"]) ) + $paper = rawurldecode($_GET["paper"]); + else + $paper = DOMPDF_DEFAULT_PAPER_SIZE; + + if ( isset($_GET["orientation"]) ) + $orientation = rawurldecode($_GET["orientation"]); + else + $orientation = "portrait"; + + if ( isset($_GET["base_path"]) ) { + $base_path = rawurldecode($_GET["base_path"]); + $file = $base_path . $file; # Set the input file + } + + if ( isset($_GET["options"]) ) { + $options = $_GET["options"]; + } + + $file_parts = explode_url($file); + /* Check to see if the input file is local and, if so, that the base path falls within that specified by DOMDPF_CHROOT */ + if(($file_parts['protocol'] == '' || $file_parts['protocol'] === 'file://')) { + $file = realpath($file); + if (strpos($file, DOMPDF_CHROOT) !== 0) { + throw new DOMPDF_Exception("Permission denied on $file."); + } + } + + $outfile = "dompdf_out.pdf"; # Don't allow them to set the output file + $save_file = false; # Don't save the file + + break; +} + +$dompdf = new DOMPDF(); + +if ( $file === "-" ) { + $str = ""; + while ( !feof(STDIN) ) + $str .= fread(STDIN, 4096); + + $dompdf->load_html($str); + +} else + $dompdf->load_html_file($file); + +if ( isset($base_path) ) { + $dompdf->set_base_path($base_path); +} + +$dompdf->set_paper($paper, $orientation); + +$dompdf->render(); + +if ( $_dompdf_show_warnings ) { + global $_dompdf_warnings; + foreach ($_dompdf_warnings as $msg) + echo $msg . "\n"; + echo $dompdf->get_canvas()->get_cpdf()->messages; + flush(); +} + +if ( $save_file ) { +// if ( !is_writable($outfile) ) +// throw new DOMPDF_Exception("'$outfile' is not writable."); + if ( strtolower(DOMPDF_PDF_BACKEND) === "gd" ) + $outfile = str_replace(".pdf", ".png", $outfile); + + list($proto, $host, $path, $file) = explode_url($outfile); + if ( $proto != "" ) // i.e. not file:// + $outfile = $file; // just save it locally, FIXME? could save it like wget: ./host/basepath/file + + $outfile = realpath(dirname($outfile)) . DIRECTORY_SEPARATOR . basename($outfile); + + if ( strpos($outfile, DOMPDF_CHROOT) !== 0 ) + throw new DOMPDF_Exception("Permission denied."); + + file_put_contents($outfile, $dompdf->output( array("compress" => 0) )); + exit(0); +} + +if ( !headers_sent() ) { + $dompdf->stream($outfile, $options); +} diff --git a/application/third_party/dompdf/dompdf_config.custom.inc.php b/application/third_party/dompdf/dompdf_config.custom.inc.php new file mode 100644 index 00000000..609a7ab6 --- /dev/null +++ b/application/third_party/dompdf/dompdf_config.custom.inc.php @@ -0,0 +1,24 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - Allow overriding of configuration settings by calling php script. + * This allows replacing of dompdf by a new version in an application + * without any modification, + * - Optionally separate font cache folder from font folder. + * This allows write protecting the entire installation + * - Add settings to enable/disable additional debug output categories + * - Change some defaults to more practical values + * - Add comments about configuration parameter implications + */ + +/* $Id: dompdf_config.inc.php 363 2011-02-17 21:18:25Z fabien.menager $ */ + +//error_reporting(E_STRICT | E_ALL | E_DEPRECATED); +//ini_set("display_errors", 1); + +/** + * The root of your DOMPDF installation + */ +define("DOMPDF_DIR", str_replace(DIRECTORY_SEPARATOR, '/', realpath(dirname(__FILE__)))); + +/** + * The location of the DOMPDF include directory + */ +define("DOMPDF_INC_DIR", DOMPDF_DIR . "/include"); + +/** + * The location of the DOMPDF lib directory + */ +define("DOMPDF_LIB_DIR", DOMPDF_DIR . "/lib"); + +/** + * Some installations don't have $_SERVER['DOCUMENT_ROOT'] + * http://fyneworks.blogspot.com/2007/08/php-documentroot-in-iis-windows-servers.html + */ +if( !isset($_SERVER['DOCUMENT_ROOT']) ) { + $path = ""; + + if ( isset($_SERVER['SCRIPT_FILENAME']) ) + $path = $_SERVER['SCRIPT_FILENAME']; + elseif ( isset($_SERVER['PATH_TRANSLATED']) ) + $path = str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']); + + $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr($path, 0, 0-strlen($_SERVER['PHP_SELF']))); +} + +/** Include the custom config file if it exists */ +if ( file_exists(DOMPDF_DIR . "/dompdf_config.custom.inc.php") ){ + require_once(DOMPDF_DIR . "/dompdf_config.custom.inc.php"); +} + +//FIXME: Some function definitions rely on the constants defined by DOMPDF. However, might this location prove problematic? +require_once(DOMPDF_INC_DIR . "/functions.inc.php"); + +/** + * The location of the DOMPDF font directory + * + * If DOMPDF_FONT_DIR identical to DOMPDF_FONT_CACHE or user executing DOMPDF from the CLI, + * this directory must be writable by the webserver process (). + * *Please note the trailing slash.* + * + * Notes regarding fonts: + * Additional .afm font metrics can be added by executing load_font.php from command line. + * Converting ttf fonts to afm requires the external tool referenced by TTF2AFM + * + * Only the original "Base 14 fonts" are present on all pdf viewers. Additional fonts must + * be embedded in the pdf file or the PDF may not display correctly. This can significantly + * increase file size and could violate copyright provisions of a font. Font embedding is + * not currently supported (? via HT). + * + * Any font specification in the source HTML is translated to the closest font available + * in the font directory. + * + * The pdf standard "Base 14 fonts" are: + * Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique, + * Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique, + * Times-Roman, Times-Bold, Times-BoldItalic, Times-Italic, + * Symbol, + * ZapfDingbats, + * + * *Please note the trailing slash.* + */ +def("DOMPDF_FONT_DIR", DOMPDF_DIR . "/lib/fonts/"); + +/** + * The location of the DOMPDF font cache directory + * + * Note this directory must be writable by the webserver process + * This folder must already exist! + * It contains the .afm files, on demand parsed, converted to php syntax and cached + * This folder can be the same as DOMPDF_FONT_DIR + */ +def("DOMPDF_FONT_CACHE", DOMPDF_FONT_DIR); + +/** + * The location of a temporary directory. + * + * The directory specified must be writeable by the webserver process. + * The temporary directory is required to download remote images and when + * using the PFDLib back end. + */ +def("DOMPDF_TEMP_DIR", sys_get_temp_dir()); + +/** + * ==== IMPORTANT ==== + * + * dompdf's "chroot": Prevents dompdf from accessing system files or other + * files on the webserver. All local files opened by dompdf must be in a + * subdirectory of this directory. DO NOT set it to '/' since this could + * allow an attacker to use dompdf to read any files on the server. This + * should be an absolute path. + * This is only checked on command line call by dompdf.php, but not by + * direct class use like: + * $dompdf = new DOMPDF(); $dompdf->load_html($htmldata); $dompdf->render(); $pdfdata = $dompdf->output(); + */ +def("DOMPDF_CHROOT", realpath(DOMPDF_DIR)); + +/** + * Whether to use Unicode fonts or not. + * + * When set to true the PDF backend must be set to "CPDF" and fonts must be + * loaded via the modified ttf2ufm tool included with dompdf (see below). + * Unicode font metric files (with .ufm extensions) must be created with + * ttf2ufm. load_font.php should do this for you if the TTF2AFM define below + * points to the modified ttf2ufm tool included with dompdf. + * + * When enabled, dompdf can support all Unicode glyphs. Any glyphs used in a + * document must be present in your fonts, however. + */ +def("DOMPDF_UNICODE_ENABLED", true); + +/** + * The path to the tt2pt1 utility (used to convert ttf to afm) + * + * Not strictly necessary, but useful if you would like to install + * additional fonts using the {@link load_font.php} utility. + * + * Windows users should use something like this: + * define("TTF2AFM", "C:\\Program Files\\Ttf2Pt1\\bin\\ttf2pt1.exe"); + * + * @link http://ttf2pt1.sourceforge.net/ + */ +if ( strpos(PHP_OS, "WIN") === false ) + def("TTF2AFM", DOMPDF_LIB_DIR ."/ttf2ufm/ttf2ufm-src/ttf2pt1"); +else + def("TTF2AFM", "C:\\Program Files\\GnuWin32\\bin\\ttf2pt1.exe"); + +/** + * The PDF rendering backend to use + * + * Valid settings are 'PDFLib', 'CPDF' (the bundled R&OS PDF class), 'GD' and + * 'auto'. 'auto' will look for PDFLib and use it if found, or if not it will + * fall back on CPDF. 'GD' renders PDFs to graphic files. {@link + * Canvas_Factory} ultimately determines which rendering class to instantiate + * based on this setting. + * + * Both PDFLib & CPDF rendering backends provide sufficient rendering + * capabilities for dompdf, however additional features (e.g. object, + * image and font support, etc.) differ between backends. Please see + * {@link PDFLib_Adapter} for more information on the PDFLib backend + * and {@link CPDF_Adapter} and lib/class.pdf.php for more information + * on CPDF. Also see the documentation for each backend at the links + * below. + * + * The GD rendering backend is a little different than PDFLib and + * CPDF. Several features of CPDF and PDFLib are not supported or do + * not make any sense when creating image files. For example, + * multiple pages are not supported, nor are PDF 'objects'. Have a + * look at {@link GD_Adapter} for more information. GD support is new + * and experimental, so use it at your own risk. + * + * @link http://www.pdflib.com + * @link http://www.ros.co.nz/pdf + * @link http://www.php.net/image + */ +def("DOMPDF_PDF_BACKEND", "CPDF"); + +/** + * PDFlib license key + * + * If you are using a licensed, commercial version of PDFlib, specify + * your license key here. If you are using PDFlib-Lite or are evaluating + * the commercial version of PDFlib, comment out this setting. + * + * @link http://www.pdflib.com + * + * If pdflib present in web server and auto or selected explicitely above, + * a real license code must exist! + */ +#def("DOMPDF_PDFLIB_LICENSE", "your license key here"); + +/** + * html target media view which should be rendered into pdf. + * List of types and parsing rules for future extensions: + * http://www.w3.org/TR/REC-html40/types.html + * screen, tty, tv, projection, handheld, print, braille, aural, all + * Note: aural is deprecated in CSS 2.1 because it is replaced by speech in CSS 3. + * Note, even though the generated pdf file is intended for print output, + * the desired content might be different (e.g. screen or projection view of html file). + * Therefore allow specification of content here. + */ +def("DOMPDF_DEFAULT_MEDIA_TYPE", "screen"); + +/** + * The default paper size. + * + * North America standard is "letter"; other countries generally "a4" + * + * @see CPDF_Adapter::PAPER_SIZES for valid sizes + */ +def("DOMPDF_DEFAULT_PAPER_SIZE", "letter"); + +/** + * The default font family + * + * Used if no suitable fonts can be found. This must exist in the font folder. + * @var string + */ +def("DOMPDF_DEFAULT_FONT", "serif"); + +/** + * Image DPI setting + * + * This setting determines the default DPI setting for images and fonts. The + * DPI may be overridden for inline images by explictly setting the + * image's width & height style attributes (i.e. if the image's native + * width is 600 pixels and you specify the image's width as 72 points, + * the image will have a DPI of 600 in the rendered PDF. The DPI of + * background images can not be overridden and is controlled entirely + * via this parameter. + * + * For the purposes of DOMPDF, pixels per inch (PPI) = dots per inch (DPI). + * If a size in html is given as px (or without unit as image size), + * this tells the corresponding size in pt. + * This adjusts the relative sizes to be similar to the rendering of the + * html page in a reference browser. + * + * In pdf, always 1 pt = 1/72 inch + * + * Rendering resolution of various browsers in px per inch: + * Windows Firefox and Internet Explorer: + * SystemControl->Display properties->FontResolution: Default:96, largefonts:120, custom:? + * Linux Firefox: + * about:config *resolution: Default:96 + * (xorg screen dimension in mm and Desktop font dpi settings are ignored) + * + * Take care about extra font/image zoom factor of browser. + * + * In images, size in pixel attribute, img css style, are overriding + * the real image dimension in px for rendering. + * + * @var int + */ +def("DOMPDF_DPI", 96); + +/** + * Enable inline PHP + * + * If this setting is set to true then DOMPDF will automatically evaluate + * inline PHP contained within tags. + * + * Enabling this for documents you do not trust (e.g. arbitrary remote html + * pages) is a security risk. Set this option to false if you wish to process + * untrusted documents. + * + * @var bool + */ +def("DOMPDF_ENABLE_PHP", false); + +/** + * Enable inline Javascript + * + * If this setting is set to true then DOMPDF will automatically insert + * JavaScript code contained within tags. + * + * @var bool + */ +def("DOMPDF_ENABLE_JAVASCRIPT", true); + +/** + * Enable remote file access + * + * If this setting is set to true, DOMPDF will access remote sites for + * images and CSS files as required. + * This is required for part of test case www/test/image_variants.html through www/examples.php + * + * Attention! + * This can be a security risk, in particular in combination with DOMPDF_ENABLE_PHP and + * allowing remote access to dompdf.php or on allowing remote html code to be passed to + * $dompdf = new DOMPDF(); $dompdf->load_html(...); + * This allows anonymous users to download legally doubtful internet content which on + * tracing back appears to being downloaded by your server, or allows malicious php code + * in remote html pages to be executed by your server with your account privileges. + * + * @var bool + */ +def("DOMPDF_ENABLE_REMOTE", false); + +/** + * The debug output log + * @var string + */ +def("DOMPDF_LOG_OUTPUT_FILE", DOMPDF_FONT_DIR."log.htm"); + +/** + * A ratio applied to the fonts height to be more like browsers' line height + */ +def("DOMPDF_FONT_HEIGHT_RATIO", 1.1); + +/** + * Enable CSS float + * + * Allows people to disabled CSS float support + * @var bool + */ +def("DOMPDF_ENABLE_CSS_FLOAT", false); + +/** + * DOMPDF autoload function + * + * If you have an existing autoload function, add a call to this function + * from your existing __autoload() implementation. + * + * @param string $class + */ +function DOMPDF_autoload($class) { + $filename = DOMPDF_INC_DIR . "/" . mb_strtolower($class) . ".cls.php"; + + if ( is_file($filename) ) + require_once($filename); +} + +// If SPL autoload functions are available (PHP >= 5.1.2) +if ( function_exists("spl_autoload_register") ) { + $autoload = "DOMPDF_autoload"; + $funcs = spl_autoload_functions(); + + // No functions currently in the stack. + if ( $funcs === false ) { + spl_autoload_register($autoload); + } + + // If PHP >= 5.3 the $prepend argument is available + else if ( version_compare(PHP_VERSION, '5.3', '>=') ) { + spl_autoload_register($autoload, true, true); + } + + else { + // Unregister existing autoloaders... + $compat = version_compare(PHP_VERSION, '5.1.2', '<=') && + version_compare(PHP_VERSION, '5.1.0', '>='); + + foreach ($funcs as $func) { + if (is_array($func)) { + // :TRICKY: There are some compatibility issues and some + // places where we need to error out + $reflector = new ReflectionMethod($func[0], $func[1]); + if (!$reflector->isStatic()) { + throw new Exception('This function is not compatible with non-static object methods due to PHP Bug #44144.'); + } + + // Suprisingly, spl_autoload_register supports the + // Class::staticMethod callback format, although call_user_func doesn't + if ($compat) $func = implode('::', $func); + } + + spl_autoload_unregister($func); + } + + // Register the new one, thus putting it at the front of the stack... + spl_autoload_register($autoload); + + // Now, go back and re-register all of our old ones. + foreach ($funcs as $func) { + spl_autoload_register($func); + } + + // Be polite and ensure that userland autoload gets retained + if ( function_exists("__autoload") ) { + spl_autoload_register("__autoload"); + } + } +} + +else if ( !function_exists("__autoload") ) { + /** + * Default __autoload() function + * + * @param string $class + */ + function __autoload($class) { + DOMPDF_autoload($class); + } +} + +// ### End of user-configurable options ### + + +/** + * Ensure that PHP is working with text internally using UTF8 character encoding. + */ +mb_internal_encoding('UTF-8'); + +/** + * Global array of warnings generated by DomDocument parser and + * stylesheet class + * + * @var array + */ +global $_dompdf_warnings; +$_dompdf_warnings = array(); + +/** + * If true, $_dompdf_warnings is dumped on script termination when using + * dompdf/dompdf.php or after rendering when using the DOMPDF class. + * When using the class, setting this value to true will prevent you from + * streaming the PDF. + * + * @var bool + */ +global $_dompdf_show_warnings; +$_dompdf_show_warnings = false; + +/** + * If true, the entire tree is dumped to stdout in dompdf.cls.php. + * Setting this value to true will prevent you from streaming the PDF. + * + * @var bool + */ +global $_dompdf_debug; +$_dompdf_debug = false; + +/** + * Array of enabled debug message types + * + * @var array + */ +global $_DOMPDF_DEBUG_TYPES; +$_DOMPDF_DEBUG_TYPES = array(); //array("page-break" => 1); + +/* Optionally enable different classes of debug output before the pdf content. + * Visible if displaying pdf as text, + * E.g. on repeated display of same pdf in browser when pdf is not taken out of + * the browser cache and the premature output prevents setting of the mime type. + */ +def('DEBUGPNG', false); +def('DEBUGKEEPTEMP', false); +def('DEBUGCSS', false); + +/* Layout debugging. Will display rectangles around different block levels. + * Visible in the PDF itself. + */ +def('DEBUG_LAYOUT', false); +def('DEBUG_LAYOUT_LINES', true); +def('DEBUG_LAYOUT_BLOCKS', true); +def('DEBUG_LAYOUT_INLINE', true); +def('DEBUG_LAYOUT_PADDINGBOX', true); diff --git a/application/third_party/dompdf/include/absolute_positioner.cls.php b/application/third_party/dompdf/include/absolute_positioner.cls.php new file mode 100644 index 00000000..ff8b6fa7 --- /dev/null +++ b/application/third_party/dompdf/include/absolute_positioner.cls.php @@ -0,0 +1,85 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id */ + +/** + * Positions absolutly positioned frames + */ +class Absolute_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + function position() { + + $frame = $this->_frame; + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + + $top = $style->length_in_pt($style->top, $cb["h"]); + $right = $style->length_in_pt($style->right, $cb["w"]); + $bottom = $style->length_in_pt($style->bottom, $cb["h"]); + $left = $style->length_in_pt($style->left, $cb["w"]); + + $p = $frame->find_positionned_parent(); + + if ( $p ) { + // Get the parent's padding box (see http://www.w3.org/TR/CSS21/visuren.html#propdef-top) + list($x, $y, $w, $h) = $p->get_padding_box(); + } else { + $x = $cb["x"]; + $y = $cb["y"]; + } + + if ( $top !== "auto" ) { + $y += $top; + } else if ( $bottom !== "auto" ) { + // FIXME: need to know this frame's height before we can do this correctly + } + + if ( $left !== "auto" ) { + $x += $left; + } else if ( $right !== "auto" ) { + // FIXME: need to know this frame's width before we can do this correctly + } + + $frame->set_position($x, $y); + + } +} \ No newline at end of file diff --git a/application/third_party/dompdf/include/abstract_renderer.cls.php b/application/third_party/dompdf/include/abstract_renderer.cls.php new file mode 100644 index 00000000..979e30e6 --- /dev/null +++ b/application/third_party/dompdf/include/abstract_renderer.cls.php @@ -0,0 +1,890 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - On background image + * - Clip invisible areas from background images, then merge identical + * image/size/offset to a single image. + * - Fix rounding of background image size. + * - Fix background image position given as percent + * - Check if identical image is already cached by cpdf. Then do not create + * duplicates to save memory and CPU time + * - Fix skipping of image repetition if area is too small + * - Do not create temporary files, but pass gd object directly + */ + +/* $Id: abstract_renderer.cls.php 361 2011-02-16 21:03:05Z fabien.menager $ */ + +/** + * Base renderer class + * + * @access private + * @package dompdf + */ +abstract class Abstract_Renderer { + + /** + * Rendering backend + * + * @var Canvas + */ + protected $_canvas; + + /** + * Current dompdf instance + * + * @var DOMPDF + */ + protected $_dompdf; + + /** + * Class constructor + * + * @param DOMPDF $dompdf The current dompdf instance + */ + function __construct(DOMPDF $dompdf) { + $this->_dompdf = $dompdf; + $this->_canvas = $dompdf->get_canvas(); + } + + /** + * Render a frame. + * + * Specialized in child classes + * + * @param Frame $frame The frame to render + */ + abstract function render(Frame $frame); + + //........................................................................ + + /** + * Render a background image over a rectangular area + * + * @param string $img The background image to load + * @param float $x The left edge of the rectangular area + * @param float $y The top edge of the rectangular area + * @param float $width The width of the rectangular area + * @param float $height The height of the rectangular area + * @param Style $style The associated Style object + */ + protected function _background_image($url, $x, $y, $width, $height, $style) { + $sheet = $style->get_stylesheet(); + + // Skip degenerate cases + if ( $width == 0 || $height == 0 ) + return; + + //debugpng + if (DEBUGPNG) print '[_background_image '.$url.']'; + + list($img, $ext) = Image_Cache::resolve_url($url, + $sheet->get_protocol(), + $sheet->get_host(), + $sheet->get_base_path()); + + // Bail if the image is no good + if ( $img === DOMPDF_LIB_DIR . "/res/broken_image.png" ) + return; + + //Try to optimize away reading and composing of same background multiple times + //Postponing read with imagecreatefrom ...() + //final composition paramters and name not known yet + //Therefore read dimension directly from file, instead of creating gd object first. + //$img_w = imagesx($src); $img_h = imagesy($src); + + list($img_w, $img_h) = dompdf_getimagesize($img); + if (!isset($img_w) || $img_w == 0 || !isset($img_h) || $img_h == 0) { + return; + } + + $repeat = $style->background_repeat; + $bg_color = $style->background_color; + + //Increase background resolution and dependent box size according to image resolution to be placed in + //Then image can be copied in without resize + $bg_width = round((float)($width * DOMPDF_DPI) / 72); + $bg_height = round((float)($height * DOMPDF_DPI) / 72); + + //Need %bg_x, $bg_y as background pos, where img starts, converted to pixel + + list($bg_x, $bg_y) = $style->background_position; + + if ( is_percent($bg_x) ) { + // The point $bg_x % from the left edge of the image is placed + // $bg_x % from the left edge of the background rectangle + $p = ((float)$bg_x)/100.0; + $x1 = $p * $img_w; + $x2 = $p * $bg_width; + + $bg_x = round($x2 - $x1); + } else { + $bg_x = round((float)($style->length_in_pt($bg_x)*DOMPDF_DPI) / 72); + } + + if ( is_percent($bg_y) ) { + // The point $bg_y % from the left edge of the image is placed + // $bg_y % from the left edge of the background rectangle + $p = ((float)$bg_y)/100.0; + $y1 = $p * $img_h; + $y2 = $p * $bg_height; + + $bg_y = round($y2 - $y1); + } else { + $bg_y = round((float)($style->length_in_pt($bg_y)*DOMPDF_DPI) / 72); + } + + //clip background to the image area on partial repeat. Nothing to do if img off area + //On repeat, normalize start position to the tile at immediate left/top or 0/0 of area + //On no repeat with positive offset: move size/start to have offset==0 + //Handle x/y Dimensions separately + + if ( $repeat !== "repeat" && $repeat !== "repeat-x" ) { + //No repeat x + if ($bg_x < 0) { + $bg_width = $img_w + $bg_x; + } else { + $x += ($bg_x * 72)/DOMPDF_DPI; + $bg_width = $bg_width - $bg_x; + if ($bg_width > $img_w) { + $bg_width = $img_w; + } + $bg_x = 0; + } + if ($bg_width <= 0) { + return; + } + $width = (float)($bg_width * 72)/DOMPDF_DPI; + } else { + //repeat x + if ($bg_x < 0) { + $bg_x = - ((-$bg_x) % $img_w); + } else { + $bg_x = $bg_x % $img_w; + if ($bg_x > 0) { + $bg_x -= $img_w; + } + } + } + + if ( $repeat !== "repeat" && $repeat !== "repeat-y" ) { + //no repeat y + if ($bg_y < 0) { + $bg_height = $img_h + $bg_y; + } else { + $y += ($bg_y * 72)/DOMPDF_DPI; + $bg_height = $bg_height - $bg_y; + if ($bg_height > $img_h) { + $bg_height = $img_h; + } + $bg_y = 0; + } + if ($bg_height <= 0) { + return; + } + $height = (float)($bg_height * 72)/DOMPDF_DPI; + } else { + //repeat y + if ($bg_y < 0) { + $bg_y = - ((-$bg_y) % $img_h); + } else { + $bg_y = $bg_y % $img_h; + if ($bg_y > 0) { + $bg_y -= $img_h; + } + } + } + + //Optimization, if repeat has no effect + if ( $repeat === "repeat" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height ) { + $repeat = "repeat-x"; + } + if ( $repeat === "repeat" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width ) { + $repeat = "repeat-y"; + } + if ( ($repeat === "repeat-x" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width) || + ($repeat === "repeat-y" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height) ) { + $repeat = "no-repeat"; + } + + //Use filename as indicator only + //different names for different variants to have different copies in the pdf + //This is not dependent of background color of box! .'_'.(is_array($bg_color) ? $bg_color["hex"] : $bg_color) + //Note: Here, bg_* are the start values, not end values after going through the tile loops! + + $filedummy = $img; + + /* + //Make shorter strings with limited characters for cache associative array index - needed? + //Strip common base path - server root, explicite temp, default temp; remove unwanted characters; + $filedummy = strtr($filedummy,"\\:","//"); + $p = strtr($_SERVER["DOCUMENT_ROOT"],"\\:","//"); + $l = strlen($p); + if ( substr($filedummy,0,$l) == $p) { + $filedummy = substr($filedummy,$l); + } else { + $p = strtr(DOMPDF_TEMP_DIR,"\\:","//"); + $l = strlen($p); + if ( substr($filedummy,0,$l) == $p) { + $filedummy = substr($filedummy,$l); + } else { + $p = strtr(sys_get_temp_dir(),"\\:","//"); + $l = strlen($p); + if ( substr($filedummy,0,$l) == $p) { + $filedummy = substr($filedummy,$l); + } + } + } + */ + + $filedummy .= '_'.$bg_width.'_'.$bg_height.'_'.$bg_x.'_'.$bg_y.'_'.$repeat; + //debugpng + //if (DEBUGPNG) print '
[_background_image name '.$filedummy.']
'; + + //Optimization to avoid multiple times rendering the same image. + //If check functions are existing and identical image already cached, + //then skip creation of duplicate, because it is not needed by addImagePng + if ( method_exists( $this->_canvas, "get_cpdf" ) && + method_exists( $this->_canvas->get_cpdf(), "addImagePng" ) && + method_exists( $this->_canvas->get_cpdf(), "image_iscached" ) && + $this->_canvas->get_cpdf()->image_iscached($filedummy) ) { + $bg = null; + + //debugpng + //if (DEBUGPNG) print '[_background_image skip]'; + } + + else { + + // Create a new image to fit over the background rectangle + $bg = imagecreatetruecolor($bg_width, $bg_height); + + //anyway default + //imagealphablending($img, true); + + switch (strtolower($ext)) { + case "png": + $src = imagecreatefrompng($img); + break; + + case "jpg": + case "jpeg": + $src = imagecreatefromjpeg($img); + break; + + case "gif": + $src = imagecreatefromgif($img); + break; + + case "bmp": + $src = imagecreatefrombmp($img); + break; + + default: return; // Unsupported image type + } + + if ($src == null) { + return; + } + + //Background color if box is not relevant here + //Non transparent image: box clipped to real size. Background non relevant. + //Transparent image: The image controls the transparency and lets shine through whatever background. + //However on transparent imaage preset the composed image with the transparency color, + //to keep the transparency when copying over the non transparent parts of the tiles. + $ti = imagecolortransparent($src); + + if ($ti >= 0) { + $tc = imagecolorsforindex($src,$ti); + $ti = imagecolorallocate($bg,$tc['red'],$tc['green'],$tc['blue']); + imagefill($bg,0,0,$ti); + imagecolortransparent($bg, $ti); + } + + //This has only an effect for the non repeatable dimension. + //compute start of src and dest coordinates of the single copy + if ( $bg_x < 0 ) { + $dst_x = 0; + $src_x = -$bg_x; + } else { + $src_x = 0; + $dst_x = $bg_x; + } + + if ( $bg_y < 0 ) { + $dst_y = 0; + $src_y = -$bg_y; + } else { + $src_y = 0; + $dst_y = $bg_y; + } + + //For historical reasons exchange meanings of variables: + //start_* will be the start values, while bg_* will be the temporary start values in the loops + $start_x = $bg_x; + $start_y = $bg_y; + + // Copy regions from the source image to the background + if ( $repeat === "no-repeat" ) { + + // Simply place the image on the background + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $img_h); + + } else if ( $repeat === "repeat-x" ) { + + for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) { + if ( $bg_x < 0 ) { + $dst_x = 0; + $src_x = -$bg_x; + $w = $img_w + $bg_x; + } else { + $dst_x = $bg_x; + $src_x = 0; + $w = $img_w; + } + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h); + } + + } else if ( $repeat === "repeat-y" ) { + + for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) { + if ( $bg_y < 0 ) { + $dst_y = 0; + $src_y = -$bg_y; + $h = $img_h + $bg_y; + } else { + $dst_y = $bg_y; + $src_y = 0; + $h = $img_h; + } + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h); + + } + + } else if ( $repeat === "repeat" ) { + + for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) { + for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) { + + if ( $bg_x < 0 ) { + $dst_x = 0; + $src_x = -$bg_x; + $w = $img_w + $bg_x; + } else { + $dst_x = $bg_x; + $src_x = 0; + $w = $img_w; + } + + if ( $bg_y < 0 ) { + $dst_y = 0; + $src_y = -$bg_y; + $h = $img_h + $bg_y; + } else { + $dst_y = $bg_y; + $src_y = 0; + $h = $img_h; + } + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h); + } + } + } + + else { + print 'Unknown repeat!'; + } + + imagedestroy($src); + + } /* End optimize away creation of duplicates */ + + //img: image url string + //img_w, img_h: original image size in px + //width, height: box size in pt + //bg_width, bg_height: box size in px + //x, y: left/top edge of box on page in pt + //start_x, start_y: placement of image relativ to pattern + //$repeat: repeat mode + //$bg: GD object of result image + //$src: GD object of original image + //When using cpdf and optimization to direct png creation from gd object is available, + //don't create temp file, but place gd object directly into the pdf + if ( method_exists( $this->_canvas, "get_cpdf" ) && + method_exists( $this->_canvas->get_cpdf(), "addImagePng" ) ) { + // Note: CPDF_Adapter image converts y position + $this->_canvas->get_cpdf()->addImagePng($filedummy, $x, $this->_canvas->get_height() - $y - $height, $width, $height, $bg); + } + + else { + $tmp_file = tempnam(DOMPDF_TEMP_DIR, "bg_dompdf_img_").'.png'; + //debugpng + if (DEBUGPNG) print '[_background_image '.$tmp_file.']'; + + imagepng($bg, $tmp_file); + $this->_canvas->image($tmp_file, "png", $x, $y, $width, $height); + imagedestroy($bg); + + //debugpng + if (DEBUGPNG) print '[_background_image unlink '.$tmp_file.']'; + + if (!DEBUGKEEPTEMP) + unlink($tmp_file); + } + } + + protected function _get_dash_pattern($style, $width) { + $pattern = array(); + + switch ($style) { + default: + /*case "solid": + case "double": + case "groove": + case "inset": + case "outset": + case "ridge":*/ + case "none": break; + + case "dotted": + if ( $width < 2 ) + $pattern = array($width, 2); + else + $pattern = array($width); + break; + + case "dashed": + $pattern = array(3 * $width); + break; + } + + return $pattern; + } + + protected function _border_none($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + return; + } + + // Border rendering functions + protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + $pattern = $this->_get_dash_pattern("dotted", $$side); + + switch ($side) { + + case "top": + $delta = $top / 2; + case "bottom": + $delta = isset($delta) ? $delta : -$bottom / 2; + $this->_canvas->line($x, $y + $delta, $x + $length, $y + $delta, $color, $$side, $pattern); + break; + + case "left": + $delta = $left / 2; + case "right": + $delta = isset($delta) ? $delta : - $right / 2; + $this->_canvas->line($x + $delta, $y, $x + $delta, $y + $length, $color, $$side, $pattern); + break; + + default: + return; + + } + } + + + protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + $pattern = $this->_get_dash_pattern("dashed", $$side); + + switch ($side) { + + case "top": + $delta = $top / 2; + case "bottom": + $delta = isset($delta) ? $delta : -$bottom / 2; + $this->_canvas->line($x, $y + $delta, $x + $length, $y + $delta, $color, $$side, $pattern); + break; + + case "left": + $delta = $left / 2; + case "right": + $delta = isset($delta) ? $delta : - $right / 2; + $this->_canvas->line($x + $delta, $y, $x + $delta, $y + $length, $color, $$side, $pattern); + break; + + default: + return; + } + + } + + + protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + // All this polygon business is for beveled corners... + switch ($side) { + + case "top": + if ( $corner_style === "bevel" ) { + + $points = array($x, $y, + $x + $length, $y, + $x + $length - $right, $y + $top, + $x + $left, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + } else + $this->_canvas->filled_rectangle($x, $y, $length, $top, $color); + + break; + + case "bottom": + if ( $corner_style === "bevel" ) { + $points = array($x, $y, + $x + $length, $y, + $x + $length - $right, $y - $bottom, + $x + $left, $y - $bottom); + $this->_canvas->polygon($points, $color, null, null, true); + } else + $this->_canvas->filled_rectangle($x, $y - $bottom, $length, $bottom, $color); + + break; + + case "left": + if ( $corner_style === "bevel" ) { + $points = array($x, $y, + $x, $y + $length, + $x + $left, $y + $length - $bottom, + $x + $left, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + } else + $this->_canvas->filled_rectangle($x, $y, $left, $length, $color); + + break; + + case "right": + if ( $corner_style === "bevel" ) { + $points = array($x, $y, + $x, $y + $length, + $x - $right, $y + $length - $bottom, + $x - $right, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + } else + $this->_canvas->filled_rectangle($x - $right, $y, $right, $length, $color); + + break; + + default: + return; + + } + + } + + + protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + $line_width = $$side / 4; + + // We draw the outermost edge first. Points are ordered: outer left, + // outer right, inner right, inner left, or outer top, outer bottom, + // inner bottom, inner top. + switch ($side) { + + case "top": + if ( $corner_style === "bevel" ) { + $left_line_width = $left / 4; + $right_line_width = $right / 4; + + $points = array($x, $y, + $x + $length, $y, + $x + $length - $right_line_width, $y + $line_width, + $x + $left_line_width, $y + $line_width,); + $this->_canvas->polygon($points, $color, null, null, true); + + $points = array($x + $left - $left_line_width, $y + $top - $line_width, + $x + $length - $right + $right_line_width, $y + $top - $line_width, + $x + $length - $right, $y + $top, + $x + $left, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + + } else { + $this->_canvas->filled_rectangle($x, $y, $length, $line_width, $color); + $this->_canvas->filled_rectangle($x, $y + $top - $line_width, $length, $line_width, $color); + + } + break; + + case "bottom": + if ( $corner_style === "bevel" ) { + $left_line_width = $left / 4; + $right_line_width = $right / 4; + + $points = array($x, $y, + $x + $length, $y, + $x + $length - $right_line_width, $y - $line_width, + $x + $left_line_width, $y - $line_width); + $this->_canvas->polygon($points, $color, null, null, true); + + $points = array($x + $left - $left_line_width, $y - $bottom + $line_width, + $x + $length - $right + $right_line_width, $y - $bottom + $line_width, + $x + $length - $right, $y - $bottom, + $x + $left, $y - $bottom); + $this->_canvas->polygon($points, $color, null, null, true); + + } else { + $this->_canvas->filled_rectangle($x, $y - $line_width, $length, $line_width, $color); + $this->_canvas->filled_rectangle($x, $y - $bottom, $length, $line_width, $color); + } + + break; + + case "left": + if ( $corner_style === "bevel" ) { + $top_line_width = $top / 4; + $bottom_line_width = $bottom / 4; + + $points = array($x, $y, + $x, $y + $length, + $x + $line_width, $y + $length - $bottom_line_width, + $x + $line_width, $y + $top_line_width); + $this->_canvas->polygon($points, $color, null, null, true); + + $points = array($x + $left - $line_width, $y + $top - $top_line_width, + $x + $left - $line_width, $y + $length - $bottom + $bottom_line_width, + $x + $left, $y + $length - $bottom, + $x + $left, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + + } else { + $this->_canvas->filled_rectangle($x, $y, $line_width, $length, $color); + $this->_canvas->filled_rectangle($x + $left - $line_width, $y, $line_width, $length, $color); + } + + break; + + case "right": + if ( $corner_style === "bevel" ) { + $top_line_width = $top / 4; + $bottom_line_width = $bottom / 4; + + + $points = array($x, $y, + $x, $y + $length, + $x - $line_width, $y + $length - $bottom_line_width, + $x - $line_width, $y + $top_line_width); + $this->_canvas->polygon($points, $color, null, null, true); + + $points = array($x - $right + $line_width, $y + $top - $top_line_width, + $x - $right + $line_width, $y + $length - $bottom + $bottom_line_width, + $x - $right, $y + $length - $bottom, + $x - $right, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + + } else { + $this->_canvas->filled_rectangle($x - $line_width, $y, $line_width, $length, $color); + $this->_canvas->filled_rectangle($x - $right, $y, $line_width, $length, $color); + } + + break; + + default: + return; + + } + + } + + protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2); + + $this->_border_inset($x, $y, $length, $color, $half_widths, $side); + + switch ($side) { + + case "top": + $x += $left / 2; + $y += $top / 2; + $length -= $left / 2 + $right / 2; + break; + + case "bottom": + $x += $left / 2; + $y -= $bottom / 2; + $length -= $left / 2 + $right / 2; + break; + + case "left": + $x += $left / 2; + $y += $top / 2; + $length -= $top / 2 + $bottom / 2; + break; + + case "right": + $x -= $right / 2; + $y += $top / 2; + $length -= $top / 2 + $bottom / 2; + break; + + default: + return; + + } + + $this->_border_outset($x, $y, $length, $color, $half_widths, $side); + + } + + protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2); + + $this->_border_outset($x, $y, $length, $color, $half_widths, $side); + + switch ($side) { + + case "top": + $x += $left / 2; + $y += $top / 2; + $length -= $left / 2 + $right / 2; + break; + + case "bottom": + $x += $left / 2; + $y -= $bottom / 2; + $length -= $left / 2 + $right / 2; + break; + + case "left": + $x += $left / 2; + $y += $top / 2; + $length -= $top / 2 + $bottom / 2; + break; + + case "right": + $x -= $right / 2; + $y += $top / 2; + $length -= $top / 2 + $bottom / 2; + break; + + default: + return; + + } + + $this->_border_inset($x, $y, $length, $color, $half_widths, $side); + + } + + protected function _tint($c) { + if ( !is_numeric($c) ) + return $c; + + return min(1, $c + 0.16); + } + + protected function _shade($c) { + if ( !is_numeric($c) ) + return $c; + + return max(0, $c - 0.33); + } + + protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + switch ($side) { + + case "top": + case "left": + $shade = array_map(array($this, "_shade"), $color); + $this->_border_solid($x, $y, $length, $shade, $widths, $side); + break; + + case "bottom": + case "right": + $tint = array_map(array($this, "_tint"), $color); + $this->_border_solid($x, $y, $length, $tint, $widths, $side); + break; + + default: + return; + } + } + + protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + switch ($side) { + case "top": + case "left": + $tint = array_map(array($this, "_tint"), $color); + $this->_border_solid($x, $y, $length, $tint, $widths, $side); + break; + + case "bottom": + case "right": + $shade = array_map(array($this, "_shade"), $color); + $this->_border_solid($x, $y, $length, $shade, $widths, $side); + break; + + default: + return; + + } + } + + protected function _set_opacity($opacity) { + if ( is_numeric($opacity) && $opacity <= 1.0 && $opacity >= 0.0 ) { + $this->_canvas->set_opacity( $opacity ); + } + } + + protected function _debug_layout($box, $color = "red", $style = array()) { + $this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], CSS_Color::parse($color), 0.1, $style); + } + //........................................................................ +} diff --git a/application/third_party/dompdf/include/attribute_translator.cls.php b/application/third_party/dompdf/include/attribute_translator.cls.php new file mode 100644 index 00000000..87503fea --- /dev/null +++ b/application/third_party/dompdf/include/attribute_translator.cls.php @@ -0,0 +1,481 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: attribute_translator.cls.php 346 2011-01-09 13:23:22Z fabien.menager $ */ + +/** + * Translates HTML 4.0 attributes into CSS rules + * + * @access private + * @package dompdf + */ +class Attribute_Translator { + + // Munged data originally from + // http://www.w3.org/TR/REC-html40/index/attributes.html + // + // thank you var_export() :D + static private $__ATTRIBUTE_LOOKUP = array( + //'caption' => array ( 'align' => '', ), + 'img' => array( + 'align' => array( + 'bottom' => 'vertical-align: baseline;', + 'middle' => 'vertical-align: middle;', + 'top' => 'vertical-align: top;', + 'left' => 'float: left;', + 'right' => 'float: right;' + ), + 'border' => 'border-width: %0.2F px;', + 'height' => 'height: %s px;', + 'hspace' => 'padding-left: %1$0.2F px; padding-right: %1$0.2F px;', + 'vspace' => 'padding-top: %1$0.2F px; padding-bottom: %1$0.2F px;', + 'width' => 'width: %s px;', + ), + 'table' => array( + 'align' => array( + 'left' => 'margin-left: 0; margin-right: auto;', + 'center' => 'margin-left: auto; margin-right: auto;', + 'right' => 'margin-left: auto; margin-right: 0;' + ), + 'bgcolor' => 'background-color: %s;', + 'border' => '!set_table_border', + 'cellpadding' => '!set_table_cellpadding', + 'cellspacing' => 'border-spacing: %0.2F; border-collapse: separate;', + 'frame' => array( + 'void' => 'border-style: none;', + 'above' => 'border-top-style: solid;', + 'below' => 'border-bottom-style: solid;', + 'hsides' => 'border-left-style: solid; border-right-style: solid;', + 'vsides' => 'border-top-style: solid; border-bottom-style: solid;', + 'lhs' => 'border-left-style: solid;', + 'rhs' => 'border-right-style: solid;', + 'box' => 'border-style: solid;', + 'border' => 'border-style: solid;' + ), + 'rules' => '!set_table_rules', + 'width' => 'width: %s;', + ), + 'hr' => array( + 'align' => '!set_hr_align', // Need to grab width to set 'left' & 'right' correctly + 'noshade' => 'border-style: solid;', + 'size' => 'border-width: %0.2F px;', + 'width' => 'width: %s;', + ), + 'div' => array( + 'align' => 'text-align: %s;', + ), + 'h1' => array( + 'align' => 'text-align: %s;', + ), + 'h2' => array( + 'align' => 'text-align: %s;', + ), + 'h3' => array( + 'align' => 'text-align: %s;', + ), + 'h4' => array( + 'align' => 'text-align: %s;', + ), + 'h5' => array( + 'align' => 'text-align: %s;', + ), + 'h6' => array( + 'align' => 'text-align: %s;', + ), + 'p' => array( + 'align' => 'text-align: %s;', + ), +// 'col' => array( +// 'align' => '', +// 'valign' => '', +// ), +// 'colgroup' => array( +// 'align' => '', +// 'valign' => '', +// ), + 'tbody' => array( + 'align' => '!set_table_row_align', + 'valign' => '!set_table_row_valign', + ), + 'td' => array( + 'align' => 'text-align: %s;', + 'bgcolor' => 'background-color: %s;', + 'height' => 'height: %s;', + 'nowrap' => 'white-space: nowrap;', + 'valign' => 'vertical-align: %s;', + 'width' => 'width: %s;', + ), + 'tfoot' => array( + 'align' => '!set_table_row_align', + 'valign' => '!set_table_row_valign', + ), + 'th' => array( + 'align' => 'text-align: %s;', + 'bgcolor' => 'background-color: %s;', + 'height' => 'height: %s;', + 'nowrap' => 'white-space: nowrap;', + 'valign' => 'vertical-align: %s;', + 'width' => 'width: %s;', + ), + 'thead' => array( + 'align' => '!set_table_row_align', + 'valign' => '!set_table_row_valign', + ), + 'tr' => array( + 'align' => '!set_table_row_align', + 'bgcolor' => '!set_table_row_bgcolor', + 'valign' => '!set_table_row_valign', + ), + 'body' => array( + 'background' => 'background-image: url(%s);', + 'bgcolor' => 'background-color: %s;', + 'link' => '!set_body_link', + 'text' => 'color: %s;', + ), + 'br' => array( + 'clear' => 'clear: %s;', + ), + 'basefont' => array( + 'color' => 'color: %s;', + 'face' => 'font-family: %s;', + 'size' => '!set_basefont_size', + ), + 'font' => array( + 'color' => 'color: %s;', + 'face' => 'font-family: %s;', + 'size' => '!set_font_size', + ), + 'dir' => array( + 'compact' => 'margin: 0.5em 0;', + ), + 'dl' => array( + 'compact' => 'margin: 0.5em 0;', + ), + 'menu' => array( + 'compact' => 'margin: 0.5em 0;', + ), + 'ol' => array( + 'compact' => 'margin: 0.5em 0;', + 'start' => 'counter-reset: -dompdf-default-counter %d;', + 'type' => 'list-style-type: %s;', + ), + 'ul' => array( + 'compact' => 'margin: 0.5em 0;', + 'type' => 'list-style-type: %s;', + ), + 'li' => array( + 'type' => 'list-style-type: %s;', + 'value' => 'counter-reset: -dompdf-default-counter %d;', + ), + 'pre' => array( + 'width' => 'width: %s;', + ), + ); + + + static protected $_last_basefont_size = 3; + static protected $_font_size_lookup = array( + // For basefont support + -3 => "4pt", + -2 => "5pt", + -1 => "6pt", + 0 => "7pt", + + 1 => "8pt", + 2 => "10pt", + 3 => "12pt", + 4 => "14pt", + 5 => "18pt", + 6 => "24pt", + 7 => "34pt", + + // For basefont support + 8 => "48pt", + 9 => "44pt", + 10 => "52pt", + 11 => "60pt", + ); + + + static function translate_attributes($frame) { + $node = $frame->get_node(); + $tag = $node->tagName; + + if ( !isset(self::$__ATTRIBUTE_LOOKUP[$tag]) ) + return; + + $valid_attrs = self::$__ATTRIBUTE_LOOKUP[$tag]; + $attrs = $node->attributes; + $style = rtrim($node->getAttribute("style"), "; "); + if ( $style != "" ) + $style .= ";"; + + foreach ($attrs as $attr => $attr_node ) { + if ( !isset($valid_attrs[$attr]) ) + continue; + + $value = $attr_node->value; + + $target = $valid_attrs[$attr]; + + // Look up $value in $target, if $target is an array: + if ( is_array($target) ) { + + if ( isset($target[$value]) ) + $style .= " " . self::_resolve_target($node, $target[$value], $value); + + } else { + // otherwise use target directly + $style .= " " . self::_resolve_target($node, $target, $value); + } + } + if ( !is_null($style) ) { + $style = ltrim($style); + $node->setAttribute("style", $style); + } + + } + + static protected function _resolve_target($node, $target, $value) { + if ( $target[0] === "!" ) { + // Function call + $func = "_" . mb_substr($target, 1); + return self::$func($node, $value); + } + + return $value ? sprintf($target, $value) : ""; + } + + //..................................................................... + + static protected function _set_table_cellpadding($node, $value) { + $td_list = $node->getElementsByTagName("td"); + foreach ($td_list as $td) { + $style = rtrim($td->getAttribute("style"), ";"); + $style .= "; padding: $value" . "px;"; + $style = ltrim($style, ";"); + $td->setAttribute("style", $style); + } + return null; + } + + static protected function _set_table_border($node, $value) { + $td_list = $node->getElementsByTagName("td"); + foreach ($td_list as $td) { + $style = $td->getAttribute("style"); + if ( strpos($style, "border") !== false ) + continue; + $style = rtrim($style, ";"); + $style .= "; border-width: " . ($value > 0 ? 1 : 0) . "pt; border-style: inset;"; + $style = ltrim($style, ";"); + $td->setAttribute("style", $style); + } + + $th_list = $node->getElementsByTagName("th"); + foreach ($th_list as $th) { + $style = $th->getAttribute("style"); + if ( strpos($style, "border") !== false ) + continue; + $style = rtrim($style, ";"); + $style .= "; border-width: " . ($value > 0 ? 1 : 0) . "pt; border-style: inset;"; + $style = ltrim($style, ";"); + $th->setAttribute("style", $style); + } + + $style = rtrim($node->getAttribute("style"),";"); + $style .= "; border-width: $value" . "px; "; + return ltrim($style, "; "); + } + + static protected function _set_table_cellspacing($node, $value) { + $style = rtrim($node->getAttribute($style), ";"); + + if ( $value == 0 ) + $style .= "; border-collapse: collapse;"; + + else + $style = "; border-collapse: separate;"; + + return ltrim($style, ";"); + } + + static protected function _set_table_rules($node, $value) { + $new_style = "; border-collapse: collapse;"; + switch ($value) { + case "none": + $new_style .= "border-style: none;"; + break; + + case "groups": + // FIXME: unsupported + return; + + case "rows": + $new_style .= "border-style: solid none solid none; border-width: 1px; "; + break; + + case "cols": + $new_style .= "border-style: none solid none solid; border-width: 1px; "; + break; + + case "all": + $new_style .= "border-style: solid; border-width: 1px; "; + break; + + default: + // Invalid value + return null; + } + + $td_list = $node->getElementsByTagName("td"); + + foreach ($td_list as $td) { + $style = $td->getAttribute("style"); + $style .= $new_style; + $td->setAttribute("style", $style); + } + return null; + } + + static protected function _set_hr_align($node, $value) { + $style = rtrim($node->getAttribute("style"),";"); + $width = $node->getAttribute("width"); + if ( $width == "" ) + $width = "100%"; + + $remainder = 100 - (double)rtrim($width, "% "); + + switch ($value) { + case "left": + $style .= "; margin-right: $remainder %;"; + break; + + case "right": + $style .= "; margin-left: $remainder %;"; + break; + + case "center": + $style .= "; margin-left: auto; margin-right: auto;"; + break; + + default: + return null; + } + return ltrim($style, "; "); + } + + static protected function _set_table_row_align($node, $value) { + + $td_list = $node->getElementsByTagName("td"); + + foreach ($td_list as $td) { + $style = rtrim($td->getAttribute("style"), ";"); + $style .= "; text-align: $value;"; + $style = ltrim($style, "; "); + $td->setAttribute("style", $style); + } + + return null; + } + + static protected function _set_table_row_valign($node, $value) { + + $td_list = $node->getElementsByTagName("td"); + + foreach ($td_list as $td) { + $style = rtrim($td->getAttribute("style"), ";"); + $style .= "; vertical-align: $value;"; + $style = ltrim($style, "; "); + $td->setAttribute("style", $style); + } + + return null; + } + + static protected function _set_table_row_bgcolor($node, $value) { + + $td_list = $node->getElementsByTagName("td"); + + foreach ($td_list as $td) { + $style = rtrim($td->getAttribute("style"), ";"); + $style .= "; background-color: $value;"; + $style = ltrim($style, "; "); + $td->setAttribute("style", $style); + } + + return null; + } + + static protected function _set_body_link($node, $value) { + + $a_list = $node->getElementsByTagName("a"); + + foreach ($a_list as $a) { + $style = rtrim($a->getAttribute("style"), ";"); + $style .= "; color: $value;"; + $style = ltrim($style, "; "); + $a->setAttribute("style", $style); + } + + return null; + } + + static protected function _set_basefont_size($node, $value) { + // FIXME: ? we don't actually set the font size of anything here, just + // the base size for later modification by tags. + self::$_last_basefont_size = $value; + return null; + } + + static protected function _set_font_size($node, $value) { + $style = $node->getAttribute("style"); + + if ( $value[0] === "-" || $value[0] === "+" ) + $value = self::$_last_basefont_size + (int)$value; + + if ( isset(self::$_font_size_lookup[$value]) ) + $style .= "; font-size: " . self::$_font_size_lookup[$value] . ";"; + else + $style .= "; font-size: $value;"; + + return ltrim($style, "; "); + + } + +} diff --git a/application/third_party/dompdf/include/block_frame_decorator.cls.php b/application/third_party/dompdf/include/block_frame_decorator.cls.php new file mode 100644 index 00000000..c03ff7b9 --- /dev/null +++ b/application/third_party/dompdf/include/block_frame_decorator.cls.php @@ -0,0 +1,354 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: block_frame_decorator.cls.php 358 2011-01-30 22:22:47Z fabien.menager $ */ + +/** + * Decorates frames for block layout + * + * @access private + * @package dompdf + */ +class Block_Frame_Decorator extends Frame_Decorator { + + const DEFAULT_COUNTER = "-dompdf-default-counter"; + + protected $_lines; // array( [num] => array([frames] => array(), + // y, w, h) ) + protected $_counters; // array([id] => counter_value) (for generated content) + protected $_cl; // current line index + + static protected $_initial_line_state = array( + "frames" => array(), + "wc" => 0, + "y" => null, + "w" => 0, + "h" => 0, + "left" => 0, + "right" => 0, + "tallest_frame" => null, + "br" => false, + ); + + //........................................................................ + + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + + $this->_lines = array(self::$_initial_line_state); + + $this->_counters = array(self::DEFAULT_COUNTER => 0); + $this->_cl = 0; + } + + //........................................................................ + + function reset() { + parent::reset(); + + $this->_lines = array(self::$_initial_line_state); + + $this->_counters = array(self::DEFAULT_COUNTER => 0); + $this->_cl = 0; + } + + //........................................................................ + + // Accessor methods + + function get_current_line($i = null) { + $cl = $this->_lines[$this->_cl]; + if ( isset($i) ) + return $cl[$i]; + return $cl; + } + + function get_current_line_number() { + return $this->_cl; + } + + function get_lines() { return $this->_lines; } + + //........................................................................ + + // Set methods + function set_current_line($y = null, $w = null, $h = null, $tallest_frame = null, $left = null, $right = null) { + $this->set_line($this->_cl, $y, $w, $h, $tallest_frame, $left, $right); + } + + function clear_line($i) { + if ( isset($this->_lines[$i]) ) + unset($this->_lines[$i]); + } + + function set_line($lineno, $y = null, $w = null, $h = null, $tallest_frame = null, $left = null, $right = null) { + + if ( is_array($y) ) + extract($y); + + if (is_numeric($y)) + $this->_lines[$lineno]["y"] = $y; + + if (is_numeric($w)) + $this->_lines[$lineno]["w"] = $w; + + if (is_numeric($h)) + $this->_lines[$lineno]["h"] = $h; + + if ($tallest_frame && $tallest_frame instanceof Frame) + $this->_lines[$lineno]["tallest_frame"] = $tallest_frame; + + if (is_numeric($left)) + $this->_lines[$lineno]["left"] = $left; + + if (is_numeric($right)) + $this->_lines[$lineno]["right"] = $right; + } + + + function add_frame_to_line(Frame $frame) { + $style = $frame->get_style(); + + if ( in_array($style->position, array("absolute", "fixed")) || + (DOMPDF_ENABLE_CSS_FLOAT && $style->float !== "none") ) { + return; + } + + $frame->set_containing_line($this->_lines[$this->_cl]); + + /* + // Adds a new line after a block, only if certain conditions are met + if ((($frame instanceof Inline_Frame_Decorator && $frame->get_node()->nodeName !== "br") || + $frame instanceof Text_Frame_Decorator && trim($frame->get_text())) && + ($frame->get_prev_sibling() && $frame->get_prev_sibling()->get_style()->display === "block" && + $this->_lines[$this->_cl]["w"] > 0 )) { + + $this->maximize_line_height( $style->length_in_pt($style->line_height), $frame ); + $this->add_line(); + + // Add each child of the inline frame to the line individually + foreach ($frame->get_children() as $child) + $this->add_frame_to_line( $child ); + } + else*/ + + // Handle inline frames (which are effectively wrappers) + if ( $frame instanceof Inline_Frame_Decorator ) { + + // Handle line breaks + if ( $frame->get_node()->nodeName === "br" ) { + $this->maximize_line_height( $style->length_in_pt($style->line_height), $frame ); + $this->add_line(true); + } + + return; + } + + // Trim leading text if this is an empty line. Kinda a hack to put it here, + // but what can you do... + if ( $this->_lines[$this->_cl]["w"] == 0 && + $frame->get_node()->nodeName === "#text" && + ($style->white_space !== "pre" || + $style->white_space !== "pre-wrap") ) { + + $frame->set_text( ltrim($frame->get_text()) ); + $frame->recalculate_width(); + } + + $w = $frame->get_margin_width(); + + if ( $w == 0 ) + return; + + // Debugging code: + /* + pre_r("\n

Adding frame to line:

"); + + // pre_r("Me: " . $this->get_node()->nodeName . " (" . spl_object_hash($this->get_node()) . ")"); + // pre_r("Node: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")"); + if ( $frame->get_node()->nodeName === "#text" ) + pre_r('"'.$frame->get_node()->nodeValue.'"'); + + pre_r("Line width: " . $this->_lines[$this->_cl]["w"]); + pre_r("Frame: " . get_class($frame)); + pre_r("Frame width: " . $w); + pre_r("Frame height: " . $frame->get_margin_height()); + pre_r("Containing block width: " . $this->get_containing_block("w")); + */ + // End debugging + + $line = $this->_lines[$this->_cl]; + if ( $line["left"] + $line["w"] + $line["right"] + $w > $this->get_containing_block("w")) + $this->add_line(); + + $frame->position(); + + $current_line = &$this->_lines[$this->_cl]; + + $current_line["frames"][] = $frame; + + if ( $frame->get_node()->nodeName === "#text") + $current_line["wc"] += count(preg_split("/\s+/", trim($frame->get_text()))); + + $this->increase_line_width($w); + + $this->maximize_line_height($frame->get_margin_height(), $frame); + } + + function remove_frames_from_line(Frame $frame) { + // Search backwards through the lines for $frame + $i = $this->_cl; + + while ($i >= 0) { + if ( ($j = in_array($frame, $this->_lines[$i]["frames"], true)) !== false ) + break; + $i--; + } + + if ( $j === false ) + return; + + // Remove $frame and all frames that follow + while ($j < count($this->_lines[$i]["frames"])) { + $f = $this->_lines[$i]["frames"][$j]; + $this->_lines[$i]["frames"][$j] = null; + unset($this->_lines[$i]["frames"][$j]); + $j++; + $this->_lines[$i]["w"] -= $f->get_margin_width(); + } + + // Recalculate the height of the line + $h = 0; + foreach ($this->_lines[$i]["frames"] as $f) + $h = max( $h, $f->get_margin_height() ); + + $this->_lines[$i]["h"] = $h; + + // Remove all lines that follow + while ($this->_cl > $i) { + $this->_lines[ $this->_cl ] = null; + unset($this->_lines[ $this->_cl ]); + $this->_cl--; + } + } + + function increase_line_width($w) { + $this->_lines[ $this->_cl ]["w"] += $w; + } + + function maximize_line_height($val, Frame $frame) { + if ( $val > $this->_lines[ $this->_cl ]["h"] ) { + $this->_lines[ $this->_cl ]["tallest_frame"] = $frame; + $this->_lines[ $this->_cl ]["h"] = $val; + } + } + + function add_line($br = false) { + +// if ( $this->_lines[$this->_cl]["h"] == 0 ) //count($this->_lines[$i]["frames"]) == 0 || +// return; + + $this->_lines[$this->_cl]["br"] = $br; + $y = $this->_lines[$this->_cl]["y"] + $this->_lines[$this->_cl]["h"]; + + $new_line = self::$_initial_line_state; + $new_line["y"] = $y; + + $this->_lines[ ++$this->_cl ] = $new_line; + } + + //........................................................................ + + function reset_counter($id = self::DEFAULT_COUNTER, $value = 0) { + $this->_counters[$id] = $value; + } + + function increment_counter($id = self::DEFAULT_COUNTER, $increment = 1) { + if ( !isset($this->_counters[$id]) ) + $this->_counters[$id] = $increment; + else + $this->_counters[$id] += $increment; + } + + // TODO: What version is the best : this one or the one in List_Bullet_Renderer ? + function counter_value($id = self::DEFAULT_COUNTER, $type = "decimal") { + $type = mb_strtolower($type); + + if ( $id === "page" ) { + $value = $this->get_dompdf()->get_canvas()->get_page_number(); + } + elseif ( !isset($this->_counters[$id]) ) { + $this->_counters[$id] = 0; + $value = 0; + } + else { + $value = $this->_counters[$id]; + } + + switch ($type) { + + default: + case "decimal": + return $value; + + case "decimal-leading-zero": + return str_pad($value, 2, "0"); + + case "lower-roman": + return dec2roman($value); + + case "upper-roman": + return mb_strtoupper(dec2roman($value)); + + case "lower-latin": + case "lower-alpha": + return chr( ($value % 26) + ord('a') - 1); + + case "upper-latin": + case "upper-alpha": + return chr( ($value % 26) + ord('A') - 1); + + case "lower-greek": + return unichr($value + 944); + + case "upper-greek": + return unichr($value + 912); + } + } +} diff --git a/application/third_party/dompdf/include/block_frame_reflower.cls.php b/application/third_party/dompdf/include/block_frame_reflower.cls.php new file mode 100644 index 00000000..c2350bd9 --- /dev/null +++ b/application/third_party/dompdf/include/block_frame_reflower.cls.php @@ -0,0 +1,756 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: block_frame_reflower.cls.php 358 2011-01-30 22:22:47Z fabien.menager $ */ + +/** + * Reflows block frames + * + * @access private + * @package dompdf + */ +class Block_Frame_Reflower extends Frame_Reflower { + // Minimum line width to justify, as fraction of available width + const MIN_JUSTIFY_WIDTH = 0.80; + + /** + * @var Block_Frame_Decorator + */ + protected $_frame; + + function __construct(Block_Frame_Decorator $frame) { parent::__construct($frame); } + + /** + * Calculate the ideal used value for the width property as per: + * http://www.w3.org/TR/CSS21/visudet.html#Computing_widths_and_margins + * + * @param float $width + * @return array + */ + protected function _calculate_width($width) { + $style = $this->_frame->get_style(); + $w = $this->_frame->get_containing_block("w"); + + if( $style->position === "fixed" ) + $w = $this->_frame->get_parent()->get_containing_block("w"); + + $rm = $style->length_in_pt($style->margin_right, $w); + $lm = $style->length_in_pt($style->margin_left, $w); + + $left = $style->length_in_pt($style->left, $w); + $right = $style->length_in_pt($style->right, $w); + + // Handle 'auto' values + $dims = array($style->border_left_width, + $style->border_right_width, + $style->padding_left, + $style->padding_right, + $width !== "auto" ? $width : 0, + $rm !== "auto" ? $rm : 0, + $lm !== "auto" ? $lm : 0); + + // absolutely positioned boxes take the 'left' and 'right' properties into account + if ( $style->position === "absolute" || $style->position === "fixed" ) { + $absolute = true; + $dims[] = $left !== "auto" ? $left : 0; + $dims[] = $right !== "auto" ? $right : 0; + } else { + $absolute = false; + } + + $sum = $style->length_in_pt($dims, $w); + + // Compare to the containing block + $diff = $w - $sum; + + if ( $diff > 0 ) { + + if ( $absolute ) { + + // resolve auto properties: see + // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width + + if ( $width === "auto" && $left === "auto" && $right === "auto" ) { + + if ( $lm === "auto" ) + $lm = 0; + if ( $rm === "auto" ) + $rm = 0; + + // Technically, the width should be "shrink-to-fit" i.e. based on the + // preferred width of the content... a little too costly here as a + // special case. Just get the width to take up the slack: + $left = 0; + $right = 0; + $width = $diff; + + } else if ( $width === "auto" ) { + + if ( $lm === "auto" ) + $lm = 0; + if ( $rm === "auto" ) + $rm = 0; + if ( $left === "auto" ) + $left = 0; + if ( $right === "auto" ) + $right = 0; + + $width = $diff; + + } else if ( $left === "auto" ) { + + if ( $lm === "auto" ) + $lm = 0; + if ( $rm === "auto" ) + $rm = 0; + if ( $right === "auto" ) + $right = 0; + + $left = $diff; + + } else if ( $right === "auto" ) { + + if ( $lm === "auto" ) + $lm = 0; + if ( $rm === "auto" ) + $rm = 0; + + $right = $diff; + } + + } else { + + // Find auto properties and get them to take up the slack + if ( $width === "auto" ) + $width = $diff; + + else if ( $lm === "auto" && $rm === "auto" ) + $lm = $rm = round($diff / 2); + + else if ( $lm === "auto" ) + $lm = $diff; + + else if ( $rm === "auto" ) + $rm = $diff; + } + + } else if ($diff < 0) { + + // We are over constrained--set margin-right to the difference + $rm = $diff; + + } + + return array("width"=> $width, "margin_left" => $lm, "margin_right" => $rm, "left" => $left, "right" => $right); + } + + /** + * Call the above function, but resolve max/min widths + * @return array + */ + protected function _calculate_restricted_width() { + $frame = $this->_frame; + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + + if ( $style->position === "fixed" ) + $cb = $frame->get_root()->get_containing_block(); + + //if ( $style->position === "absolute" ) + // $cb = $frame->find_positionned_parent()->get_containing_block(); + + if ( !isset($cb["w"]) ) + throw new DOMPDF_Exception("Box property calculation requires containing block width"); + + // Treat width 100% as auto + if ( $style->width === "100%" ) { + $width = "auto"; + } + else { + $width = $style->length_in_pt($style->width, $cb["w"]); + } + extract($this->_calculate_width($width)); + + // Handle min/max width + $min_width = $style->length_in_pt($style->min_width, $cb["w"]); + $max_width = $style->length_in_pt($style->max_width, $cb["w"]); + + if ( $max_width !== "none" && $min_width > $max_width) + // Swap 'em + list($max_width, $min_width) = array($min_width, $max_width); + + if ( $max_width !== "none" && $width > $max_width ) + extract($this->_calculate_width($max_width)); + + if ( $width < $min_width ) + extract($this->_calculate_width($min_width)); + + return array($width, $margin_left, $margin_right, $left, $right); + + } + + /** + * Determine the unrestricted height of content within the block + * by adding each line's height + * @return float + */ + protected function _calculate_content_height() { + $height = 0; + + foreach ($this->_frame->get_lines() as $line) { + $height += $line["h"]; + } + + return $height; + } + + /** + * Determine the frame's restricted height + * @return array + */ + protected function _calculate_restricted_height() { + $style = $this->_frame->get_style(); + $content_height = $this->_calculate_content_height(); + $cb = $this->_frame->get_containing_block(); + + $height = $style->length_in_pt($style->height, $cb["h"]); + + $top = $style->length_in_pt($style->top, $cb["h"]); + $bottom = $style->length_in_pt($style->bottom, $cb["h"]); + + $margin_top = $style->length_in_pt($style->margin_top, $cb["h"]); + $margin_bottom = $style->length_in_pt($style->margin_bottom, $cb["h"]); + + if ( $style->position === "absolute" || $style->position === "fixed" ) { + + // see http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height + + $dims = array($top !== "auto" ? $top : 0, + $style->margin_top !== "auto" ? $style->margin_top : 0, + $style->padding_top, + $style->border_top_width, + $height !== "auto" ? $height : 0, + $style->border_bottom_width, + $style->padding_bottom, + $style->margin_bottom !== "auto" ? $style->margin_bottom : 0, + $bottom !== "auto" ? $bottom : 0); + + $sum = $style->length_in_pt($dims, $cb["h"]); + + $diff = $cb["h"] - $sum; + + if ( $diff > 0 ) { + + if ( $height === "auto" && $top === "auto" && $bottom === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $height = $diff; + + } else if ( $height === "auto" && $top === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $height = $content_height; + $top = $diff - $content_height; + + } else if ( $height === "auto" && $bottom === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $height = $content_height; + $bottom = $diff - $content_height; + + } else if ( $top === "auto" && $bottom === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $bottom = $diff; + + } else if ( $top === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $top = $diff; + + } else if ( $height === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $height = $diff; + + } else if ( $bottom === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $bottom = $diff; + + } else { + + if ( $style->overflow === "visible" ) { + + // set all autos to zero + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + if ( $top === "auto" ) + $top = 0; + if ( $bottom === "auto" ) + $bottom = 0; + if ( $height === "auto" ) + $height = $content_height; + + } + + // FIXME: overflow hidden + } + + } + + } else { + + // Expand the height if overflow is visible + if ( $height === "auto" && $content_height > $height /* && $style->overflow === "visible" */) + $height = $content_height; + + // FIXME: this should probably be moved to a seperate function as per + // _calculate_restricted_width + + // Only handle min/max height if the height is independent of the frame's content + if ( !($style->overflow === "visible" || + ($style->overflow === "hidden" && $height === "auto")) ) { + + $min_height = $style->min_height; + $max_height = $style->max_height; + + if ( isset($cb["h"]) ) { + $min_height = $style->length_in_pt($min_height, $cb["h"]); + $max_height = $style->length_in_pt($max_height, $cb["h"]); + + } else if ( isset($cb["w"]) ) { + + if ( mb_strpos($min_height, "%") !== false ) + $min_height = 0; + else + $min_height = $style->length_in_pt($min_height, $cb["w"]); + + if ( mb_strpos($max_height, "%") !== false ) + $max_height = "none"; + else + $max_height = $style->length_in_pt($max_height, $cb["w"]); + } + + if ( $max_height !== "none" && $min_height > $max_height ) + // Swap 'em + list($max_height, $min_height) = array($min_height, $max_height); + + if ( $max_height !== "none" && $height > $max_height ) + $height = $max_height; + + if ( $height < $min_height ) + $height = $min_height; + } + + } + + return array($height, $margin_top, $margin_bottom, $top, $bottom); + + } + + /** + * Adjust the justification of each of our lines. + * http://www.w3.org/TR/CSS21/text.html#propdef-text-align + */ + protected function _text_align() { + $style = $this->_frame->get_style(); + $w = $this->_frame->get_containing_block("w"); + $width = $style->length_in_pt($style->width, $w); + switch ($style->text_align) { + + default: + case "left": + foreach ($this->_frame->get_lines() as $line) { + if ( !$line["left"] ) continue; + foreach($line["frames"] as $frame) { + if ( $frame instanceof Block_Frame_Decorator) continue; + $frame->set_position( $frame->get_position("x") + $line["left"] ); + } + } + return; + + case "right": + foreach ($this->_frame->get_lines() as $line) { + // Move each child over by $dx + $dx = $width - $line["w"] - $line["right"]; + + foreach($line["frames"] as $frame) { + // Block frames are not aligned by text-align + if ($frame instanceof Block_Frame_Decorator) continue; + + $frame->set_position( $frame->get_position("x") + $dx ); + } + } + break; + + + case "justify": + // We justify all lines except the last one + $lines = $this->_frame->get_lines(); // needs to be a variable (strict standards) + $lines = array_splice($lines, 0, -1); + + foreach($lines as $i => $line) { + if ( $line["br"] ) { + unset($lines[$i]); + } + } + + // One space character's width. Will be used to get a more accurate spacing + $space_width = Font_Metrics::get_text_width(" ", $style->font_family, $style->font_size); + + foreach ($lines as $i => $line) { + if ( $line["left"] ) { + foreach($line["frames"] as $frame) { + if ( !$frame instanceof Text_Frame_Decorator ) + continue; + + $frame->set_position( $frame->get_position("x") + $line["left"] ); + } + } + + // Only set the spacing if the line is long enough. This is really + // just an aesthetic choice ;) + //if ( $line["left"] + $line["w"] + $line["right"] > self::MIN_JUSTIFY_WIDTH * $width ) { + + // Set the spacing for each child + if ( $line["wc"] > 1 ) + $spacing = ($width - ($line["left"] + $line["w"] + $line["right"]) + $space_width) / ($line["wc"] - 1); + else + $spacing = 0; + + $dx = 0; + foreach($line["frames"] as $frame) { + if ( !$frame instanceof Text_Frame_Decorator ) + continue; + + $text = $frame->get_text(); + $spaces = mb_substr_count($text, " "); + + $char_spacing = $style->length_in_pt($style->letter_spacing); + $_spacing = $spacing + $char_spacing; + + $frame->set_position( $frame->get_position("x") + $dx ); + $frame->set_text_spacing($_spacing); + + $dx += $spaces * $_spacing; + } + + // The line (should) now occupy the entire width + $this->_frame->set_line($i, null, $width); + + //} + } + break; + + case "center": + case "centre": + foreach ($this->_frame->get_lines() as $line) { + // Centre each line by moving each frame in the line by: + $dx = ($width + $line["left"] - $line["w"] - $line["right"] ) / 2; + + foreach ($line["frames"] as $frame) { + // Block frames are not aligned by text-align + if ($frame instanceof Block_Frame_Decorator) continue; + + $frame->set_position( $frame->get_position("x") + $dx ); + } + } + break; + } + } + + /** + * Align inline children vertically. + * Aligns each child vertically after each line is reflowed + */ + function vertical_align() { + + foreach ( $this->_frame->get_lines() as $i => $line ) { + + $height = $line["h"]; + + foreach ( $line["frames"] as $frame ) { + $style = $frame->get_style(); + + if ( $style->display !== "inline" && $style->display !== "text" ) + continue; + + // FIXME? + if ( $this instanceof Table_Cell_Frame_Reflower ) + $align = $frame->get_frame()->get_style()->vertical_align; + else + $align = $frame->get_frame()->get_parent()->get_style()->vertical_align; + + $frame_h = $frame->get_margin_height(); + $y = $line["y"]; + + switch ($align) { + + case "baseline": + $y += $height - $frame_h; + break; + + case "middle": + $y += ($height + $frame_h) / 2; + break; + + case "sub": + $y += 0.2 * $height; + break; + + case "super": + $y += -0.3 * $height; + break; + + case "text-top": + case "top": // Not strictly accurate, but good enough for now + break; + + case "text-bottom": + case "bottom": + $y += $height - $frame_h; + break; + } + + $x = $frame->get_position("x"); + $frame->set_position($x, $y); + + } + } + } + + function reflow(Frame_Decorator $block = null) { + + // Check if a page break is forced + $page = $this->_frame->get_root(); + $page->check_forced_page_break($this->_frame); + + // Bail if the page is full + if ( $page->is_full() ) + return; + + // Generated content + $this->_set_content(); + + // Collapse margins if required + $this->_collapse_margins(); + + $style = $this->_frame->get_style(); + $cb = $this->_frame->get_containing_block(); + + if ( $style->counter_increment && ($increment = $style->counter_increment) !== "none" ) + $this->_frame->increment_counter($increment); + + if ( $style->position === "fixed" ) + $cb = $this->_frame->get_root()->get_containing_block(); + + // Determine the constraints imposed by this frame: calculate the width + // of the content area: + list($w, $left_margin, $right_margin, $left, $right) = $this->_calculate_restricted_width(); + + // Store the calculated properties + $style->width = $w . "pt"; + $style->margin_left = $left_margin."pt"; + $style->margin_right = $right_margin."pt"; + $style->left = $left ."pt"; + $style->right = $right . "pt"; + + // Update the position + $this->_frame->position(); + list($x, $y) = $this->_frame->get_position(); + + // Adjust the first line based on the text-indent property + $indent = $style->length_in_pt($style->text_indent, $cb["w"]); + $this->_frame->increase_line_width($indent); + + // Determine the content edge + $top = $style->length_in_pt(array($style->margin_top, + $style->padding_top, + $style->border_top_width), $cb["h"]); + + $bottom = $style->length_in_pt(array($style->border_bottom_width, + $style->margin_bottom, + $style->padding_bottom), $cb["h"]); + + $cb_x = $x + $left_margin + $style->length_in_pt(array($style->border_left_width, + $style->padding_left), $cb["w"]); + + $cb_y = $y + $top; + + $cb_h = ($cb["h"] + $cb["y"]) - $bottom - $cb_y; + + // Set the y position of the first line in this block + $this->_frame->set_current_line($cb_y); + + $floating_children = array(); + + // Set the containing blocks and reflow each child + foreach ( $this->_frame->get_children() as $child ) { + + // Bail out if the page is full + if ( $page->is_full() ) + break; + + // Floating siblings + if ( DOMPDF_ENABLE_CSS_FLOAT && count($floating_children) ) { + $offset_left = 0; + $offset_right = 0; + + // We need to reflow the child to know its initial x position + $child->set_containing_block($cb_x, $cb_y, $w, $cb_h); + $child->reflow($this->_frame); + + $current_line = $this->_frame->get_current_line(); + + foreach ( $floating_children as $child_key => $floating_child ) { + $float = $floating_child->get_style()->float; + $floating_width = $floating_child->get_margin_width(); + $floating_x = $floating_child->get_position("x"); + + if ( $float === "left" ) { + if ($current_line["left"] + $child->get_position("x") > $floating_x + $floating_width) continue; + } + else { + if ($current_line["left"] + $child->get_position("x") + $child->get_margin_width() < $w - $floating_width - $current_line["right"]) continue; + } + + // If the child is still shifted by the floating element + if ( $floating_child->get_position("y") + $floating_child->get_margin_height() > $current_line["y"] ) { + if ( $float === "left" ) + $offset_left += $floating_width; + else + $offset_right += $floating_width; + } + + // else, the floating element won't shift anymore + else { + unset($floating_children[$child_key]); + } + } + + if ( $offset_left ) + $this->_frame->set_current_line(array("left" => $offset_left)); + + if ( $offset_right ) + $this->_frame->set_current_line(array("right" => $offset_right)); + } + + $child->set_containing_block($cb_x, $cb_y, $w, $cb_h); + $child->reflow($this->_frame); + + // Don't add the child to the line if a page break has occurred + if ( $page->check_page_break($child) ) + break; + + $child_style = $child->get_style(); + + if ( DOMPDF_ENABLE_CSS_FLOAT && $child_style->float !== "none") { + $floating_children[] = $child; + + // Remove next frame's beginning whitespace + $next = $child->get_next_sibling(); + if ( $next && $next instanceof Text_Frame_Decorator) { + $next->set_text(ltrim($next->get_text())); + } + + $float_x = $cb_x; + $float_y = $this->_frame->get_current_line("y"); + + $child_style = $child->get_style(); + + switch( $child_style->float ) { + case "left": break; + case "right": + $width = $w; + $float_x += ($width - $child->get_margin_width()); + break; + } + + $child->set_position($float_x, $float_y); + } + + } + + // Determine our height + list($height, $margin_top, $margin_bottom, $top, $bottom) = $this->_calculate_restricted_height(); + $style->height = $height; + $style->margin_top = $margin_top; + $style->margin_bottom = $margin_bottom; + $style->top = $top; + $style->bottom = $bottom; + + $this->_text_align(); + $this->vertical_align(); + + if ( $block ) { + $block->add_frame_to_line($this->_frame); + } + } +} diff --git a/application/third_party/dompdf/include/block_positioner.cls.php b/application/third_party/dompdf/include/block_positioner.cls.php new file mode 100644 index 00000000..2f81caa0 --- /dev/null +++ b/application/third_party/dompdf/include/block_positioner.cls.php @@ -0,0 +1,86 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: block_positioner.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */ + +/** + * Positions block frames + * + * @access private + * @package dompdf + */ +class Block_Positioner extends Positioner { + + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function position() { + $frame = $this->_frame; + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + $p = $frame->find_block_parent(); + + if ( $p ) { + $float = $style->float; + if ( !DOMPDF_ENABLE_CSS_FLOAT || !$float || $float === "none" ) { + $p->add_line(); + } + $y = $p->get_current_line("y"); + + } else + $y = $cb["y"]; + + $x = $cb["x"]; + + // Relative positionning + if ( $style->position === "relative" ) { + $top = $style->length_in_pt($style->top, $cb["h"]); + //$right = $style->length_in_pt($style->right, $cb["w"]); + //$bottom = $style->length_in_pt($style->bottom, $cb["h"]); + $left = $style->length_in_pt($style->left, $cb["w"]); + + $x += $left; + $y += $top; + } + + $frame->set_position($x, $y); + } +} diff --git a/application/third_party/dompdf/include/block_renderer.cls.php b/application/third_party/dompdf/include/block_renderer.cls.php new file mode 100644 index 00000000..6506b240 --- /dev/null +++ b/application/third_party/dompdf/include/block_renderer.cls.php @@ -0,0 +1,211 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: block_renderer.cls.php 346 2011-01-09 13:23:22Z fabien.menager $ */ + +/** + * Renders block frames + * + * @access private + * @package dompdf + */ +class Block_Renderer extends Abstract_Renderer { + + //........................................................................ + + function render(Frame $frame) { + $style = $frame->get_style(); + list($x, $y, $w, $h) = $frame->get_padding_box(); + + $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); + + // Draw our background, border and content + if ( ($bg = $style->background_color) !== "transparent" ) { + $this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg ); + } + + if ( ($url = $style->background_image) && $url !== "none" ) + $this->_background_image($url, $x, $y, $w, $h, $style); + + $this->_render_border($frame); + $this->_render_outline($frame); + + if (DEBUG_LAYOUT && DEBUG_LAYOUT_BLOCKS) { + $this->_debug_layout($frame->get_border_box(), "red"); + if (DEBUG_LAYOUT_PADDINGBOX) { + $this->_debug_layout($frame->get_padding_box(), "red", array(0.5, 0.5)); + } + } + + if (DEBUG_LAYOUT && DEBUG_LAYOUT_LINES && $frame->get_decorator()) { + foreach ($frame->get_decorator()->get_lines() as $line) { + $frame->_debug_layout(array($line["x"], $line["y"], $line["w"], $line["h"]), "orange"); + } + } + } + + protected function _render_border(Frame_Decorator $frame, $corner_style = "bevel") { + $style = $frame->get_style(); + $bbox = $frame->get_border_box(); + $bp = $style->get_border_properties(); + + // If all the borders are "solid" with the same color and style, we'd better draw a rectangle + if ( + in_array($bp["top"]["style"], array("solid", "dashed", "dotted")) && + $bp["top"] == $bp["right"] && + $bp["right"] == $bp["bottom"] && + $bp["bottom"] == $bp["left"] + ) { + $props = $bp["top"]; + if ( $props["color"] === "transparent" || $props["width"] <= 0 ) return; + + list($x, $y, $w, $h) = $bbox; + $width = $style->length_in_pt($props["width"]); + $pattern = $this->_get_dash_pattern($props["style"], $width); + $this->_canvas->rectangle($x + $width / 2, $y + $width / 2, $w - $width, $h - $width, $props["color"], $width, $pattern); + return; + } + + $widths = array($style->length_in_pt($bp["top"]["width"]), + $style->length_in_pt($bp["right"]["width"]), + $style->length_in_pt($bp["bottom"]["width"]), + $style->length_in_pt($bp["left"]["width"])); + + foreach ($bp as $side => $props) { + list($x, $y, $w, $h) = $bbox; + + if ( !$props["style"] || + $props["style"] === "none" || + $props["width"] <= 0 || + $props["color"] == "transparent" ) + continue; + + switch($side) { + case "top": + $length = $w; + break; + + case "bottom": + $length = $w; + $y += $h; + break; + + case "left": + $length = $h; + break; + + case "right": + $length = $h; + $x += $w; + break; + default: + break; + } + $method = "_border_" . $props["style"]; + + $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style); + } + } + + protected function _render_outline(Frame_Decorator $frame, $corner_style = "bevel") { + $style = $frame->get_style(); + + $props = array( + "width" => $style->outline_width, + "style" => $style->outline_style, + "color" => $style->outline_color, + ); + + if ( !$props["style"] || $props["style"] === "none" || $props["width"] <= 0 ) + return; + + $bbox = $frame->get_border_box(); + $offset = $style->length_in_pt($props["width"]); + $pattern = $this->_get_dash_pattern($props["style"], $offset); + + // If the outline style is "solid" we'd better draw a rectangle + if ( in_array($props["style"], array("solid", "dashed", "dotted")) ) { + $bbox[0] -= $offset / 2; + $bbox[1] -= $offset / 2; + $bbox[2] += $offset; + $bbox[3] += $offset; + + list($x, $y, $w, $h) = $bbox; + $this->_canvas->rectangle($x, $y, $w, $h, $props["color"], $offset, $pattern); + return; + } + + $bbox[0] -= $offset; + $bbox[1] -= $offset; + $bbox[2] += $offset * 2; + $bbox[3] += $offset * 2; + + $method = "_border_" . $props["style"]; + $widths = array_fill(0, 4, $props["width"]); + $sides = array("top", "right", "left", "bottom"); + + foreach ($sides as $side) { + list($x, $y, $w, $h) = $bbox; + + switch($side) { + case "top": + $length = $w; + break; + + case "bottom": + $length = $w; + $y += $h; + break; + + case "left": + $length = $h; + break; + + case "right": + $length = $h; + $x += $w; + break; + default: + break; + } + + $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style); + } + } +} diff --git a/application/third_party/dompdf/include/cached_pdf_decorator.cls.php b/application/third_party/dompdf/include/cached_pdf_decorator.cls.php new file mode 100644 index 00000000..53790401 --- /dev/null +++ b/application/third_party/dompdf/include/cached_pdf_decorator.cls.php @@ -0,0 +1,186 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: cached_pdf_decorator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Caching canvas implementation + * + * Each rendered page is serialized and stored in the {@link Page_Cache}. + * This is useful for static forms/pages that do not need to be re-rendered + * all the time. + * + * This class decorates normal CPDF_Adapters. It is currently completely + * experimental. + * + * @access private + * @package dompdf + */ +class Cached_PDF_Decorator extends CPDF_Adapter implements Canvas { + protected $_pdf; + protected $_cache_id; + protected $_current_page_id; + protected $_fonts; // fonts used in this document + + function __construct($cache_id, CPDF_Adapter $pdf) { + $this->_pdf = $pdf; + $this->_cache_id = $cache_id; + $this->_fonts = array(); + + $this->_current_page_id = $this->_pdf->open_object(); + } + + //........................................................................ + + function get_cpdf() { return $this->_pdf->get_cpdf(); } + + function open_object() { $this->_pdf->open_object(); } + function reopen_object() { return $this->_pdf->reopen_object(); } + + function close_object() { $this->_pdf->close_object(); } + + function add_object($object, $where = 'all') { $this->_pdf->add_object($object, $where); } + + function serialize_object($id) { $this->_pdf->serialize_object($id); } + + function reopen_serialized_object($obj) { $this->_pdf->reopen_serialized_object($obj); } + + //........................................................................ + + function get_width() { return $this->_pdf->get_width(); } + function get_height() { return $this->_pdf->get_height(); } + function get_page_number() { return $this->_pdf->get_page_number(); } + function get_page_count() { return $this->_pdf->get_page_count(); } + + function set_page_number($num) { $this->_pdf->set_page_number($num); } + function set_page_count($count) { $this->_pdf->set_page_count($count); } + + function line($x1, $y1, $x2, $y2, $color, $width, $style = array()) { + $this->_pdf->line($x1, $y1, $x2, $y2, $color, $width, $style); + } + + function rectangle($x1, $y1, $w, $h, $color, $width, $style = array()) { + $this->_pdf->rectangle($x1, $y1, $w, $h, $color, $width, $style); + } + + function filled_rectangle($x1, $y1, $w, $h, $color) { + $this->_pdf->filled_rectangle($x1, $y1, $w, $h, $color); + } + + function polygon($points, $color, $width = null, $style = array(), $fill = false) { + $this->_pdf->polygon($points, $color, $width, $style, $fill); + } + + function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false) { + $this->_pdf->circle($x, $y, $r1, $color, $width, $style, $fill); + } + + function image($img_url, $x, $y, $w = null, $h = null) { + $this->_pdf->image($img_url, $x, $y, $w, $h); + } + + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) { + $this->_fonts[$font] = true; + $this->_pdf->text($x, $y, $text, $font, $size, $color, $adjust, $angle); + } + + function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) { + + // We want to remove this from cached pages since it may not be correct + $this->_pdf->close_object(); + $this->_pdf->page_text($x, $y, $text, $font, $size, $color, $adjust, $angle); + $this->_pdf->reopen_object($this->_current_page_id); + } + + function page_script($script, $type = 'text/php') { + + // We want to remove this from cached pages since it may not be correct + $this->_pdf->close_object(); + $this->_pdf->page_script($script, $type); + $this->_pdf->reopen_object($this->_current_page_id); + } + + function new_page() { + $this->_pdf->close_object(); + + // Add the object to the current page + $this->_pdf->add_object($this->_current_page_id, "add"); + $this->_pdf->new_page(); + + Page_Cache::store_page($this->_cache_id, + $this->_pdf->get_page_number() - 1, + $this->_pdf->serialize_object($this->_current_page_id)); + + $this->_current_page_id = $this->_pdf->open_object(); + return $this->_current_page_id; + } + + function stream($filename) { + // Store the last page in the page cache + if ( !is_null($this->_current_page_id) ) { + $this->_pdf->close_object(); + $this->_pdf->add_object($this->_current_page_id, "add"); + Page_Cache::store_page($this->_cache_id, + $this->_pdf->get_page_number(), + $this->_pdf->serialize_object($this->_current_page_id)); + Page_Cache::store_fonts($this->_cache_id, $this->_fonts); + $this->_current_page_id = null; + } + + $this->_pdf->stream($filename); + + } + + function &output() { + // Store the last page in the page cache + if ( !is_null($this->_current_page_id) ) { + $this->_pdf->close_object(); + $this->_pdf->add_object($this->_current_page_id, "add"); + Page_Cache::store_page($this->_cache_id, + $this->_pdf->get_page_number(), + $this->_pdf->serialize_object($this->_current_page_id)); + $this->_current_page_id = null; + } + + return $this->_pdf->output(); + } + + function get_messages() { return $this->_pdf->get_messages(); } + +} diff --git a/application/third_party/dompdf/include/canvas.cls.php b/application/third_party/dompdf/include/canvas.cls.php new file mode 100644 index 00000000..cbc0d9c9 --- /dev/null +++ b/application/third_party/dompdf/include/canvas.cls.php @@ -0,0 +1,328 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: canvas.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Main rendering interface + * + * Currently {@link CPDF_Adapter}, {@link PDFLib_Adapter}, {@link TCPDF_Adapter}, and {@link GD_Adapter} + * implement this interface. + * + * Implementations should measure x and y increasing to the left and down, + * respectively, with the origin in the top left corner. Implementations + * are free to use a unit other than points for length, but I can't + * guarantee that the results will look any good. + * + * @package dompdf + */ +interface Canvas { + + /** + * Returns the current page number + * + * @return int + */ + function get_page_number(); + + /** + * Returns the total number of pages + * + * @return int + */ + function get_page_count(); + + /** + * Sets the total number of pages + * + * @param int $count + */ + function set_page_count($count); + + /** + * Draws a line from x1,y1 to x2,y2 + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the format of the + * $style parameter (aka dash). + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param array $color + * @param float $width + * @param array $style + */ + function line($x1, $y1, $x2, $y2, $color, $width, $style = null); + + /** + * Draws a rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + * @param float $width + * @param array $style + */ + function rectangle($x1, $y1, $w, $h, $color, $width, $style = null); + + /** + * Draws a filled rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + */ + function filled_rectangle($x1, $y1, $w, $h, $color); + + /** + * Starts a clipping rectangle at x1,y1 with width w and height h + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + */ + function clipping_rectangle($x1, $y1, $w, $h); + + /** + * Ends the last clipping shape + */ + function clipping_end(); + + /** + * Save current state + */ + function save(); + + /** + * Restore last state + */ + function restore(); + + /** + * Rotate + */ + function rotate($angle, $x, $y); + + /** + * Skew + */ + function skew($angle_x, $angle_y, $x, $y); + + /** + * Scale + */ + function scale($s_x, $s_y, $x, $y); + + /** + * Translate + */ + function translate($t_x, $t_y); + + /** + * Transform + */ + function transform($a, $b, $c, $d, $e, $f); + + /** + * Draws a polygon + * + * The polygon is formed by joining all the points stored in the $points + * array. $points has the following structure: + * + * array(0 => x1, + * 1 => y1, + * 2 => x2, + * 3 => y2, + * ... + * ); + * + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param array $points + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the polygon if true + */ + function polygon($points, $color, $width = null, $style = null, $fill = false); + + /** + * Draws a circle at $x,$y with radius $r + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x + * @param float $y + * @param float $r + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the circle if true + */ + function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false); + + /** + * Add an image to the pdf. + * + * The image is placed at the specified x and y coordinates with the + * given width and height. + * + * @param string $img_url the path to the image + * @param string $img_type the type (e.g. extension) of the image + * @param float $x x position + * @param float $y y position + * @param int $w width (in pixels) + * @param int $h height (in pixels) + */ + function image($img_url, $img_type, $x, $y, $w, $h); + + /** + * Writes text at the specified x and y coordinates + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x + * @param float $y + * @param string $text the text to write + * @param string $font the font file to use + * @param float $size the font size, in points + * @param array $color + * @param float $word_space word spacing adjustment + * @param float $char_space whar spacing adjustment + * @param float $angle angle + */ + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0, $char_space = 0, $angle = 0); + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname); + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height); + + /** + * Add meta information to the pdf + * + * @param string $label label of the value (Creator, Producer, etc.) + * @param string $value the text to set + */ + function add_info($name, $value); + + /** + * Calculates text size, in points + * + * @param string $text the text to be sized + * @param string $font the desired font + * @param float $size the desired font size + * @param float $spacing word spacing, if any + * @return float + */ + function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0); + + /** + * Calculates font height, in points + * + * @param string $font + * @param float $size + * @return float + */ + function get_font_height($font, $size); + + /** + * Sets the opacity + * + * @param float $opacity + * @param string $mode + * @return float + */ + function set_opacity($opacity, $mode = "Normal"); + + /** + * Starts a new page + * + * Subsequent drawing operations will appear on the new page. + */ + function new_page(); + + /** + * Streams the PDF directly to the browser + * + * @param string $filename the name of the PDF file + * @param array $options associative array, 'Attachment' => 0 or 1, 'compress' => 1 or 0 + */ + function stream($filename, $options = null); + + /** + * Returns the PDF as a string + * + * @param array $options associative array: 'compress' => 1 or 0 + * @return string + */ + function output($options = null); + +} diff --git a/application/third_party/dompdf/include/canvas_factory.cls.php b/application/third_party/dompdf/include/canvas_factory.cls.php new file mode 100644 index 00000000..4dc4070a --- /dev/null +++ b/application/third_party/dompdf/include/canvas_factory.cls.php @@ -0,0 +1,83 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: canvas_factory.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Create canvas instances + * + * The canvas factory creates canvas instances based on the + * availability of rendering backends and config options. + * + * @package dompdf + */ +class Canvas_Factory { + + /** + * Constructor is private: this is a static class + */ + private function __construct() { } + + static function get_instance($paper = null, $orientation = null, $class = null) { + + $backend = strtolower(DOMPDF_PDF_BACKEND); + + if ( isset($class) && class_exists($class, false) ) + $class .= "_Adapter"; + + else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "pdflib" ) && + class_exists("PDFLib", false) ) + $class = "PDFLib_Adapter"; + + else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "cpdf") ) + $class = "CPDF_Adapter"; + + else if ( ( $backend === "tcpdf") ) + $class = "TCPDF_Adapter"; + + else if ( $backend === "gd" ) + $class = "GD_Adapter"; + + else + $class = "CPDF_Adapter"; + + return new $class($paper, $orientation); + + } +} diff --git a/application/third_party/dompdf/include/cellmap.cls.php b/application/third_party/dompdf/include/cellmap.cls.php new file mode 100644 index 00000000..03f9c03a --- /dev/null +++ b/application/third_party/dompdf/include/cellmap.cls.php @@ -0,0 +1,730 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: cellmap.cls.php 283 2010-07-19 17:57:40Z fabien.menager $ */ + +/** + * Maps table cells to the table grid. + * + * This class resolves borders in tables with collapsed borders and helps + * place row & column spanned table cells. + * + * @access private + * @package dompdf + */ +class Cellmap { + + /** + * Border style weight lookup for collapsed border resolution. + * + * @var array + */ + static protected $_BORDER_STYLE_SCORE = array("inset" => 1, + "groove" => 2, + "outset" => 3, + "ridge" => 4, + "dotted" => 5, + "dashed" => 6, + "solid" => 7, + "double" => 8, + "none" => 0); + + /** + * The table object this cellmap is attached to. + * + * @var Table_Frame_Decorator + */ + protected $_table; + + /** + * The total number of rows in the table + * + * @var int + */ + protected $_num_rows; + + /** + * The total number of columns in the table + * + * @var int + */ + protected $_num_cols; + + /** + * 2D array mapping to frames + * + * @var array + */ + protected $_cells; + + /** + * 1D array of column dimensions + * + * @var array + */ + protected $_columns; + + /** + * 1D array of row dimensions + * + * @var array + */ + protected $_rows; + + /** + * 2D array of border specs + * + * @var array + */ + protected $_borders; + + /** + * 1D Array mapping frames to (multiple) pairs, keyed on + * frame_id. + * + * @var array + */ + protected $_frames; + + /** + * Current column when adding cells, 0-based + * + * @var int + */ + private $__col; + + /** + * Current row when adding cells, 0-based + * + * @var int + */ + private $__row; + + //........................................................................ + + function __construct(Table_Frame_Decorator $table) { + $this->_table = $table; + $this->reset(); + } + + function __destruct() { + clear_object($this); + } + //........................................................................ + + function reset() { + $this->_num_rows = 0; + $this->_num_cols = 0; + + $this->_cells = array(); + $this->_frames = array(); + + $this->_columns = array(); + $this->_rows = array(); + + $this->_borders = array(); + + $this->__col = $this->__row = 0; + } + + //........................................................................ + + function get_num_rows() { return $this->_num_rows; } + function get_num_cols() { return $this->_num_cols; } + + function &get_columns() { + return $this->_columns; + } + + function &get_column($i) { + if ( !isset($this->_columns[$i]) ) + $this->_columns[$i] = array("x" => 0, + "min-width" => 0, + "max-width" => 0, + "used-width" => null, + "absolute" => 0, + "percent" => 0, + "auto" => true); + + return $this->_columns[$i]; + } + + function &get_rows() { + return $this->_rows; + } + + function &get_row($j) { + if ( !isset($this->_rows[$j]) ) + $this->_rows[$j] = array("y" => 0, + "first-column" => 0, + "height" => null); + return $this->_rows[$j]; + } + + function get_border($i, $j, $h_v, $prop = null) { + if ( !isset($this->_borders[$i][$j][$h_v]) ) + $this->_borders[$i][$j][$h_v] = array("width" => 0, + "style" => "solid", + "color" => "black"); + if ( isset($prop) ) + return $this->_borders[$i][$j][$h_v][$prop]; + + return $this->_borders[$i][$j][$h_v]; + } + + function get_border_properties($i, $j) { + + $left = $this->get_border($i, $j, "vertical"); + $right = $this->get_border($i, $j+1, "vertical"); + $top = $this->get_border($i, $j, "horizontal"); + $bottom = $this->get_border($i+1, $j, "horizontal"); + + return compact("top", "bottom", "left", "right"); + } + + //........................................................................ + + function get_spanned_cells($frame) { + $key = $frame->get_id(); + + if ( !isset($this->_frames[$key]) ) { + throw new DOMPDF_Internal_Exception("Frame not found in cellmap"); + } + + return $this->_frames[$key]; + + } + + function frame_exists_in_cellmap($frame) { + $key = $frame->get_id(); + return isset($this->_frames[$key]); + } + + function get_frame_position($frame) { + global $_dompdf_warnings; + + $key = $frame->get_id(); + + if ( !isset($this->_frames[$key]) ) { + throw new DOMPDF_Internal_Exception("Frame not found in cellmap"); + } + + $col = $this->_frames[$key]["columns"][0]; + $row = $this->_frames[$key]["rows"][0]; + + if ( !isset($this->_columns[$col])) { + $_dompdf_warnings[] = "Frame not found in columns array. Check your table layout for missing or extra TDs."; + $x = 0; + } else + $x = $this->_columns[$col]["x"]; + + if ( !isset($this->_rows[$row])) { + $_dompdf_warnings[] = "Frame not found in row array. Check your table layout for missing or extra TDs."; + $y = 0; + } else + $y = $this->_rows[$row]["y"]; + + return array($x, $y, "x" => $x, "y" => $y); + } + + function get_frame_width($frame) { + $key = $frame->get_id(); + + if ( !isset($this->_frames[$key]) ) { + throw new DOMPDF_Internal_Exception("Frame not found in cellmap"); + } + + $cols = $this->_frames[$key]["columns"]; + $w = 0; + foreach ($cols as $i) + $w += $this->_columns[$i]["used-width"]; + + return $w; + + } + + function get_frame_height($frame) { + $key = $frame->get_id(); + + if ( !isset($this->_frames[$key]) ) + throw new DOMPDF_Internal_Exception("Frame not found in cellmap"); + + $rows = $this->_frames[$key]["rows"]; + $h = 0; + foreach ($rows as $i) { + if ( !isset($this->_rows[$i]) ) { + throw new Exception("foo"); + } + $h += $this->_rows[$i]["height"]; + } + return $h; + + } + + + //........................................................................ + + function set_column_width($j, $width) { + $col =& $this->get_column($j); + $col["used-width"] = $width; + $next_col =& $this->get_column($j+1); + $next_col["x"] = $next_col["x"] + $width; + } + + function set_row_height($i, $height) { + $row =& $this->get_row($i); + if ( $height <= $row["height"] ) + return; + + $row["height"] = $height; + $next_row =& $this->get_row($i+1); + $next_row["y"] = $row["y"] + $height; + + } + + //........................................................................ + + + protected function _resolve_border($i, $j, $h_v, $border_spec) { + $n_width = $border_spec["width"]; + $n_style = $border_spec["style"]; + $n_color = $border_spec["color"]; + + if ( !isset($this->_borders[$i][$j][$h_v]) ) { + $this->_borders[$i][$j][$h_v] = $border_spec; + return $this->_borders[$i][$j][$h_v]["width"]; + } + + $border = &$this->_borders[$i][$j][$h_v]; + + $o_width = $border["width"]; + $o_style = $border["style"]; + $o_color = $border["color"]; + + if ( ($n_style === "hidden" || + $n_width > $o_width || + $o_style === "none") + + or + + ($o_width == $n_width && + in_array($n_style, self::$_BORDER_STYLE_SCORE) && + self::$_BORDER_STYLE_SCORE[ $n_style ] > self::$_BORDER_STYLE_SCORE[ $o_style ]) ) + $border = $border_spec; + + return $border["width"]; + } + + //........................................................................ + + function add_frame(Frame $frame) { + + $style = $frame->get_style(); + $display = $style->display; + + $collapse = $this->_table->get_style()->border_collapse == "collapse"; + + // Recursively add the frames within tables, table-row-groups and table-rows + if ( $display === "table-row" || + $display === "table" || + $display === "inline-table" || + in_array($display, Table_Frame_Decorator::$ROW_GROUPS) ) { + + $start_row = $this->__row; + foreach ( $frame->get_children() as $child ) + $this->add_frame( $child ); + + if ( $display === "table-row" ) + $this->add_row(); + + $num_rows = $this->__row - $start_row - 1; + $key = $frame->get_id(); + + // Row groups always span across the entire table + $this->_frames[$key]["columns"] = range(0,max(0,$this->_num_cols-1)); + $this->_frames[$key]["rows"] = range($start_row, max(0, $this->__row - 1)); + $this->_frames[$key]["frame"] = $frame; + + if ( $display !== "table-row" && $collapse ) { + + $bp = $style->get_border_properties(); + + // Resolve the borders + for ( $i = 0; $i < $num_rows+1; $i++) { + $this->_resolve_border($start_row + $i, 0, "vertical", $bp["left"]); + $this->_resolve_border($start_row + $i, $this->_num_cols, "vertical", $bp["right"]); + } + + for ( $j = 0; $j < $this->_num_cols; $j++) { + $this->_resolve_border($start_row, $j, "horizontal", $bp["top"]); + $this->_resolve_border($this->__row, $j, "horizontal", $bp["bottom"]); + } + } + + + return; + } + + $node = $frame->get_node(); + + // Determine where this cell is going + $colspan = $node->getAttribute("colspan"); + $rowspan = $node->getAttribute("rowspan"); + + if ( !$colspan ) { + $colspan = 1; + $node->setAttribute("colspan",1); + } + + if ( !$rowspan ) { + $rowspan = 1; + $node->setAttribute("rowspan",1); + } + $key = $frame->get_id(); + + $bp = $style->get_border_properties(); + + + // Add the frame to the cellmap + $max_left = $max_right = 0; + + // Find the next available column (fix by Ciro Mondueri) + $ac = $this->__col; + while ( isset($this->_cells[$this->__row][$ac]) ) + $ac++; + $this->__col = $ac; + + // Rows: + for ( $i = 0; $i < $rowspan; $i++ ) { + $row = $this->__row + $i; + + $this->_frames[$key]["rows"][] = $row; + + for ( $j = 0; $j < $colspan; $j++) + $this->_cells[$row][$this->__col + $j] = $frame; + + if ( $collapse ) { + // Resolve vertical borders + $max_left = max($max_left, $this->_resolve_border($row, $this->__col, "vertical", $bp["left"])); + $max_right = max($max_right, $this->_resolve_border($row, $this->__col + $colspan, "vertical", $bp["right"])); + } + } + + $max_top = $max_bottom = 0; + + // Columns: + for ( $j = 0; $j < $colspan; $j++ ) { + $col = $this->__col + $j; + $this->_frames[$key]["columns"][] = $col; + + if ( $collapse ) { + // Resolve horizontal borders + $max_top = max($max_top, $this->_resolve_border($this->__row, $col, "horizontal", $bp["top"])); + $max_bottom = max($max_bottom, $this->_resolve_border($this->__row + $rowspan, $col, "horizontal", $bp["bottom"])); + } + } + + $this->_frames[$key]["frame"] = $frame; + + // Handle seperated border model + if ( !$collapse ) { + list($h, $v) = $this->_table->get_style()->border_spacing; + + // Border spacing is effectively a margin between cells + $v = $style->length_in_pt($v) / 2; + $h = $style->length_in_pt($h) / 2; + $style->margin = "$v $h"; + + // The additional 1/2 width gets added to the table proper + + } else { + + // Drop the frame's actual border + $style->border_left_width = $max_left / 2; + $style->border_right_width = $max_right / 2; + $style->border_top_width = $max_top / 2; + $style->border_bottom_width = $max_bottom / 2; + $style->margin = "none"; + } + + // Resolve the frame's width + list($frame_min, $frame_max) = $frame->get_min_max_width(); + + $width = $style->width; + + if ( is_percent($width) ) { + $var = "percent"; + $val = (float)rtrim($width, "% ") / $colspan; + + } else if ( $width !== "auto" ) { + $var = "absolute"; + $val = $style->length_in_pt($frame_min) / $colspan; + } + + $min = 0; + $max = 0; + for ( $cs = 0; $cs < $colspan; $cs++ ) { + + // Resolve the frame's width(s) with other cells + $col =& $this->get_column( $this->__col + $cs ); + + // Note: $var is either 'percent' or 'absolute'. We compare the + // requested percentage or absolute values with the existing widths + // and adjust accordingly. + if ( isset($var) && $val > $col[$var] ) { + $col[$var] = $val; + $col["auto"] = false; + } + + $min += $col["min-width"]; + $max += $col["max-width"]; + } + + + if ( $frame_min > $min ) { + // The frame needs more space. Expand each sub-column + $inc = ($frame_min - $min) / $colspan; + for ($c = 0; $c < $colspan; $c++) { + $col =& $this->get_column($this->__col + $c); + $col["min-width"] += $inc; + } + } + + if ( $frame_max > $max ) { + $inc = ($frame_max - $max) / $colspan; + for ($c = 0; $c < $colspan; $c++) { + $col =& $this->get_column($this->__col + $c); + $col["max-width"] += $inc; + } + } + + $this->__col += $colspan; + if ( $this->__col > $this->_num_cols ) + $this->_num_cols = $this->__col; + + } + + //........................................................................ + + function add_row() { + + $this->__row++; + $this->_num_rows++; + + // Find the next available column + $i = 0; + while ( isset($this->_cells[$this->__row][$i]) ) + $i++; + + $this->__col = $i; + + } + + //........................................................................ + + /** + * Remove a row from the cellmap. + * + * @param Frame + */ + function remove_row(Frame $row) { + + $key = $row->get_id(); + if ( !isset($this->_frames[$key]) ) + return; // Presumably this row has alredy been removed + + $this->_row = $this->_num_rows--; + + $rows = $this->_frames[$key]["rows"]; + $columns = $this->_frames[$key]["columns"]; + + // Remove all frames from this row + foreach ( $rows as $r ) { + foreach ( $columns as $c ) { + if ( isset($this->_cells[$r][$c]) ) { + $id = $this->_cells[$r][$c]->get_id(); + + $this->_frames[$id] = null; + unset($this->_frames[$id]); + + $this->_cells[$r][$c] = null; + unset($this->_cells[$r][$c]); + } + } + $this->_rows[$r] = null; + unset($this->_rows[$r]); + } + + $this->_frames[$key] = null; + unset($this->_frames[$key]); + + } + + /** + * Remove a row group from the cellmap. + * + * @param Frame $group The group to remove + */ + function remove_row_group(Frame $group) { + + $key = $group->get_id(); + if ( !isset($this->_frames[$key]) ) + return; // Presumably this row has alredy been removed + + $iter = $group->get_first_child(); + while ($iter) { + $this->remove_row($iter); + $iter = $iter->get_next_sibling(); + } + + $this->_frames[$key] = null; + unset($this->_frames[$key]); + } + + /** + * Update a row group after rows have been removed + * + * @param Frame $group The group to update + * @param Frame $last_row The last row in the row group + */ + function update_row_group(Frame $group, Frame $last_row) { + + $g_key = $group->get_id(); + $r_key = $last_row->get_id(); + + $r_rows = $this->_frames[$r_key]["rows"]; + $this->_frames[$g_key]["rows"] = range( $this->_frames[$g_key]["rows"][0], end($r_rows) ); + + } + + //........................................................................ + + function assign_x_positions() { + // Pre-condition: widths must be resolved and assigned to columns and + // column[0]["x"] must be set. + + $x = $this->_columns[0]["x"]; + foreach ( array_keys($this->_columns) as $j ) { + $this->_columns[$j]["x"] = $x; + $x += $this->_columns[$j]["used-width"]; + + } + + } + + function assign_frame_heights() { + // Pre-condition: widths and heights of each column & row must be + // calcluated + + foreach ( $this->_frames as $arr ) { + $frame = $arr["frame"]; + + $h = 0; + foreach( $arr["rows"] as $row ) { + if ( !isset($this->_rows[$row]) ) + // The row has been removed because of a page split, so skip it. + continue; + $h += $this->_rows[$row]["height"]; + } + + if ( $frame instanceof Table_Cell_Frame_Decorator ) + $frame->set_cell_height($h); + else + $frame->get_style()->height = $h; + } + + } + + //........................................................................ + + /** + * Re-adjust frame height if the table height is larger than its content + */ + function set_frame_heights($table_height, $content_height) { + + + // Distribute the increased height proportionally amongst each row + foreach ( $this->_frames as $arr ) { + $frame = $arr["frame"]; + + $h = 0; + foreach ($arr["rows"] as $row ) { + if ( !isset($this->_rows[$row]) ) + continue; + + $h += $this->_rows[$row]["height"]; + } + + if ( $content_height > 0 ) + $new_height = ($h / $content_height) * $table_height; + else + $new_height = 0; + + if ( $frame instanceof Table_Cell_Frame_Decorator ) + $frame->set_cell_height($new_height); + else + $frame->get_style()->height = $new_height; + } + + } + + //........................................................................ + + // Used for debugging: + function __toString() { + $str = ""; + $str .= "Columns:
"; + $str .= pre_r($this->_columns, true); + $str .= "Rows:
"; + $str .= pre_r($this->_rows, true); + + $str .= "Frames:
"; + $arr = array(); + foreach ( $this->_frames as $key => $val ) + $arr[$key] = array("columns" => $val["columns"], "rows" => $val["rows"]); + + $str .= pre_r($arr, true); + + if ( php_sapi_name() == "cli" ) + $str = strip_tags(str_replace(array("
","",""), + array("\n",chr(27)."[01;33m", chr(27)."[0m"), + $str)); + return $str; + } +} diff --git a/application/third_party/dompdf/include/cpdf_adapter.cls.php b/application/third_party/dompdf/include/cpdf_adapter.cls.php new file mode 100644 index 00000000..8598df52 --- /dev/null +++ b/application/third_party/dompdf/include/cpdf_adapter.cls.php @@ -0,0 +1,919 @@ + + * Portions copyright (c) 2008 - Orion Richardson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Orion Richardson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - On gif to png conversion tmp file creation, clarify tmp name and add to tmp deletion list only on success + * - On gif to png conversion, when available add direct from gd without tmp file, skip image load if already cached. + * to safe CPU time and memory + * @contributor Helmut Tischer + * @version dompdf_trunk_with_helmut_mods.20090524 + * - Pass temp and fontcache folders to Cpdf, to making Cpdf independent from dompdf + * @version dompdf_trunk_with_helmut_mods.20090528 + * - fix text position according to glyph baseline to match background rectangle + */ + +/* $Id: cpdf_adapter.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */ + +// FIXME: Need to sanity check inputs to this class +require_once(DOMPDF_LIB_DIR . "/class.pdf.php"); + +/** + * PDF rendering interface + * + * CPDF_Adapter provides a simple stateless interface to the stateful one + * provided by the Cpdf class. + * + * Unless otherwise mentioned, all dimensions are in points (1/72 in). The + * coordinate origin is in the top left corner, and y values increase + * downwards. + * + * See {@link http://www.ros.co.nz/pdf/} for more complete documentation + * on the underlying {@link Cpdf} class. + * + * @package dompdf + */ +class CPDF_Adapter implements Canvas { + + /** + * Dimensions of paper sizes in points + * + * @var array; + */ + static $PAPER_SIZES = array( + "4a0" => array(0,0,4767.87,6740.79), + "2a0" => array(0,0,3370.39,4767.87), + "a0" => array(0,0,2383.94,3370.39), + "a1" => array(0,0,1683.78,2383.94), + "a2" => array(0,0,1190.55,1683.78), + "a3" => array(0,0,841.89,1190.55), + "a4" => array(0,0,595.28,841.89), + "a5" => array(0,0,419.53,595.28), + "a6" => array(0,0,297.64,419.53), + "a7" => array(0,0,209.76,297.64), + "a8" => array(0,0,147.40,209.76), + "a9" => array(0,0,104.88,147.40), + "a10" => array(0,0,73.70,104.88), + "b0" => array(0,0,2834.65,4008.19), + "b1" => array(0,0,2004.09,2834.65), + "b2" => array(0,0,1417.32,2004.09), + "b3" => array(0,0,1000.63,1417.32), + "b4" => array(0,0,708.66,1000.63), + "b5" => array(0,0,498.90,708.66), + "b6" => array(0,0,354.33,498.90), + "b7" => array(0,0,249.45,354.33), + "b8" => array(0,0,175.75,249.45), + "b9" => array(0,0,124.72,175.75), + "b10" => array(0,0,87.87,124.72), + "c0" => array(0,0,2599.37,3676.54), + "c1" => array(0,0,1836.85,2599.37), + "c2" => array(0,0,1298.27,1836.85), + "c3" => array(0,0,918.43,1298.27), + "c4" => array(0,0,649.13,918.43), + "c5" => array(0,0,459.21,649.13), + "c6" => array(0,0,323.15,459.21), + "c7" => array(0,0,229.61,323.15), + "c8" => array(0,0,161.57,229.61), + "c9" => array(0,0,113.39,161.57), + "c10" => array(0,0,79.37,113.39), + "ra0" => array(0,0,2437.80,3458.27), + "ra1" => array(0,0,1729.13,2437.80), + "ra2" => array(0,0,1218.90,1729.13), + "ra3" => array(0,0,864.57,1218.90), + "ra4" => array(0,0,609.45,864.57), + "sra0" => array(0,0,2551.18,3628.35), + "sra1" => array(0,0,1814.17,2551.18), + "sra2" => array(0,0,1275.59,1814.17), + "sra3" => array(0,0,907.09,1275.59), + "sra4" => array(0,0,637.80,907.09), + "letter" => array(0,0,612.00,792.00), + "legal" => array(0,0,612.00,1008.00), + "ledger" => array(0,0,1224.00, 792.00), + "tabloid" => array(0,0,792.00, 1224.00), + "executive" => array(0,0,521.86,756.00), + "folio" => array(0,0,612.00,936.00), + "commercial #10 envelope" => array(0,0,684,297), + "catalog #10 1/2 envelope" => array(0,0,648,864), + "8.5x11" => array(0,0,612.00,792.00), + "8.5x14" => array(0,0,612.00,1008.0), + "11x17" => array(0,0,792.00, 1224.00), + ); + + + /** + * Instance of Cpdf class + * + * @var Cpdf + */ + private $_pdf; + + /** + * PDF width, in points + * + * @var float + */ + private $_width; + + /** + * PDF height, in points + * + * @var float; + */ + private $_height; + + /** + * Current page number + * + * @var int + */ + private $_page_number; + + /** + * Total number of pages + * + * @var int + */ + private $_page_count; + + /** + * Text to display on every page + * + * @var array + */ + private $_page_text; + + /** + * Array of pages for accesing after rendering is initially complete + * + * @var array + */ + private $_pages; + + /** + * Array of temporary cached images to be deleted when processing is complete + * + * @var array + */ + private $_image_cache; + + /** + * Class constructor + * + * @param mixed $paper The size of paper to use in this PDF ({@link CPDF_Adapter::$PAPER_SIZES}) + * @param string $orientation The orienation of the document (either 'landscape' or 'portrait') + */ + function __construct($paper = "letter", $orientation = "portrait") { + + if ( is_array($paper) ) + $size = $paper; + else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) ) + $size = self::$PAPER_SIZES[mb_strtolower($paper)]; + else + $size = self::$PAPER_SIZES["letter"]; + + if ( mb_strtolower($orientation) === "landscape" ) { + list($size[2], $size[3]) = array($size[3], $size[2]); + } + + $this->_pdf = new Cpdf($size, DOMPDF_UNICODE_ENABLED, DOMPDF_FONT_CACHE, DOMPDF_TEMP_DIR); + $this->_pdf->addInfo("Creator", "DOMPDF"); + $time = substr_replace(date('YmdHisO'), '\'', -2, 0).'\''; + $this->_pdf->addInfo("CreationDate", "D:$time"); + $this->_pdf->addInfo("ModDate", "D:$time"); + + $this->_width = $size[2] - $size[0]; + $this->_height= $size[3] - $size[1]; + $this->_pdf->openHere('Fit'); + + $this->_page_number = $this->_page_count = 1; + $this->_page_text = array(); + + $this->_pages = array($this->_pdf->getFirstPageId()); + + $this->_image_cache = array(); + } + + /** + * Class destructor + * + * Deletes all temporary image files + */ + function __destruct() { + foreach ($this->_image_cache as $img) { + //debugpng + if (DEBUGPNG) print '[__destruct unlink '.$img.']'; + if (!DEBUGKEEPTEMP) + unlink($img); + } + clear_object($this); + } + + /** + * Returns the Cpdf instance + * + * @return Cpdf + */ + function get_cpdf() { return $this->_pdf; } + + /** + * Add meta information to the PDF + * + * @param string $label label of the value (Creator, Producer, etc.) + * @param string $value the text to set + */ + function add_info($label, $value) { + $this->_pdf->addInfo($label, $value); + } + + /** + * Opens a new 'object' + * + * While an object is open, all drawing actions are recored in the object, + * as opposed to being drawn on the current page. Objects can be added + * later to a specific page or to several pages. + * + * The return value is an integer ID for the new object. + * + * @see CPDF_Adapter::close_object() + * @see CPDF_Adapter::add_object() + * + * @return int + */ + function open_object() { + $ret = $this->_pdf->openObject(); + $this->_pdf->saveState(); + return $ret; + } + + /** + * Reopens an existing 'object' + * + * @see CPDF_Adapter::open_object() + * @param int $object the ID of a previously opened object + */ + function reopen_object($object) { + $this->_pdf->reopenObject($object); + $this->_pdf->saveState(); + } + + /** + * Closes the current 'object' + * + * @see CPDF_Adapter::open_object() + */ + function close_object() { + $this->_pdf->restoreState(); + $this->_pdf->closeObject(); + } + + /** + * Adds a specified 'object' to the document + * + * $object int specifying an object created with {@link + * CPDF_Adapter::open_object()}. $where can be one of: + * - 'add' add to current page only + * - 'all' add to every page from the current one onwards + * - 'odd' add to all odd numbered pages from now on + * - 'even' add to all even numbered pages from now on + * - 'next' add the object to the next page only + * - 'nextodd' add to all odd numbered pages from the next one + * - 'nexteven' add to all even numbered pages from the next one + * + * @see Cpdf::addObject() + * + * @param int $object + * @param string $where + */ + function add_object($object, $where = 'all') { + $this->_pdf->addObject($object, $where); + } + + /** + * Stops the specified 'object' from appearing in the document. + * + * The object will stop being displayed on the page following the current + * one. + * + * @param int $object + */ + function stop_object($object) { + $this->_pdf->stopObject($object); + } + + /** + * @access private + */ + function serialize_object($id) { + // Serialize the pdf object's current state for retrieval later + return $this->_pdf->serializeObject($id); + } + + /** + * @access private + */ + function reopen_serialized_object($obj) { + return $this->_pdf->restoreSerializedObject($obj); + } + + //........................................................................ + + /** + * Returns the PDF's width in points + * @return float + */ + function get_width() { return $this->_width; } + + /** + * Returns the PDF's height in points + * @return float + */ + function get_height() { return $this->_height; } + + /** + * Returns the current page number + * @return int + */ + function get_page_number() { return $this->_page_number; } + + /** + * Returns the total number of pages in the document + * @return int + */ + function get_page_count() { return $this->_page_count; } + + /** + * Sets the current page number + * + * @param int $num + */ + function set_page_number($num) { $this->_page_number = $num; } + + /** + * Sets the page count + * + * @param int $count + */ + function set_page_count($count) { $this->_page_count = $count; } + + /** + * Sets the stroke colour + * + * See {@link Style::set_colour()} for the format of the color array. + * @param array $color + */ + protected function _set_stroke_color($color) { + $this->_pdf->setStrokeColor($color); + } + + /** + * Sets the fill colour + * + * See {@link Style::set_colour()} for the format of the colour array. + * @param array $color + */ + protected function _set_fill_color($color) { + $this->_pdf->setColor($color); + } + + /** + * Sets line transparency + * @see Cpdf::setLineTransparency() + * + * Valid blend modes are (case-sensitive): + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDodge, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blending mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + protected function _set_line_transparency($mode, $opacity) { + $this->_pdf->setLineTransparency($mode, $opacity); + } + + /** + * Sets fill transparency + * @see Cpdf::setFillTransparency() + * + * Valid blend modes are (case-sensitive): + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blending mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + protected function _set_fill_transparency($mode, $opacity) { + $this->_pdf->setFillTransparency($mode, $opacity); + } + + /** + * Sets the line style + * + * @see Cpdf::setLineStyle() + * + * @param float width + * @param string cap + * @param string join + * @param array dash + */ + protected function _set_line_style($width, $cap, $join, $dash) { + $this->_pdf->setLineStyle($width, $cap, $join, $dash); + } + + /** + * Sets the opacity + * + * @param $opacity + * @param $mode + */ + function set_opacity($opacity, $mode = "Normal") { + $this->_set_line_transparency($mode, $opacity); + $this->_set_fill_transparency($mode, $opacity); + } + + //........................................................................ + + + /** + * Remaps y coords from 4th to 1st quadrant + * + * @param float $y + * @return float + */ + protected function y($y) { return $this->_height - $y; } + + // Canvas implementation + + function line($x1, $y1, $x2, $y2, $color, $width, $style = array()) { + //pre_r(compact("x1", "y1", "x2", "y2", "color", "width", "style")); + + $this->_set_stroke_color($color); + $this->_set_line_style($width, "butt", "", $style); + $this->_pdf->line($x1, $this->y($y1), + $x2, $this->y($y2)); + } + + //........................................................................ + + /** + * Convert a GIF or BMP image to a PNG image + * + * @return string The url of the newly converted image + */ + protected function _convert_gif_bmp_to_png($image_url, $image_type) { + $func_name = "imagecreatefrom$image_type"; + + if ( !function_exists($func_name) ) { + throw new DOMPDF_Exception("Function $func_name() not found. Cannot convert $image_type image: $image_url. Please install the image PHP extension."); + } + + set_error_handler("record_warnings"); + $im = $func_name($image_url); + + if ( $im ) { + imageinterlace($im, 0); + + $filename = tempnam(DOMPDF_TEMP_DIR, "{$image_type}dompdf_img_").'.png'; + $this->_image_cache[] = $filename; + + imagepng($im, $filename); + imagedestroy($im); + } else { + $filename = DOMPDF_LIB_DIR . "/res/broken_image.png"; + + } + + restore_error_handler(); + + return $filename; + } + + function rectangle($x1, $y1, $w, $h, $color, $width, $style = array()) { + $this->_set_stroke_color($color); + $this->_set_line_style($width, "butt", "", $style); + $this->_pdf->rectangle($x1, $this->y($y1) - $h, $w, $h); + } + + //........................................................................ + + function filled_rectangle($x1, $y1, $w, $h, $color) { + $this->_set_fill_color($color); + $this->_pdf->filledRectangle($x1, $this->y($y1) - $h, $w, $h); + } + + function clipping_rectangle($x1, $y1, $w, $h) { + $this->_pdf->clippingRectangle($x1, $this->y($y1) - $h, $w, $h); + } + + function clipping_end() { + $this->_pdf->clippingEnd(); + } + + function save() { + $this->_pdf->saveState(); + } + + function restore() { + $this->_pdf->restoreState(); + } + + function rotate($angle, $x, $y) { + $this->_pdf->rotate($angle, $x, $y); + } + + function skew($angle_x, $angle_y, $x, $y) { + $this->_pdf->skew($angle_x, $angle_y, $x, $y); + } + + function scale($s_x, $s_y, $x, $y) { + $this->_pdf->scale($s_x, $s_y, $x, $y); + } + + function translate($t_x, $t_y) { + $this->_pdf->translate($t_x, $t_y); + } + + function transform($a, $b, $c, $d, $e, $f) { + $this->_pdf->transform(array($a, $b, $c, $d, $e, $f)); + } + + //........................................................................ + + function polygon($points, $color, $width = null, $style = array(), $fill = false) { + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + // Adjust y values + for ( $i = 1; $i < count($points); $i += 2) + $points[$i] = $this->y($points[$i]); + + $this->_pdf->polygon($points, count($points) / 2, $fill); + } + + //........................................................................ + + function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false) { + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + if ( !$fill && isset($width) ) + $this->_set_line_style($width, "round", "round", $style); + + $this->_pdf->ellipse($x, $this->y($y), $r1, 0, 0, 8, 0, 360, 1, $fill); + } + + //........................................................................ + + function image($img_url, $img_type, $x, $y, $w, $h) { + //debugpng + if (DEBUGPNG) print '[image:'.$img_url.'|'.$img_type.']'; + + $img_type = mb_strtolower($img_type); + + switch ($img_type) { + case "jpeg": + case "jpg": + //debugpng + if (DEBUGPNG) print '!!!jpg!!!'; + + $this->_pdf->addJpegFromFile($img_url, $x, $this->y($y) - $h, $w, $h); + break; + + case "png": + //debugpng + if (DEBUGPNG) print '!!!png!!!'; + + $this->_pdf->addPngFromFile($img_url, $x, $this->y($y) - $h, $w, $h); + break; + + case "gif": + case "bmp": + // Convert gifs or bmps to pngs + //DEBUG_IMG_TEMP + //if (0) { + if ( method_exists( $this->_pdf, "addImagePng" ) ) { + //debugpng + if (DEBUGPNG) print "!!!$img_type addImagePng!!!"; + + //If optimization to direct png creation from gd object is available, + //don't create temp file, but place gd object directly into the pdf + if ( method_exists( $this->_pdf, "image_iscached" ) && + $this->_pdf->image_iscached($img_url) ) { + //If same image has occured already before, no need to load because + //duplicate will anyway be eliminated. + $img = null; + unset($img); + } + else { + $func_name = "imagecreatefrom$img_type"; + $img = @$func_name($img_url); + if ( !$img ) { + return; + } + imageinterlace($img, false); + } + + $this->_pdf->addImagePng($img_url, $x, $this->y($y) - $h, $w, $h, $img); + + if ( $img ) { + imagedestroy($img); + } + } + else { + //debugpng + if (DEBUGPNG) print "!!!$img_type addPngFromFile!!!"; + $img_url = $this->_convert_gif_bmp_to_png($img_url, $img_type); + $this->_pdf->addPngFromFile($img_url, $x, $this->y($y) - $h, $w, $h); + } + break; + + default: + //debugpng + if (DEBUGPNG) print '!!!unknown!!!'; + break; + } + + return; + } + + //........................................................................ + + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0, $char_space = 0, $angle = 0) { + $pdf = $this->_pdf; + + $pdf->setColor($color); + + $font .= ".afm"; + $pdf->selectFont($font); + + //Font_Metrics::get_font_height($font, $size) == + //$this->get_font_height($font, $size) == + //$this->_pdf->selectFont($font),$this->_pdf->getFontHeight($size) + //- FontBBoxheight+FontHeightOffset, scaled to $size, in pt + //$this->_pdf->getFontDescender($size) + //- Descender scaled to size + // + //$this->_pdf->fonts[$this->_pdf->currentFont] sizes: + //['FontBBox'][0] left, ['FontBBox'][1] bottom, ['FontBBox'][2] right, ['FontBBox'][3] top + //Maximum extent of all glyphs of the font from the baseline point + //['Ascender'] maximum height above baseline except accents + //['Descender'] maximum depth below baseline, negative number means below baseline + //['FontHeightOffset'] manual enhancement of .afm files to trim windows fonts. currently not used. + //Values are in 1/1000 pt for a font size of 1 pt + // + //['FontBBox'][1] should be close to ['Descender'] + //['FontBBox'][3] should be close to ['Ascender']+Accents + //in practice, FontBBox values are a little bigger + // + //The text position is referenced to the baseline, not to the lower corner of the FontBBox, + //for what the left,top corner is given. + //FontBBox spans also the background box for the text. + //If the lower corner would be used as reference point, the Descents of the glyphs would + //hang over the background box border. + //Therefore compensate only the extent above the Baseline. + // + //print '
['.$font.','.$size.','.$pdf->getFontHeight($size).','.$pdf->getFontDescender($size).','.$pdf->fonts[$pdf->currentFont]['FontBBox'][3].','.$pdf->fonts[$pdf->currentFont]['FontBBox'][1].','.$pdf->fonts[$pdf->currentFont]['FontHeightOffset'].','.$pdf->fonts[$pdf->currentFont]['Ascender'].','.$pdf->fonts[$pdf->currentFont]['Descender'].']
'; + // + //$pdf->addText($x, $this->y($y) - Font_Metrics::get_font_height($font, $size), $size, $text, $angle, $word_space, $char_space); + //$pdf->addText($x, $this->y($y) - $size, $size, $text, $angle, $word_space, $char_space); + //$pdf->addText($x, $this->y($y) - $pdf->getFontHeight($size)-$pdf->getFontDescender($size), $size, $text, $angle, $word_space, $char_space); + $pdf->addText($x, $this->y($y) - ($pdf->fonts[$pdf->currentFont]['FontBBox'][3]*$size)/1000, $size, $text, $angle, $word_space, $char_space); + } + + //........................................................................ + + function javascript($code) { + $this->_pdf->addJavascript($code); + } + + //........................................................................ + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname) { + $this->_pdf->addDestination($anchorname, "Fit"); + } + + //........................................................................ + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height) { + + $y = $this->y($y) - $height; + + if ( strpos($url, '#') === 0 ) { + // Local link + $name = substr($url,1); + if ( $name ) + $this->_pdf->addInternalLink($name, $x, $y, $x + $width, $y + $height); + + } else { + $this->_pdf->addLink(rawurldecode($url), $x, $y, $x + $width, $y + $height); + } + } + + //........................................................................ + + function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) { + $this->_pdf->selectFont($font); + if (!DOMPDF_UNICODE_ENABLED) { + $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8'); + } + return $this->_pdf->getTextWidth($size, $text, $word_spacing, $char_spacing); + } + + //........................................................................ + + function get_font_height($font, $size) { + $this->_pdf->selectFont($font); + return $this->_pdf->getFontHeight($size) * DOMPDF_FONT_HEIGHT_RATIO; + } + + //........................................................................ + + /** + * Writes text at the specified x and y coordinates on every page + * + * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced + * with their current values. + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x + * @param float $y + * @param string $text the text to write + * @param string $font the font file to use + * @param float $size the font size, in points + * @param array $color + * @param float $adjust word spacing adjustment + * @param float $angle angle to write the text at, measured CW starting from the x-axis + */ + function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) { + $_t = "text"; + $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "adjust", "angle"); + } + + //........................................................................ + + /** + * Processes a script on every page + * + * The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available. + * + * This function can be used to add page numbers to all pages + * after the first one, for example. + * + * @param string $code the script code + * @param string $type the language type for script + */ + function page_script($code, $type = "text/php") { + $_t = "script"; + $this->_page_text[] = compact("_t", "code", "type"); + } + + //........................................................................ + + function new_page() { + $this->_page_number++; + $this->_page_count++; + + $ret = $this->_pdf->newPage(); + $this->_pages[] = $ret; + return $ret; + } + + //........................................................................ + + /** + * Add text to each page after rendering is complete + */ + protected function _add_page_text() { + + if ( !count($this->_page_text) ) + return; + + $page_number = 1; + $eval = null; + + foreach ($this->_pages as $pid) { + $this->reopen_object($pid); + + foreach ($this->_page_text as $pt) { + extract($pt); + + switch ($_t) { + + case "text": + $text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"), + array($page_number, $this->_page_count), $text); + $this->text($x, $y, $text, $font, $size, $color, $adjust, $angle); + break; + + case "script": + if (!$eval) { + $eval = new PHP_Evaluator($this); + } + $eval->evaluate($code, array('PAGE_NUM' => $page_number, 'PAGE_COUNT' => $this->_page_count)); + break; + } + } + + $this->close_object(); + $page_number++; + } + } + + /** + * Streams the PDF directly to the browser + * + * @param string $filename the name of the PDF file + * @param array $options associative array, 'Attachment' => 0 or 1, 'compress' => 1 or 0 + */ + function stream($filename, $options = null) { + // Add page text + $this->_add_page_text(); + + $options["Content-Disposition"] = $filename; + $this->_pdf->stream($options); + } + + //........................................................................ + + /** + * Returns the PDF as a string + * + * @param array $options Output options + * @return string + */ + function output($options = null) { + // Add page text + $this->_add_page_text(); + + $debug = isset($options["compress"]) && $options["compress"] != 1; + + return $this->_pdf->output($debug); + } + + //........................................................................ + + /** + * Returns logging messages generated by the Cpdf class + * + * @return string + */ + function get_messages() { return $this->_pdf->messages; } + +} diff --git a/application/third_party/dompdf/include/css_color.cls.php b/application/third_party/dompdf/include/css_color.cls.php new file mode 100644 index 00000000..f6f003a7 --- /dev/null +++ b/application/third_party/dompdf/include/css_color.cls.php @@ -0,0 +1,287 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Fabien M�nager + * @package dompdf + */ + +/* $Id: css_color.cls.php 300 2010-08-11 22:01:09Z fabien.menager $ */ + +class CSS_Color { + static $cssColorNames = array( + "aliceblue" => "F0F8FF", + "antiquewhite" => "FAEBD7", + "aqua" => "00FFFF", + "aquamarine" => "7FFFD4", + "azure" => "F0FFFF", + "beige" => "F5F5DC", + "bisque" => "FFE4C4", + "black" => "000000", + "blanchedalmond" => "FFEBCD", + "blue" => "0000FF", + "blueviolet" => "8A2BE2", + "brown" => "A52A2A", + "burlywood" => "DEB887", + "cadetblue" => "5F9EA0", + "chartreuse" => "7FFF00", + "chocolate" => "D2691E", + "coral" => "FF7F50", + "cornflowerblue" => "6495ED", + "cornsilk" => "FFF8DC", + "crimson" => "DC143C", + "cyan" => "00FFFF", + "darkblue" => "00008B", + "darkcyan" => "008B8B", + "darkgoldenrod" => "B8860B", + "darkgray" => "A9A9A9", + "darkgreen" => "006400", + "darkgrey" => "A9A9A9", + "darkkhaki" => "BDB76B", + "darkmagenta" => "8B008B", + "darkolivegreen" => "556B2F", + "darkorange" => "FF8C00", + "darkorchid" => "9932CC", + "darkred" => "8B0000", + "darksalmon" => "E9967A", + "darkseagreen" => "8FBC8F", + "darkslateblue" => "483D8B", + "darkslategray" => "2F4F4F", + "darkslategrey" => "2F4F4F", + "darkturquoise" => "00CED1", + "darkviolet" => "9400D3", + "deeppink" => "FF1493", + "deepskyblue" => "00BFFF", + "dimgray" => "696969", + "dimgrey" => "696969", + "dodgerblue" => "1E90FF", + "firebrick" => "B22222", + "floralwhite" => "FFFAF0", + "forestgreen" => "228B22", + "fuchsia" => "FF00FF", + "gainsboro" => "DCDCDC", + "ghostwhite" => "F8F8FF", + "gold" => "FFD700", + "goldenrod" => "DAA520", + "gray" => "808080", + "green" => "008000", + "greenyellow" => "ADFF2F", + "grey" => "808080", + "honeydew" => "F0FFF0", + "hotpink" => "FF69B4", + "indianred" => "CD5C5C", + "indigo" => "4B0082", + "ivory" => "FFFFF0", + "khaki" => "F0E68C", + "lavender" => "E6E6FA", + "lavenderblush" => "FFF0F5", + "lawngreen" => "7CFC00", + "lemonchiffon" => "FFFACD", + "lightblue" => "ADD8E6", + "lightcoral" => "F08080", + "lightcyan" => "E0FFFF", + "lightgoldenrodyellow" => "FAFAD2", + "lightgray" => "D3D3D3", + "lightgreen" => "90EE90", + "lightgrey" => "D3D3D3", + "lightpink" => "FFB6C1", + "lightsalmon" => "FFA07A", + "lightseagreen" => "20B2AA", + "lightskyblue" => "87CEFA", + "lightslategray" => "778899", + "lightslategrey" => "778899", + "lightsteelblue" => "B0C4DE", + "lightyellow" => "FFFFE0", + "lime" => "00FF00", + "limegreen" => "32CD32", + "linen" => "FAF0E6", + "magenta" => "FF00FF", + "maroon" => "800000", + "mediumaquamarine" => "66CDAA", + "mediumblue" => "0000CD", + "mediumorchid" => "BA55D3", + "mediumpurple" => "9370DB", + "mediumseagreen" => "3CB371", + "mediumslateblue" => "7B68EE", + "mediumspringgreen" => "00FA9A", + "mediumturquoise" => "48D1CC", + "mediumvioletred" => "C71585", + "midnightblue" => "191970", + "mintcream" => "F5FFFA", + "mistyrose" => "FFE4E1", + "moccasin" => "FFE4B5", + "navajowhite" => "FFDEAD", + "navy" => "000080", + "oldlace" => "FDF5E6", + "olive" => "808000", + "olivedrab" => "6B8E23", + "orange" => "FFA500", + "orangered" => "FF4500", + "orchid" => "DA70D6", + "palegoldenrod" => "EEE8AA", + "palegreen" => "98FB98", + "paleturquoise" => "AFEEEE", + "palevioletred" => "DB7093", + "papayawhip" => "FFEFD5", + "peachpuff" => "FFDAB9", + "peru" => "CD853F", + "pink" => "FFC0CB", + "plum" => "DDA0DD", + "powderblue" => "B0E0E6", + "purple" => "800080", + "red" => "FF0000", + "rosybrown" => "BC8F8F", + "royalblue" => "4169E1", + "saddlebrown" => "8B4513", + "salmon" => "FA8072", + "sandybrown" => "F4A460", + "seagreen" => "2E8B57", + "seashell" => "FFF5EE", + "sienna" => "A0522D", + "silver" => "C0C0C0", + "skyblue" => "87CEEB", + "slateblue" => "6A5ACD", + "slategray" => "708090", + "slategrey" => "708090", + "snow" => "FFFAFA", + "springgreen" => "00FF7F", + "steelblue" => "4682B4", + "tan" => "D2B48C", + "teal" => "008080", + "thistle" => "D8BFD8", + "tomato" => "FF6347", + "turquoise" => "40E0D0", + "violet" => "EE82EE", + "wheat" => "F5DEB3", + "white" => "FFFFFF", + "whitesmoke" => "F5F5F5", + "yellow" => "FFFF00", + "yellowgreen" => "9ACD32", + ); + + static function parse($colour) { + if ( is_array($colour) ) + // Assume the array has the right format... + // FIXME: should/could verify this. + return $colour; + + $colour = strtolower($colour); + + if (isset(self::$cssColorNames[$colour])) + return self::getArray(self::$cssColorNames[$colour]); + + if ($colour === "transparent") + return "transparent"; + + $length = mb_strlen($colour); + + // #rgb format + if ( $length == 4 && $colour[0] === "#" ) { + return self::getArray($colour[1].$colour[1].$colour[2].$colour[2].$colour[3].$colour[3]); + + // #rrggbb format + } else if ( $length == 7 && $colour[0] === "#" ) { + return self::getArray(mb_substr($colour, 1, 6)); + + // rgb( r,g,b ) format + } else if ( mb_strpos($colour, "rgb") !== false ) { + $i = mb_strpos($colour, "("); + $j = mb_strpos($colour, ")"); + + // Bad colour value + if ($i === false || $j === false) + return null; + + $triplet = explode(",", mb_substr($colour, $i+1, $j-$i-1)); + + if (count($triplet) != 3) + return null; + + foreach (array_keys($triplet) as $c) { + $triplet[$c] = trim($triplet[$c]); + + if ( $triplet[$c][mb_strlen($triplet[$c]) - 1] === "%" ) + $triplet[$c] = round($triplet[$c] * 2.55); + } + + return self::getArray(vsprintf("%02X%02X%02X", $triplet)); + + // cmyk( c,m,y,k ) format + // http://www.w3.org/TR/css3-gcpm/#cmyk-colors + } else if ( mb_strpos($colour, "cmyk") !== false ) { + $i = mb_strpos($colour, "("); + $j = mb_strpos($colour, ")"); + + // Bad colour value + if ($i === false || $j === false) + return null; + + $values = explode(",", mb_substr($colour, $i+1, $j-$i-1)); + + if (count($values) != 4) + return null; + + foreach ($values as &$c) { + $c = floatval(trim($c)); + if ($c > 1.0) $c = 1.0; + if ($c < 0.0) $c = 0.0; + } + + return self::getArray($values); + } + } + + static function getArray($colour) { + $c = array(null, null, null, null, "hex" => null); + + if (is_array($colour)) { + $c = $colour; + $c["c"] = $c[0]; + $c["m"] = $c[1]; + $c["y"] = $c[2]; + $c["k"] = $c[3]; + $c["hex"] = "cmyk($c[0],$c[1],$c[2],$c[3])"; + } + else { + $c[0] = hexdec(mb_substr($colour, 0, 2)) / 0xff; + $c[1] = hexdec(mb_substr($colour, 2, 2)) / 0xff; + $c[2] = hexdec(mb_substr($colour, 4, 2)) / 0xff; + $c["r"] = $c[0]; + $c["g"] = $c[1]; + $c["b"] = $c[2]; + $c["hex"] = "#$colour"; + } + + return $c; + } +} diff --git a/application/third_party/dompdf/include/dompdf.cls.php b/application/third_party/dompdf/include/dompdf.cls.php new file mode 100644 index 00000000..7cff2491 --- /dev/null +++ b/application/third_party/dompdf/include/dompdf.cls.php @@ -0,0 +1,792 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: dompdf.cls.php 362 2011-02-16 22:17:28Z fabien.menager $ */ + +/** + * DOMPDF - PHP5 HTML to PDF renderer + * + * DOMPDF loads HTML and does its best to render it as a PDF. It gets its + * name from the new DomDocument PHP5 extension. Source HTML is first + * parsed by a DomDocument object. DOMPDF takes the resulting DOM tree and + * attaches a {@link Frame} object to each node. {@link Frame} objects store + * positioning and layout information and each has a reference to a {@link + * Style} object. + * + * Style information is loaded and parsed (see {@link Stylesheet}) and is + * applied to the frames in the tree by using XPath. CSS selectors are + * converted into XPath queries, and the computed {@link Style} objects are + * applied to the {@link Frame}s. + * + * {@link Frame}s are then decorated (in the design pattern sense of the + * word) based on their CSS display property ({@link + * http://www.w3.org/TR/CSS21/visuren.html#propdef-display}). + * Frame_Decorators augment the basic {@link Frame} class by adding + * additional properties and methods specific to the particular type of + * {@link Frame}. For example, in the CSS layout model, block frames + * (display: block;) contain line boxes that are usually filled with text or + * other inline frames. The Block_Frame_Decorator therefore adds a $lines + * property as well as methods to add {@link Frame}s to lines and to add + * additional lines. {@link Frame}s also are attached to specific + * Positioner and {@link Frame_Reflower} objects that contain the + * positioining and layout algorithm for a specific type of frame, + * respectively. This is an application of the Strategy pattern. + * + * Layout, or reflow, proceeds recursively (post-order) starting at the root + * of the document. Space constraints (containing block width & height) are + * pushed down, and resolved positions and sizes bubble up. Thus, every + * {@link Frame} in the document tree is traversed once (except for tables + * which use a two-pass layout algorithm). If you are interested in the + * details, see the reflow() method of the Reflower classes. + * + * Rendering is relatively straightforward once layout is complete. {@link + * Frame}s are rendered using an adapted {@link Cpdf} class, originally + * written by Wayne Munro, http://www.ros.co.nz/pdf/. (Some performance + * related changes have been made to the original {@link Cpdf} class, and + * the {@link CPDF_Adapter} class provides a simple, stateless interface to + * PDF generation.) PDFLib support has now also been added, via the {@link + * PDFLib_Adapter}. + * + * + * @package dompdf + */ +class DOMPDF { + + /** + * DomDocument representing the HTML document + * + * @var DomDocument + */ + protected $_xml; + + /** + * Frame_Tree derived from the DOM tree + * + * @var Frame_Tree + */ + protected $_tree; + + /** + * Stylesheet for the document + * + * @var Stylesheet + */ + protected $_css; + + /** + * Actual PDF renderer + * + * @var Canvas + */ + protected $_pdf; + + /** + * Desired paper size ('letter', 'legal', 'A4', etc.) + * + * @var string + */ + protected $_paper_size; + + /** + * Paper orientation ('portrait' or 'landscape') + * + * @var string + */ + protected $_paper_orientation; + + /** + * Callbacks on new page and new element + * + * @var array + */ + protected $_callbacks; + + /** + * Experimental caching capability + * + * @var string + */ + private $_cache_id; + + /** + * Base hostname + * + * Used for relative paths/urls + * @var string + */ + protected $_base_host; + + /** + * Absolute base path + * + * Used for relative paths/urls + * @var string + */ + protected $_base_path; + + /** + * Protcol used to request file (file://, http://, etc) + * + * @var string + */ + protected $_protocol; + + /** + * Timestamp of the script start time + * + * @var int + */ + private $_start_time = null; + + /** + * @var string The system's locale + */ + private $_system_locale = null; + + /** + * @var bool Tells if the system's locale is the C standard one + */ + private $_locale_standard = false; + + /** + * Class constructor + */ + function __construct() { + $this->_locale_standard = sprintf('%.1f', 1.0) == '1.0'; + + $this->save_locale(); + + $this->_messages = array(); + $this->_xml = new DOMDocument(); + $this->_xml->preserveWhiteSpace = true; + $this->_tree = new Frame_Tree($this->_xml); + $this->_css = new Stylesheet(); + $this->_pdf = null; + $this->_paper_size = "letter"; + $this->_paper_orientation = "portrait"; + $this->_base_protocol = ""; + $this->_base_host = ""; + $this->_base_path = ""; + $this->_callbacks = array(); + $this->_cache_id = null; + + $this->restore_locale(); + } + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + + /** + * Save the system's locale configuration and + * set the right value for numeric formatting + */ + private function save_locale() { + if ( $this->_locale_standard ) return; + + $this->_system_locale = setlocale(LC_NUMERIC, "C"); + } + + /** + * Restore the system's locale configuration + */ + private function restore_locale() { + if ( $this->_locale_standard ) return; + + setlocale(LC_NUMERIC, $this->_system_locale); + } + + /** + * Returns the underlying {@link Frame_Tree} object + * + * @return Frame_Tree + */ + function get_tree() { return $this->_tree; } + + /** + * Sets the protocol to use + * FIXME validate these + * + * @param string $proto + */ + function set_protocol($proto) { $this->_protocol = $proto; } + + /** + * Sets the base hostname + * + * @param string $host + */ + function set_host($host) { $this->_base_host = $host; } + + /** + * Sets the base path + * + * @param string $path + */ + function set_base_path($path) { $this->_base_path = $path; } + + /** + * Returns the protocol in use + * + * @return string + */ + function get_protocol() { return $this->_protocol; } + + /** + * Returns the base hostname + * + * @return string + */ + function get_host() { return $this->_base_host; } + + /** + * Returns the base path + * + * @return string + */ + function get_base_path() { return $this->_base_path; } + + /** + * Return the underlying Canvas instance (e.g. CPDF_Adapter, GD_Adapter) + * + * @return Canvas + */ + function get_canvas() { return $this->_pdf; } + + /** + * Returns the callbacks array + * + * @return array + */ + function get_callbacks() { return $this->_callbacks; } + + /** + * Loads an HTML file + * + * Parse errors are stored in the global array _dompdf_warnings. + * + * @param string $file a filename or url to load + */ + function load_html_file($file) { + $this->save_locale(); + + // Store parsing warnings as messages (this is to prevent output to the + // browser if the html is ugly and the dom extension complains, + // preventing the pdf from being streamed.) + if ( !$this->_protocol && !$this->_base_host && !$this->_base_path ) + list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($file); + + if ( !DOMPDF_ENABLE_REMOTE && + ($this->_protocol != "" && $this->_protocol !== "file://" ) ) + throw new DOMPDF_Exception("Remote file requested, but DOMPDF_ENABLE_REMOTE is false."); + + if ($this->_protocol == "" || $this->_protocol === "file://") { + + $realfile = realpath($file); + if ( !$file ) + throw new DOMPDF_Exception("File '$file' not found."); + + if ( strpos($realfile, DOMPDF_CHROOT) !== 0 ) + throw new DOMPDF_Exception("Permission denied on $file."); + + // Exclude dot files (e.g. .htaccess) + if ( substr(basename($realfile),0,1) === "." ) + throw new DOMPDF_Exception("Permission denied on $file."); + + $file = $realfile; + } + + $contents = file_get_contents($file); + $encoding = null; + + // See http://the-stickman.com/web-development/php/getting-http-response-headers-when-using-file_get_contents/ + if ( isset($http_response_header) ) { + foreach($http_response_header as $_header) { + if ( preg_match("@Content-Type:\s*[\w/]+;\s*?charset=([^\s]+)@i", $_header, $matches) ) { + $encoding = strtoupper($matches[1]); + break; + } + } + } + + $this->restore_locale(); + + $this->load_html($contents, $encoding); + } + + /** + * Loads an HTML string + * + * Parse errors are stored in the global array _dompdf_warnings. + * + * @param string $str HTML text to load + */ + function load_html($str, $encoding = null) { + $this->save_locale(); + + // TODO: use the $encoding variable + // FIXME: Determine character encoding, switch to UTF8, update meta tag. Need better http/file stream encoding detection, currently relies on text or meta tag. + mb_detect_order('auto'); + + if (mb_detect_encoding($str) !== 'UTF-8') { + $metatags = array( + '@', '', $str); + } + } + + // Parse embedded php, first-pass + if ( DOMPDF_ENABLE_PHP ) { + ob_start(); + eval("?" . ">$str"); + $str = ob_get_clean(); + } + + // if the document contains non utf-8 with a utf-8 meta tag chars and was + // detected as utf-8 by mbstring, problems could happen. + // http://devzone.zend.com/article/8855 + if ( $encoding === 'UTF-8' ) { + $str = preg_replace("/]+)>/", "", $str); + } + + // Store parsing warnings as messages + set_error_handler("record_warnings"); + $this->_xml->loadHTML($str); + restore_error_handler(); + + /** + @todo Take the quirksmode into account + // http://hsivonen.iki.fi/doctype/ + // https://developer.mozilla.org/en/mozilla's_quirks_mode + $quirksmode = false; + + // HTML5 + if ( !$this->_xml->doctype->publicId && !$this->_xml->doctype->systemId ) { + $quirksmode = false; + } + + // not XHTML + if ( !preg_match("/xhtml/i", $this->_xml->doctype->publicId) ) { + $quirksmode = true; + } + */ + + $this->restore_locale(); + } + + /** + * Builds the {@link Frame_Tree}, loads any CSS and applies the styles to + * the {@link Frame_Tree} + */ + protected function _process_html() { + $this->save_locale(); + + $this->_tree->build_tree(); + + $this->_css->load_css_file(Stylesheet::DEFAULT_STYLESHEET); + + $acceptedmedia = Stylesheet::$ACCEPTED_GENERIC_MEDIA_TYPES; + if ( defined("DOMPDF_DEFAULT_MEDIA_TYPE") ) { + $acceptedmedia[] = DOMPDF_DEFAULT_MEDIA_TYPE; + } else { + $acceptedmedia[] = Stylesheet::$ACCEPTED_DEFAULT_MEDIA_TYPE; + } + + // load tags + $links = $this->_xml->getElementsByTagName("link"); + foreach ($links as $link) { + if ( mb_strtolower($link->getAttribute("rel")) === "stylesheet" || + mb_strtolower($link->getAttribute("type")) === "text/css" ) { + //Check if the css file is for an accepted media type + //media not given then always valid + $formedialist = preg_split("/[\s\n,]/", $link->getAttribute("media"),-1, PREG_SPLIT_NO_EMPTY); + if ( count($formedialist) > 0 ) { + $accept = false; + foreach ( $formedialist as $type ) { + if ( in_array(mb_strtolower(trim($type)), $acceptedmedia) ) { + $accept = true; + break; + } + } + if (!$accept) { + //found at least one mediatype, but none of the accepted ones + //Skip this css file. + continue; + } + } + + $url = $link->getAttribute("href"); + $url = build_url($this->_protocol, $this->_base_host, $this->_base_path, $url); + + $this->_css->load_css_file($url); + } + + } + + // load + $child = $child->nextSibling; + } + + } else + $css = $style->nodeValue; + + // Set the base path of the Stylesheet to that of the file being processed + $this->_css->set_protocol($this->_protocol); + $this->_css->set_host($this->_base_host); + $this->_css->set_base_path($this->_base_path); + + $this->_css->load_css($css); + } + + $this->restore_locale(); + } + + /** + * Sets the paper size & orientation + * + * @param string $size 'letter', 'legal', 'A4', etc. {@link CPDF_Adapter::$PAPER_SIZES} + * @param string $orientation 'portrait' or 'landscape' + */ + function set_paper($size, $orientation = "portrait") { + $this->_paper_size = $size; + $this->_paper_orientation = $orientation; + } + + /** + * Enable experimental caching capability + * @access private + */ + function enable_caching($cache_id) { + $this->_cache_id = $cache_id; + } + + /** + * Sets callbacks for events like rendering of pages and elements. + * The callbacks array contains arrays with 'event' set to 'begin_page', + * 'end_page', 'begin_frame', or 'end_frame' and 'f' set to a function or + * object plus method to be called. + * + * The function 'f' must take an array as argument, which contains info + * about the event. + * + * @param array $callbacks the set of callbacks to set + */ + function set_callbacks($callbacks) { + if (is_array($callbacks)) { + $this->_callbacks = array(); + foreach ($callbacks as $c) { + if (is_array($c) && isset($c['event']) && isset($c['f'])) { + $event = $c['event']; + $f = $c['f']; + if (is_callable($f) && is_string($event)) { + $this->_callbacks[$event][] = $f; + } + } + } + } + } + + /** + * Renders the HTML to PDF + */ + function render() { + $this->save_locale(); + + if ( DOMPDF_LOG_OUTPUT_FILE ) { + if ( !file_exists(DOMPDF_LOG_OUTPUT_FILE) && is_writable(dirname(DOMPDF_LOG_OUTPUT_FILE)) ) { + touch(DOMPDF_LOG_OUTPUT_FILE); + } + + $this->_start_time = microtime(true); + ob_start(); + } + + //enable_mem_profile(); + + $this->_process_html(); + + $this->_css->apply_styles($this->_tree); + + $root = null; + + foreach ($this->_tree->get_frames() as $frame) { + // Set up the root frame + + if ( is_null($root) ) { + $root = Frame_Factory::decorate_root( $this->_tree->get_root(), $this ); + continue; + } + + // Create the appropriate decorators, reflowers & positioners. + $deco = Frame_Factory::decorate_frame($frame, $this); + $deco->set_root($root); + + // FIXME: handle generated content + if ( $frame->get_style()->display === "list-item" ) { + + // Insert a list-bullet frame + $node = $this->_xml->createElement("bullet"); // arbitrary choice + $b_f = new Frame($node); + + $parent_node = $frame->get_parent()->get_node(); + + if ( !$parent_node->hasAttribute("dompdf-children-count") ) { + $count = 0; + foreach ($parent_node->childNodes as $_node) { + if ( $_node instanceof DOMElement ) + $count++; + } + $parent_node->setAttribute("dompdf-children-count", $count); + } + + $index = 0; + if ( !$parent_node->hasAttribute("dompdf-counter") ) { + $index = 1; + $parent_node->setAttribute("dompdf-counter", 1); + } + else { + $index = $parent_node->getAttribute("dompdf-counter"); + $index++; + $parent_node->setAttribute("dompdf-counter", $index); + } + + $node->setAttribute("dompdf-counter", $index); + $style = $this->_css->create_style(); + $style->display = "-dompdf-list-bullet"; + $style->inherit($frame->get_style()); + $b_f->set_style($style); + + $deco->prepend_child( Frame_Factory::decorate_frame($b_f, $this) ); + } + + } + + $page_style = $this->_css->get_page_style(); + + if ( $page_style && is_array($page_style->size) ) { + $this->set_paper(array(0, 0, $page_style->size[0], $page_style->size[1])); + } + + $this->_pdf = Canvas_Factory::get_instance($this->_paper_size, $this->_paper_orientation); + + // Add meta information + $title = $this->_xml->getElementsByTagName("title"); + if ( $title->length ) { + $this->_pdf->add_info("Title", trim($title->item(0)->nodeValue)); + } + + $metas = $this->_xml->getElementsByTagName("meta"); + $labels = array( + "author" => "Author", + "keywords" => "Keywords", + "description" => "Subject", + ); + foreach($metas as $meta) { + $name = mb_strtolower($meta->getAttribute("name")); + if ( isset($labels[$name]) ) { + $this->_pdf->add_info($labels[$name], trim($meta->getAttribute("content"))); + } + } + + $root->set_containing_block(0, 0, $this->_pdf->get_width(), $this->_pdf->get_height()); + $root->set_renderer(new Renderer($this)); + + // This is where the magic happens: + $root->reflow(); + + // Clean up cached images + Image_Cache::clear(); + + global $_dompdf_warnings, $_dompdf_show_warnings; + if ( $_dompdf_show_warnings ) { + echo 'DOMPDF Warnings
';
+      foreach ($_dompdf_warnings as $msg)
+        echo $msg . "\n";
+      echo $this->get_canvas()->get_cpdf()->messages;
+      echo '
'; + flush(); + } + + $this->restore_locale(); + } + + /** + * Add meta information to the PDF after rendering + */ + function add_info($label, $value) { + if (!is_null($this->_pdf)) + $this->_pdf->add_info($label, $value); + } + + /** + * Writes the output buffer in the log file + * @return void + */ + private function write_log() { + if ( !DOMPDF_LOG_OUTPUT_FILE || !is_writable(DOMPDF_LOG_OUTPUT_FILE) ) return; + + $memory = DOMPDF_memory_usage(); + $memory = number_format($memory/1024); + $time = number_format((microtime(true) - $this->_start_time) * 1000, 4); + + $out = "$memory KB ". + "$time ms
"; + + $out .= ob_get_clean(); + file_put_contents(DOMPDF_LOG_OUTPUT_FILE, $out); + } + + /** + * Streams the PDF to the client + * + * The file will open a download dialog by default. The options + * parameter controls the output. Accepted options are: + * + * 'Accept-Ranges' => 1 or 0 - if this is not set to 1, then this + * header is not included, off by default this header seems to + * have caused some problems despite the fact that it is supposed + * to solve them, so I am leaving it off by default. + * + * 'compress' = > 1 or 0 - apply content stream compression, this is + * on (1) by default + * + * 'Attachment' => 1 or 0 - if 1, force the browser to open a + * download dialog, on (1) by default + * + * @param string $filename the name of the streamed file + * @param array $options header options (see above) + */ + function stream($filename, $options = null) { + $this->save_locale(); + + $this->write_log(); + + if (!is_null($this->_pdf)) + $this->_pdf->stream($filename, $options); + + $this->restore_locale(); + } + + /** + * Returns the PDF as a string + * + * The file will open a download dialog by default. The options + * parameter controls the output. Accepted options are: + * + * + * 'compress' = > 1 or 0 - apply content stream compression, this is + * on (1) by default + * + * + * @param array $options options (see above) + * @return string + */ + function output($options = null) { + $this->save_locale(); + + $this->write_log(); + + if ( is_null($this->_pdf) ) + return null; + + $output = $this->_pdf->output( $options ); + + $this->restore_locale(); + + return $output; + } + + /** + * Returns the underlying HTML document as a string + * + * @return string + */ + function output_html() { + return $this->_xml->saveHTML(); + } +} diff --git a/application/third_party/dompdf/include/dompdf_exception.cls.php b/application/third_party/dompdf/include/dompdf_exception.cls.php new file mode 100644 index 00000000..bc61e31a --- /dev/null +++ b/application/third_party/dompdf/include/dompdf_exception.cls.php @@ -0,0 +1,60 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: dompdf_exception.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Standard exception thrown by DOMPDF classes + * + * @link http://www.zend.com/php5/articles/engine2-php5-changes.php#Heading12 + * @package dompdf + */ +class DOMPDF_Exception extends Exception { + + /** + * Class constructor + * + * @param string $message Error message + * @param int $code Error code + */ + function __construct($message = NULL, $code = 0) { + parent::__construct($message, $code); + } + +} diff --git a/application/third_party/dompdf/include/dompdf_internal_exception.cls.php b/application/third_party/dompdf/include/dompdf_internal_exception.cls.php new file mode 100644 index 00000000..1822548e --- /dev/null +++ b/application/third_party/dompdf/include/dompdf_internal_exception.cls.php @@ -0,0 +1,59 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: dompdf_internal_exception.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Exception thrown by DOMPDF classes for internal errors + * + * @package dompdf + */ +class DOMPDF_Internal_Exception extends Exception { + + /** + * Class constructor + * + * @param string $message Error message + * @param int $code Error code + */ + function __construct($message = NULL, $code = 0) { + parent::__construct($message, $code); + } + +} diff --git a/application/third_party/dompdf/include/file.skel b/application/third_party/dompdf/include/file.skel new file mode 100644 index 00000000..f5610438 --- /dev/null +++ b/application/third_party/dompdf/include/file.skel @@ -0,0 +1,40 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + * @version 0.3 + */ + +/* $Id: file.skel 216 2010-03-11 22:49:18Z ryan.masten $ */ diff --git a/application/third_party/dompdf/include/fixed_positioner.cls.php b/application/third_party/dompdf/include/fixed_positioner.cls.php new file mode 100644 index 00000000..8903776b --- /dev/null +++ b/application/third_party/dompdf/include/fixed_positioner.cls.php @@ -0,0 +1,117 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + */ + +/* $Id */ + +/** + * Positions fixely positioned frames + */ +class Fixed_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + function position() { + + $frame = $this->_frame; + $style = $frame->get_original_style(); + $root = $frame->get_root(); + $initialcb = $root->get_containing_block(); + $initialcb_style = $root->get_style(); + + $p = $frame->find_block_parent(); + if ( $p ) { + $p->add_line(); + } + + // Compute the margins of the @page style + $margin_top = $initialcb_style->length_in_pt($initialcb_style->margin_top, $initialcb["h"]); + $margin_right = $initialcb_style->length_in_pt($initialcb_style->margin_right, $initialcb["w"]); + $margin_bottom = $initialcb_style->length_in_pt($initialcb_style->margin_bottom, $initialcb["h"]); + $margin_left = $initialcb_style->length_in_pt($initialcb_style->margin_left, $initialcb["w"]); + + // The needed computed style of the element + $height = $style->length_in_pt($style->height, $initialcb["h"]); + $width = $style->length_in_pt($style->width, $initialcb["w"]); + + $top = $style->length_in_pt($style->top, $initialcb["h"]); + $right = $style->length_in_pt($style->right, $initialcb["w"]); + $bottom = $style->length_in_pt($style->bottom, $initialcb["h"]); + $left = $style->length_in_pt($style->left, $initialcb["w"]); + + $y = $margin_top; + if ( isset($top) ) { + $y = $top + $margin_top; + if ( $top === "auto" ) { + $y = $margin_top; + if ( isset($bottom) && $bottom !== "auto" ) { + $y = $initialcb["h"] - $bottom - $margin_bottom; + $margin_height = $this->_frame->get_margin_height(); + if ( $margin_height !== "auto" ) { + $y -= $margin_height; + } else { + $y -= $height; + } + } + } + } + + $x = $margin_left; + if ( isset($left) ) { + $x = $left + $margin_left; + if ( $left === "auto" ) { + $x = $margin_left; + if ( isset($right) && $right !== "auto" ) { + $x = $initialcb["w"] - $right - $margin_right; + $margin_width = $this->_frame->get_margin_width(); + if ( $margin_width !== "auto" ) { + $x -= $margin_width; + } else { + $x -= $width; + } + } + } + } + + $frame->set_position($x, $y); + + $children = $frame->get_children(); + foreach($children as $child) { + $child->set_position($x, $y); + } + } +} \ No newline at end of file diff --git a/application/third_party/dompdf/include/font_metrics.cls.php b/application/third_party/dompdf/include/font_metrics.cls.php new file mode 100644 index 00000000..ee91ebe5 --- /dev/null +++ b/application/third_party/dompdf/include/font_metrics.cls.php @@ -0,0 +1,299 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - On missing font on explicite font selection don't change subtype and don't return default font. + * - On requesting default font and missing subtype, check similar subtypes, then any subtype, then normal. The last must exist. + * - Add comments + */ + +/* $Id: font_metrics.cls.php 355 2011-01-27 07:44:54Z fabien.menager $ */ + +require_once(DOMPDF_LIB_DIR . "/class.pdf.php"); + +/** + * Name of the font cache file + * + * This file must be writable by the webserver process only to update it + * with save_font_families() after adding the .afm file references of a new font family + * with Font_Metrics::save_font_families(). + * This is typically done only from command line with load_font.php on converting + * ttf fonts to afm with an external tool referenced in the define _TTF2AFM + * + * Declared here because PHP5 prevents constants from being declared with expressions + */ +if (!defined("__DOMPDF_FONT_CACHE_FILE")) { + if (file_exists(DOMPDF_FONT_DIR . "dompdf_font_family_cache")) { + define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache"); + } else { + define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache.dist.php"); + } +} + +/** + * The font metrics class + * + * This class provides information about fonts and text. It can resolve + * font names into actual installed font files, as well as determine the + * size of text in a particular font and size. + * + * @static + * @package dompdf + */ +class Font_Metrics { + + /** + * @see __DOMPDF_FONT_CACHE_FILE + */ + const CACHE_FILE = __DOMPDF_FONT_CACHE_FILE; + + /** + * Underlying {@link Canvas} object to perform text size calculations + * + * @var Canvas + */ + static protected $_pdf = null; + + /** + * Array of font family names to font files + * + * Usually cached by the {@link load_font.php} script + * + * @var array + */ + static protected $_font_lookup = array(); + + + /** + * Class initialization + * + */ + static function init() { + if (!self::$_pdf) { + self::load_font_families(); + self::$_pdf = Canvas_Factory::get_instance(); + } + } + + /** + * Calculates text size, in points + * + * @param string $text the text to be sized + * @param string $font the desired font + * @param float $size the desired font size + * @param float $spacing word spacing, if any + * @return float + */ + static function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) { + return self::$_pdf->get_text_width($text, $font, $size, $word_spacing, $char_spacing); + } + + /** + * Calculates font height + * + * @param string $font + * @param float $size + * @return float + */ + static function get_font_height($font, $size) { + return self::$_pdf->get_font_height($font, $size); + } + + /** + * Resolves a font family & subtype into an actual font file + * + * Subtype can be one of 'normal', 'bold', 'italic' or 'bold_italic'. If + * the particular font family has no suitable font file, the default font + * ({@link DOMPDF_DEFAULT_FONT}) is used. The font file returned + * is the absolute pathname to the font file on the system. + * + * @param string $family + * @param string $subtype + * @return string + */ + static function get_font($family, $subtype = "normal") { + + /* Allow calling for various fonts in search path. Therefore not immediately + * return replacement on non match. + * Only when called with NULL try replacement. + * When this is also missing there is really trouble. + * If only the subtype fails, nevertheless return failure. + * Only on checking the fallback font, check various subtypes on same font. + */ + + if ( $family ) { + $family = str_replace( array("'", '"'), "", mb_strtolower($family)); + $subtype = mb_strtolower($subtype); + + if ( isset(self::$_font_lookup[$family][$subtype]) ) { + return self::$_font_lookup[$family][$subtype]; + } + return null; + } + + $family = DOMPDF_DEFAULT_FONT; + + if ( isset(self::$_font_lookup[$family][$subtype]) ) { + return self::$_font_lookup[$family][$subtype]; + } + + foreach ( self::$_font_lookup[$family] as $sub => $font ) { + if (strpos($subtype, $sub) !== false) { + return $font; + } + } + + if ($subtype !== "normal") { + foreach ( self::$_font_lookup[$family] as $sub => $font ) { + if ($sub !== "normal") { + return $font; + } + } + } + + $subtype = "normal"; + + if ( isset(self::$_font_lookup[$family][$subtype]) ) { + return self::$_font_lookup[$family][$subtype]; + } + return null; + } + + /** + * Saves the stored font family cache + * + * The name and location of the cache file are determined by {@link + * Font_Metrics::CACHE_FILE}. This file should be writable by the + * webserver process. + * + * @see Font_Metrics::load_font_families() + */ + static function save_font_families() { + // replace the path to the DOMPDF font directory with "DOMPDF_FONT_DIR" (allows for more portability) + $cache_data = var_export(self::$_font_lookup, true); + $cache_data = str_replace('\''.DOMPDF_FONT_DIR , 'DOMPDF_FONT_DIR . \'' , $cache_data); + $cache_data = "<"."?php return $cache_data ?".">"; + file_put_contents(self::CACHE_FILE, $cache_data); + } + + /** + * Loads the stored font family cache + * + * @see save_font_families() + */ + static function load_font_families() { + if ( !is_readable(self::CACHE_FILE) ) + return; + + self::$_font_lookup = require_once(self::CACHE_FILE); + + // If the font family cache is still in the old format + if ( self::$_font_lookup === 1 ) { + $cache_data = file_get_contents(self::CACHE_FILE); + file_put_contents(self::CACHE_FILE, "<"."?php return $cache_data ?".">"); + self::$_font_lookup = require_once(self::CACHE_FILE); + } + } + + static function get_system_fonts() { + $files = glob("/usr/share/fonts/truetype/*.ttf") + + glob("/usr/share/fonts/truetype/*/*.ttf") + + glob("/usr/share/fonts/truetype/*/*/*.ttf") + + glob("C:\\Windows\\fonts\\*.ttf") + + glob("C:\\WinNT\\fonts\\*.ttf") + + glob("/mnt/c_drive/WINDOWS/Fonts/"); + + new TTF_Info; + + $names = array(); + + foreach($files as $file) { + $info = getFontInfo($file); + $info["path"] = $file; + $type = $info[2]; + + if (preg_match("/regular|normal|medium|book/i", $type)) { + $type = "normal"; + } + elseif (preg_match("/bold/i", $type)) { + if (preg_match("/italic|oblique/i", $type)) { + $type = "bold_italic"; + } + else { + $type = "bold"; + } + } + elseif (preg_match("/italic|oblique/i", $type)) { + $type = "italic"; + } + + $names[mb_strtolower($info[1])][$type] = $file; + } + + $keys = array_keys($names); + + /*$matches = array_intersect(array("times", "times new roman"), $keys); + $names["serif"] = $names[reset($matches)]; + + $matches = array_intersect(array("helvetica", "arial", "verdana"), $keys); + $names["sans-serif"] = $names[reset($matches)]; + + $matches = array_intersect(array("courier", "courier new"), $keys); + $names["monospace"] = $names[reset($matches)]; + $names["fixed"] = $names[reset($matches)];*/ + + return $names; + } + + /** + * Returns the current font lookup table + * + * @return array + */ + static function get_font_families() { + return self::$_font_lookup; + } + + static function set_font_family($fontname, $entry) { + self::$_font_lookup[mb_strtolower($fontname)] = $entry; + } +} + +Font_Metrics::init(); diff --git a/application/third_party/dompdf/include/frame.cls.php b/application/third_party/dompdf/include/frame.cls.php new file mode 100644 index 00000000..3f16ad5a --- /dev/null +++ b/application/third_party/dompdf/include/frame.cls.php @@ -0,0 +1,990 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: frame.cls.php 359 2011-02-05 12:15:06Z fabien.menager $ */ + +/** + * The main Frame class + * + * This class represents a single HTML element. This class stores + * positioning information as well as containing block location and + * dimensions. Style information for the element is stored in a {@link + * Style} object. Tree structure is maintained via the parent & children + * links. + * + * @access protected + * @package dompdf + */ +class Frame { + + /** + * The DOMNode object this frame represents + * + * @var DOMNode + */ + protected $_node; + + /** + * Unique identifier for this frame. Used to reference this frame + * via the node. + * + * @var string + */ + protected $_id; + + /** + * Unique id counter + */ + static protected $ID_COUNTER = 0; + + /** + * This frame's calculated style + * + * @var Style + */ + protected $_style; + + /** + * This frame's original style. Needed for cases where frames are + * split across pages. + * + * @var Style + */ + protected $_original_style; + + /** + * This frame's parent in the document tree. + * + * @var Frame + */ + protected $_parent; + + /** + * This frame's first child. All children are handled as a + * doubly-linked list. + * + * @var Frame + */ + protected $_first_child; + + /** + * This frame's last child. + * + * @var Frame + */ + protected $_last_child; + + /** + * This frame's previous sibling in the document tree. + * + * @var Frame + */ + protected $_prev_sibling; + + /** + * This frame's next sibling in the document tree. + * + * @var Frame + */ + protected $_next_sibling; + + /** + * This frame's containing block (used in layout): array(x, y, w, h) + * + * @var array + */ + protected $_containing_block; + + /** + * Position on the page of the top-left corner of the margin box of + * this frame: array(x,y) + * + * @var array + */ + protected $_position; + + /** + * Absolute opacity of this frame + * + * @var float + */ + protected $_opacity; + + /** + * This frame's decorator + * + * @var Frame_Decorator + */ + protected $_decorator; + + protected $_containing_line; + + /** + * Tells wether the frame was already pushed to the next page + * @var bool + */ + public $_already_pushed = false; + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + + /** + * Class constructor + * + * @param DOMNode $node the DOMNode this frame represents + */ + function __construct(DomNode $node) { + $this->_node = $node; + + $this->_parent = null; + $this->_first_child = null; + $this->_last_child = null; + $this->_prev_sibling = $this->_next_sibling = null; + + $this->_style = null; + $this->_original_style = null; + + $this->_containing_block = array( + "x" => null, + "y" => null, + "w" => null, + "h" => null, + ); + + $this->_containing_block[0] =& $this->_containing_block["x"]; + $this->_containing_block[1] =& $this->_containing_block["y"]; + $this->_containing_block[2] =& $this->_containing_block["w"]; + $this->_containing_block[3] =& $this->_containing_block["h"]; + + $this->_position = array( + "x" => null, + "y" => null, + ); + + $this->_position[0] =& $this->_position["x"]; + $this->_position[1] =& $this->_position["y"]; + + $this->_opacity = 1.0; + $this->_decorator = null; + + $this->set_id( self::$ID_COUNTER++ ); + } + + /** + * "Destructor": forcibly free all references held by this frame + * + * @param bool $recursive if true, call dispose on all children + */ + function dispose($recursive = false) { + + if ( $recursive ) { + while ( $child = $this->_first_child ) + $child->dispose(true); + } + + // Remove this frame from the tree + if ( $this->_prev_sibling ) { + $this->_prev_sibling->_next_sibling = $this->_next_sibling; + } + + if ( $this->_next_sibling ) { + $this->_next_sibling->_prev_sibling = $this->_prev_sibling; + } + + if ( $this->_parent && $this->_parent->_first_child === $this ) { + $this->_parent->_first_child = $this->_next_sibling; + } + + if ( $this->_parent && $this->_parent->_last_child === $this ) { + $this->_parent->_last_child = $this->_prev_sibling; + } + + if ( $this->_parent ) { + $this->_parent->get_node()->removeChild($this->_node); + } + + $this->_style->dispose(); + $this->_style = null; + unset($this->_style); + + $this->_original_style->dispose(); + $this->_original_style = null; + unset($this->_original_style); + + } + + // Re-initialize the frame + function reset() { + $this->_position["x"] = null; + $this->_position["y"] = null; + + $this->_containing_block["x"] = null; + $this->_containing_block["y"] = null; + $this->_containing_block["w"] = null; + $this->_containing_block["h"] = null; + + $this->_style = null; + unset($this->_style); + $this->_style = clone $this->_original_style; + } + + //........................................................................ + + // Accessor methods + /** + * @return DOMNode + */ + function get_node() { return $this->_node; } + + /** + * @return string + */ + function get_id() { return $this->_id; } + + /** + * @return Style + */ + function get_style() { return $this->_style; } + + /** + * @return Style + */ + function get_original_style() { return $this->_original_style; } + + /** + * @return Frame + */ + function get_parent() { return $this->_parent; } + + /** + * @return Frame_Decorator + */ + function get_decorator() { return $this->_decorator; } + + /** + * @return Frame + */ + function get_first_child() { return $this->_first_child; } + + /** + * @return Frame + */ + function get_last_child() { return $this->_last_child; } + + /** + * @return Frame + */ + function get_prev_sibling() { return $this->_prev_sibling; } + + /** + * @return Frame + */ + function get_next_sibling() { return $this->_next_sibling; } + + /** + * @return FrameList + */ + function get_children() { return new FrameList($this); } + + // Layout property accessors + + /** + * Containing block dimensions + * + * @param $i string The key of the wanted containing block's dimension (x, y, x, h) + * @return array|float + */ + function get_containing_block($i = null) { + if ( isset($i) ) + return $this->_containing_block[$i]; + return $this->_containing_block; + } + + /** + * Block position + * + * @param $i string The key of the wanted position value (x, y) + * @return array|float + */ + function get_position($i = null) { + if ( isset($i) ) { + return $this->_position[$i]; + } + return $this->_position; + } + + //........................................................................ + + /** + * Return the height of the margin box of the frame, in pt. Meaningless + * unless the height has been calculated properly. + * + * @return float + */ + function get_margin_height() { + $style = $this->_style; + + return $style->length_in_pt(array( + $style->height, + $style->margin_top, + $style->margin_bottom, + $style->border_top_width, + $style->border_bottom_width, + $style->padding_top, + $style->padding_bottom + ), $this->_containing_block["h"]); + } + + /** + * Return the width of the margin box of the frame, in pt. Meaningless + * unless the width has been calculated properly. + * + * @return float + */ + function get_margin_width() { + $style = $this->_style; + + return $style->length_in_pt(array( + $style->width, + $style->margin_left, + $style->margin_right, + $style->border_left_width, + $style->border_right_width, + $style->padding_left, + $style->padding_right + ), $this->_containing_block["w"]); + } + + function get_break_margins(){ + $style = $this->_style; + + return $style->length_in_pt(array( + //$style->height, + $style->margin_top, + $style->margin_bottom, + $style->border_top_width, + $style->border_bottom_width, + $style->padding_top, + $style->padding_bottom + ), $this->_containing_block["h"]); + } + + /** + * Return the padding box (x,y,w,h) of the frame + * + * @return array + */ + function get_padding_box() { + $style = $this->_style; + $cb = $this->_containing_block; + + $x = $this->_position["x"] + + $style->length_in_pt(array($style->margin_left, + $style->border_left_width), + $cb["w"]); + + $y = $this->_position["y"] + + $style->length_in_pt(array($style->margin_top, + $style->border_top_width), + $cb["h"]); + + $w = $style->length_in_pt(array($style->padding_left, + $style->width, + $style->padding_right), + $cb["w"]); + + $h = $style->length_in_pt(array($style->padding_top, + $style->height, + $style->padding_bottom), + $cb["h"]); + + return array(0 => $x, "x" => $x, + 1 => $y, "y" => $y, + 2 => $w, "w" => $w, + 3 => $h, "h" => $h); + } + + /** + * Return the border box of the frame + * + * @return array + */ + function get_border_box() { + $style = $this->_style; + $cb = $this->_containing_block; + + $x = $this->_position["x"] + $style->length_in_pt($style->margin_left, $cb["w"]); + + $y = $this->_position["y"] + $style->length_in_pt($style->margin_top, $cb["h"]); + + $w = $style->length_in_pt(array($style->border_left_width, + $style->padding_left, + $style->width, + $style->padding_right, + $style->border_right_width), + $cb["w"]); + + $h = $style->length_in_pt(array($style->border_top_width, + $style->padding_top, + $style->height, + $style->padding_bottom, + $style->border_bottom_width), + $cb["h"]); + + return array(0 => $x, "x" => $x, + 1 => $y, "y" => $y, + 2 => $w, "w" => $w, + 3 => $h, "h" => $h); + } + + function get_opacity($opacity = null) { + if ( $opacity !== null ) { + $this->set_opacity($opacity); + } + return $this->_opacity; + } + + function &get_containing_line() { + return $this->_containing_line; + } + + //........................................................................ + + // Set methods + function set_id($id) { + $this->_id = $id; + + // We can only set attributes of DOMElement objects (nodeType == 1). + // Since these are the only objects that we can assign CSS rules to, + // this shortcoming is okay. + if ( $this->_node->nodeType == XML_ELEMENT_NODE ) + $this->_node->setAttribute("frame_id", $id); + } + + function set_style(Style $style) { + if ( is_null($this->_style) ) + $this->_original_style = clone $style; + + //$style->set_frame($this); + $this->_style = $style; + } + + function set_decorator(Frame_Decorator $decorator) { + $this->_decorator = $decorator; + } + + function set_containing_block($x = null, $y = null, $w = null, $h = null) { + if ( is_array($x) ){ + foreach($x as $key => $val){ + $$key = $val; + } + } + + if (is_numeric($x)) { + $this->_containing_block["x"] = $x; + } + + if (is_numeric($y)) { + $this->_containing_block["y"] = $y; + } + + if (is_numeric($w)) { + $this->_containing_block["w"] = $w; + } + + if (is_numeric($h)) { + $this->_containing_block["h"] = $h; + } + } + + function set_position($x = null, $y = null) { + if ( is_array($x) ) + extract($x); + + if ( is_numeric($x) ) { + $this->_position["x"] = $x; + } + + if ( is_numeric($y) ) { + $this->_position["y"] = $y; + } + } + + function set_opacity($opacity) { + $parent = $this->get_parent(); + $base_opacity = (($parent && $parent->_opacity !== null) ? $parent->_opacity : 1.0); + $this->_opacity = $base_opacity * $opacity; + } + + function set_containing_line(&$line) { + $this->_containing_line = &$line; + } + + //........................................................................ + + /** + * Inserts a new child at the beginning of the Frame + * + * @param $child Frame The new Frame to insert + * @param $update_node boolean Whether or not to update the DOM + */ + function prepend_child(Frame $child, $update_node = true) { + if ( $update_node ) + $this->_node->insertBefore($child->_node, $this->_first_child ? $this->_first_child->_node : null); + + // Remove the child from its parent + if ( $child->_parent ) + $child->_parent->remove_child($child, false); + + $child->_parent = $this; + $child->_prev_sibling = null; + + // Handle the first child + if ( !$this->_first_child ) { + $this->_first_child = $child; + $this->_last_child = $child; + $child->_next_sibling = null; + } else { + $this->_first_child->_prev_sibling = $child; + $child->_next_sibling = $this->_first_child; + $this->_first_child = $child; + } + } + + /** + * Inserts a new child at the end of the Frame + * + * @param $child Frame The new Frame to insert + * @param $update_node boolean Whether or not to update the DOM + */ + function append_child(Frame $child, $update_node = true) { + if ( $update_node ) + $this->_node->appendChild($child->_node); + + // Remove the child from its parent + if ( $child->_parent ) + $child->_parent->remove_child($child, false); + + $child->_parent = $this; + $child->_next_sibling = null; + + // Handle the first child + if ( !$this->_last_child ) { + $this->_first_child = $child; + $this->_last_child = $child; + $child->_prev_sibling = null; + } else { + $this->_last_child->_next_sibling = $child; + $child->_prev_sibling = $this->_last_child; + $this->_last_child = $child; + } + } + + /** + * Inserts a new child immediately before the specified frame + * + * @param $new_child Frame The new Frame to insert + * @param $ref Frame The Frame after the new Frame + * @param $update_node boolean Whether or not to update the DOM + */ + function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) { + if ( $ref === $this->_first_child ) { + $this->prepend_child($new_child, $update_node); + return; + } + + if ( is_null($ref) ) { + $this->append_child($new_child, $update_node); + return; + } + + if ( $ref->_parent !== $this ) + throw new DOMPDF_Exception("Reference child is not a child of this node."); + + // Update the node + if ( $update_node ) + $this->_node->insertBefore($new_child->_node, $ref->_node); + + // Remove the child from its parent + if ( $new_child->_parent ) + $new_child->_parent->remove_child($new_child, false); + + $new_child->_parent = $this; + $new_child->_next_sibling = $ref; + $new_child->_prev_sibling = $ref->_prev_sibling; + + if ( $ref->_prev_sibling ) + $ref->_prev_sibling->_next_sibling = $new_child; + + $ref->_prev_sibling = $new_child; + } + + /** + * Inserts a new child immediately after the specified frame + * + * @param $new_child Frame The new Frame to insert + * @param $ref Frame The Frame before the new Frame + * @param $update_node boolean Whether or not to update the DOM + */ + function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) { + if ( $ref === $this->_last_child ) { + $this->append_child($new_child, $update_node); + return; + } + + if ( is_null($ref) ) { + $this->prepend_child($new_child, $update_node); + return; + } + + if ( $ref->_parent !== $this ) + throw new DOMPDF_Exception("Reference child is not a child of this node."); + + // Update the node + if ( $update_node ) { + if ( $ref->_next_sibling ) { + $next_node = $ref->_next_sibling->_node; + $this->_node->insertBefore($new_child->_node, $next_node); + } else { + $new_child->_node = $this->_node->appendChild($new_child); + } + } + + // Remove the child from its parent + if ( $new_child->_parent) + $new_child->_parent->remove_child($new_child, false); + + $new_child->_parent = $this; + $new_child->_prev_sibling = $ref; + $new_child->_next_sibling = $ref->_next_sibling; + + if ( $ref->_next_sibling ) + $ref->_next_sibling->_prev_sibling = $new_child; + + $ref->_next_sibling = $new_child; + } + + + /** + * Remove a child frame + * + * @param $child Frame + * @param $update_node boolean Whether or not to remove the DOM node + * @return Frame The removed child frame + */ + function remove_child(Frame $child, $update_node = true) { + if ( $child->_parent !== $this ) + throw new DOMPDF_Exception("Child not found in this frame"); + + if ( $update_node ) + $this->_node->removeChild($child->_node); + + if ( $child === $this->_first_child ) + $this->_first_child = $child->_next_sibling; + + if ( $child === $this->_last_child ) + $this->_last_child = $child->_prev_sibling; + + if ( $child->_prev_sibling ) + $child->_prev_sibling->_next_sibling = $child->_next_sibling; + + if ( $child->_next_sibling ) + $child->_next_sibling->_prev_sibling = $child->_prev_sibling; + + $child->_next_sibling = null; + $child->_prev_sibling = null; + $child->_parent = null; + return $child; + } + + //........................................................................ + + // Debugging function: + function __toString() { + // Skip empty text frames +// if ( $this->_node->nodeName === "#text" && +// preg_replace("/\s/", "", $this->_node->data) === "" ) +// return ""; + + + $str = "" . $this->_node->nodeName . ":
"; + //$str .= spl_object_hash($this->_node) . "
"; + $str .= "Id: " .$this->get_id() . "
"; + $str .= "Class: " .get_class($this) . "
"; + + if ( $this->_node->nodeName === "#text" ) { + $tmp = htmlspecialchars($this->_node->nodeValue); + $str .= "
'" .  mb_substr($tmp,0,70) .
+        (mb_strlen($tmp) > 70 ? "..." : "") . "'
"; + } elseif ( $css_class = $this->_node->getAttribute("class") ) { + $tmp = htmlspecialchars($css_class); + $str .= "CSS class: '$css_class'
"; + } + + if ( $this->_parent ) + $str .= "\nParent:" . $this->_parent->_node->nodeName . + " (" . spl_object_hash($this->_parent->_node) . ") " . + "
"; + + if ( $this->_prev_sibling ) + $str .= "Prev: " . $this->_prev_sibling->_node->nodeName . + " (" . spl_object_hash($this->_prev_sibling->_node) . ") " . + "
"; + + if ( $this->_next_sibling ) + $str .= "Next: " . $this->_next_sibling->_node->nodeName . + " (" . spl_object_hash($this->_next_sibling->_node) . ") " . + "
"; + + $d = $this->get_decorator(); + while ($d && $d != $d->get_decorator()) { + $str .= "Decorator: " . get_class($d) . "
"; + $d = $d->get_decorator(); + } + + $str .= "Position: " . pre_r($this->_position, true); + $str .= "\nContaining block: " . pre_r($this->_containing_block, true); + $str .= "\nMargin width: " . pre_r($this->get_margin_width(), true); + $str .= "\nMargin height: " . pre_r($this->get_margin_height(), true); + + $str .= "\nStyle:
". $this->_style->__toString() . "
"; + + if ( $this->_decorator instanceof Block_Frame_Decorator ) { + $str .= "Lines:
";
+      foreach ($this->_decorator->get_lines() as $line) {
+        foreach ($line["frames"] as $frame) {
+          if ($frame instanceof Text_Frame_Decorator) {
+            $str .= "\ntext: ";          
+            $str .= "'". htmlspecialchars($frame->get_text()) ."'";
+          } else {
+            $str .= "\nBlock: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")";
+          }
+        }
+        
+        $str .=
+          //"\ncount => " . $line["count"] . "\n".
+          "\ny => " . $line["y"] . "\n" .
+          "w => " . $line["w"] . "\n" .
+          "h => " . $line["h"] . "\n" .
+          "left => " . $line["left"] . "\n" .
+          "right => " . $line["right"] . "\n";
+      }
+      $str .= "
"; + } + $str .= "\n"; + if ( php_sapi_name() === "cli" ) + $str = strip_tags(str_replace(array("
","",""), + array("\n","",""), + $str)); + + return $str; + } +} + +//------------------------------------------------------------------------ + +/** + * Linked-list IteratorAggregate + * + * @access private + * @package dompdf + */ +class FrameList implements IteratorAggregate { + protected $_frame; + + function __construct($frame) { $this->_frame = $frame; } + function getIterator() { return new FrameListIterator($this->_frame); } +} + +/** + * Linked-list Iterator + * + * Returns children in order and allows for list to change during iteration, + * provided the changes occur to or after the current element + * + * @access private + * @package dompdf + */ +class FrameListIterator implements Iterator { + + /** + * @var Frame + */ + protected $_parent; + + /** + * @var Frame + */ + protected $_cur; + + /** + * @var int + */ + protected $_num; + + function __construct(Frame $frame) { + $this->_parent = $frame; + $this->_cur = $frame->get_first_child(); + $this->_num = 0; + } + + function rewind() { + $this->_cur = $this->_parent->get_first_child(); + $this->_num = 0; + } + + /** + * @return bool + */ + function valid() { + return isset($this->_cur);// && ($this->_cur->get_prev_sibling() === $this->_prev); + } + + function key() { return $this->_num; } + + /** + * @return Frame + */ + function current() { return $this->_cur; } + + /** + * @return Frame + */ + function next() { + + $ret = $this->_cur; + if ( !$ret ) + return null; + + $this->_cur = $this->_cur->get_next_sibling(); + $this->_num++; + return $ret; + } +} + +//------------------------------------------------------------------------ + +/** + * Pre-order IteratorAggregate + * + * @access private + * @package dompdf + */ +class FrameTreeList implements IteratorAggregate { + /** + * @var Frame + */ + protected $_root; + + function __construct(Frame $root) { $this->_root = $root; } + + /** + * @return FrameTreeIterator + */ + function getIterator() { return new FrameTreeIterator($this->_root); } +} + +/** + * Pre-order Iterator + * + * Returns frames in preorder traversal order (parent then children) + * + * @access private + * @package dompdf + */ +class FrameTreeIterator implements Iterator { + /** + * @var Frame + */ + protected $_root; + protected $_stack = array(); + + /** + * @var int + */ + protected $_num; + + function __construct(Frame $root) { + $this->_stack[] = $this->_root = $root; + $this->_num = 0; + } + + function rewind() { + $this->_stack = array($this->_root); + $this->_num = 0; + } + + /** + * @return bool + */ + function valid() { return count($this->_stack) > 0; } + + /** + * @return int + */ + function key() { return $this->_num; } + + /** + * @var Frame + */ + function current() { return end($this->_stack); } + + /** + * @var Frame + */ + function next() { + $b = end($this->_stack); + + // Pop last element + unset($this->_stack[ key($this->_stack) ]); + $this->_num++; + + // Push all children onto the stack in reverse order + if ( $c = $b->get_last_child() ) { + $this->_stack[] = $c; + while ( $c = $c->get_prev_sibling() ) + $this->_stack[] = $c; + } + return $b; + } +} diff --git a/application/third_party/dompdf/include/frame_decorator.cls.php b/application/third_party/dompdf/include/frame_decorator.cls.php new file mode 100644 index 00000000..19478811 --- /dev/null +++ b/application/third_party/dompdf/include/frame_decorator.cls.php @@ -0,0 +1,483 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: frame_decorator.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Base Frame_Decorator class + * + * @access private + * @package dompdf + */ +abstract class Frame_Decorator extends Frame { + + /** + * The root node of the DOM tree + * + * @var Frame + */ + protected $_root; + + /** + * The decorated frame + * + * @var Frame + */ + protected $_frame; + + /** + * Positioner object used to position this frame (Strategy pattern) + * + * @var Positioner + */ + protected $_positioner; + + /** + * Reflower object used to calculate frame dimensions (Strategy pattern) + * + * @var Frame_Reflower + */ + protected $_reflower; + + /** + * Reference to the current dompdf instance + * + * @var DOMPDF + */ + protected $_dompdf; + + /** + * First block parent + * + * @var Frame_Decorator + */ + private $_block_parent; + + /** + * First positionned parent (position: relative | absolute | fixed) + * + * @var Frame_Decorator + */ + private $_positionned_parent; + + /** + * Class constructor + * + * @param Frame $frame the decoration target + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + $this->_frame = $frame; + $this->_root = null; + $this->_dompdf = $dompdf; + $frame->set_decorator($this); + } + + /** + * "Destructor": foribly free all references held by this object + * + * @param bool $recursive if true, call dispose on all children + */ + function dispose($recursive = false) { + + if ( $recursive ) { + while ( $child = $this->get_first_child() ) + $child->dispose(true); + } + + $this->_root = null; + unset($this->_root); + + $this->_frame->dispose(true); + $this->_frame = null; + unset($this->_frame); + + $this->_positioner = null; + unset($this->_positioner); + + $this->_reflower = null; + unset($this->_reflower); + } + + /** + * Return a copy of this frame with $node as its node + * + * @param DomNode $node + * @return Frame + */ + function copy(DomNode $node) { + $frame = new Frame($node); + $frame->set_style(clone $this->_frame->get_original_style()); + $deco = Frame_Factory::decorate_frame($frame, $this->_dompdf); + $deco->set_root($this->_root); + return $deco; + } + + /** + * Create a deep copy: copy this node and all children + * + * @return Frame + */ + function deep_copy() { + $frame = new Frame($this->get_node()->cloneNode()); + $frame->set_style(clone $this->_frame->get_original_style()); + $deco = Frame_Factory::decorate_frame($frame, $this->_dompdf); + $deco->set_root($this->_root); + + foreach ($this->get_children() as $child) + $deco->append_child($child->deep_copy()); + + return $deco; + } + //........................................................................ + + /** + * Delegate calls to decorated frame object + */ + function reset() { + $this->_frame->reset(); + + // Reset all children + foreach ($this->get_children() as $child) + $child->reset(); + } + + // Getters ----------- + function get_id() { return $this->_frame->get_id(); } + + /** + * @return Frame + */ + function get_frame() { return $this->_frame; } + + /** + * @return DomNode + */ + function get_node() { return $this->_frame->get_node(); } + + /** + * @return Style + */ + function get_style() { return $this->_frame->get_style(); } + + /** + * @return Style + */ + function get_original_style() { return $this->_frame->get_original_style(); } + function get_containing_block($i = null) { return $this->_frame->get_containing_block($i); } + function get_position($i = null) { return $this->_frame->get_position($i); } + + /** + * @return DOMPDF + */ + function get_dompdf() { return $this->_dompdf; } + + function get_margin_height() { return $this->_frame->get_margin_height(); } + function get_margin_width() { return $this->_frame->get_margin_width(); } + function get_padding_box() { return $this->_frame->get_padding_box(); } + function get_border_box() { return $this->_frame->get_border_box(); } + + // Setters ----------- + function set_id($id) { $this->_frame->set_id($id); } + function set_style(Style $style) { $this->_frame->set_style($style); } + + function set_containing_block($x = null, $y = null, $w = null, $h = null) { + $this->_frame->set_containing_block($x, $y, $w, $h); + } + + function set_position($x = null, $y = null) { + $this->_frame->set_position($x, $y); + } + function __toString() { return $this->_frame->__toString(); } + + function prepend_child(Frame $child, $update_node = true) { + while ( $child instanceof Frame_Decorator ) + $child = $child->_frame; + + $this->_frame->prepend_child($child, $update_node); + } + + function append_child(Frame $child, $update_node = true) { + while ( $child instanceof Frame_Decorator ) + $child = $child->_frame; + + $this->_frame->append_child($child, $update_node); + } + + function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) { + while ( $new_child instanceof Frame_Decorator ) + $new_child = $new_child->_frame; + + if ( $ref instanceof Frame_Decorator ) + $ref = $ref->_frame; + + $this->_frame->insert_child_before($new_child, $ref, $update_node); + } + + function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) { + while ( $new_child instanceof Frame_Decorator ) + $new_child = $new_child->_frame; + + while ( $ref instanceof Frame_Decorator ) + $ref = $ref->_frame; + + $this->_frame->insert_child_after($new_child, $ref, $update_node); + } + + function remove_child(Frame $child, $update_node = true) { + while ( $child instanceof Frame_Decorator ) + $child = $new_child->_frame; + + $this->_frame->remove_child($child, $update_node); + } + + //........................................................................ + + /** + * @return Frame_Decorator + */ + function get_parent() { + $p = $this->_frame->get_parent(); + if ( $p && $deco = $p->get_decorator() ) { + while ( $tmp = $deco->get_decorator() ) + $deco = $tmp; + return $deco; + } else if ( $p ) + return $p; + else + return null; + } + + /** + * @return Frame_Decorator + */ + function get_first_child() { + $c = $this->_frame->get_first_child(); + if ( $c && $deco = $c->get_decorator() ) { + while ( $tmp = $deco->get_decorator() ) + $deco = $tmp; + return $deco; + } else if ( $c ) + return $c; + else + return null; + } + + /** + * @return Frame_Decorator + */ + function get_last_child() { + $c = $this->_frame->get_last_child(); + if ( $c && $deco = $c->get_decorator() ) { + while ( $tmp = $deco->get_decorator() ) + $deco = $tmp; + return $deco; + } else if ( $c ) + return $c; + else + return null; + } + + /** + * @return Frame_Decorator + */ + function get_prev_sibling() { + $s = $this->_frame->get_prev_sibling(); + if ( $s && $deco = $s->get_decorator() ) { + while ( $tmp = $deco->get_decorator() ) + $deco = $tmp; + return $deco; + } else if ( $s ) + return $s; + else + return null; + } + + /** + * @return Frame_Decorator + */ + function get_next_sibling() { + $s = $this->_frame->get_next_sibling(); + if ( $s && $deco = $s->get_decorator() ) { + while ( $tmp = $deco->get_decorator() ) + $deco = $tmp; + return $deco; + } else if ( $s ) + return $s; + else + return null; + } + + /** + * @return FrameList + */ + function get_children() { + return new FrameList($this); + } + + /** + * @return FrameTreeList + */ + function get_subtree() { + return new FrameTreeList($this); + } + + //........................................................................ + + function set_positioner(Positioner $posn) { + $this->_positioner = $posn; + if ( $this->_frame instanceof Frame_Decorator ) + $this->_frame->set_positioner($posn); + } + + //........................................................................ + + function set_reflower(Frame_Reflower $reflower) { + $this->_reflower = $reflower; + if ( $this->_frame instanceof Frame_Decorator ) + $this->_frame->set_reflower( $reflower ); + } + + function get_reflower() { return $this->_reflower; } + + //........................................................................ + + function set_root(Frame $root) { + $this->_root = $root; + if ( $this->_frame instanceof Frame_Decorator ) + $this->_frame->set_root($root); + } + + function get_root() { return $this->_root; } + + //........................................................................ + + /** + * @return Frame_Decorator + */ + function find_block_parent() { + //if ( $this->_block_parent ) return $this->_block_parent; // FIXME: makes dom_anchor_link example fail + + // Find our nearest block level parent + $p = $this->get_parent(); + + while ( $p ) { + if ( in_array($p->get_style()->display, Style::$BLOCK_TYPES) ) + break; + + $p = $p->get_parent(); + } + + return $this->_block_parent = $p; + } + + /** + * @return Frame_Decorator + */ + function find_positionned_parent() { + //if ( $this->_positionned_parent ) return $this->_positionned_parent; // FIXME: makes dom_anchor_link example fail + + // Find our nearest relative positionned parent + $p = $this->get_parent(); + while ( $p ) { + if ( in_array($p->get_style()->position, Style::$POSITIONNED_TYPES) ) { + break; + } + + $p = $p->get_parent(); + } + + if ( !$p ) { + $p = $this->_root; + } + + return $this->_positionned_parent = $p; + } + + //........................................................................ + + /** + * split this frame at $child. + * + * The current frame is cloned and $child and all children following + * $child are added to the clone. The clone is then passed to the + * current frame's parent->split() method. + * + * @param Frame $child + * @param boolean $force_pagebreak + */ + function split($child = null, $force_pagebreak = false) { + if ( is_null( $child ) ) { + $this->get_parent()->split($this, $force_pagebreak); + return; + } + + if ( $child->get_parent() !== $this ) + throw new DOMPDF_Exception("Unable to split: frame is not a child of this one."); + + $split = $this->copy( $this->_frame->get_node()->cloneNode() ); + $split->reset(); + $this->get_parent()->insert_child_after($split, $this); + + // Add $frame and all following siblings to the new split node + $iter = $child; + while ($iter) { + $frame = $iter; + $iter = $iter->get_next_sibling(); + $frame->reset(); + $split->append_child($frame); + } + + $this->get_parent()->split($split, $force_pagebreak); + } + + //........................................................................ + + final function position() { $this->_positioner->position(); } + + final function reflow(Frame_Decorator $block = null) { + // Uncomment this to see the frames before they're laid out, instead of + // during rendering. + //echo $this->_frame; flush(); + $this->_reflower->reflow($block); + } + + final function get_min_max_width() { return $this->_reflower->get_min_max_width(); } + + //........................................................................ +} diff --git a/application/third_party/dompdf/include/frame_factory.cls.php b/application/third_party/dompdf/include/frame_factory.cls.php new file mode 100644 index 00000000..f4a1a8cb --- /dev/null +++ b/application/third_party/dompdf/include/frame_factory.cls.php @@ -0,0 +1,207 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: frame_factory.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */ + +/** + * Contains frame decorating logic + * + * This class is responsible for assigning the correct {@link Frame_Decorator}, + * {@link Positioner}, and {@link Frame_Reflower} objects to {@link Frame} + * objects. This is determined primarily by the Frame's display type, but + * also by the Frame's node's type (e.g. DomElement vs. #text) + * + * @access private + * @package dompdf + */ +class Frame_Factory { + + /** + * Decorate the Frame + * + * @param $root Frame The frame to decorate + * @param $dompdf DOMPDF The dompdf instance + */ + static function decorate_root(Frame $root, DOMPDF $dompdf) { + $frame = new Page_Frame_Decorator($root, $dompdf); + $frame->set_reflower( new Page_Frame_Reflower($frame) ); + $root->set_decorator($frame); + return $frame; + } + + /** + * Decorate a Frame + * + * @param $root Frame The frame to decorate + * @param $dompdf DOMPDF The dompdf instance + * @return Frame_Decorator + * FIXME: this is admittedly a little smelly... + */ + static function decorate_frame(Frame $frame, DOMPDF $dompdf) { + if ( is_null($dompdf) ) + throw new Exception("foo"); + + $style = $frame->get_style(); + + switch ($style->display) { + + case "block": + $positioner = "Block"; + $decorator = "Block"; + $reflower = "Block"; + break; + + case "inline-block": + $positioner = "Inline"; + $decorator = "Block"; + $reflower = "Block"; + break; + + case "inline": + $positioner = "Inline"; + if ( $frame->get_node()->nodeName === "#text" ) { + $decorator = "Text"; + $reflower = "Text"; + } + else { + if ( DOMPDF_ENABLE_CSS_FLOAT && $style->float !== "none" ) { + $decorator = "Block"; + $reflower = "Block"; + } + else { + $decorator = "Inline"; + $reflower = "Inline"; + } + } + break; + + case "table": + $positioner = "Block"; + $decorator = "Table"; + $reflower = "Table"; + break; + + case "inline-table": + $positioner = "Inline"; + $decorator = "Table"; + $reflower = "Table"; + break; + + case "table-row-group": + case "table-header-group": + case "table-footer-group": + $positioner = "Null"; + $decorator = "Table_Row_Group"; + $reflower = "Table_Row_Group"; + break; + + case "table-row": + $positioner = "Null"; + $decorator = "Table_Row"; + $reflower = "Table_Row"; + break; + + case "table-cell": + $positioner = "Table_Cell"; + $decorator = "Table_Cell"; + $reflower = "Table_Cell"; + break; + + case "list-item": + $positioner = "Block"; + $decorator = "Block"; + $reflower = "Block"; + break; + + case "-dompdf-list-bullet": + if ( $style->list_style_position === "inside" ) + $positioner = "Inline"; + else + $positioner = "List_Bullet"; + + if ( $style->list_style_image !== "none" ) + $decorator = "List_Bullet_Image"; + else + $decorator = "List_Bullet"; + + $reflower = "List_Bullet"; + break; + + case "-dompdf-image": + $positioner = "Inline"; + $decorator = "Image"; + $reflower = "Image"; + break; + + case "-dompdf-br": + $positioner = "Inline"; + $decorator = "Inline"; + $reflower = "Inline"; + break; + + default: + // FIXME: should throw some sort of warning or something? + case "none": + $positioner = "Null"; + $decorator = "Null"; + $reflower = "Null"; + break; + } + + $position = $style->position; + + if ( $position === "absolute" ) + $positioner = "Absolute"; + + else if ( $position === "fixed" ) + $positioner = "Fixed"; + + $positioner .= "_Positioner"; + $decorator .= "_Frame_Decorator"; + $reflower .= "_Frame_Reflower"; + + $deco = new $decorator($frame, $dompdf); + $deco->set_positioner( new $positioner($deco) ); + $reflow = new $reflower($deco); + + $deco->set_reflower( $reflow ); + + return $deco; + } +} diff --git a/application/third_party/dompdf/include/frame_reflower.cls.php b/application/third_party/dompdf/include/frame_reflower.cls.php new file mode 100644 index 00000000..febe473b --- /dev/null +++ b/application/third_party/dompdf/include/frame_reflower.cls.php @@ -0,0 +1,414 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Base reflower class + * + * Reflower objects are responsible for determining the width and height of + * individual frames. They also create line and page breaks as necessary. + * + * @access private + * @package dompdf + */ +abstract class Frame_Reflower { + + /** + * Frame for this reflower + * + * @var Frame + */ + protected $_frame; + + /** + * Cached min/max size + * + * @var array + */ + protected $_min_max_cache; + + function __construct(Frame $frame) { + $this->_frame = $frame; + $this->_min_max_cache = null; + } + + function dispose() { + clear_object($this); + } + + protected function _collapse_margins() { + $cb = $this->_frame->get_containing_block(); + $style = $this->_frame->get_style(); + + $t = $style->length_in_pt($style->margin_top, $cb["h"]); + $b = $style->length_in_pt($style->margin_bottom, $cb["h"]); + + // Handle 'auto' values + if ( $t === "auto" ) { + $style->margin_top = "0pt"; + $t = 0; + } + + if ( $b === "auto" ) { + $style->margin_bottom = "0pt"; + $b = 0; + } + + // Collapse vertical margins: + $n = $this->_frame->get_next_sibling(); + + // FIXME If there is a non-empty inline frame between the blocks, it is not taken into account + while ( $n && !in_array($n->get_style()->display, Style::$BLOCK_TYPES) ) { + $n = $n->get_next_sibling(); + } + + if ( $n ) { // && !$n instanceof Page_Frame_Decorator ) { + $b = max($b, $style->length_in_pt($n->get_style()->margin_top, $cb["h"])); + $n->get_style()->margin_top = "0pt"; + $style->margin_bottom = $b."pt"; + } + + // Collapse our first child's margin + $f = $this->_frame->get_first_child(); + while ( $f && !in_array($f->get_style()->display, Style::$BLOCK_TYPES) ) + $f = $f->get_next_sibling(); + + // Margin are collapsed only between block elements + if ( $f && in_array($f->get_style()->display, Style::$BLOCK_TYPES)) { + $t = max( $t, $style->length_in_pt($f->get_style()->margin_top, $cb["h"])); + $style->margin_top = $t."pt"; + $f->get_style()->margin_bottom = "0pt"; + } + + } + + //........................................................................ + + abstract function reflow(Frame_Decorator $block = null); + + //........................................................................ + + // Required for table layout: Returns an array(0 => min, 1 => max, "min" + // => min, "max" => max) of the minimum and maximum widths of this frame. + // This provides a basic implementation. Child classes should override + // this if necessary. + function get_min_max_width() { + if ( !is_null($this->_min_max_cache) ) { + return $this->_min_max_cache; + } + + $style = $this->_frame->get_style(); + + // Account for margins & padding + $dims = array($style->padding_left, + $style->padding_right, + $style->border_left_width, + $style->border_right_width, + $style->margin_left, + $style->margin_right); + + $cb_w = $this->_frame->get_containing_block("w"); + $delta = $style->length_in_pt($dims, $cb_w); + + // Handle degenerate case + if ( !$this->_frame->get_first_child() ) + return $this->_min_max_cache = array($delta, $delta,"min" => $delta, "max" => $delta); + + $low = array(); + $high = array(); + + for ( $iter = $this->_frame->get_children()->getIterator(); + $iter->valid(); + $iter->next() ) { + + $inline_min = 0; + $inline_max = 0; + + // Add all adjacent inline widths together to calculate max width + while ( $iter->valid() && in_array( $iter->current()->get_style()->display, Style::$INLINE_TYPES ) ) { + + $child = $iter->current(); + + $minmax = $child->get_min_max_width(); + + if ( in_array( $iter->current()->get_style()->white_space, array("pre", "nowrap") ) ) + $inline_min += $minmax["min"]; + else + $low[] = $minmax["min"]; + + $inline_max += $minmax["max"]; + $iter->next(); + + } + + if ( $inline_max > 0 ) + $high[] = $inline_max; + + if ( $inline_min > 0 ) + $low[] = $inline_min; + + if ( $iter->valid() ) { + list($low[], $high[]) = $iter->current()->get_min_max_width(); + continue; + } + + } + $min = count($low) ? max($low) : 0; + $max = count($high) ? max($high) : 0; + + // Use specified width if it is greater than the minimum defined by the + // content. If the width is a percentage ignore it for now. + $width = $style->width; + if ( $width !== "auto" && !is_percent($width) ) { + $width = $style->length_in_pt($width, $cb_w); + if ( $min < $width ) + $min = $width; + if ( $max < $width ) + $max = $width; + } + + $min += $delta; + $max += $delta; + return $this->_min_max_cache = array($min, $max, "min"=>$min, "max"=>$max); + } + + /** + * Parses a CSS string containing quotes and escaped hex characters + * + * @param $string string The CSS string to parse + * @param $single_trim + * @return string + */ + protected function _parse_string($string, $single_trim = false) { + if ($single_trim) { + $string = preg_replace("/^[\"\']/", "", $string); + $string = preg_replace("/[\"\']$/", "", $string); + } + else { + $string = trim($string, "'\""); + } + + $string = str_replace(array("\\\n",'\\"',"\\'"), + array("",'"',"'"), $string); + + // Convert escaped hex characters into ascii characters (e.g. \A => newline) + $string = preg_replace_callback("/\\\\([0-9a-fA-F]{0,6})(\s)?(?(2)|(?=[^0-9a-fA-F]))/", + create_function('$matches', + 'return chr(hexdec($matches[1]));'), + $string); + return $string; + } + + /** + * Parses a CSS "quotes" property + * + * @return array An array of pairs of quotes + */ + protected function _parse_quotes() { + + // Matches quote types + $re = "/(\'[^\']*\')|(\"[^\"]*\")/"; + + $quotes = $this->_frame->get_style()->quotes; + + // split on spaces, except within quotes + if (!preg_match_all($re, "$quotes", $matches, PREG_SET_ORDER)) + return; + + $quotes_array = array(); + foreach($matches as &$_quote){ + $quotes_array[] = $this->_parse_string($_quote[0], true); + } + + if ( empty($quotes_array) ) { + $quotes_array = array('"', '"'); + } + + return array_chunk($quotes_array, 2); + } + + /** + * Parses the CSS "content" property + * + * @return string The resulting string + */ + protected function _parse_content() { + + // Matches generated content + $re = "/\n". + "\s(counters?\\([^)]*\\))|\n". + "\A(counters?\\([^)]*\\))|\n". + "\s([\"']) ( (?:[^\"']|\\\\[\"'])+ )(?_frame->get_style()->content; + + $quotes = $this->_parse_quotes(); + + // split on spaces, except within quotes + if (!preg_match_all($re, $content, $matches, PREG_SET_ORDER)) + return; + + $text = ""; + + foreach ($matches as $match) { + + if ( isset($match[2]) && $match[2] !== "" ) + $match[1] = $match[2]; + + if ( isset($match[6]) && $match[6] !== "" ) + $match[4] = $match[6]; + + if ( isset($match[8]) && $match[8] !== "" ) + $match[7] = $match[8]; + + if ( isset($match[1]) && $match[1] !== "" ) { + + // counters?(...) + $match[1] = mb_strtolower(trim($match[1])); + + // Handle counter() references: + // http://www.w3.org/TR/CSS21/generate.html#content + + $i = mb_strpos($match[1], ")"); + if ( $i === false ) + continue; + + $args = explode(",", mb_substr($match[1], 8, $i - 8)); + $counter_id = $args[0]; + + if ( $match[1][7] === "(" ) { + // counter(name [,style]) + + if ( isset($args[1]) ) + $type = trim($args[1]); + else + $type = null; + + $p = $this->_frame->find_block_parent(); + + $text .= $p->counter_value($counter_id, $type); + + } else if ( $match[1][7] === "s" ) { + // counters(name, string [,style]) + if ( isset($args[1]) ) + $string = $this->_parse_string(trim($args[1])); + else + $string = ""; + + if ( isset($args[2]) ) + $type = $args[2]; + else + $type = null; + + $p = $this->_frame->find_block_parent(); + $tmp = ""; + while ($p) { + $tmp = $p->counter_value($counter_id, $type) . $string . $tmp; + $p = $p->find_block_parent(); + } + $text .= $tmp; + + } else + // countertops? + continue; + + } else if ( isset($match[4]) && $match[4] !== "" ) { + // String match + $text .= $this->_parse_string($match[4]); + + } else if ( isset($match[7]) && $match[7] !== "" ) { + // Directive match + + if ( $match[7] === "open-quote" ) { + // FIXME: do something here + $text .= $quotes[0][0]; + } else if ( $match[7] === "close-quote" ) { + // FIXME: do something else here + $text .= $quotes[0][1]; + } else if ( $match[7] === "no-open-quote" ) { + // FIXME: + } else if ( $match[7] === "no-close-quote" ) { + // FIXME: + } else if ( mb_strpos($match[7],"attr(") === 0 ) { + + $i = mb_strpos($match[7],")"); + if ( $i === false ) + continue; + + $attr = mb_substr($match[7], 5, $i - 5); + if ( $attr == "" ) + continue; + + $text .= $this->_frame->get_parent()->get_node()->getAttribute($attr); + } else + continue; + } + } + + return $text; + } + + /** + * Sets the generated content of a generated frame + */ + protected function _set_content(){ + $frame = $this->_frame; + $style = $frame->get_style(); + + if ( $style->content && $frame->get_node()->nodeName === "dompdf_generated" ) { + $content = $this->_parse_content(); + $node = $frame->get_node()->ownerDocument->createTextNode($content); + + $new_style = $style->get_stylesheet()->create_style(); + $new_style->inherit($style); + + $new_frame = new Frame($node); + $new_frame->set_style($new_style); + + Frame_Factory::decorate_frame($new_frame, $frame->get_dompdf()); + $new_frame->get_decorator()->set_root($frame->get_root()); + $frame->append_child($new_frame); + } + } +} diff --git a/application/third_party/dompdf/include/frame_tree.cls.php b/application/third_party/dompdf/include/frame_tree.cls.php new file mode 100644 index 00000000..3d5d2148 --- /dev/null +++ b/application/third_party/dompdf/include/frame_tree.cls.php @@ -0,0 +1,230 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: frame_tree.cls.php 332 2010-11-27 14:06:34Z fabien.menager $ */ + +/** + * Represents an entire document as a tree of frames + * + * The Frame_Tree consists of {@link Frame} objects each tied to specific + * DomNode objects in a specific DomDocument. The Frame_Tree has the same + * structure as the DomDocument, but adds additional capabalities for + * styling and layout. + * + * @package dompdf + * @access protected + */ +class Frame_Tree { + + /** + * Tags to ignore while parsing the tree + * + * @var array + */ + static protected $_HIDDEN_TAGS = array("area", "base", "basefont", "head", "style", + "meta", "title", "colgroup", + "noembed", "noscript", "param", "#comment"); + /** + * The main DomDocument + * + * @see http://ca2.php.net/manual/en/ref.dom.php + * @var DomDocument + */ + protected $_dom; + + /** + * The root node of the FrameTree. + * + * @var Frame + */ + protected $_root; + + /** + * Subtrees of absolutely positioned elements + * + * @var array of Frames + */ + protected $_absolute_frames; + + /** + * A mapping of {@link Frame} objects to DomNode objects + * + * @var array + */ + protected $_registry; + + + /** + * Class constructor + * + * @param DomDocument $dom the main DomDocument object representing the current html document + */ + function __construct(DomDocument $dom) { + $this->_dom = $dom; + $this->_root = null; + $this->_registry = array(); + } + + function __destruct() { + clear_object($this); + } + + /** + * Returns the DomDocument object representing the curent html document + * + * @return DomDocument + */ + function get_dom() { return $this->_dom; } + + /** + * Returns the root frame of the tree + * + * @return Frame + */ + function get_root() { return $this->_root; } + + /** + * Returns a specific frame given its id + * + * @param string $id + * @return Frame + */ + function get_frame($id) { return isset($this->_registry[$id]) ? $this->_registry[$id] : null; } + + /** + * Returns a post-order iterator for all frames in the tree + * + * @return FrameTreeList + */ + function get_frames() { return new FrameTreeList($this->_root); } + + /** + * Builds the tree + */ + function build_tree() { + $html = $this->_dom->getElementsByTagName("html")->item(0); + if ( is_null($html) ) + $html = $this->_dom->firstChild; + + if ( is_null($html) ) + throw new DOMPDF_Exception("Requested HTML document contains no data."); + + $this->_root = $this->_build_tree_r($html); + + } + + /** + * Recursively adds {@link Frame} objects to the tree + * + * Recursively build a tree of Frame objects based on a dom tree. + * No layout information is calculated at this time, although the + * tree may be adjusted (i.e. nodes and frames for generated content + * and images may be created). + * + * @param DomNode $node the current DomNode being considered + * @return Frame + */ + protected function _build_tree_r(DomNode $node) { + + $frame = new Frame($node); + $id = $frame->get_id(); + $this->_registry[ $id ] = $frame; + + if ( !$node->hasChildNodes() ) + return $frame; + + // Fixes 'cannot access undefined property for object with + // overloaded access', fix by Stefan radulian + // + //foreach ($node->childNodes as $child) { + + // Store the children in an array so that the tree can be modified + $children = array(); + for ($i = 0; $i < $node->childNodes->length; $i++) + $children[] = $node->childNodes->item($i); + + foreach ($children as $child) { + $node_name = mb_strtolower($child->nodeName); + + // Skip non-displaying nodes + if ( in_array($node_name, self::$_HIDDEN_TAGS) ) { + if ( $node_name !== "head" && + $node_name !== "style" ) + $child->parentNode->removeChild($child); + continue; + } + + // Skip empty text nodes + if ( $node_name === "#text" && $child->nodeValue == "" ) { + $child->parentNode->removeChild($child); + continue; + } + + // Skip empty image nodes + if ( $node_name === "img" && $child->getAttribute("src") == "" ) { + $child->parentNode->removeChild($child); + continue; + } + + $frame->append_child($this->_build_tree_r($child), false); + } + + return $frame; + } + + public function insert_node(DOMNode $node, DOMNode $new_node, $pos) { + if ($pos === "after" || !$node->firstChild) + $node->appendChild($new_node); + else + $node->insertBefore($new_node, $node->firstChild); + + $this->_build_tree_r($new_node); + + $frame_id = $new_node->getAttribute("frame_id"); + $frame = $this->get_frame($frame_id); + + $parent_id = $node->getAttribute("frame_id"); + $parent = $this->get_frame($parent_id); + + if ($pos === "before") + $parent->prepend_child($frame, false); + else + $parent->append_child($frame, false); + } +} diff --git a/application/third_party/dompdf/include/functions.inc.php b/application/third_party/dompdf/include/functions.inc.php new file mode 100644 index 00000000..23c3b1ab --- /dev/null +++ b/application/third_party/dompdf/include/functions.inc.php @@ -0,0 +1,942 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - trailing slash of base_path in build_url is no longer optional when + * required. This allows paths not ending in a slash, e.g. on dynamically + * created sites with page id in the url parameters. + * @version 20090601 + * - fix windows paths + * @version 20090610 + * - relax windows path syntax, use uniform path delimiter. Used for background images. + */ + +/* $Id: functions.inc.php 361 2011-02-16 21:03:05Z fabien.menager $ */ + +function def($name, $value = true) { + if (!defined($name)) { + define($name, $value); + } +} + +if ( !function_exists("pre_r") ) { +/** + * print_r wrapper for html/cli output + * + * Wraps print_r() output in < pre > tags if the current sapi is not + * 'cli'. Returns the output string instead of displaying it if $return is + * true. + * + * @param mixed $mixed variable or expression to display + * @param bool $return + * + */ +function pre_r($mixed, $return = false) { + if ($return) + return "
" . print_r($mixed, true) . "
"; + + if ( php_sapi_name() !== "cli") + echo ("
");
+  print_r($mixed);
+
+  if ( php_sapi_name() !== "cli")
+    echo("
"); + else + echo ("\n"); + flush(); + +} +} + +if ( !function_exists("pre_var_dump") ) { +/** + * var_dump wrapper for html/cli output + * + * Wraps var_dump() output in < pre > tags if the current sapi is not + * 'cli'. + * + * @param mixed $mixed variable or expression to display. + */ +function pre_var_dump($mixed) { + if ( php_sapi_name() !== "cli") + echo("
");
+    
+  var_dump($mixed);
+  
+  if ( php_sapi_name() !== "cli")
+    echo("
"); +} +} + +if ( !function_exists("d") ) { +/** + * generic debug function + * + * Takes everything and does its best to give a good debug output + * + * @param mixed $mixed variable or expression to display. + */ +function d($mixed) { + if ( php_sapi_name() !== "cli") + echo("
");
+    
+  // line
+  if (is_array($mixed) && array_key_exists("tallest_frame", $mixed)) {
+    echo "LINE:\n";
+    foreach($mixed as $key => $value) {
+      if (is_array($value) || is_object($value)) continue;
+      echo "  $key:\t".var_export($value,true)."\n";
+    }
+  }
+  
+  // other
+  else {
+    var_export($mixed);
+  }
+  
+  if ( php_sapi_name() !== "cli")
+    echo("
"); +} +} + +/** + * builds a full url given a protocol, hostname, base path and url + * + * @param string $protocol + * @param string $host + * @param string $base_path + * @param string $url + * @return string + * + * Initially the trailing slash of $base_path was optional, and conditionally appended. + * However on dynamically created sites, where the page is given as url parameter, + * the base path might not end with an url. + * Therefore do not append a slash, and **require** the $base_url to ending in a slash + * when needed. + * Vice versa, on using the local file system path of a file, make sure that the slash + * is appended (o.k. also for Windows) + */ +function build_url($protocol, $host, $base_path, $url) { + if ( mb_strlen($url) == 0 ) { + //return $protocol . $host . rtrim($base_path, "/\\") . "/"; + return $protocol . $host . $base_path; + } + + // Is the url already fully qualified or a Data URI? + if ( mb_strpos($url, "://") !== false || mb_strpos($url, "data:") === 0 ) + return $url; + + $ret = $protocol; + + if (!in_array(mb_strtolower($protocol), array("http://", "https://", "ftp://", "ftps://"))) { + //On Windows local file, an abs path can begin also with a '\' or a drive letter and colon + //drive: followed by a relative path would be a drive specific default folder. + //not known in php app code, treat as abs path + //($url[1] !== ':' || ($url[2]!=='\\' && $url[2]!=='/')) + if ($url[0] !== '/' && (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' || ($url[0] !== '\\' && $url[1] !== ':'))) { + // For rel path and local acess we ignore the host, and run the path through realpath() + $ret .= realpath($base_path).'/'; + } + $ret .= $url; + $ret = preg_replace("/\?(.*)$/", "", $ret); + return $ret; + } + + //remote urls with backslash in html/css are not really correct, but lets be genereous + if ( $url[0] === '/' || $url[0] === '\\' ) { + // Absolute path + $ret .= $host . $url; + } else { + // Relative path + //$base_path = $base_path !== "" ? rtrim($base_path, "/\\") . "/" : ""; + $ret .= $host . $base_path . $url; + } + + return $ret; + +} + +/** + * parse a full url or pathname and return an array(protocol, host, path, + * file + query + fragment) + * + * @param string $url + * @return array + */ +function explode_url($url) { + $protocol = ""; + $host = ""; + $path = ""; + $file = ""; + + $arr = parse_url($url); + + if ( isset($arr["scheme"]) && + $arr["scheme"] !== "file" && + mb_strlen($arr["scheme"]) > 1 ) // Exclude windows drive letters... + { + $protocol = $arr["scheme"] . "://"; + + if ( isset($arr["user"]) ) { + $host .= $arr["user"]; + + if ( isset($arr["pass"]) ) + $host .= "@" . $arr["pass"]; + + $host .= ":"; + } + + if ( isset($arr["host"]) ) + $host .= $arr["host"]; + + if ( isset($arr["port"]) ) + $host .= ":" . $arr["port"]; + + if ( isset($arr["path"]) && $arr["path"] !== "" ) { + // Do we have a trailing slash? + if ( $arr["path"][ mb_strlen($arr["path"]) - 1 ] === "/" ) { + $path = $arr["path"]; + $file = ""; + } else { + $path = dirname($arr["path"]) . "/"; + $file = basename($arr["path"]); + } + } + + if ( isset($arr["query"]) ) + $file .= "?" . $arr["query"]; + + if ( isset($arr["fragment"]) ) + $file .= "#" . $arr["fragment"]; + + } else { + + $i = mb_strpos($url, "file://"); + if ( $i !== false) + $url = mb_substr($url, $i + 7); + + $protocol = ""; // "file://"; ? why doesn't this work... It's because of + // network filenames like //COMPU/SHARENAME + + $host = ""; // localhost, really + $file = basename($url); + + $path = dirname($url); + + // Check that the path exists + if ( $path !== false ) { + $path .= '/'; + + } else { + // generate a url to access the file if no real path found. + $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://'; + + $host = isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : php_uname("n"); + + if ( substr($arr["path"], 0, 1) === '/' ) { + $path = dirname($arr["path"]); + } else { + $path = '/' . rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/') . '/' . $arr["path"]; + } + } + } + + $ret = array($protocol, $host, $path, $file, + "protocol" => $protocol, + "host" => $host, + "path" => $path, + "file" => $file); + return $ret; +} + +/** + * converts decimal numbers to roman numerals + * + * @param int $num + * @return string + */ +function dec2roman($num) { + + static $ones = array("", "i", "ii", "iii", "iv", "v", + "vi", "vii", "viii", "ix"); + static $tens = array("", "x", "xx", "xxx", "xl", "l", + "lx", "lxx", "lxxx", "xc"); + static $hund = array("", "c", "cc", "ccc", "cd", "d", + "dc", "dcc", "dccc", "cm"); + static $thou = array("", "m", "mm", "mmm"); + + if ( !is_numeric($num) ) + throw new DOMPDF_Exception("dec2roman() requires a numeric argument."); + + if ( $num > 4000 || $num < 0 ) + return "(out of range)"; + + $num = strrev((string)$num); + + $ret = ""; + switch (mb_strlen($num)) { + case 4: $ret .= $thou[$num[3]]; + case 3: $ret .= $hund[$num[2]]; + case 2: $ret .= $tens[$num[1]]; + case 1: $ret .= $ones[$num[0]]; + default: break; + } + return $ret; + +} + +/** + * Determines whether $value is a percentage or not + * + * @param float $value + * @return bool + */ +function is_percent($value) { return false !== mb_strpos($value, "%"); } + +/** + * Parses a data URI scheme + * http://en.wikipedia.org/wiki/Data_URI_scheme + * @param string $data_uri The data URI to parse + * @return array The result with charset, mime type and decoded data + */ +function parse_data_uri($data_uri) { + if (!preg_match('/^data:(?P[a-z0-9\/+-.]+)(;charset=(?P[a-z0-9-])+)?(?P;base64)?\,(?P.*)?/i', $data_uri, $match)) { + return false; + } + + $match['data'] = rawurldecode($match['data']); + $result = array( + 'charset' => $match['charset'] ? $match['charset'] : 'US-ASCII', + 'mime' => $match['mime'] ? $match['mime'] : 'text/plain', + 'data' => $match['base64'] ? base64_decode($match['data']) : $match['data'], + ); + + return $result; +} + +/** + * mb_string compatibility + */ +if ( !function_exists("mb_strlen") ) { + + define('MB_OVERLOAD_MAIL', 1); + define('MB_OVERLOAD_STRING', 2); + define('MB_OVERLOAD_REGEX', 4); + define('MB_CASE_UPPER', 0); + define('MB_CASE_LOWER', 1); + define('MB_CASE_TITLE', 2); + + function mb_convert_encoding($data, $to_encoding, $from_encoding = 'UTF-8') { + if (str_replace('-', '', strtolower($to_encoding)) === 'utf8') { + return utf8_encode($data); + } else { + return utf8_decode($data); + } + } + + function mb_detect_encoding($data, $encoding_list = array('iso-8859-1'), $strict = false) { + return 'iso-8859-1'; + } + + function mb_detect_order($encoding_list = array('iso-8859-1')) { + return 'iso-8859-1'; + } + + function mb_internal_encoding($encoding = null) { + if (isset($encoding)) { + return true; + } else { + return 'iso-8859-1'; + } + } + + function mb_strlen($str, $encoding = 'iso-8859-1') { + switch (str_replace('-', '', strtolower($encoding))) { + case "utf8": return strlen(utf8_encode($str)); + case "8bit": return strlen($str); + default: return strlen(utf8_decode($str)); + } + } + + function mb_strpos($haystack, $needle, $offset = 0) { + return strpos($haystack, $needle, $offset); + } + + function mb_strrpos($haystack, $needle, $offset = 0) { + return strrpos($haystack, $needle, $offset); + } + + function mb_strtolower( $str ) { + return strtolower($str); + } + + function mb_strtoupper( $str ) { + return strtoupper($str); + } + + function mb_substr($string, $start, $length = null, $encoding = 'iso-8859-1') { + if ( is_null($length) ) + return substr($string, $start); + else + return substr($string, $start, $length); + } + + function mb_substr_count($haystack, $needle, $encoding = 'iso-8859-1') { + return substr_count($haystack, $needle); + } + + function mb_encode_numericentity($str, $convmap, $encoding) { + return htmlspecialchars($str); + } + + function mb_convert_case($str, $mode = MB_CASE_UPPER, $encoding = array()) { + switch($mode) { + case MB_CASE_UPPER: return mb_strtoupper($str); + case MB_CASE_LOWER: return mb_strtolower($str); + case MB_CASE_TITLE: return ucwords(mb_strtolower($str)); + default: return $str; + } + } + + function mb_list_encodings() { + return array( + "ISO-8859-1", + "UTF-8", + "8bit", + ); + } +} + +/** + * Decoder for RLE8 compression in windows bitmaps + * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp + */ +function rle8_decode ($str, $width){ + $lineWidth = $width + (3 - ($width-1) % 4); + $out = ''; + $cnt = strlen($str); + + for ($i = 0; $i <$cnt; $i++) { + $o = ord($str[$i]); + switch ($o){ + case 0: # ESCAPE + $i++; + switch (ord($str[$i])){ + case 0: # NEW LINE + $padCnt = $lineWidth - strlen($out)%$lineWidth; + if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line + break; + case 1: # END OF FILE + $padCnt = $lineWidth - strlen($out)%$lineWidth; + if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line + break 3; + case 2: # DELTA + $i += 2; + break; + default: # ABSOLUTE MODE + $num = ord($str[$i]); + for ($j = 0; $j < $num; $j++) + $out .= $str[++$i]; + if ($num % 2) $i++; + } + break; + default: + $out .= str_repeat($str[++$i], $o); + } + } + return $out; +} + +/** + * Decoder for RLE4 compression in windows bitmaps + * see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp + */ +function rle4_decode ($str, $width) { + $w = floor($width/2) + ($width % 2); + $lineWidth = $w + (3 - ( ($width-1) / 2) % 4); + $pixels = array(); + $cnt = strlen($str); + + for ($i = 0; $i < $cnt; $i++) { + $o = ord($str[$i]); + switch ($o) { + case 0: # ESCAPE + $i++; + switch (ord($str[$i])){ + case 0: # NEW LINE + while (count($pixels)%$lineWidth!=0) + $pixels[]=0; + break; + case 1: # END OF FILE + while (count($pixels)%$lineWidth!=0) + $pixels[]=0; + break 3; + case 2: # DELTA + $i += 2; + break; + default: # ABSOLUTE MODE + $num = ord($str[$i]); + for ($j = 0; $j < $num; $j++){ + if ($j%2 == 0){ + $c = ord($str[++$i]); + $pixels[] = ($c & 240)>>4; + } else + $pixels[] = $c & 15; + } + if ($num % 2) $i++; + } + break; + default: + $c = ord($str[++$i]); + for ($j = 0; $j < $o; $j++) + $pixels[] = ($j%2==0 ? ($c & 240)>>4 : $c & 15); + } + } + + $out = ''; + if (count($pixels)%2) $pixels[]=0; + $cnt = count($pixels)/2; + + for ($i = 0; $i < $cnt; $i++) + $out .= chr(16*$pixels[2*$i] + $pixels[2*$i+1]); + + return $out; +} + +if ( !function_exists("imagecreatefrombmp") ) { + +/** + * Credit goes to mgutt + * http://www.programmierer-forum.de/function-imagecreatefrombmp-welche-variante-laeuft-t143137.htm + * Modified by Fabien Menager to support RGB555 BMP format + */ +function imagecreatefrombmp($filename) { + try { + // version 1.00 + if (!($fh = fopen($filename, 'rb'))) { + trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING); + return false; + } + + // read file header + $meta = unpack('vtype/Vfilesize/Vreserved/Voffset', fread($fh, 14)); + + // check for bitmap + if ($meta['type'] != 19778) { + trigger_error('imagecreatefrombmp: ' . $filename . ' is not a bitmap!', E_USER_WARNING); + return false; + } + + // read image header + $meta += unpack('Vheadersize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vcolors/Vimportant', fread($fh, 40)); + + // read additional bitfield header + if ($meta['compression'] == 3) { + $meta += unpack('VrMask/VgMask/VbMask', fread($fh, 12)); + } + + //pre_r($filename);pre_r($meta); + + // set bytes and padding + $meta['bytes'] = $meta['bits'] / 8; + $meta['decal'] = 4 - (4 * (($meta['width'] * $meta['bytes'] / 4)- floor($meta['width'] * $meta['bytes'] / 4))); + if ($meta['decal'] == 4) { + $meta['decal'] = 0; + } + + // obtain imagesize + if ($meta['imagesize'] < 1) { + $meta['imagesize'] = $meta['filesize'] - $meta['offset']; + // in rare cases filesize is equal to offset so we need to read physical size + if ($meta['imagesize'] < 1) { + $meta['imagesize'] = @filesize($filename) - $meta['offset']; + if ($meta['imagesize'] < 1) { + trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $filename . '!', E_USER_WARNING); + return false; + } + } + } + + // calculate colors + $meta['colors'] = !$meta['colors'] ? pow(2, $meta['bits']) : $meta['colors']; + + // read color palette + $palette = array(); + if ($meta['bits'] < 16) { + $palette = unpack('l' . $meta['colors'], fread($fh, $meta['colors'] * 4)); + // in rare cases the color value is signed + if ($palette[1] < 0) { + foreach ($palette as $i => $color) { + $palette[$i] = $color + 16777216; + } + } + } + + // create gd image + $im = imagecreatetruecolor($meta['width'], $meta['height']); + $data = fread($fh, $meta['imagesize']); + + // uncompress data + switch ($meta['compression']) { + case 1: $data = rle8_decode($data, $meta['width']); break; + case 2: $data = rle4_decode($data, $meta['width']); break; + } + + $p = 0; + $vide = chr(0); + $y = $meta['height'] - 1; + $error = 'imagecreatefrombmp: ' . $filename . ' has not enough data!'; + + // loop through the image data beginning with the lower left corner + while ($y >= 0) { + $x = 0; + while ($x < $meta['width']) { + switch ($meta['bits']) { + case 32: + case 24: + if (!($part = substr($data, $p, 3 /*$meta['bytes']*/))) { + trigger_error($error, E_USER_WARNING); + return $im; + } + $color = unpack('V', $part . $vide); + break; + case 16: + if (!($part = substr($data, $p, 2 /*$meta['bytes']*/))) { + trigger_error($error, E_USER_WARNING); + return $im; + } + $color = unpack('v', $part); + + if (empty($meta['rMask']) || $meta['rMask'] != 0xf800) + $color[1] = (($color[1] & 0x7c00) >> 7) * 65536 + (($color[1] & 0x03e0) >> 2) * 256 + (($color[1] & 0x001f) << 3); // 555 + else + $color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3); // 565 + break; + case 8: + $color = unpack('n', $vide . substr($data, $p, 1)); + $color[1] = $palette[ $color[1] + 1 ]; + break; + case 4: + $color = unpack('n', $vide . substr($data, floor($p), 1)); + $color[1] = ($p * 2) % 2 == 0 ? $color[1] >> 4 : $color[1] & 0x0F; + $color[1] = $palette[ $color[1] + 1 ]; + break; + case 1: + $color = unpack('n', $vide . substr($data, floor($p), 1)); + switch (($p * 8) % 8) { + case 0: $color[1] = $color[1] >> 7; break; + case 1: $color[1] = ($color[1] & 0x40) >> 6; break; + case 2: $color[1] = ($color[1] & 0x20) >> 5; break; + case 3: $color[1] = ($color[1] & 0x10) >> 4; break; + case 4: $color[1] = ($color[1] & 0x8 ) >> 3; break; + case 5: $color[1] = ($color[1] & 0x4 ) >> 2; break; + case 6: $color[1] = ($color[1] & 0x2 ) >> 1; break; + case 7: $color[1] = ($color[1] & 0x1 ); break; + } + $color[1] = $palette[ $color[1] + 1 ]; + break; + default: + trigger_error('imagecreatefrombmp: ' . $filename . ' has ' . $meta['bits'] . ' bits and this is not supported!', E_USER_WARNING); + return false; + } + imagesetpixel($im, $x, $y, $color[1]); + $x++; + $p += $meta['bytes']; + } + $y--; + $p += $meta['decal']; + } + fclose($fh); + return $im; + } catch (Exception $e) {var_dump($e);} +} +} + +/** + * getimagesize doesn't give a good size for 32bit BMP image v5 + * + * @param string $filename + * @return array The same format as getimagesize($filename) + */ +function dompdf_getimagesize($filename) { + $size = getimagesize($filename); + + if ( $size[0] == null || $size[1] == null ) { + $data = file_get_contents($filename, null, null, 0, 26); + + if ( substr($data, 0, 2) === "BM" ) { + $meta = unpack('vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight', $data); + $size[0] = (int)$meta['width']; + $size[1] = (int)$meta['height']; + } + } + + return $size; +} + +/** + * Converts a CMYK color to RGB + * + * @param int $c + * @param int $m + * @param int $y + * @param int $k + * @return object + */ +function cmyk_to_rgb($c, $m = null, $y = null, $k = null) { + if (is_array($c)) { + list($c, $m, $y, $k) = $c; + } + + $c *= 255; + $m *= 255; + $y *= 255; + $k *= 255; + + $r = (1 - round(2.55 * ($c+$k))) ; + $g = (1 - round(2.55 * ($m+$k))) ; + $b = (1 - round(2.55 * ($y+$k))) ; + + if($r<0) $r = 0; + if($g<0) $g = 0; + if($b<0) $b = 0; + + return array( + $r, $g, $b, + "r" => $r, "g" => $g, "b" => $b + ); +} + +function unichr($c) { + if ($c <= 0x7F) { + return chr($c); + } else if ($c <= 0x7FF) { + return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F); + } else if ($c <= 0xFFFF) { + return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F) + . chr(0x80 | $c & 0x3F); + } else if ($c <= 0x10FFFF) { + return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F) + . chr(0x80 | $c >> 6 & 0x3F) + . chr(0x80 | $c & 0x3F); + } + return false; +} + +if ( !function_exists("date_default_timezone_get") ) { + function date_default_timezone_get() { + return ""; + } + + function date_default_timezone_set($timezone_identifier) { + return true; + } +} + +/** + * Stores warnings in an array for display later + * + * This function allows warnings generated by the DomDocument parser + * and CSS loader ({@link Stylesheet}) to be captured and displayed + * later. Without this function, errors are displayed immediately and + * PDF streaming is impossible. + * + * @see http://www.php.net/manual/en/function.set-error_handler.php + * + * @param int $errno + * @param string $errstr + * @param string $errfile + * @param string $errline + */ +function record_warnings($errno, $errstr, $errfile, $errline) { + + if ( !($errno & (E_WARNING | E_NOTICE | E_USER_NOTICE | E_USER_WARNING )) ) // Not a warning or notice + throw new DOMPDF_Exception($errstr . " $errno"); + + global $_dompdf_warnings; + global $_dompdf_show_warnings; + + if ( $_dompdf_show_warnings ) + echo $errstr . "\n"; + + $_dompdf_warnings[] = $errstr; +} + +/** + * Print a useful backtrace + */ +function bt() { + if ( php_sapi_name() !== "cli") + echo("
");
+    
+  $bt = debug_backtrace();
+
+  array_shift($bt); // remove actual bt() call
+  echo "\n";
+
+  $i = 0;
+  foreach ($bt as $call) {
+    $file = basename($call["file"]) . " (" . $call["line"] . ")";
+    if ( isset($call["class"]) ) {
+      $func = $call["class"] . "->" . $call["function"] . "()";
+    } else {
+      $func = $call["function"] . "()";
+    }
+
+    echo "#" . str_pad($i, 2, " ", STR_PAD_RIGHT) . ": " . str_pad($file.":", 42) . " $func\n";
+    $i++;
+  }
+  echo "\n";
+  
+  if ( php_sapi_name() !== "cli")
+    echo("
"); +} + +/** + * Print debug messages + * + * @param string $type The type of debug messages to print + */ +function dompdf_debug($type, $msg) { + global $_DOMPDF_DEBUG_TYPES, $_dompdf_show_warnings, $_dompdf_debug; + if ( isset($_DOMPDF_DEBUG_TYPES[$type]) && ($_dompdf_show_warnings || $_dompdf_debug) ) { + $arr = debug_backtrace(); + + echo basename($arr[0]["file"]) . " (" . $arr[0]["line"] ."): " . $arr[1]["function"] . ": "; + pre_r($msg); + } +} + +if ( !function_exists("print_memusage") ) { +/** + * Dump memory usage + */ +function print_memusage() { + global $memusage; + echo ("Memory Usage\n"); + $prev = 0; + $initial = reset($memusage); + echo (str_pad("Initial:", 40) . $initial . "\n\n"); + + foreach ($memusage as $key=>$mem) { + $mem -= $initial; + echo (str_pad("$key:" , 40)); + echo (str_pad("$mem", 12) . "(diff: " . ($mem - $prev) . ")\n"); + $prev = $mem; + } + + echo ("\n" . str_pad("Total:", 40) . memory_get_usage()) . "\n"; +} +} + +if ( !function_exists("enable_mem_profile") ) { +/** + * Initialize memory profiling code + */ +function enable_mem_profile() { + global $memusage; + $memusage = array("Startup" => memory_get_usage()); + register_shutdown_function("print_memusage"); +} +} + +if ( !function_exists("mark_memusage") ) { +/** + * Record the current memory usage + * + * @param string $location a meaningful location + */ +function mark_memusage($location) { + global $memusage; + if ( isset($memusage) ) + $memusage[$location] = memory_get_usage(); +} +} + +if ( !function_exists('sys_get_temp_dir')) { +/** + * Find the current system temporary directory + * + * @link http://us.php.net/manual/en/function.sys-get-temp-dir.php#85261 + */ +function sys_get_temp_dir() { + if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); } + if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); } + if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); } + $tempfile=tempnam(uniqid(rand(),TRUE),''); + if (file_exists($tempfile)) { + unlink($tempfile); + return realpath(dirname($tempfile)); + } +} +} + +if ( function_exists("memory_get_peak_usage") ) { + function DOMPDF_memory_usage(){ + return memory_get_peak_usage(true); + } +} +else if ( function_exists("memory_get_peak_usage") ) { + function DOMPDF_memory_usage(){ + return memory_get_usage(true); + } +} +else { + function DOMPDF_memory_usage(){ + return "N/A"; + } +} + +/** + * Affect null to the unused objects + * @param unknown_type $object + */ +function clear_object(&$object) { + if ( is_object($object) ) { + foreach (array_keys((array)$object) as $key) { + clear_object($property); + } + foreach(get_class_vars(get_class($object)) as $property => $value) { + clear_object($property); + } + } + $object = null; + unset($object); +} diff --git a/application/third_party/dompdf/include/gd_adapter.cls.php b/application/third_party/dompdf/include/gd_adapter.cls.php new file mode 100644 index 00000000..58dde2da --- /dev/null +++ b/application/third_party/dompdf/include/gd_adapter.cls.php @@ -0,0 +1,840 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: gd_adapter.cls.php 355 2011-01-27 07:44:54Z fabien.menager $ */ + +/** + * Image rendering interface + * + * Renders to an image format supported by GD (jpeg, gif, png, xpm). + * Not super-useful day-to-day but handy nonetheless + * + * @package dompdf + */ +class GD_Adapter implements Canvas { + + /** + * Resoure handle for the image + * + * @var resource + */ + private $_img; + + /** + * Image width in pixels + * + * @var int + */ + private $_width; + + /** + * Image height in pixels + * + * @var int + */ + private $_height; + + /** + * Current page number + * + * @var int + */ + private $_page_number; + + /** + * Total number of pages + * + * @var int + */ + private $_page_count; + + /** + * Image antialias factor + * + * @var float + */ + private $_aa_factor; + + /** + * Allocated colors + * + * @var array + */ + private $_colors; + + /** + * Background color + * + * @var int + */ + private $_bg_color; + + /** + * Class constructor + * + * @param mixed $size The size of image to create: array(x1,y1,x2,y2) or "letter", "legal", etc. + * @param string $orientation The orientation of the document (either 'landscape' or 'portrait') + * @param float $aa_factor Anti-aliasing factor, 1 for no AA + * @param array $bg_color Image background color: array(r,g,b,a), 0 <= r,g,b,a <= 1 + */ + function __construct($size, $orientation = "portrait", $aa_factor = 1, $bg_color = array(1,1,1,0) ) { + + if ( !is_array($size) ) { + $size = strtolower($size); + + if ( isset(CPDF_Adapter::$PAPER_SIZES[$size]) ) + $size = CPDF_Adapter::$PAPER_SIZES[$size]; + else + $size = CPDF_Adapter::$PAPER_SIZES["letter"]; + } + + if ( strtolower($orientation) === "landscape" ) { + list($size[2],$size[3]) = array($size[3],$size[2]); + } + + if ( $aa_factor < 1 ) + $aa_factor = 1; + + $this->_aa_factor = $aa_factor; + + $size[2] *= $aa_factor; + $size[3] *= $aa_factor; + + $this->_width = $size[2] - $size[0]; + $this->_height = $size[3] - $size[1]; + + $this->_img = imagecreatetruecolor($this->_width, $this->_height); + + if ( is_null($bg_color) || !is_array($bg_color) ) { + // Pure white bg + $bg_color = array(1,1,1,0); + } + + $this->_bg_color = $this->_allocate_color($bg_color); + imagealphablending($this->_img, true); + imagesavealpha($this->_img, true); + imagefill($this->_img, 0, 0, $this->_bg_color); + + } + + /** + * Return the GF image resource + * + * @return resource + */ + function get_image() { return $this->_img; } + + /** + * Return the image's width in pixels + * + * @return float + */ + function get_width() { return $this->_width / $this->_aa_factor; } + + /** + * Return the image's height in pixels + * + * @return float + */ + function get_height() { return $this->_height / $this->_aa_factor; } + + /** + * Returns the current page number + * @return int + */ + function get_page_number() { return $this->_page_number; } + + /** + * Returns the total number of pages in the document + * @return int + */ + function get_page_count() { return $this->_page_count; } + + /** + * Sets the current page number + * + * @param int $num + */ + function set_page_number($num) { $this->_page_number = $num; } + + /** + * Sets the page count + * + * @param int $count + */ + function set_page_count($count) { $this->_page_count = $count; } + + /** + * Sets the opacity + * + * @param $opacity + * @param $mode + */ + function set_opacity($opacity, $mode = "Normal") { + // FIXME + } + + /** + * Allocate a new color. Allocate with GD as needed and store + * previously allocated colors in $this->_colors. + * + * @param array $color The new current color + * @return int The allocated color + */ + private function _allocate_color($color) { + + if ( isset($color["c"]) ) { + $color = cmyk_to_rgb($color); + } + + // Full opacity if no alpha set + if ( !isset($color[3]) ) + $color[3] = 0; + + list($r,$g,$b,$a) = $color; + + $r *= 255; + $g *= 255; + $b *= 255; + $a *= 127; + + // Clip values + $r = $r > 255 ? 255 : $r; + $g = $g > 255 ? 255 : $g; + $b = $b > 255 ? 255 : $b; + $a = $a > 127 ? 127 : $a; + + $r = $r < 0 ? 0 : $r; + $g = $g < 0 ? 0 : $g; + $b = $b < 0 ? 0 : $b; + $a = $a < 0 ? 0 : $a; + + $key = sprintf("#%02X%02X%02X%02X", $r, $g, $b, $a); + + if ( isset($this->_colors[$key]) ) + return $this->_colors[$key]; + + if ( $a != 0 ) + $this->_colors[$key] = imagecolorallocatealpha($this->_img, $r, $g, $b, $a); + else + $this->_colors[$key] = imagecolorallocate($this->_img, $r, $g, $b); + + return $this->_colors[$key]; + + } + + /** + * Draws a line from x1,y1 to x2,y2 + * + * See {@link Style::munge_color()} for the format of the color array. + * See {@link Cpdf::setLineStyle()} for a description of the format of the + * $style parameter (aka dash). + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param array $color + * @param float $width + * @param array $style + */ + function line($x1, $y1, $x2, $y2, $color, $width, $style = null) { + + // Scale by the AA factor + $x1 *= $this->_aa_factor; + $y1 *= $this->_aa_factor; + $x2 *= $this->_aa_factor; + $y2 *= $this->_aa_factor; + $width *= $this->_aa_factor; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if ( !is_null($style) ) { + $gd_style = array(); + + if ( count($style) == 1 ) { + for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) { + $gd_style[] = $c; + } + + for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) { + $gd_style[] = $this->_bg_color; + } + + } else { + + $i = 0; + foreach ($style as $length) { + + if ( $i % 2 == 0 ) { + // 'On' pattern + for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) + $gd_style[] = $c; + + } else { + // Off pattern + for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) + $gd_style[] = $this->_bg_color; + + } + $i++; + } + } + + imagesetstyle($this->_img, $gd_style); + $c = IMG_COLOR_STYLED; + } + + imagesetthickness($this->_img, $width); + + imageline($this->_img, $x1, $y1, $x2, $y2, $c); + + } + + /** + * Draws a rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_color()} for the format of the color array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + * @param float $width + * @param array $style + */ + function rectangle($x1, $y1, $w, $h, $color, $width, $style = null) { + + // Scale by the AA factor + $x1 *= $this->_aa_factor; + $y1 *= $this->_aa_factor; + $w *= $this->_aa_factor; + $h *= $this->_aa_factor; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if ( !is_null($style) ) { + $gd_style = array(); + + foreach ($style as $length) { + for ($i = 0; $i < $length; $i++) { + $gd_style[] = $c; + } + } + + imagesetstyle($this->_img, $gd_style); + $c = IMG_COLOR_STYLED; + } + + imagesetthickness($this->_img, $width); + + imagerectangle($this->_img, $x1, $y1, $x1 + $w, $y1 + $h, $c); + + } + + /** + * Draws a filled rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_color()} for the format of the color array. + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + */ + function filled_rectangle($x1, $y1, $w, $h, $color) { + + // Scale by the AA factor + $x1 *= $this->_aa_factor; + $y1 *= $this->_aa_factor; + $w *= $this->_aa_factor; + $h *= $this->_aa_factor; + + $c = $this->_allocate_color($color); + + imagefilledrectangle($this->_img, $x1, $y1, $x1 + $w, $y1 + $h, $c); + + } + + /** + * Starts a clipping rectangle at x1,y1 with width w and height h + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + */ + function clipping_rectangle($x1, $y1, $w, $h) { + // @todo + } + + /** + * Ends the last clipping shape + */ + function clipping_end() { + // @todo + } + + function save() { + // @todo + } + + function restore() { + // @todo + } + + function rotate($angle, $x, $y) { + // @todo + } + + function skew($angle_x, $angle_y, $x, $y) { + // @todo + } + + function scale($s_x, $s_y, $x, $y) { + // @todo + } + + function translate($t_x, $t_y) { + // @todo + } + + function transform($a, $b, $c, $d, $e, $f) { + // @todo + } + + /** + * Draws a polygon + * + * The polygon is formed by joining all the points stored in the $points + * array. $points has the following structure: + * + * array(0 => x1, + * 1 => y1, + * 2 => x2, + * 3 => y2, + * ... + * ); + * + * + * See {@link Style::munge_color()} for the format of the color array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param array $points + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the polygon if true + */ + function polygon($points, $color, $width = null, $style = null, $fill = false) { + + // Scale each point by the AA factor + foreach (array_keys($points) as $i) + $points[$i] *= $this->_aa_factor; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if ( !is_null($style) && !$fill ) { + $gd_style = array(); + + foreach ($style as $length) { + for ($i = 0; $i < $length; $i++) { + $gd_style[] = $c; + } + } + + imagesetstyle($this->_img, $gd_style); + $c = IMG_COLOR_STYLED; + } + + imagesetthickness($this->_img, $width); + + if ( $fill ) + imagefilledpolygon($this->_img, $points, count($points) / 2, $c); + else + imagepolygon($this->_img, $points, count($points) / 2, $c); + + } + + /** + * Draws a circle at $x,$y with radius $r + * + * See {@link Style::munge_color()} for the format of the color array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x + * @param float $y + * @param float $r + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the circle if true + */ + function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false) { + + // Scale by the AA factor + $x *= $this->_aa_factor; + $y *= $this->_aa_factor; + $r *= $this->_aa_factor; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if ( !is_null($style) && !$fill ) { + $gd_style = array(); + + foreach ($style as $length) { + for ($i = 0; $i < $length; $i++) { + $gd_style[] = $c; + } + } + + imagesetstyle($this->_img, $gd_style); + $c = IMG_COLOR_STYLED; + } + + imagesetthickness($this->_img, $width); + + if ( $fill ) + imagefilledellipse($this->_img, $x, $y, $r, $r, $c); + else + imageellipse($this->_img, $x, $y, $r, $r, $c); + + } + + /** + * Add an image to the pdf. + * + * The image is placed at the specified x and y coordinates with the + * given width and height. + * + * @param string $img_url the path to the image + * @param string $img_type the type (e.g. extension) of the image + * @param float $x x position + * @param float $y y position + * @param int $w width (in pixels) + * @param int $h height (in pixels) + */ + function image($img_url, $img_type, $x, $y, $w, $h) { + + switch ($img_type) { + case "png": + $src = @imagecreatefrompng($img_url); + break; + + case "gif": + $src = @imagecreatefromgif($img_url); + break; + + case "bmp": + $src = @imagecreatefrombmp($img_url); + break; + + case "jpg": + case "jpeg": + $src = @imagecreatefromjpeg($img_url); + break; + + default: + break; + + } + + if ( !$src ) + return; // Probably should add to $_dompdf_errors or whatever here + + // Scale by the AA factor + $x *= $this->_aa_factor; + $y *= $this->_aa_factor; + + $w *= $this->_aa_factor; + $h *= $this->_aa_factor; + + $img_w = imagesx($src); + $img_h = imagesy($src); + + + imagecopyresampled($this->_img, $src, $x, $y, 0, 0, $w, $h, $img_w, $img_h); + + } + + /** + * Writes text at the specified x and y coordinates + * + * See {@link Style::munge_color()} for the format of the color array. + * + * @param float $x + * @param float $y + * @param string $text the text to write + * @param string $font the font file to use + * @param float $size the font size, in points + * @param array $color + * @param float $adjust word spacing adjustment + * @param float $angle Text angle + */ + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_spacing = 0, $char_spacing = 0, $angle = 0) { + + // Scale by the AA factor + $x *= $this->_aa_factor; + $y *= $this->_aa_factor; + $size *= $this->_aa_factor; + + $h = $this->get_font_height($font, $size); + $c = $this->_allocate_color($color); + + $text = mb_encode_numericentity($text, array(0x0080, 0xff, 0, 0xff), 'UTF-8'); + + if ( strpos($font, '.ttf') === false ) + $font .= ".ttf"; + + // FIXME: word spacing + @imagettftext($this->_img, $size, $angle, $x, $y + $h, $c, $font, $text); + + } + + function javascript($code) { + // Not implemented + } + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname) { + // Not implemented + } + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height) { + // Not implemented + } + + /** + * Add meta information to the PDF + * + * @param string $label label of the value (Creator, Producer, etc.) + * @param string $value the text to set + */ + function add_info($label, $value) { + // N/A + } + + /** + * Calculates text size, in points + * + * @param string $text the text to be sized + * @param string $font the desired font + * @param float $size the desired font size + * @param float $spacing word spacing, if any + * @return float + */ + function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) { + + if ( strpos($font, '.ttf') === false ) + $font .= ".ttf"; + + $text = mb_encode_numericentity($text, array(0x0080, 0xffff, 0, 0xffff), 'UTF-8'); + + // FIXME: word spacing + list($x1,,$x2) = @imagettfbbox($size, 0, $font, $text); + return $x2 - $x1; + } + + /** + * Calculates font height, in points + * + * @param string $font + * @param float $size + * @return float + */ + function get_font_height($font, $size) { + if ( strpos($font, '.ttf') === false ) + $font .= ".ttf"; + + // FIXME: word spacing + list(,$y2,,,,$y1) = imagettfbbox($size, 0, $font, "MXjpqytfhl"); // Test string with ascenders, descenders and caps + return ($y2 - $y1) * DOMPDF_FONT_HEIGHT_RATIO; + } + + + /** + * Starts a new page + * + * Subsequent drawing operations will appear on the new page. + */ + function new_page() { + $this->_page_number++; + $this->_page_count++; + } + + function open_object(){ + // N/A + } + + function close_object(){ + // N/A + } + + function add_object(){ + // N/A + } + + function page_text(){ + // N/A + } + + /** + * Streams the image directly to the browser + * + * @param string $filename the name of the image file (ignored) + * @param array $options associative array, 'type' => jpeg|jpg|png, 'quality' => 0 - 100 (jpeg only) + */ + function stream($filename, $options = null) { + + // Perform any antialiasing + if ( $this->_aa_factor != 1 ) { + $dst_w = $this->_width / $this->_aa_factor; + $dst_h = $this->_height / $this->_aa_factor; + $dst = imagecreatetruecolor($dst_w, $dst_h); + imagecopyresampled($dst, $this->_img, 0, 0, 0, 0, + $dst_w, $dst_h, + $this->_width, $this->_height); + } else { + $dst = $this->_img; + } + + if ( !isset($options["type"]) ) + $options["type"] = "png"; + + $type = strtolower($options["type"]); + + header("Cache-Control: private"); + + switch ($type) { + + case "jpg": + case "jpeg": + if ( !isset($options["quality"]) ) + $options["quality"] = 75; + + header("Content-type: image/jpeg"); + imagejpeg($dst, '', $options["quality"]); + break; + + case "png": + default: + header("Content-type: image/png"); + imagepng($dst); + break; + } + + if ( $this->_aa_factor != 1 ) + imagedestroy($dst); + } + + /** + * Returns the PNG as a string + * + * @param array $options associative array, 'type' => jpeg|jpg|png, 'quality' => 0 - 100 (jpeg only) + * @return string + */ + function output($options = null) { + + if ( $this->_aa_factor != 1 ) { + $dst_w = $this->_width / $this->_aa_factor; + $dst_h = $this->_height / $this->_aa_factor; + $dst = imagecreatetruecolor($dst_w, $dst_h); + imagecopyresampled($dst, $this->_img, 0, 0, 0, 0, + $dst_w, $dst_h, + $this->_width, $this->_height); + } else { + $dst = $this->_img; + } + + if ( !isset($options["type"]) ) + $options["type"] = "png"; + + $type = $options["type"]; + + ob_start(); + + switch ($type) { + + case "jpg": + case "jpeg": + if ( !isset($options["quality"]) ) + $options["quality"] = 75; + + imagejpeg($dst, '', $options["quality"]); + break; + + case "png": + default: + imagepng($dst); + break; + } + + $image = ob_get_clean(); + + if ( $this->_aa_factor != 1 ) + imagedestroy($dst); + + return $image; + } + + +} diff --git a/application/third_party/dompdf/include/image_cache.cls.php b/application/third_party/dompdf/include/image_cache.cls.php new file mode 100644 index 00000000..46dc0c66 --- /dev/null +++ b/application/third_party/dompdf/include/image_cache.cls.php @@ -0,0 +1,231 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - On getting type of images don't require any file endings + * and don't strip off url parameters, + * to allowing dynamically generated sites with image id + * in url parameters and not at end of url or missing file extension + * @contributor Helmut Tischer + * @version dompdf_trunk_with_helmut_mods.20090524 + * - Made debug messages more individually configurable + * @version 20090622 + * - don't cache broken image, but refer to original broken image replacement + */ + +/* $Id: image_cache.cls.php 354 2011-01-24 21:59:54Z fabien.menager $ */ + +/** + * Static class that resolves image urls and downloads and caches + * remote images if required. + * + * @access private + * @package dompdf + */ +class Image_Cache { + + /** + * Array of downloaded images. Cached so that identical images are + * not needlessly downloaded. + * + * @var array + */ + static protected $_cache = array(); + + + /** + * Resolve and fetch an image for use. + * + * @param string $url The url of the image + * @param string $proto Default protocol if none specified in $url + * @param string $host Default host if none specified in $url + * @param string $base_path Default path if none specified in $url + * @return array An array with two elements: The local path to the image and the image extension + */ + static function resolve_url($url, $proto, $host, $base_path) { + global $_dompdf_warnings; + + $parsed_url = explode_url($url); + + $DEBUGPNG=DEBUGPNG; //=DEBUGPNG; Allow override of global setting for ad hoc debug + $full_url_dbg = ''; + + //debugpng + if ($DEBUGPNG) print 'resolve_url('.$url.','.$proto.','.$host.','.$base_path.')('.$parsed_url['protocol'].')'; + + $remote = ($proto != "" && $proto !== "file://"); + $remote = $remote || ($parsed_url['protocol'] != ""); + + $datauri = strpos($parsed_url['protocol'], "data:") === 0; + + if ( !DOMPDF_ENABLE_REMOTE && $remote && !$datauri ) { + $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png"; + $ext = "png"; + + //debugpng + if ($DEBUGPNG) $full_url_dbg = '(blockedremote)'; + + } + else if ( DOMPDF_ENABLE_REMOTE && $remote || $datauri ) { + // Download remote files to a temporary directory + $full_url = build_url($proto, $host, $base_path, $url); + + if ( isset(self::$_cache[$full_url]) ) { + list($resolved_url,$ext) = self::$_cache[$full_url]; + + //debugpng + if ($DEBUGPNG) $full_url_dbg = $full_url.'(cache)'; + + } else { + + $resolved_url = tempnam(DOMPDF_TEMP_DIR, "ca_dompdf_img_"); + //debugpng + if ($DEBUGPNG) echo $resolved_url . "\n"; + + if ($datauri) { + if ($parsed_data_uri = parse_data_uri($url)) { + $image = $parsed_data_uri['data']; + list(, $ext) = explode('/', $parsed_data_uri['mime'], 2); + } + } + else { + $old_err = set_error_handler("record_warnings"); + $image = file_get_contents($full_url); + restore_error_handler(); + } + + if ( strlen($image) == 0 ) { + //target image not found + $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png"; + $ext = "png"; + + //debugpng + if ($DEBUGPNG) $full_url_dbg = $full_url.'(missing)'; + + } else { + + file_put_contents($resolved_url, $image); + + //e.g. fetch.php?media=url.jpg&cache=1 + //- Image file name might be one of the dynamic parts of the url, don't strip off! + // if ( preg_match("/.*\.(\w+)/",$url,$match) ) $ext = $match[1]; + //- a remote url does not need to have a file extension at all + //- local cached file does not have a matching file extension + //Therefore get image type from the content + + $imagedim = dompdf_getimagesize($resolved_url); + + if( $imagedim[0] && $imagedim[1] && + in_array($imagedim[2], array(IMAGETYPE_GIF, IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_BMP)) ) { + //target image is valid + + $imagetypes = array('','gif','jpeg','png','swf','psd','bmp'); + $ext = $imagetypes[$imagedim[2]]; + if ( rename($resolved_url,$resolved_url.'.'.$ext) ) { + $resolved_url .= '.'.$ext; + } + + //Don't put replacement image into cache - otherwise it will be deleted on cache cleanup. + //Only execute on successfull caching of remote image. + self::$_cache[$full_url] = array($resolved_url,$ext); + + } else { + //target image is not valid. + unlink($resolved_url); + + $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png"; + $ext = "png"; + } + } + + } + + } else { + + $resolved_url = build_url($proto, $host, $base_path, $url); + if ($DEBUGPNG) print 'build_url('.$proto.','.$host.','.$base_path.','.$url.')('.$resolved_url.')'; + + if ( !preg_match("/.*\.(\w+)/",$url,$match) ) { + //debugpng + if ($DEBUGPNG) print '[resolve_url exception '.$url.']'; + throw new DOMPDF_Exception("Unknown image type: $url."); + } + + $ext = $match[1]; + + //debugpng + if ($DEBUGPNG) $full_url_dbg = '(local)'; + + } + + if ( !is_readable($resolved_url) || !filesize($resolved_url) ) { + + //debugpng + if ($DEBUGPNG) $full_url_dbg .= '(nocache'.$resolved_url.')'; + + $_dompdf_warnings[] = "File " .$resolved_url . " is not readable or is an empty file.\n"; + $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png"; + $ext = "png"; + } + + //debugpng + if ($DEBUGPNG) print '[resolve_url '.$url.'|'.$full_url_dbg.'|'.$resolved_url.'|'.$ext.']'; + + return array($resolved_url, $ext); + } + + /** + * Unlink all cached images (i.e. temporary images either downloaded + * or converted) + */ + static function clear() { + if ( count(self::$_cache) ) { + while ($entry = array_shift(self::$_cache)) { + list($file, $ext) = $entry; + //debugpng + if (DEBUGPNG) print '[clear unlink '.$file.']'; + if (!DEBUGKEEPTEMP) + //XXX: Should we have some kind of fallback or warning if unlink() fails? + unlink($file); + } + } + } + +} diff --git a/application/third_party/dompdf/include/image_frame_decorator.cls.php b/application/third_party/dompdf/include/image_frame_decorator.cls.php new file mode 100644 index 00000000..e81a4cfd --- /dev/null +++ b/application/third_party/dompdf/include/image_frame_decorator.cls.php @@ -0,0 +1,116 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - add optional debug output + */ + +/* $Id: image_frame_decorator.cls.php 283 2010-07-19 17:57:40Z fabien.menager $ */ + +/** + * Decorates frames for image layout and rendering + * + * @access private + * @package dompdf + */ +class Image_Frame_Decorator extends Frame_Decorator { + + /** + * The path to the image file (note that remote images are + * downloaded locally to DOMPDF_TEMP_DIR). + * + * @var string + */ + protected $_image_url; + + /** + * The image's file extension (i.e. png, jpeg, gif) + * + * @var string + */ + protected $_image_ext; + + /** + * Class constructor + * + * @param Frame $frame the frame to decorate + * @param DOMPDF $dompdf the document's dompdf object (required to resolve relative & remote urls) + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + global $_dompdf_warnings; + + parent::__construct($frame, $dompdf); + $url = $frame->get_node()->getAttribute("src"); + + //debugpng + if (DEBUGPNG) print '[__construct '.$url.']'; + + list($this->_image_url, $this->_image_ext) = Image_Cache::resolve_url($url, + $dompdf->get_protocol(), + $dompdf->get_host(), + $dompdf->get_base_path()); + + if ( strrpos( $this->_image_url, DOMPDF_LIB_DIR . "/res/broken_image.png", 0) !== false && + $alt = $frame->get_node()->getAttribute("alt") ) { + $style = $frame->get_style(); + $style->width = (4/3)*Font_Metrics::get_text_width($alt, $style->font_family, $style->font_size, $style->word_spacing); + $style->height = Font_Metrics::get_font_height($style->font_family, $style->font_size); + } + } + + /** + * Return the image's url + * + * @return string The url of this image + */ + function get_image_url() { + return $this->_image_url; + } + + /** + * Return the image's file extension + * + * @return string The image's file extension + */ + function get_image_ext() { + return $this->_image_ext; + } + +} diff --git a/application/third_party/dompdf/include/image_frame_reflower.cls.php b/application/third_party/dompdf/include/image_frame_reflower.cls.php new file mode 100644 index 00000000..153fa3e5 --- /dev/null +++ b/application/third_party/dompdf/include/image_frame_reflower.cls.php @@ -0,0 +1,162 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - Fix image size as percent of wrapping box + * - Fix arithmetic rounding of image size + * - Time consuming additional image file scan only when really needed + */ + +/* $Id: image_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Image reflower class + * + * @access private + * @package dompdf + */ +class Image_Frame_Reflower extends Frame_Reflower { + + function __construct(Image_Frame_Decorator $frame) { + parent::__construct($frame); + } + + function reflow(Frame_Decorator $block = null) { + $this->_frame->position(); + + //FLOAT + //$frame = $this->_frame; + //$page = $frame->get_root(); + //if (DOMPDF_ENABLE_CSS_FLOAT && $frame->get_style()->float !== "none" ) { + // $page->add_floating_frame($this); + //} + // Set the frame's width + $this->get_min_max_width(); + + if ( $block ) { + $block->add_frame_to_line($this->_frame); + } + } + + function get_min_max_width() { + if (DEBUGPNG) { + // Determine the image's size. Time consuming. Only when really needed? + list($img_width, $img_height) = dompdf_getimagesize($this->_frame->get_image_url()); + print "get_min_max_width() ". + $this->_frame->get_style()->width.' '. + $this->_frame->get_style()->height.';'. + $this->_frame->get_parent()->get_style()->width." ". + $this->_frame->get_parent()->get_style()->height.";". + $this->_frame->get_parent()->get_parent()->get_style()->width.' '. + $this->_frame->get_parent()->get_parent()->get_style()->height.';'. + $img_width. ' '. + $img_height.'|' ; + } + + $style = $this->_frame->get_style(); + + //own style auto or invalid value: use natural size in px + //own style value: ignore suffix text including unit, use given number as px + //own style %: walk up parent chain until found available space in pt; fill available space + // + //special ignored unit: e.g. 10ex: e treated as exponent; x ignored; 10e completely invalid ->like auto + + $width = ($style->width > 0 ? $style->width : 0); + if ( is_percent($width) ) { + $t = 0.0; + for ($f = $this->_frame->get_parent(); $f; $f = $f->get_parent()) { + $t = (float)($f->get_style()->width); //always in pt + if ((float)$t != 0) { + break; + } + } + $width = ((float)rtrim($width,"%") * $t)/100; //maybe 0 + } elseif ( !mb_strpos($width, 'pt') ) { + // Don't set image original size if "%" branch was 0 or size not given. + // Otherwise aspect changed on %/auto combination for width/height + // Resample according to px per inch + // See also List_Bullet_Image_Frame_Decorator::__construct + $width = (float)($width * 72) / DOMPDF_DPI; + } + + $height = ($style->height > 0 ? $style->height : 0); + if ( is_percent($height) ) { + $t = 0.0; + for ($f = $this->_frame->get_parent(); $f; $f = $f->get_parent()) { + $t = (float)($f->get_style()->height); //always in pt + if ((float)$t != 0) { + break; + } + } + $height = ((float)rtrim($height,"%") * $t)/100; //maybe 0 + } elseif ( !mb_strpos($height, 'pt') ) { + // Don't set image original size if "%" branch was 0 or size not given. + // Otherwise aspect changed on %/auto combination for width/height + // Resample according to px per inch + // See also List_Bullet_Image_Frame_Decorator::__construct + $height = (float)($height * 72) / DOMPDF_DPI; + } + + if ($width == 0 || $height == 0) { + // Determine the image's size. Time consuming. Only when really needed! + list($img_width, $img_height) = dompdf_getimagesize($this->_frame->get_image_url()); + + // don't treat 0 as error. Can be downscaled or can be catched elsewhere if image not readable. + // Resample according to px per inch + // See also List_Bullet_Image_Frame_Decorator::__construct + if ($width == 0 && $height == 0) { + $width = (float)($img_width * 72) / DOMPDF_DPI; + $height = (float)($img_height * 72) / DOMPDF_DPI; + } elseif ($height == 0 && $width != 0) { + $height = ($width / $img_width) * $img_height; //keep aspect ratio + } elseif ($width == 0 && $height != 0) { + $width = ($height / $img_height) * $img_width; //keep aspect ratio + } + } + + if (DEBUGPNG) print $width.' '.$height.';'; + + $style->width = $width . "pt"; + $style->height = $height . "pt"; + + return array( $width, $width, "min" => $width, "max" => $width); + + } +} diff --git a/application/third_party/dompdf/include/image_renderer.cls.php b/application/third_party/dompdf/include/image_renderer.cls.php new file mode 100644 index 00000000..6fef82ab --- /dev/null +++ b/application/third_party/dompdf/include/image_renderer.cls.php @@ -0,0 +1,95 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: image_renderer.cls.php 325 2010-11-07 18:05:59Z fabien.menager $ */ + +/** + * Image renderer + * + * @access private + * @package dompdf + */ +class Image_Renderer extends Block_Renderer { + + function render(Frame $frame) { + // Render background & borders + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + list($x, $y, $w, $h) = $frame->get_border_box(); + + $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); + + // Handle the last child + if ( ($bg = $style->background_color) !== "transparent" ) + $this->_canvas->filled_rectangle( $x + $widths[3], $y + $widths[0], $w, $h, $bg); + + if ( ($url = $style->background_image) && $url !== "none" ) + $this->_background_image($url, $x + $widths[3], $y + $widths[0], $w, $h, $style); + + $this->_render_border($frame); + $this->_render_outline($frame); + + list($x, $y) = $frame->get_padding_box(); + $x += $style->length_in_pt($style->padding_left, $cb["w"]); + $y += $style->length_in_pt($style->padding_top, $cb["h"]); + + $w = $style->length_in_pt($style->width, $cb["w"]); + $h = $style->length_in_pt($style->height, $cb["h"]); + + if ( strrpos( $frame->get_image_url(), DOMPDF_LIB_DIR . "/res/broken_image.png", 0) !== false && + $alt = $frame->get_node()->getAttribute("alt") ) { + $font = $style->font_family; + $size = $style->font_size; + $spacing = $style->word_spacing; + $this->_canvas->text($x, $y, $alt, + $font, $size, + $style->color, $spacing); + } + else { + $this->_canvas->image( $frame->get_image_url(), $frame->get_image_ext(), $x, $y, $w, $h); + } + + if (DEBUG_LAYOUT && DEBUG_LAYOUT_BLOCKS) { + $this->_debug_layout($frame->get_border_box(), "blue"); + if (DEBUG_LAYOUT_PADDINGBOX) { + $this->_debug_layout($frame->get_padding_box(), "blue", array(0.5, 0.5)); + } + } + } +} diff --git a/application/third_party/dompdf/include/inline_frame_decorator.cls.php b/application/third_party/dompdf/include/inline_frame_decorator.cls.php new file mode 100644 index 00000000..efd66d05 --- /dev/null +++ b/application/third_party/dompdf/include/inline_frame_decorator.cls.php @@ -0,0 +1,112 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + + * + * Changes + * @contributor Helmut Tischer + * @version 20090610 + * - don't repeat non repeatable background images after a line break + */ + +/* $Id: inline_frame_decorator.cls.php 252 2010-04-19 08:10:45Z flaviencrochard $ */ + +/** + * Decorates frames for inline layout + * + * @access private + * @package dompdf + */ +class Inline_Frame_Decorator extends Frame_Decorator { + + function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); } + + function split($frame = null, $force_pagebreak = false) { + + if ( is_null($frame) ) { + $this->get_parent()->split($this, $force_pagebreak); + return; + } + + if ( $frame->get_parent() !== $this ) + throw new DOMPDF_Exception("Unable to split: frame is not a child of this one."); + + $split = $this->copy( $this->_frame->get_node()->cloneNode() ); + $this->get_parent()->insert_child_after($split, $this); + + // Unset the current node's right style properties + $style = $this->_frame->get_style(); + $style->margin_right = "0"; + $style->padding_right = "0"; + $style->border_right_width = "0"; + + // Unset the split node's left style properties since we don't want them + // to propagate + $style = $split->get_style(); + $style->margin_left = "0"; + $style->padding_left = "0"; + $style->border_left_width = "0"; + + //On continuation of inline element on next line, + //don't repeat non-vertically repeatble background images + //See e.g. in testcase image_variants, long desriptions + if ( ($url = $style->background_image) && $url !== "none" + && ($repeat = $style->background_repeat) && $repeat !== "repeat" && $repeat !== "repeat-y" + ) { + $style->background_image = "none"; + } + + // Add $frame and all following siblings to the new split node + $iter = $frame; + while ($iter) { + $frame = $iter; + $iter = $iter->get_next_sibling(); + $frame->reset(); + $split->append_child($frame); + } + + $page_breaks = array("always", "left", "right"); + $frame_style = $frame->get_style(); + if( $force_pagebreak || + in_array($frame_style->page_break_before, $page_breaks) || + in_array($frame_style->page_break_after, $page_breaks) ) { + + $this->get_parent()->split($split, true); + } + } + +} diff --git a/application/third_party/dompdf/include/inline_frame_reflower.cls.php b/application/third_party/dompdf/include/inline_frame_reflower.cls.php new file mode 100644 index 00000000..be2e1759 --- /dev/null +++ b/application/third_party/dompdf/include/inline_frame_reflower.cls.php @@ -0,0 +1,99 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: inline_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Reflows inline frames + * + * @access private + * @package dompdf + */ +class Inline_Frame_Reflower extends Frame_Reflower { + + function __construct(Frame $frame) { parent::__construct($frame); } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + $frame = $this->_frame; + + // Check if a page break is forced + $page = $frame->get_root(); + $page->check_forced_page_break($frame); + + if ( $page->is_full() ) + return; + + $style = $frame->get_style(); + + // Generated content + $this->_set_content(); + + $frame->position(); + + $cb = $frame->get_containing_block(); + + // Add our margin, padding & border to the first and last children + if ( ($f = $frame->get_first_child()) && $f instanceof Text_Frame_Decorator ) { + $f_style = $f->get_style(); + $f_style->margin_left = $style->margin_left; + $f_style->padding_left = $style->padding_left; + $f_style->border_left = $style->border_left; + } + + if ( ($l = $frame->get_last_child()) && $l instanceof Text_Frame_Decorator ) { + $l_style = $l->get_style(); + $l_style->margin_right = $style->margin_right; + $l_style->padding_right = $style->padding_right; + $l_style->border_right = $style->border_right; + } + + if ( $block ) { + $block->add_frame_to_line($this->_frame); + } + + // Set the containing blocks and reflow each child. The containing + // block is not changed by line boxes. + foreach ( $frame->get_children() as $child ) { + $child->set_containing_block($cb); + $child->reflow($block); + } + } +} diff --git a/application/third_party/dompdf/include/inline_positioner.cls.php b/application/third_party/dompdf/include/inline_positioner.cls.php new file mode 100644 index 00000000..79bd776c --- /dev/null +++ b/application/third_party/dompdf/include/inline_positioner.cls.php @@ -0,0 +1,102 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: inline_positioner.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ +/** + * Positions inline frames + * + * @access private + * @package dompdf + */ +class Inline_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function position() { + // Find our nearest block level parent and access its lines property. + $p = $this->_frame->find_block_parent(); + + // Debugging code: + +// pre_r("\nPositioning:"); +// pre_r("Me: " . $this->_frame->get_node()->nodeName . " (" . spl_object_hash($this->_frame->get_node()) . ")"); +// pre_r("Parent: " . $p->get_node()->nodeName . " (" . spl_object_hash($p->get_node()) . ")"); + + // End debugging + + if ( !$p ) + throw new DOMPDF_Exception("No block-level parent found. Not good."); + + $f = $this->_frame; + + $cb = $f->get_containing_block(); + $style = $f->get_style(); + $line = $p->get_current_line(); + + // Skip the page break if in a fixed position element + $is_fixed = false; + while($f = $f->get_parent()) { + if($f->get_style()->position === "fixed") { + $is_fixed = true; + break; + } + } + + $f = $this->_frame; + + if ( !$is_fixed && $f->get_parent() && + $f->get_parent() instanceof Inline_Frame_Decorator && + $f->get_node()->nodeName === "#text" ) { + + $min_max = $f->get_reflower()->get_min_max_width(); + $initialcb = $f->get_root()->get_containing_block(); + $height = $style->length_in_pt($style->height, $initialcb["h"]); + + // If the frame doesn't fit in the current line, a line break occurs + if ( $min_max["min"] > ($cb["w"]-$line["left"]-$line["w"]-$line["right"]) ) { + $p->add_line(); + } + } + + $this->_frame->set_position($cb["x"] + $line["w"], $line["y"]); + + } +} diff --git a/application/third_party/dompdf/include/inline_renderer.cls.php b/application/third_party/dompdf/include/inline_renderer.cls.php new file mode 100644 index 00000000..131e8439 --- /dev/null +++ b/application/third_party/dompdf/include/inline_renderer.cls.php @@ -0,0 +1,207 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: inline_renderer.cls.php 332 2010-11-27 14:06:34Z fabien.menager $ */ + +/** + * Renders inline frames + * + * @access private + * @package dompdf + */ +class Inline_Renderer extends Abstract_Renderer { + + //........................................................................ + + function render(Frame $frame) { + $style = $frame->get_style(); + + if ( !$frame->get_first_child() ) + return; // No children, no service + + // Draw the left border if applicable + $bp = $style->get_border_properties(); + $widths = array($style->length_in_pt($bp["top"]["width"]), + $style->length_in_pt($bp["right"]["width"]), + $style->length_in_pt($bp["bottom"]["width"]), + $style->length_in_pt($bp["left"]["width"])); + + // Draw the background & border behind each child. To do this we need + // to figure out just how much space each child takes: + list($x, $y) = $frame->get_first_child()->get_position(); + $w = null; + $h = 0; +// $x += $widths[3]; +// $y += $widths[0]; + + $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); + + $first_row = true; + + foreach ($frame->get_children() as $child) { + list($child_x, $child_y, $child_w, $child_h) = $child->get_padding_box(); + + if ( !is_null($w) && $child_x < $x + $w ) { + //This branch seems to be supposed to being called on the first part + //of an inline html element, and the part after the if clause for the + //parts after a line break. + //But because $w initially mostly is 0, and gets updated only on the next + //round, this seem to be never executed and the common close always. + + // The next child is on another line. Draw the background & + // borders on this line. + + // Background: + if ( ($bg = $style->background_color) !== "transparent" ) + $this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg); + + if ( ($url = $style->background_image) && $url !== "none" ) { + $this->_background_image($url, $x, $y, $w, $h, $style); + } + + // If this is the first row, draw the left border + if ( $first_row ) { + + if ( $bp["left"]["style"] !== "none" && $bp["left"]["color"] !== "transparent" && $bp["left"]["width"] > 0 ) { + $method = "_border_" . $bp["left"]["style"]; + $this->$method($x, $y, $h + $widths[0] + $widths[2], $bp["left"]["color"], $widths, "left"); + } + $first_row = false; + } + + // Draw the top & bottom borders + if ( $bp["top"]["style"] !== "none" && $bp["top"]["color"] !== "transparent" && $bp["top"]["width"] > 0 ) { + $method = "_border_" . $bp["top"]["style"]; + $this->$method($x, $y, $w + $widths[1] + $widths[3], $bp["top"]["color"], $widths, "top"); + } + + if ( $bp["bottom"]["style"] !== "none" && $bp["bottom"]["color"] !== "transparent" && $bp["bottom"]["width"] > 0 ) { + $method = "_border_" . $bp["bottom"]["style"]; + $this->$method($x, $y + $h + $widths[0] + $widths[2], $w + $widths[1] + $widths[3], $bp["bottom"]["color"], $widths, "bottom"); + } + + // Handle anchors & links + if ( $frame->get_node()->nodeName === "a" ) { + if ( $href = $frame->get_node()->getAttribute("href") ) + $this->_canvas->add_link($href, $x, $y, $w, $h); + } + + $x = $child_x; + $y = $child_y; + $w = $child_w; + $h = $child_h; + continue; + } + + if ( is_null($w) ) + $w = $child_w; + else + $w += $child_w; + + $h = max($h, $child_h); + } + + + // Handle the last child + if ( ($bg = $style->background_color) !== "transparent" ) + $this->_canvas->filled_rectangle( $x + $widths[3], $y + $widths[0], $w, $h, $bg); + + //On continuation lines (after line break) of inline elements, the style got copied. + //But a non repeatable background image should not be repeated on the next line. + //But removing the background image above has never an effect, and removing it below + //removes it always, even on the initial line. + //Need to handle it elsewhere, e.g. on certain ...clone()... usages. + // Repeat not given: default is Style::__construct + // ... && (!($repeat = $style->background_repeat) || $repeat === "repeat" ... + //different position? $this->_background_image($url, $x, $y, $w, $h, $style); + if ( ($url = $style->background_image) && $url !== "none" ) + $this->_background_image($url, $x + $widths[3], $y + $widths[0], $w, $h, $style); + + // Add the border widths + $w += $widths[1] + $widths[3]; + $h += $widths[0] + $widths[2]; + + // make sure the border and background start inside the left margin + $left_margin = $style->length_in_pt($style->margin_left); + $x += $left_margin; + + // If this is the first row, draw the left border too + if ( $first_row && $bp["left"]["style"] !== "none" && $bp["left"]["color"] !== "transparent" && $widths[3] > 0 ) { + $method = "_border_" . $bp["left"]["style"]; + $this->$method($x, $y, $h, $bp["left"]["color"], $widths, "left"); + } + + // Draw the top & bottom borders + if ( $bp["top"]["style"] !== "none" && $bp["top"]["color"] !== "transparent" && $widths[0] > 0 ) { + $method = "_border_" . $bp["top"]["style"]; + $this->$method($x, $y, $w, $bp["top"]["color"], $widths, "top"); + } + + if ( $bp["bottom"]["style"] !== "none" && $bp["bottom"]["color"] !== "transparent" && $widths[2] > 0 ) { + $method = "_border_" . $bp["bottom"]["style"]; + $this->$method($x, $y + $h, $w, $bp["bottom"]["color"], $widths, "bottom"); + } + + // pre_var_dump(get_class($frame->get_next_sibling())); + // $last_row = get_class($frame->get_next_sibling()) !== 'Inline_Frame_Decorator'; + // Draw the right border if this is the last row + if ( $bp["right"]["style"] !== "none" && $bp["right"]["color"] !== "transparent" && $widths[1] > 0 ) { + $method = "_border_" . $bp["right"]["style"]; + $this->$method($x + $w, $y, $h, $bp["right"]["color"], $widths, "right"); + } + + $node = $frame->get_node(); + + // Handle anchors & links + if ( $node->nodeName === "a" ) { + if ( $name = $node->getAttribute("name") ) + $this->_canvas->add_named_dest($name); + + if ( $href = $node->getAttribute("href") ) + $this->_canvas->add_link($href, $x, $y, $w, $h); + } + + if (DEBUG_LAYOUT && DEBUG_LAYOUT_INLINE) { + $this->_debug_layout($child->get_border_box(), "blue"); + if (DEBUG_LAYOUT_PADDINGBOX) { + $this->_debug_layout($child->get_padding_box(), "blue", array(0.5, 0.5)); + } + } + } +} diff --git a/application/third_party/dompdf/include/javascript_embedder.cls.php b/application/third_party/dompdf/include/javascript_embedder.cls.php new file mode 100644 index 00000000..087f0e5c --- /dev/null +++ b/application/third_party/dompdf/include/javascript_embedder.cls.php @@ -0,0 +1,68 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + */ + +/* $Id: javascript_embedder.cls.php 291 2010-08-02 20:55:23Z fabien.menager $ */ + +/** + * Embeds Javascript into the PDF document + * + * @access private + * @package dompdf + */ +class Javascript_Embedder { + + /** + * @var DOMPDF + */ + protected $_dompdf; + + function __construct(DOMPDF $dompdf) { + $this->_dompdf = $dompdf; + } + + function insert($code) { + $this->_dompdf->get_canvas()->javascript($code); + } + + function render($frame) { + if ( !DOMPDF_ENABLE_JAVASCRIPT ) + return; + + $this->insert($frame->get_node()->nodeValue); + } +} diff --git a/application/third_party/dompdf/include/list_bullet_frame_decorator.cls.php b/application/third_party/dompdf/include/list_bullet_frame_decorator.cls.php new file mode 100644 index 00000000..28210198 --- /dev/null +++ b/application/third_party/dompdf/include/list_bullet_frame_decorator.cls.php @@ -0,0 +1,96 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + + * + * Changes + * @contributor Helmut Tischer + * @version 20090622 + * - bullet size proportional to font size, center position + */ + +/* $Id: list_bullet_frame_decorator.cls.php 325 2010-11-07 18:05:59Z fabien.menager $ */ + +/** + * Decorates frames for list bullet rendering + * + * @access private + * @package dompdf + */ +class List_Bullet_Frame_Decorator extends Frame_Decorator { + + const BULLET_PADDING = 1; // Distance from bullet to text in pt + // As fraction of font size (including descent). See also DECO_THICKNESS. + const BULLET_THICKNESS = 0.04; // Thickness of bullet outline. Screen: 0.08, print: better less, e.g. 0.04 + const BULLET_DESCENT = 0.3; //descent of font below baseline. Todo: Guessed for now. + const BULLET_SIZE = 0.35; // bullet diameter. For now 0.5 of font_size without descent. + + static $BULLET_TYPES = array("disc", "circle", "square"); + + //........................................................................ + + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + } + + function get_margin_width() { + $style = $this->_frame->get_style(); + // Small hack to prevent extra indenting of list text on list_style_position === "inside" + // and on suppressed bullet + if ( $style->list_style_position === "outside" || + $style->list_style_type === "none" ) + return 0; + return $style->get_font_size()*self::BULLET_SIZE + 2 * self::BULLET_PADDING; + } + + //hits only on "inset" lists items, to increase height of box + function get_margin_height() { + $style = $this->_frame->get_style(); + if ( $style->list_style_type === 'none' ) return 0; + return $style->get_font_size() * self::BULLET_SIZE + 2 * self::BULLET_PADDING; + } + + function get_width() { + return $this->get_margin_height(); + } + + function get_height() { + return $this->get_margin_height(); + } + + //........................................................................ +} diff --git a/application/third_party/dompdf/include/list_bullet_frame_reflower.cls.php b/application/third_party/dompdf/include/list_bullet_frame_reflower.cls.php new file mode 100644 index 00000000..fcc75e44 --- /dev/null +++ b/application/third_party/dompdf/include/list_bullet_frame_reflower.cls.php @@ -0,0 +1,66 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: list_bullet_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Reflows list bullets + * + * @access private + * @package dompdf + */ +class List_Bullet_Frame_Reflower extends Frame_Reflower { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + $style = $this->_frame->get_style(); + + $style->width = $this->_frame->get_width(); + $this->_frame->position(); + + if ( $style->list_style_position === "inside" ) { + $p = $this->_frame->find_block_parent(); + $p->add_frame_to_line($this->_frame); + } + + } +} diff --git a/application/third_party/dompdf/include/list_bullet_image_frame_decorator.cls.php b/application/third_party/dompdf/include/list_bullet_image_frame_decorator.cls.php new file mode 100644 index 00000000..cfbeb182 --- /dev/null +++ b/application/third_party/dompdf/include/list_bullet_image_frame_decorator.cls.php @@ -0,0 +1,188 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - added comment + */ + +/* $Id: list_bullet_image_frame_decorator.cls.php 354 2011-01-24 21:59:54Z fabien.menager $ */ + +/** + * Decorates frames for list bullets with custom images + * + * @access private + * @package dompdf + */ +class List_Bullet_Image_Frame_Decorator extends Frame_Decorator { + + /** + * The underlying image frame + * + * @var Image_Frame_Decorator + */ + protected $_img; + + /** + * The image's width in pixels + * + * @var int + */ + protected $_width; + + /** + * The image's height in pixels + * + * @var int + */ + protected $_height; + + /** + * Class constructor + * + * @param Frame $frame the bullet frame to decorate + * @param DOMPDF $dompdf the document's dompdf object + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + $style = $frame->get_style(); + $url = $style->list_style_image; + $frame->get_node()->setAttribute("src", $url); + $this->_img = new Image_Frame_Decorator($frame, $dompdf); + parent::__construct($this->_img, $dompdf); + list($width, $height) = dompdf_getimagesize($this->_img->get_image_url()); + + // Resample the bullet image to be consistent with 'auto' sized images + // See also Image_Frame_Reflower::get_min_max_width + // Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary. + $this->_width = (((float)rtrim($width, "px")) * 72) / DOMPDF_DPI; + $this->_height = (((float)rtrim($height, "px")) * 72) / DOMPDF_DPI; + + //If an image is taller as the containing block/box, the box should be extended. + //Neighbour elements are overwriting the overlapping image areas. + //Todo: Where can the box size be extended? + //Code below has no effect. + //See block_frame_reflower _calculate_restricted_height + //See generated_frame_reflower, Dompdf:render() "list-item", "-dompdf-list-bullet"S. + //Leave for now + //if ($style->min_height < $this->_height ) { + // $style->min_height = $this->_height; + //} + //$style->height = "auto"; + } + + /** + * Return the bullet's width + * + * @return int + */ + function get_width() { + //ignore image width, use same width as on predefined bullet List_Bullet_Frame_Decorator + //for proper alignment of bullet image and text. Allow image to not fitting on left border. + //This controls the distance between bullet image and text + //return $this->_width; + return $this->_frame->get_style()->get_font_size()*List_Bullet_Frame_Decorator::BULLET_SIZE + + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; + } + + /** + * Return the bullet's height + * + * @return int + */ + function get_height() { + //based on image height + return $this->_height; + } + + /** + * Override get_margin_width + * + * @return int + */ + function get_margin_width() { + //ignore image width, use same width as on predefined bullet List_Bullet_Frame_Decorator + //for proper alignment of bullet image and text. Allow image to not fitting on left border. + //This controls the extra indentation of text to make room for the bullet image. + //Here use actual image size, not predefined bullet size + //return $this->_frame->get_style()->get_font_size()*List_Bullet_Frame_Decorator::BULLET_SIZE + + // 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; + + // Small hack to prevent indenting of list text + // Image Might not exist, then position like on list_bullet_frame_decorator fallback to none. + if ( $this->_frame->get_style()->list_style_position === "outside" || + $this->_width == 0) + return 0; + //This aligns the "inside" image position with the text. + //The text starts to the right of the image. + //Between the image and the text there is an added margin of image width. + //Where this comes from is unknown. + //The corresponding List_Bullet_Frame_Decorator sets a smaller margin. bullet size? + return $this->_width + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; + } + + /** + * Override get_margin_height() + * + * @return int + */ + function get_margin_height() { + //Hits only on "inset" lists items, to increase height of box + //based on image height + return $this->_height + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; + } + + /** + * Return image url + * + * @return string + */ + function get_image_url() { + return $this->_img->get_image_url(); + } + + /** + * Return the image extension + * + * @return string + */ + function get_image_ext() { + return $this->_img->get_image_ext(); + } + +} diff --git a/application/third_party/dompdf/include/list_bullet_positioner.cls.php b/application/third_party/dompdf/include/list_bullet_positioner.cls.php new file mode 100644 index 00000000..66a5c12f --- /dev/null +++ b/application/third_party/dompdf/include/list_bullet_positioner.cls.php @@ -0,0 +1,111 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + + * + * Changes + * @contributor Helmut Tischer + * @version 20090622 + * - try to adjust top position of bullet to top corner of subsequent font + */ + +/* $Id: list_bullet_positioner.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Positions list bullets + * + * @access private + * @package dompdf + */ +class List_Bullet_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function position() { + + // Bullets & friends are positioned an absolute distance to the left of + // the content edge of their parent element + $cb = $this->_frame->get_containing_block(); + $style = $this->_frame->get_style(); + + // Note: this differs from most frames in that we must position + // ourselves after determining our width + $x = $cb["x"] - $this->_frame->get_width(); + + $p = $this->_frame->find_block_parent(); + + $y = $p->get_current_line("y"); + + // This is a bit of a hack... + $n = $this->_frame->get_next_sibling(); + if ( $n ) { + $style = $n->get_style(); + $y += $style->length_in_pt( array($style->margin_top, $style->padding_top), + $n->get_containing_block("w") ); + } + + // Now the position is the left top of the block which should be marked with the bullet. + // We tried to find out the y of the start of the first text character within the block. + // But the top margin/padding does not fit, neither from this nor from the next sibling + // The "bit of a hack" above does not work also. + + // Instead let's position the bullet vertically centered to the block which should be marked. + // But for get_next_sibling() the get_containing_block is all zero, and for find_block_parent() + // the get_containing_block is paper width and the entire list as height. + + // if ($p) { + // //$cb = $n->get_containing_block(); + // $cb = $p->get_containing_block(); + // $y += $cb["h"]/2; + // print 'cb:'.$cb["x"].':'.$cb["y"].':'.$cb["w"].':'.$cb["h"].':'; + // } + + // Todo: + // For now give up on the above. Use Guesswork with font y-pos in the middle of the line spacing + + $style = $p->get_style(); + $font_size = $style->get_font_size(); + $line_height = $style->length_in_pt($style->line_height, $font_size); + $y += ($line_height - $font_size) / 2; + + //Position is x-end y-top of character position of the bullet. + $this->_frame->set_position($x, $y); + + } +} diff --git a/application/third_party/dompdf/include/list_bullet_renderer.cls.php b/application/third_party/dompdf/include/list_bullet_renderer.cls.php new file mode 100644 index 00000000..8655ffd6 --- /dev/null +++ b/application/third_party/dompdf/include/list_bullet_renderer.cls.php @@ -0,0 +1,200 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + + * + * Changes + * @contributor Helmut Tischer + * @version 20090622 + * - bullet size proportional to font size, center position + */ + +/* $Id: list_bullet_renderer.cls.php 354 2011-01-24 21:59:54Z fabien.menager $ */ + +/** + * Renders list bullets + * + * @access private + * @package dompdf + */ +class List_Bullet_Renderer extends Abstract_Renderer { + + //........................................................................ + private function make_counter($n, $type, $pad = null){ + $n = intval($n); + $text = ""; + $uppercase = false; + + switch ($type) { + case "decimal-leading-zero": + case "decimal": + case "1": + if ($pad) + $text = str_pad($n, $pad, "0", STR_PAD_LEFT); + else + $text = $n; + break; + + case "upper-alpha": + case "upper-latin": + case "A": + $uppercase = true; + case "lower-alpha": + case "lower-latin": + case "a": + $text = chr( ($n % 26) + ord('a') - 1); + break; + + case "upper-roman": + case "I": + $uppercase = true; + case "lower-roman": + case "i": + $text = dec2roman($n); + break; + + case "lower-greek": + $text = unichr($n + 944); + break; + } + + if ($uppercase) + $text = strtoupper($text); + + return $text."."; + } + + function render(Frame $frame) { + + $style = $frame->get_style(); + $font_size = $style->get_font_size(); + $line_height = $style->length_in_pt($style->line_height, $frame->get_containing_block("w")); + + $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); + + // Handle list-style-image + // If list style image is requested but missing, fall back to predefined types + if ( $style->list_style_image !== "none" && + strcmp($img = $frame->get_image_url(), DOMPDF_LIB_DIR . "/res/broken_image.png") != 0) { + + list($x,$y) = $frame->get_position(); + + //For expected size and aspect, instead of box size, use image natural size scaled to DPI. + // Resample the bullet image to be consistent with 'auto' sized images + // See also Image_Frame_Reflower::get_min_max_width + // Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary. + //$w = $frame->get_width(); + //$h = $frame->get_height(); + list($width, $height) = dompdf_getimagesize($img); + $w = (((float)rtrim($width, "px")) * 72) / DOMPDF_DPI; + $h = (((float)rtrim($height, "px")) * 72) / DOMPDF_DPI; + + $x -= $w; + $y -= ($line_height - $font_size)/2; //Reverse hinting of list_bullet_positioner + + $this->_canvas->image( $img, $frame->get_image_ext(), $x, $y, $w, $h); + + } else { + + $bullet_style = $style->list_style_type; + + $fill = false; + + switch ($bullet_style) { + + default: + case "disc": + $fill = true; + + case "circle": + list($x,$y) = $frame->get_position(); + $r = ($font_size*(List_Bullet_Frame_Decorator::BULLET_SIZE /*-List_Bullet_Frame_Decorator::BULLET_THICKNESS*/ ))/2; + $x -= $font_size*(List_Bullet_Frame_Decorator::BULLET_SIZE/2); + $y += ($font_size*(1-List_Bullet_Frame_Decorator::BULLET_DESCENT))/2; + $o = $font_size*List_Bullet_Frame_Decorator::BULLET_THICKNESS; + $this->_canvas->circle($x, $y, $r, $style->color, $o, null, $fill); + break; + + case "square": + list($x, $y) = $frame->get_position(); + $w = $font_size*List_Bullet_Frame_Decorator::BULLET_SIZE; + $x -= $w; + $y += ($font_size*(1-List_Bullet_Frame_Decorator::BULLET_DESCENT-List_Bullet_Frame_Decorator::BULLET_SIZE))/2; + $this->_canvas->filled_rectangle($x, $y, $w, $w, $style->color); + break; + + case "decimal-leading-zero": + case "decimal": + case "lower-alpha": + case "lower-latin": + case "lower-roman": + case "lower-greek": + case "upper-alpha": + case "upper-latin": + case "upper-roman": + case "1": // HTML 4.0 compatibility + case "a": + case "i": + case "A": + case "I": + list($x,$y) = $frame->get_position(); + + $pad = null; + if ( $bullet_style === "decimal-leading-zero" ) { + $pad = strlen($frame->get_parent()->get_parent()->get_node()->getAttribute("dompdf-children-count")); + } + + $index = $frame->get_node()->getAttribute("dompdf-counter"); + $text = $this->make_counter($index, $bullet_style, $pad); + $font_family = $style->font_family; + $spacing = 0; //$frame->get_text_spacing() + $style->word_spacing; + + if ( trim($text) == "" ) + return; + + $x -= Font_Metrics::get_text_width($text, $font_family, $font_size, $spacing); + + $this->_canvas->text($x, $y, $text, + $font_family, $font_size, + $style->color, $spacing); + + case "none": + break; + } + } + } +} diff --git a/application/third_party/dompdf/include/null_frame_decorator.cls.php b/application/third_party/dompdf/include/null_frame_decorator.cls.php new file mode 100644 index 00000000..ff3f955a --- /dev/null +++ b/application/third_party/dompdf/include/null_frame_decorator.cls.php @@ -0,0 +1,59 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: null_frame_decorator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Dummy decorator + * + * @access private + * @package dompdf + */ +class Null_Frame_Decorator extends Frame_Decorator { + + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + $style = $this->_frame->get_style(); + $style->width = 0; + $style->height = 0; + $style->margin = 0; + $style->padding = 0; + } + +} diff --git a/application/third_party/dompdf/include/null_frame_reflower.cls.php b/application/third_party/dompdf/include/null_frame_reflower.cls.php new file mode 100644 index 00000000..6af18ace --- /dev/null +++ b/application/third_party/dompdf/include/null_frame_reflower.cls.php @@ -0,0 +1,54 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: null_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Dummy reflower + * + * @access private + * @package dompdf + */ +class Null_Frame_Reflower extends Frame_Reflower { + + function __construct(Frame $frame) { parent::__construct($frame); } + + function reflow(Frame_Decorator $block = null) { return; } + +} diff --git a/application/third_party/dompdf/include/null_positioner.cls.php b/application/third_party/dompdf/include/null_positioner.cls.php new file mode 100644 index 00000000..0e79f816 --- /dev/null +++ b/application/third_party/dompdf/include/null_positioner.cls.php @@ -0,0 +1,56 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: null_positioner.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Dummy positioner + * + * @access private + * @package dompdf + */ +class Null_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { + parent::__construct($frame); + } + + function position() { return; } + +} diff --git a/application/third_party/dompdf/include/page_cache.cls.php b/application/third_party/dompdf/include/page_cache.cls.php new file mode 100644 index 00000000..a7b7dc87 --- /dev/null +++ b/application/third_party/dompdf/include/page_cache.cls.php @@ -0,0 +1,159 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: page_cache.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Caches individual rendered PDF pages + * + * Not totally implmented yet. Use at your own risk ;) + * + * @access private + * @package dompdf + * @static + */ +class Page_Cache { + + const DB_USER = "dompdf_page_cache"; + const DB_PASS = "some meaningful password"; + const DB_NAME = "dompdf_page_cache"; + + static private $__connection = null; + + function init() { + if ( is_null(self::$__connection) ) { + $con_str = "host=" . DB_HOST . + " dbname=" . self::DB_NAME . + " user=" . self::DB_USER . + " password=" . self::DB_PASS; + + if ( !self::$__connection = pg_connect($con_str) ) + throw new Exception("Database connection failed."); + } + } + + function __construct() { throw new Exception("Can not create instance of Page_Class. Class is static."); } + + private static function __query($sql) { + if ( !($res = pg_query(self::$__connection, $sql)) ) + throw new Exception(pg_last_error(self::$__connection)); + return $res; + } + + static function store_page($id, $page_num, $data) { + $where = "WHERE id='" . pg_escape_string($id) . "' AND ". + "page_num=". pg_escape_string($page_num); + + $res = self::__query("SELECT timestamp FROM page_cache ". $where); + + $row = pg_fetch_assoc($res); + + if ( $row ) + self::__query("UPDATE page_cache SET data='" . pg_escape_string($data) . "' " . $where); + else + self::__query("INSERT INTO page_cache (id, page_num, data) VALUES ('" . pg_escape_string($id) . "', ". + pg_escape_string($page_num) . ", ". + "'". pg_escape_string($data) . "')"); + + } + + static function store_fonts($id, $fonts) { + self::__query("BEGIN"); + // Update the font information + self::__query("DELETE FROM page_fonts WHERE id='" . pg_escape_string($id) . "'"); + + foreach (array_keys($fonts) as $font) + self::__query("INSERT INTO page_fonts (id, font_name) VALUES ('" . + pg_escape_string($id) . "', '" . pg_escape_string($font) . "')"); + self::__query("COMMIT"); + } + +// static function retrieve_page($id, $page_num) { + +// $res = self::__query("SELECT data FROM page_cache WHERE id='" . pg_escape_string($id) . "' AND ". +// "page_num=". pg_escape_string($page_num)); + +// $row = pg_fetch_assoc($res); + +// return pg_unescape_bytea($row["data"]); + +// } + + static function get_page_timestamp($id, $page_num) { + $res = self::__query("SELECT timestamp FROM page_cache WHERE id='" . pg_escape_string($id) . "' AND ". + "page_num=". pg_escape_string($page_num)); + + $row = pg_fetch_assoc($res); + + return $row["timestamp"]; + + } + + // Adds the cached document referenced by $id to the provided pdf + static function insert_cached_document(CPDF_Adapter $pdf, $id, $new_page = true) { + $res = self::__query("SELECT font_name FROM page_fonts WHERE id='" . pg_escape_string($id) . "'"); + + // Ensure that the fonts needed by the cached document are loaded into + // the pdf + while ($row = pg_fetch_assoc($res)) + $pdf->get_cpdf()->selectFont($row["font_name"]); + + $res = self::__query("SELECT data FROM page_cache WHERE id='" . pg_escape_string($id) . "'"); + + if ( $new_page ) + $pdf->new_page(); + + $first = true; + while ($row = pg_fetch_assoc($res)) { + + if ( !$first ) + $pdf->new_page(); + else + $first = false; + + $page = $pdf->reopen_serialized_object($row["data"]); + //$pdf->close_object(); + $pdf->add_object($page, "add"); + + } + + } +} + +Page_Cache::init(); diff --git a/application/third_party/dompdf/include/page_frame_decorator.cls.php b/application/third_party/dompdf/include/page_frame_decorator.cls.php new file mode 100644 index 00000000..eaa823b7 --- /dev/null +++ b/application/third_party/dompdf/include/page_frame_decorator.cls.php @@ -0,0 +1,583 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: page_frame_decorator.cls.php 337 2010-12-01 21:30:27Z fabien.menager $ */ + +/** + * Decorates frames for page layout + * + * @access private + * @package dompdf + */ +class Page_Frame_Decorator extends Frame_Decorator { + + /** + * y value of bottom page margin + * + * @var float + */ + protected $_bottom_page_margin; + + /** + * Flag indicating page is full. + * + * @var bool + */ + protected $_page_full; + + /** + * Number of tables currently being reflowed + * + * @var int + */ + protected $_in_table; + + /** + * The pdf renderer + * + * @var Renderer + */ + protected $_renderer; + + //........................................................................ + + /** + * Class constructor + * + * @param Frame $frame the frame to decorate + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + $this->_page_full = false; + $this->_in_table = 0; + $this->_bottom_page_margin = null; + } + + + /** + * Set the renderer used for this pdf + * + * @param Renderer $renderer the renderer to use + */ + function set_renderer($renderer) { + $this->_renderer = $renderer; + } + + /** + * Return the renderer used for this pdf + * + * @return Renderer + */ + function get_renderer() { + return $this->_renderer; + } + + /** + * Set the frame's containing block. Overridden to set $this->_bottom_page_margin. + * + * @param float $x + * @param float $y + * @param float $w + * @param float $h + */ + function set_containing_block($x = null, $y = null, $w = null, $h = null) { + parent::set_containing_block($x,$y,$w,$h); + $w = $this->get_containing_block("w"); + if ( isset($h) ) + $this->_bottom_page_margin = $h; // - $this->_frame->get_style()->length_in_pt($this->_frame->get_style()->margin_bottom, $w); + } + + /** + * Returns true if the page is full and is no longer accepting frames. + * + * @return bool + */ + function is_full() { + return $this->_page_full; + } + + /** + * Start a new page by resetting the full flag. + */ + function next_page() { + $this->_renderer->new_page(); + $this->_page_full = false; + } + + /** + * Indicate to the page that a table is currently being reflowed. + */ + function table_reflow_start() { + $this->_in_table++; + } + + /** + * Indicate to the page that table reflow is finished. + */ + function table_reflow_end() { + $this->_in_table--; + } + + /** + * Return whether we are currently in a nested table or not + * + * @return bool + */ + function in_nested_table() { + return $this->_in_table > 1; + } + + /** + * Check if a forced page break is required before $frame. This uses the + * frame's page_break_before property as well as the preceeding frame's + * page_break_after property. + * + * @link http://www.w3.org/TR/CSS21/page.html#forced + * + * @param Frame $frame the frame to check + * @return bool true if a page break occured + */ + function check_forced_page_break(Frame $frame) { + + // Skip check if page is already split + if ( $this->_page_full ) + return; + + $block_types = array("block", "list-item", "table", "inline"); + $page_breaks = array("always", "left", "right"); + + $style = $frame->get_style(); + + if ( !in_array($style->display, $block_types) ) + return false; + + // Find the previous block-level sibling + $prev = $frame->get_prev_sibling(); + + while ( $prev && !in_array($prev->get_style()->display, $block_types) ) + $prev = $prev->get_prev_sibling(); + + + if ( in_array($style->page_break_before, $page_breaks) ) { + + // Prevent cascading splits + $frame->split(null, true); + // We have to grab the style again here because split() resets + // $frame->style to the frame's orignal style. + $frame->get_style()->page_break_before = "auto"; + $this->_page_full = true; + + return true; + } + + if ( $prev && in_array($prev->get_style()->page_break_after, $page_breaks) ) { + // Prevent cascading splits + $frame->split(null, true); + $prev->get_style()->page_break_after = "auto"; + $this->_page_full = true; + return true; + } + + if( $prev && $prev->get_last_child() && $frame->get_node()->nodeName != "body" ) { + $prev_last_child = $prev->get_last_child(); + if ( in_array($prev_last_child->get_style()->page_break_after, $page_breaks) ) { + $frame->split(null, true); + $prev_last_child->get_style()->page_break_after = "auto"; + $this->_page_full = true; + return true; + } + } + + + return false; + } + + /** + * Determine if a page break is allowed before $frame + * http://www.w3.org/TR/CSS21/page.html#allowed-page-breaks + * + * In the normal flow, page breaks can occur at the following places: + * + * 1. In the vertical margin between block boxes. When a page + * break occurs here, the used values of the relevant + * 'margin-top' and 'margin-bottom' properties are set to '0'. + * 2. Between line boxes inside a block box. + * + * These breaks are subject to the following rules: + * + * * Rule A: Breaking at (1) is allowed only if the + * 'page-break-after' and 'page-break-before' properties of + * all the elements generating boxes that meet at this margin + * allow it, which is when at least one of them has the value + * 'always', 'left', or 'right', or when all of them are + * 'auto'. + * + * * Rule B: However, if all of them are 'auto' and the + * nearest common ancestor of all the elements has a + * 'page-break-inside' value of 'avoid', then breaking here is + * not allowed. + * + * * Rule C: Breaking at (2) is allowed only if the number of + * line boxes between the break and the start of the enclosing + * block box is the value of 'orphans' or more, and the number + * of line boxes between the break and the end of the box is + * the value of 'widows' or more. + * + * * Rule D: In addition, breaking at (2) is allowed only if + * the 'page-break-inside' property is 'auto'. + * + * If the above doesn't provide enough break points to keep + * content from overflowing the page boxes, then rules B and D are + * dropped in order to find additional breakpoints. + * + * If that still does not lead to sufficient break points, rules A + * and C are dropped as well, to find still more break points. + * + * We will also allow breaks between table rows. However, when + * splitting a table, the table headers should carry over to the + * next page (but they don't yet). + * + * @param Frame $frame the frame to check + * @return bool true if a break is allowed, false otherwise + */ + protected function _page_break_allowed(Frame $frame) { + + $block_types = array("block", "list-item", "table", "-dompdf-image"); + dompdf_debug("page-break", "_page_break_allowed(" . $frame->get_node()->nodeName. ")"); + $display = $frame->get_style()->display; + + // Block Frames (1): + if ( in_array($display, $block_types) ) { + + // Avoid breaks within table-cells + if ( $this->_in_table ) { + dompdf_debug("page-break", "In table: " . $this->_in_table); + return false; + } + + // Rules A & B + + if ( $frame->get_style()->page_break_before === "avoid" ) { + dompdf_debug("page-break", "before: avoid"); + return false; + } + + // Find the preceeding block-level sibling + $prev = $frame->get_prev_sibling(); + while ( $prev && !in_array($prev->get_style()->display, $block_types) ) + $prev = $prev->get_prev_sibling(); + + // Does the previous element allow a page break after? + if ( $prev && $prev->get_style()->page_break_after === "avoid" ) { + dompdf_debug("page-break", "after: avoid"); + return false; + } + + // If both $prev & $frame have the same parent, check the parent's + // page_break_inside property. + $parent = $frame->get_parent(); + if ( $prev && $parent && $parent->get_style()->page_break_inside === "avoid" ) { + dompdf_debug("page-break", "parent inside: avoid"); + return false; + } + + // To prevent cascading page breaks when a top-level element has + // page-break-inside: avoid, ensure that at least one frame is + // on the page before splitting. + if ( $parent->get_node()->nodeName === "body" && !$prev ) { + // We are the body's first child + dompdf_debug("page-break", "Body's first child."); + return false; + } + + // If the frame is the first block-level frame, use the value from + // $frame's parent instead. + if ( !$prev && $parent ) + return $this->_page_break_allowed( $parent ); + + dompdf_debug("page-break", "block: break allowed"); + return true; + + } + + // Inline frames (2): + else if ( in_array($display, Style::$INLINE_TYPES) ) { + + // Avoid breaks within table-cells + if ( $this->_in_table ) { + dompdf_debug("page-break", "In table: " . $this->_in_table); + return false; + } + + // Rule C + $block_parent = $frame->find_block_parent(); + if ( count($block_parent->get_lines() ) < $frame->get_style()->orphans ) { + dompdf_debug("page-break", "orphans"); + return false; + } + + // FIXME: Checking widows is tricky without having laid out the + // remaining line boxes. Just ignore it for now... + + // Rule D + $p = $block_parent; + while ($p) { + if ( $p->get_style()->page_break_inside === "avoid" ) { + dompdf_debug("page-break", "parent->inside: avoid"); + return false; + } + $p = $p->find_block_parent(); + } + + // To prevent cascading page breaks when a top-level element has + // page-break-inside: avoid, ensure that at least one frame with + // some content is on the page before splitting. + $prev = $frame->get_prev_sibling(); + while ( $prev && ($prev->get_node()->nodeName === "#text" && trim($prev->get_node()->nodeValue) == "") ) + $prev = $prev->get_prev_sibling(); + + if ( $block_parent->get_node()->nodeName === "body" && !$prev ) { + // We are the body's first child + dompdf_debug("page-break", "Body's first child."); + return false; + } + + // Skip breaks on empty text nodes + if ( $frame->get_node()->nodeName === "#text" && + $frame->get_node()->nodeValue == "" ) + return false; + + dompdf_debug("page-break", "inline: break allowed"); + return true; + + // Table-rows + } else if ( $display === "table-row" ) { + + // Simply check if the parent table's page_break_inside property is + // not 'avoid' + $p = Table_Frame_Decorator::find_parent_table($frame); + + while ($p) { + if ( $p->get_style()->page_break_inside === "avoid" ) { + dompdf_debug("page-break", "parent->inside: avoid"); + return false; + } + $p = $p->find_block_parent(); + } + + // Avoid breaking after the first row of a table + if ( $p && $p->get_first_child() === $frame) { + dompdf_debug("page-break", "table: first-row"); + return false; + } + + // If this is a nested table, prevent the page from breaking + if ( $this->_in_table > 1 ) { + dompdf_debug("page-break", "table: nested table"); + return false; + } + + dompdf_debug("page-break","table-row/row-groups: break allowed"); + return true; + + } else if ( in_array($display, Table_Frame_Decorator::$ROW_GROUPS) ) { + + // Disallow breaks at row-groups: only split at row boundaries + return false; + + } else { + + dompdf_debug("page-break", "? " . $frame->get_style()->display . ""); + return false; + } + + } + + /** + * Check if $frame will fit on the page. If the frame does not fit, + * the frame tree is modified so that a page break occurs in the + * correct location. + * + * @param Frame $frame the frame to check + * @return Frame the frame following the page break + */ + function check_page_break(Frame $frame) { + // Do not split if we have already or if the frame was already + // pushed to the next page (prevents infinite loops) + if ( $this->_page_full || $frame->_already_pushed ) { + return false; + } + + // If the frame is absolute of fixed it shouldn't break + $p = $frame; + do { + if ( in_array($p->get_style()->position, array("fixed", "absolute")) ) + return false; + } while ( $p = $p->get_parent() ); + + $margin_height = $frame->get_margin_height(); + + // FIXME If the row is taller than the page and + // if it the first of the page, we don't break + if ( $frame->get_style()->display === "table-row" && + !$frame->get_prev_sibling() && + $margin_height > $this->get_margin_height() ) + return false; + + // Determine the frame's maximum y value + $max_y = $frame->get_position("y") + $margin_height; + + // If a split is to occur here, then the bottom margins & paddings of all + // parents of $frame must fit on the page as well: + $p = $frame->get_parent(); + while ( $p ) { + $style = $p->get_style(); + $max_y += $style->length_in_pt(array($style->margin_bottom, + $style->padding_bottom, + $style->border_bottom_width)); + $p = $p->get_parent(); + } + + + // Check if $frame flows off the page + if ( $max_y <= $this->_bottom_page_margin ) + // no: do nothing + return false; + + dompdf_debug("page-break", "check_page_break"); + dompdf_debug("page-break", "in_table: " . $this->_in_table); + + // yes: determine page break location + $iter = $frame; + $flg = false; + + $in_table = $this->_in_table; + + dompdf_debug("page-break","Starting search"); + while ( $iter ) { +// echo "\nbacktrack: " .$iter->get_node()->nodeName ." ".spl_object_hash($iter->get_node()). ""; + if ( $iter === $this ) { + dompdf_debug("page-break", "reached root."); + // We've reached the root in our search. Just split at $frame. + break; + } + + if ( $this->_page_break_allowed($iter) ) { + dompdf_debug("page-break","break allowed, splitting."); + $iter->split(null, true); + $this->_page_full = true; + $this->_in_table = $in_table; + $frame->_already_pushed = true; + return true; + } + + if ( !$flg && $next = $iter->get_last_child() ) { + dompdf_debug("page-break", "following last child."); + + if ( in_array($next->get_style()->display, Style::$TABLE_TYPES) ) + $this->_in_table++; + + $iter = $next; + continue; + } + + if ( $next = $iter->get_prev_sibling() ) { + dompdf_debug("page-break", "following prev sibling."); + + if ( in_array($next->get_style()->display, Style::$TABLE_TYPES) && + !in_array($iter->get_style()->display, Style::$TABLE_TYPES) ) + $this->_in_table++; + + else if ( !in_array($next->get_style()->display, Style::$TABLE_TYPES) && + in_array($iter->get_style()->display, Style::$TABLE_TYPES) ) + $this->_in_table--; + + $iter = $next; + $flg = false; + continue; + } + + if ( $next = $iter->get_parent() ) { + dompdf_debug("page-break", "following parent."); + + if ( in_array($iter->get_style()->display, Style::$TABLE_TYPES) ) + $this->_in_table--; + + $iter = $next; + $flg = true; + continue; + } + + break; + } + + $this->_in_table = $in_table; + + // No valid page break found. Just break at $frame. + dompdf_debug("page-break", "no valid break found, just splitting."); + + // If we are in a table, backtrack to the nearest top-level table row + if ( $this->_in_table ) { + $num_tables = $this->_in_table - 1; + + $iter = $frame; + while ( $iter && $num_tables && $iter->get_style->display !== "table" ) { + $iter = $iter->get_parent(); + $num_tables--; + } + + $iter = $frame; + while ($iter && $iter->get_style()->display !== "table-row" ) + $iter = $iter->get_parent(); + } + + $frame->split(null, true); + $this->_page_full = true; + $frame->_already_pushed = true; + return true; + + } + + //........................................................................ + + function split($frame = null, $force_pagebreak = false) { + // Do nothing + } + +} diff --git a/application/third_party/dompdf/include/page_frame_reflower.cls.php b/application/third_party/dompdf/include/page_frame_reflower.cls.php new file mode 100644 index 00000000..249b3435 --- /dev/null +++ b/application/third_party/dompdf/include/page_frame_reflower.cls.php @@ -0,0 +1,245 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: page_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Reflows pages + * + * @access private + * @package dompdf + */ +class Page_Frame_Reflower extends Frame_Reflower { + + /** + * Cache of the callbacks array + * + * @var array + */ + private $_callbacks; + + /** + * Cache of the canvas + * + * @var Canvas + */ + private $_canvas; + + /** + * This page's floating frames + * + * @var array + */ + private $_floating_frames; + + /** + * true if the page has floating frales + * Used to improve performances as it will + * be accesses everytime + * @var bool + */ + private $_has_floating_frames; + + /** + * The stacking context, containing all z-indexed frames + * @var array + */ + private $_stacking_context = array(); + + function __construct(Page_Frame_Decorator $frame) { parent::__construct($frame); } + + /** + * @return array + */ + function get_floating_frames() { return $this->_floating_frames; } + + /** + * @param $frame Frame + * @return void + */ + function add_frame_to_stacking_context(Frame $frame, $z_index) { + $this->_stacking_context[$z_index][] = $frame; + } + + /** + * Add a floating frame + * + * @param $child Frame + */ + function add_floating_frame(Frame $frame) { + $this->_floating_frames[] = $frame; + $this->_has_floating_frames = true; + } + + /** + * Tells if the page has floating frames + * + * @return bool + */ + function has_floating_frames() { + return $this->_has_floating_frames; + } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + $style = $this->_frame->get_style(); + + // Paged layout: + // http://www.w3.org/TR/CSS21/page.html + + // Pages are only concerned with margins + $cb = $this->_frame->get_containing_block(); + $left = $style->length_in_pt($style->margin_left, $cb["w"]); + $right = $style->length_in_pt($style->margin_right, $cb["w"]); + $top = $style->length_in_pt($style->margin_top, $cb["h"]); + $bottom = $style->length_in_pt($style->margin_bottom, $cb["h"]); + + $content_x = $cb["x"] + $left; + $content_y = $cb["y"] + $top; + $content_width = $cb["w"] - $left - $right; + $content_height = $cb["h"] - $top - $bottom; + + $fixed_children = array(); + + $prev_child = null; + $child = $this->_frame->get_first_child(); + $current_page = 0; + + while ($child) { + // Only if it's the first page, we save the nodes with a fixed position + if ($current_page == 0) { + $children = $child->get_children(); + foreach ($children as $onechild) { + if ($onechild->get_style()->position === "fixed") { + $fixed_children[] = $onechild->deep_copy(); + } + } + $fixed_children = array_reverse($fixed_children); + } + + $child->set_containing_block($content_x, $content_y, $content_width, $content_height); + + // Check for begin reflow callback + $this->_check_callbacks("begin_page_reflow", $child); + + //Insert a copy of each node which have a fixed position + if ($current_page >= 1) { + foreach ($fixed_children as $fixed_child) { + $child->insert_child_before($fixed_child->deep_copy(), $child->get_first_child()); + } + } + + $child->reflow(); + $next_child = $child->get_next_sibling(); + + // Check for begin render callback + $this->_check_callbacks("begin_page_render", $child); + + $renderer = $this->_frame->get_renderer(); + + // Render the page + $renderer->render($child); + + // http://www.w3.org/TR/CSS21/visuren.html#z-index + ksort($this->_stacking_context); + + foreach( $this->_stacking_context as $_z_index => $_frames ) { + foreach ( $_frames as $_frame ) { + $renderer->render($_frame); + } + } + + $this->_stacking_context = array(); + + // Check for end render callback + $this->_check_callbacks("end_page_render", $child); + + if ( $next_child ) { + $this->_frame->next_page(); + } + + // Wait to dispose of all frames on the previous page + // so callback will have access to them + if ( $prev_child ) { + $prev_child->dispose(true); + } + $prev_child = $child; + $child = $next_child; + $current_page++; + } + + // Dispose of previous page if it still exists + if ( $prev_child ) { + $prev_child->dispose(true); + } + } + + //........................................................................ + + /** + * Check for callbacks that need to be performed when a given event + * gets triggered on a page + * + * @param string $event the type of event + * @param Frame $frame the frame that event is triggered on + */ + protected function _check_callbacks($event, $frame) { + if (!isset($this->_callbacks)) { + $dompdf = $this->_frame->get_dompdf(); + $this->_callbacks = $dompdf->get_callbacks(); + $this->_canvas = $dompdf->get_canvas(); + } + + if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) { + $info = array(0 => $this->_canvas, "canvas" => $this->_canvas, + 1 => $frame, "frame" => $frame); + $fs = $this->_callbacks[$event]; + foreach ($fs as $f) { + if (is_callable($f)) { + if (is_array($f)) { + $f[0]->$f[1]($info); + } else { + $f($info); + } + } + } + } + } +} diff --git a/application/third_party/dompdf/include/pdflib_adapter.cls.php b/application/third_party/dompdf/include/pdflib_adapter.cls.php new file mode 100644 index 00000000..859b6be9 --- /dev/null +++ b/application/third_party/dompdf/include/pdflib_adapter.cls.php @@ -0,0 +1,1053 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - Clarify temp file name, optional debug output for temp file tracking + */ + +/* $Id: pdflib_adapter.cls.php 355 2011-01-27 07:44:54Z fabien.menager $ */ + +/** + * PDF rendering interface + * + * PDFLib_Adapter provides a simple, stateless interface to the one + * provided by PDFLib. + * + * Unless otherwise mentioned, all dimensions are in points (1/72 in). + * The coordinate origin is in the top left corner and y values + * increase downwards. + * + * See {@link http://www.pdflib.com/} for more complete documentation + * on the underlying PDFlib functions. + * + * @package dompdf + */ +class PDFLib_Adapter implements Canvas { + + /** + * Dimensions of paper sizes in points + * + * @var array; + */ + static public $PAPER_SIZES = array(); // Set to + // CPDF_Adapter::$PAPER_SIZES below. + + /** + * Whether to create PDFs in memory or on disk + * + * @var bool + */ + static $IN_MEMORY = true; + + /** + * Instance of PDFLib class + * + * @var PDFlib + */ + private $_pdf; + + /** + * Name of temporary file used for PDFs created on disk + * + * @var string + */ + private $_file; + + /** + * PDF width, in points + * + * @var float + */ + private $_width; + + /** + * PDF height, in points + * + * @var height + */ + private $_height; + + /** + * Last fill colour used + * + * @var array + */ + private $_last_fill_color; + + /** + * Last stroke colour used + * + * @var array + */ + private $_last_stroke_color; + + /** + * Cache of image handles + * + * @var array + */ + private $_imgs; + + /** + * Cache of font handles + * + * @var array + */ + private $_fonts; + + /** + * List of objects (templates) to add to multiple pages + * + * @var array + */ + private $_objs; + + /** + * Current page number + * + * @var int + */ + private $_page_number; + + /** + * Total number of pages + * + * @var int + */ + private $_page_count; + + /** + * Text to display on every page + * + * @var array + */ + private $_page_text; + + /** + * Array of pages for accesing after rendering is initially complete + * + * @var array + */ + private $_pages; + + /** + * Class constructor + * + * @param mixed $paper The size of paper to use either a string (see {@link CPDF_Adapter::$PAPER_SIZES}) or + * an array(xmin,ymin,xmax,ymax) + * @param string $orientation The orientation of the document (either 'landscape' or 'portrait') + */ + function __construct($paper = "letter", $orientation = "portrait") { + if ( is_array($paper) ) + $size = $paper; + else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) ) + $size = self::$PAPER_SIZES[mb_strtolower($paper)]; + else + $size = self::$PAPER_SIZES["letter"]; + + if ( mb_strtolower($orientation) === "landscape" ) { + list($size[2], $size[3]) = array($size[3], $size[2]); + } + + $this->_width = $size[2] - $size[0]; + $this->_height= $size[3] - $size[1]; + + $this->_pdf = new PDFLib(); + + if ( defined("DOMPDF_PDFLIB_LICENSE") ) + $this->_pdf->set_parameter( "license", DOMPDF_PDFLIB_LICENSE); + + $this->_pdf->set_parameter("textformat", "utf8"); + $this->_pdf->set_parameter("fontwarning", "false"); + + $this->_pdf->set_info("Creator", "DOMPDF"); + + // Silence pedantic warnings about missing TZ settings + $tz = @date_default_timezone_get(); + date_default_timezone_set("UTC"); + $this->_pdf->set_info("Date", date("Y-m-d")); + date_default_timezone_set($tz); + + if ( self::$IN_MEMORY ) + $this->_pdf->begin_document("",""); + else { + $this->_file = tempnam(DOMPDF_TEMP_DIR, "libdompdf_pdf_").'.pdf'; + $this->_pdf->begin_document($this->_file,""); + } + + $this->_pdf->begin_page_ext($this->_width, $this->_height, ""); + + $this->_page_number = $this->_page_count = 1; + $this->_page_text = array(); + + $this->_imgs = array(); + $this->_fonts = array(); + $this->_objs = array(); + + // Set up font paths + $families = Font_Metrics::get_font_families(); + foreach ($families as $family => $files) { + foreach ($files as $style => $file) { + $face = basename($file); + + // Prefer ttfs to afms + if ( file_exists("$file.ttf") ) { + $outline = "$file.ttf"; + $afm = null; + + } else if ( file_exists("$file.TTF") ) { + $outline = "$file.TTF"; + $afm = null; + + } else if ( file_exists("$file.pfb") ) { + $outline = "$file.pfb"; + + if ( file_exists("$file.afm") ) + $afm = "$file.afm"; + + } else if ( file_exists("$file.PFB") ) { + $outline = "$file.PFB"; + if ( file_exists("$file.AFM") ) + $afm = "$file.AFM"; + } else + continue; + + $this->_pdf->set_parameter("FontOutline", "\{$face\}=\{$outline\}"); + if ( !is_null($afm) ) + $this->_pdf->set_parameter("FontAFM", "\{$face\}=\{$afm\}"); + } + } + } + + /** + * Close the pdf + */ + protected function _close() { + $this->_place_objects(); + + // Close all pages + $this->_pdf->suspend_page(""); + for ($p = 1; $p <= $this->_page_count; $p++) { + $this->_pdf->resume_page("pagenumber=$p"); + $this->_pdf->end_page_ext(""); + } + + $this->_pdf->end_document(""); + } + + + /** + * Returns the PDFLib instance + * + * @return PDFLib + */ + function get_pdflib() { return $this->_pdf; } + + /** + * Add meta information to the PDF + * + * @param string $label label of the value (Creator, Producter, etc.) + * @param string $value the text to set + */ + function add_info($label, $value) { + $this->_pdf->set_info($label, $value); + } + + /** + * Opens a new 'object' (template in PDFLib-speak) + * + * While an object is open, all drawing actions are recorded to the + * object instead of being drawn on the current page. Objects can + * be added later to a specific page or to several pages. + * + * The return value is an integer ID for the new object. + * + * @see PDFLib_Adapter::close_object() + * @see PDFLib_Adapter::add_object() + * + * @return int + */ + function open_object() { + $this->_pdf->suspend_page(""); + $ret = $this->_pdf->begin_template($this->_width, $this->_height); + $this->_pdf->save(); + $this->_objs[$ret] = array("start_page" => $this->_page_number); + return $ret; + } + + /** + * Reopen an existing object (NOT IMPLEMENTED) + * + * PDFLib does not seem to support reopening templates. + * + * @param int $object the ID of a previously opened object + */ + function reopen_object($object) { + throw new DOMPDF_Exception("PDFLib does not support reopening objects."); + } + + /** + * Close the current template + * + * @see PDFLib_Adapter::open_object() + */ + function close_object() { + $this->_pdf->restore(); + $this->_pdf->end_template(); + $this->_pdf->resume_page("pagenumber=".$this->_page_number); + } + + /** + * Adds the specified object to the document + * + * $where can be one of: + * - 'add' add to current page only + * - 'all' add to every page from the current one onwards + * - 'odd' add to all odd numbered pages from now on + * - 'even' add to all even numbered pages from now on + * - 'next' add the object to the next page only + * - 'nextodd' add to all odd numbered pages from the next one + * - 'nexteven' add to all even numbered pages from the next one + * + * @param int $object the object handle returned by open_object() + * @param string $where + */ + function add_object($object, $where = 'all') { + + if ( mb_strpos($where, "next") !== false ) { + $this->_objs[$object]["start_page"]++; + $where = str_replace("next", "", $where); + if ( $where == "" ) + $where = "add"; + } + + $this->_objs[$object]["where"] = $where; + } + + /** + * Stops the specified template from appearing in the document. + * + * The object will stop being displayed on the page following the + * current one. + * + * @param int $object + */ + function stop_object($object) { + + if ( !isset($this->_objs[$object]) ) + return; + + $start = $this->_objs[$object]["start_page"]; + $where = $this->_objs[$object]["where"]; + + // Place the object on this page if required + if ( $this->_page_number >= $start && + (($this->_page_number % 2 == 0 && $where === "even") || + ($this->_page_number % 2 == 1 && $where === "odd") || + ($where === "all")) ) + $this->_pdf->fit_image($object,0,0,""); + + $this->_objs[$object] = null; + unset($this->_objs[$object]); + } + + /** + * Add all active objects to the current page + */ + protected function _place_objects() { + + foreach ( $this->_objs as $obj => $props ) { + $start = $props["start_page"]; + $where = $props["where"]; + + // Place the object on this page if required + if ( $this->_page_number >= $start && + (($this->_page_number % 2 == 0 && $where === "even") || + ($this->_page_number % 2 == 1 && $where === "odd") || + ($where === "all")) ) { + $this->_pdf->fit_image($obj,0,0,""); + } + } + + } + + function get_width() { return $this->_width; } + + function get_height() { return $this->_height; } + + function get_page_number() { return $this->_page_number; } + + function get_page_count() { return $this->_page_count; } + + function set_page_number($num) { $this->_page_number = (int)$num; } + + function set_page_count($count) { $this->_page_count = (int)$count; } + + + /** + * Sets the line style + * + * @param float width + * @param string corner + * @param string join + * @param array dash + */ + protected function _set_line_style($width, $cap, $join, $dash) { + + if ( count($dash) == 1 ) + $dash[] = $dash[0]; + + if ( count($dash) > 1 ) + $this->_pdf->setdashpattern("dasharray={" . implode(" ", $dash) . "}"); + else + $this->_pdf->setdash(0,0); + + switch ( $join ) { + case "miter": + $this->_pdf->setlinejoin(0); + break; + + case "round": + $this->_pdf->setlinejoin(1); + break; + + case "bevel": + $this->_pdf->setlinejoin(2); + break; + + default: + break; + } + + switch ( $cap ) { + case "butt": + $this->_pdf->setlinecap(0); + break; + + case "round": + $this->_pdf->setlinecap(1); + break; + + case "square": + $this->_pdf->setlinecap(2); + break; + + default: + break; + } + + $this->_pdf->setlinewidth($width); + + } + + /** + * Sets the line color + * + * @param array $color array(r,g,b) + */ + protected function _set_stroke_color($color) { + if($this->_last_stroke_color == $color) + return; + + $this->_last_stroke_color = $color; + + if (isset($color[3])) { + $type = "cmyk"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], $color[3]); + } + elseif (isset($color[2])) { + $type = "rgb"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], null); + } + else { + $type = "gray"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], null, null); + } + + $this->_pdf->setcolor("stroke", $type, $c1, $c2, $c3, $c4); + } + + /** + * Sets the fill color + * + * @param array $color array(r,g,b) + */ + protected function _set_fill_color($color) { + if($this->_last_fill_color == $color) + return; + + $this->_last_fill_color = $color; + + if (isset($color[3])) { + $type = "cmyk"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], $color[3]); + } + elseif (isset($color[2])) { + $type = "rgb"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], null); + } + else { + $type = "gray"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], null, null); + } + + $this->_pdf->setcolor("fill", $type, $c1, $c2, $c3, $c4); + } + + /** + * Sets the opacity + * + * @param $opacity + * @param $mode + */ + function set_opacity($opacity, $mode = "Normal") { + if ( $mode === "Normal" ) { + $gstate = $this->_pdf->create_gstate("opacityfill=$opacity opacitystroke=$opacity"); + $this->_pdf->set_gstate($gstate); + } + } + + /** + * Loads a specific font and stores the corresponding descriptor. + * + * @param string $font + * @return int the font descriptor for the font + */ + protected function _load_font($font, $encoding = null, $options = "") { + + // Check if the font is a native PDF font + // Embed non-native fonts + $native_fonts = array("courier", "courier-bold", "courier-oblique", "courier-boldoblique", + "helvetica", "helvetica-bold", "helvetica-oblique", "helvetica-boldoblique", + "times-roman", "times-bold", "times-italic", "times-bolditalic", + "symbol", "zapfdinbats"); + + $test = strtolower(basename($font)); + if ( in_array($test, $native_fonts) ) { + $font = basename($font); + + } else { + // Embed non-native fonts + $options .= " embedding=true"; + } + + if ( is_null($encoding) ) { + + // Unicode encoding is only available for the commerical + // version of PDFlib and not PDFlib-Lite + if ( defined("DOMPDF_PDFLIB_LICENSE") ) + $encoding = "unicode"; + else + $encoding = "auto"; + + } + + $key = "$font:$encoding:$options"; + + if ( isset($this->_fonts[$key]) ) + return $this->_fonts[$key]; + + else { + + $this->_fonts[$key] = $this->_pdf->load_font($font, $encoding, $options); + return $this->_fonts[$key]; + + } + + } + + /** + * Remaps y coords from 4th to 1st quadrant + * + * @param float $y + * @return float + */ + protected function y($y) { return $this->_height - $y; } + + //........................................................................ + + function line($x1, $y1, $x2, $y2, $color, $width, $style = null) { + $this->_set_line_style($width, "butt", "", $style); + $this->_set_stroke_color($color); + + $y1 = $this->y($y1); + $y2 = $this->y($y2); + + $this->_pdf->moveto($x1,$y1); + $this->_pdf->lineto($x2, $y2); + $this->_pdf->stroke(); + } + + //........................................................................ + + function rectangle($x1, $y1, $w, $h, $color, $width, $style = null) { + $this->_set_stroke_color($color); + $this->_set_line_style($width, "butt", "", $style); + + $y1 = $this->y($y1) - $h; + + $this->_pdf->rect($x1, $y1, $w, $h); + $this->_pdf->stroke(); + } + + //........................................................................ + + function filled_rectangle($x1, $y1, $w, $h, $color) { + $this->_set_fill_color($color); + + $y1 = $this->y($y1) - $h; + + $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h)); + $this->_pdf->fill(); + } + + function clipping_rectangle($x1, $y1, $w, $h) { + $this->_pdf->save(); + + $y1 = $this->y($y1) - $h; + + $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h)); + $this->_pdf->clip(); + } + + function clipping_end() { + $this->_pdf->restore(); + } + + function save() { + $this->_pdf->save(); + } + + function restore() { + $this->_pdf->restore(); + } + + function rotate($angle, $x, $y) { + $pdf = $this->_pdf; + $pdf->translate($x, $this->_height-$y); + $pdf->rotate(-$angle); + $pdf->translate(-$x, -$this->_height+$y); + } + + function skew($angle_x, $angle_y, $x, $y) { + $pdf = $this->_pdf; + $pdf->translate($x, $this->_height-$y); + $pdf->skew($angle_y, $angle_x); // Needs to be inverted + $pdf->translate(-$x, -$this->_height+$y); + } + + function scale($s_x, $s_y, $x, $y) { + $pdf = $this->_pdf; + $pdf->translate($x, $this->_height-$y); + $pdf->scale($s_x, $s_y); + $pdf->translate(-$x, -$this->_height+$y); + } + + function translate($t_x, $t_y) { + $this->_pdf->translate($t_x, -$t_y); + } + + function transform($a, $b, $c, $d, $e, $f) { + $this->_pdf->concat($a, $b, $c, $d, $e, $f); + } + + //........................................................................ + + function polygon($points, $color, $width = null, $style = null, $fill = false) { + + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + if ( !$fill && isset($width) ) + $this->_set_line_style($width, "square", "miter", $style); + + $y = $this->y(array_pop($points)); + $x = array_pop($points); + $this->_pdf->moveto($x,$y); + + while (count($points) > 1) { + $y = $this->y(array_pop($points)); + $x = array_pop($points); + $this->_pdf->lineto($x,$y); + } + + if ( $fill ) + $this->_pdf->fill(); + else + $this->_pdf->closepath_stroke(); + } + + //........................................................................ + + function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false) { + + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + if ( !$fill && isset($width) ) + $this->_set_line_style($width, "round", "round", $style); + + $y = $this->y($y); + + $this->_pdf->circle($x, $y, $r); + + if ( $fill ) + $this->_pdf->fill(); + else + $this->_pdf->stroke(); + + } + + //........................................................................ + + function image($img_url, $img_type, $x, $y, $w, $h) { + $w = (int)$w; + $h = (int)$h; + + $img_type = strtolower($img_type); + + if ( $img_type === "jpg" ) + $img_type = "jpeg"; + + if ( isset($this->_imgs[$img_url]) ) + $img = $this->_imgs[$img_url]; + + else { + + $img = $this->_imgs[$img_url] = $this->_pdf->load_image($img_type, $img_url, ""); + } + + $y = $this->y($y) - $h; + $this->_pdf->fit_image($img, $x, $y, 'boxsize={'. "$w $h" .'} fitmethod=entire'); + + } + + //........................................................................ + + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_spacing = 0, $char_spacing = 0, $angle = 0) { + $fh = $this->_load_font($font); + + $this->_pdf->setfont($fh, $size); + $this->_set_fill_color($color); + + $y = $this->y($y) - Font_Metrics::get_font_height($font, $size); + + $word_spacing = (float)$word_spacing; + $char_spacing = (float)$char_spacing; + $angle = -(float)$angle; + + $this->_pdf->fit_textline($text, $x, $y, "rotate=$angle wordspacing=$word_spacing charspacing=$char_spacing "); + + } + + //........................................................................ + + function javascript($code) { + if ( defined("DOMPDF_PDFLIB_LICENSE") ) { + $this->_pdf->create_action("JavaScript", $code); + } + } + + //........................................................................ + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname) { + $this->_pdf->add_nameddest($anchorname,""); + } + + //........................................................................ + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height) { + + $y = $this->y($y) - $height; + if ( strpos($url, '#') === 0 ) { + // Local link + $name = substr($url,1); + if ( $name ) + $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', "contents={$url} destname=". substr($url,1) . " linewidth=0"); + } else { + + list($proto, $host, $path, $file) = explode_url($url); + + if ( $proto == "" || $proto === "file://" ) + return; // Local links are not allowed + $url = build_url($proto, $host, $path, $file); + $url = '{' . rawurldecode($url) . '}'; + + $action = $this->_pdf->create_action("URI", "url=" . $url); + $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', "contents={$url} action={activate=$action} linewidth=0"); + } + } + + //........................................................................ + + function get_text_width($text, $font, $size, $word_spacing = 0, $letter_spacing = 0) { + $fh = $this->_load_font($font); + + // Determine the additional width due to extra spacing + $num_spaces = mb_substr_count($text," "); + $delta = $word_spacing * $num_spaces; + + if ( $letter_spacing ) { + $num_chars = mb_strlen($text); + $delta += ($num_chars - $num_spaces) * $letter_spacing; + } + + return $this->_pdf->stringwidth($text, $fh, $size) + $delta; + } + + //........................................................................ + + function get_font_height($font, $size) { + + $fh = $this->_load_font($font); + + $this->_pdf->setfont($fh, $size); + + $asc = $this->_pdf->get_value("ascender", $fh); + $desc = $this->_pdf->get_value("descender", $fh); + + // $desc is usually < 0, + return $size * ($asc - $desc) * DOMPDF_FONT_HEIGHT_RATIO; + } + + //........................................................................ + + /** + * Writes text at the specified x and y coordinates on every page + * + * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced + * with their current values. + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x + * @param float $y + * @param string $text the text to write + * @param string $font the font file to use + * @param float $size the font size, in points + * @param array $color + * @param float $adjust word spacing adjustment + * @param float $angle angle to write the text at, measured CW starting from the x-axis + */ + function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), + $adjust = 0, $angle = 0) { + $_t = "text"; + $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "adjust", "angle"); + } + + //........................................................................ + + /** + * Processes a script on every page + * + * The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available. + * + * This function can be used to add page numbers to all pages + * after the first one, for example. + * + * @param string $code the script code + * @param string $type the language type for script + */ + function page_script($code, $type = "text/php") { + $_t = "script"; + $this->_page_text[] = compact("_t", "code", "type"); + } + + //........................................................................ + + function new_page() { + + // Add objects to the current page + $this->_place_objects(); + + $this->_pdf->suspend_page(""); + $this->_pdf->begin_page_ext($this->_width, $this->_height, ""); + $this->_page_number = ++$this->_page_count; + + } + + //........................................................................ + + /** + * Add text to each page after rendering is complete + */ + protected function _add_page_text() { + + if ( !count($this->_page_text) ) + return; + + $this->_pdf->suspend_page(""); + + for ($p = 1; $p <= $this->_page_count; $p++) { + $this->_pdf->resume_page("pagenumber=$p"); + + foreach ($this->_page_text as $pt) { + extract($pt); + + switch ($_t) { + + case "text": + $text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"), + array($p, $this->_page_count), $text); + $this->text($x, $y, $text, $font, $size, $color, $adjust, $angle); + break; + + case "script": + if (!$eval) { + $eval = new PHP_Evaluator($this); + } + $eval->evaluate($code, array('PAGE_NUM' => $p, 'PAGE_COUNT' => $this->_page_count)); + break; + } + } + + $this->_pdf->suspend_page(""); + } + + $this->_pdf->resume_page("pagenumber=".$this->_page_number); + } + + //........................................................................ + + function stream($filename, $options = null) { + + // Add page text + $this->_add_page_text(); + + if ( isset($options["compress"]) && $options["compress"] != 1 ) + $this->_pdf->set_value("compress", 0); + else + $this->_pdf->set_value("compress", 6); + + $this->_close(); + + if ( self::$IN_MEMORY ) { + $data = $this->_pdf->get_buffer(); + $size = strlen($data); + + } else + $size = filesize($this->_file); + + + $filename = str_replace(array("\n","'"),"", $filename); + $attach = (isset($options["Attachment"]) && $options["Attachment"]) ? "attachment" : "inline"; + + header("Cache-Control: private"); + header("Content-type: application/pdf"); + header("Content-Disposition: $attach; filename=\"$filename\""); + + //header("Content-length: " . $size); + + if ( self::$IN_MEMORY ) + echo $data; + + else { + + // Chunked readfile() + $chunk = (1 << 21); // 2 MB + $fh = fopen($this->_file, "rb"); + if ( !$fh ) + throw new DOMPDF_Exception("Unable to load temporary PDF file: " . $this->_file); + + while ( !feof($fh) ) + echo fread($fh,$chunk); + fclose($fh); + + //debugpng + if (DEBUGPNG) print '[pdflib stream unlink '.$this->_file.']'; + if (!DEBUGKEEPTEMP) + + unlink($this->_file); + $this->_file = null; + unset($this->_file); + } + + flush(); + } + + //........................................................................ + + function output($options = null) { + + // Add page text + $this->_add_page_text(); + + if ( isset($options["compress"]) && $options["compress"] != 1 ) + $this->_pdf->set_value("compress", 0); + else + $this->_pdf->set_value("compress", 6); + + $this->_close(); + + if ( self::$IN_MEMORY ) + $data = $this->_pdf->get_buffer(); + + else { + $data = file_get_contents($this->_file); + + //debugpng + if (DEBUGPNG) print '[pdflib output unlink '.$this->_file.']'; + if (!DEBUGKEEPTEMP) + + unlink($this->_file); + $this->_file = null; + unset($this->_file); + } + + return $data; + } +} + +// Workaround for idiotic limitation on statics... +PDFLib_Adapter::$PAPER_SIZES = CPDF_Adapter::$PAPER_SIZES; diff --git a/application/third_party/dompdf/include/php_evaluator.cls.php b/application/third_party/dompdf/include/php_evaluator.cls.php new file mode 100644 index 00000000..fe45864a --- /dev/null +++ b/application/third_party/dompdf/include/php_evaluator.cls.php @@ -0,0 +1,76 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: php_evaluator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Executes inline PHP code during the rendering process + * + * @access private + * @package dompdf + */ +class PHP_Evaluator { + + protected $_canvas; + + function __construct(Canvas $canvas) { + $this->_canvas = $canvas; + } + + function evaluate($code, $vars = array()) { + if ( !DOMPDF_ENABLE_PHP ) + return; + + // Set up some variables for the inline code + $pdf = $this->_canvas; + $PAGE_NUM = $pdf->get_page_number(); + $PAGE_COUNT = $pdf->get_page_count(); + + // Override those variables if passed in + foreach ($vars as $k => $v) { + $$k = $v; + } + + eval(utf8_decode($code)); + } + + function render($frame) { + $this->evaluate($frame->get_node()->nodeValue); + } +} diff --git a/application/third_party/dompdf/include/positioner.cls.php b/application/third_party/dompdf/include/positioner.cls.php new file mode 100644 index 00000000..f2e27af2 --- /dev/null +++ b/application/third_party/dompdf/include/positioner.cls.php @@ -0,0 +1,71 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: positioner.cls.php 283 2010-07-19 17:57:40Z fabien.menager $ */ + +/** + * Base Positioner class + * + * Defines postioner interface + * + * @access private + * @package dompdf + */ +abstract class Positioner { + + // protected members + protected $_frame; + + //........................................................................ + + function __construct(Frame_Decorator $frame) { + $this->_frame = $frame; + } + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + //........................................................................ + + abstract function position(); + +} diff --git a/application/third_party/dompdf/include/renderer.cls.php b/application/third_party/dompdf/include/renderer.cls.php new file mode 100644 index 00000000..d3d2162d --- /dev/null +++ b/application/third_party/dompdf/include/renderer.cls.php @@ -0,0 +1,293 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: renderer.cls.php 351 2011-01-19 20:27:02Z fabien.menager $ */ + +/** + * Concrete renderer + * + * Instantiates several specific renderers in order to render any given + * frame. + * + * @access private + * @package dompdf + */ +class Renderer extends Abstract_Renderer { + + /** + * Array of renderers for specific frame types + * + * @var array + */ + protected $_renderers; + + /** + * Cache of the callbacks array + * + * @var array + */ + private $_callbacks; + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + + /** + * Advance the canvas to the next page + */ + function new_page() { + $this->_canvas->new_page(); + } + + /** + * Render frames recursively + * + * @param Frame $frame the frame to render + */ + function render(Frame $frame) { + global $_dompdf_debug; + + if ( $_dompdf_debug ) { + echo $frame; + flush(); + } + + $style = $frame->get_style(); + $display = $style->display; + + // Starts the CSS transformation + if ( $style->transform && is_array($style->transform) ) { + $this->_canvas->save(); + list($x, $y, $w, $h) = $frame->get_padding_box(); + $origin = $style->transform_origin; + + foreach($style->transform as $transform) { + list($function, $values) = $transform; + if ( $function === "matrix" ) { + $function = "transform"; + } + + $values = array_map("floatval", $values); + $values[] = $x + $style->length_in_pt($origin[0], $style->width); + $values[] = $y + $style->length_in_pt($origin[1], $style->height); + + call_user_func_array(array($this->_canvas, $function), $values); + } + } + + switch ($display) { + + case "block": + case "list-item": + case "inline-block": + case "table": + case "table-row-group": + case "table-header-group": + case "table-footer-group": + case "inline-table": + $this->_render_frame("block", $frame); + break; + + case "inline": + if ( $frame->get_node()->nodeName === "#text" ) + $this->_render_frame("text", $frame); + else + $this->_render_frame("inline", $frame); + break; + + case "table-cell": + $this->_render_frame("table-cell", $frame); + break; + + case "-dompdf-list-bullet": + $this->_render_frame("list-bullet", $frame); + break; + + case "-dompdf-image": + $this->_render_frame("image", $frame); + break; + + case "none": + $node = $frame->get_node(); + + if ( $node->nodeName === "script" ) { + if ( $node->getAttribute("type") === "text/php" || + $node->getAttribute("language") === "php" ) { + // Evaluate embedded php scripts + $this->_render_frame("php", $frame); + } + + elseif ( $node->getAttribute("type") === "text/javascript" || + $node->getAttribute("language") === "javascript" ) { + // Insert JavaScript + $this->_render_frame("javascript", $frame); + } + } + + // Don't render children, so skip to next iter + return; + + default: + break; + + } + + // Check for begin frame callback + $this->_check_callbacks("begin_frame", $frame); + + // Starts the overflow: hidden box + if ( $style->overflow === "hidden" ) { + list($x, $y, $w, $h) = $frame->get_padding_box(); + $this->_canvas->clipping_rectangle($x, $y, $w, $h); + } + + $page = $frame->get_root()->get_reflower(); + + foreach ($frame->get_children() as $child) { + $child_style = $child->get_style(); + + // Stacking context + if ( $child_style->z_index !== false && ($child_style->z_index !== "auto" || in_array($child_style->position, Style::$POSITIONNED_TYPES)) ) { + $z_index = ($child_style->z_index === "auto") ? 0 : intval($child_style->z_index); + $page->add_frame_to_stacking_context($child, $z_index); + $child_style->z_index = false; + } + + else { + $this->render($child); + } + } + + // Ends the overflow: hidden box + if ( $style->overflow === "hidden" ) { + $this->_canvas->clipping_end(); + } + + if ( $style->transform && is_array($style->transform) ) { + $this->_canvas->restore(); + } + + // Check for end frame callback + $this->_check_callbacks("end_frame", $frame); + + } + + /** + * Check for callbacks that need to be performed when a given event + * gets triggered on a frame + * + * @param string $event the type of event + * @param Frame $frame the frame that event is triggered on + */ + protected function _check_callbacks($event, $frame) { + if (!isset($this->_callbacks)) { + $this->_callbacks = $this->_dompdf->get_callbacks(); + } + + if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) { + $info = array(0 => $this->_canvas, "canvas" => $this->_canvas, + 1 => $frame, "frame" => $frame); + $fs = $this->_callbacks[$event]; + foreach ($fs as $f) { + if (is_callable($f)) { + if (is_array($f)) { + $f[0]->$f[1]($info); + } else { + $f($info); + } + } + } + } + } + + /** + * Render a single frame + * + * Creates Renderer objects on demand + * + * @param string $type type of renderer to use + * @param Frame $frame the frame to render + */ + protected function _render_frame($type, $frame) { + + if ( !isset($this->_renderers[$type]) ) { + + switch ($type) { + case "block": + $this->_renderers[$type] = new Block_Renderer($this->_dompdf); + break; + + case "inline": + $this->_renderers[$type] = new Inline_Renderer($this->_dompdf); + break; + + case "text": + $this->_renderers[$type] = new Text_Renderer($this->_dompdf); + break; + + case "image": + $this->_renderers[$type] = new Image_Renderer($this->_dompdf); + break; + + case "table-cell": + $this->_renderers[$type] = new Table_Cell_Renderer($this->_dompdf); + break; + + case "list-bullet": + $this->_renderers[$type] = new List_Bullet_Renderer($this->_dompdf); + break; + + case "php": + $this->_renderers[$type] = new PHP_Evaluator($this->_canvas); + break; + + case "javascript": + $this->_renderers[$type] = new Javascript_Embedder($this->_dompdf); + break; + + } + } + + $this->_renderers[$type]->render($frame); + + } +} diff --git a/application/third_party/dompdf/include/style.cls.php b/application/third_party/dompdf/include/style.cls.php new file mode 100644 index 00000000..594134b9 --- /dev/null +++ b/application/third_party/dompdf/include/style.cls.php @@ -0,0 +1,2149 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - Fix px to pt conversion according to DOMPDF_DPI + * - Recognize css styles with !important attribute, and store !important attribute within style + * - Propagate !important by inherit and sequences of styles with merge. + * - Add missing style property cache flushes for consistent rendering, e.g. on explicte assignments + * - Add important set/get for access from outside of class + * - Fix font_family search path with multiple fonts list in css attribute: + * On missing font, do not immediately fall back to default font, + * but try subsequent fonts in search chain. Only when none found, explicitely + * refer to default font. + * - Allow read of background individual properties + * - Add support for individual styles background-position, background-attachment, background-repeat + * - Complete style components of list-style + * - Add support for combined styles in addition to individual styles + * like {border: red 1px solid;}, { border-width: 1px;}, { border-right-color: red; } ... + * for font, background + * - Propagate attributes including !important from combined style to individual component + * for border, background, padding, margin, font, list_style + * - Refactor common code of border, background, padding, margin, font, list_style + * - Refactor common code of list-style-image and background-image + * - special treatment of css images "none" instead of url(...), otherwise would prepend string "none" with path name + * - Added comments + * - Added debug output + * @contributor Helmut Tischer + * @version dompdf_trunk_with_helmut_mods.20090524 + * - Allow superflous white space and string delimiter in font search path. + * - Restore lost change of default font of above + * @version 20090610 + * - Allow absolute path from web server root as html image reference + * - More accurate handling of css property cache consistency + */ + +/* $Id: style.cls.php 355 2011-01-27 07:44:54Z fabien.menager $ */ + +/** + * Represents CSS properties. + * + * The Style class is responsible for handling and storing CSS properties. + * It includes methods to resolve colours and lengths, as well as getters & + * setters for many CSS properites. + * + * Actual CSS parsing is performed in the {@link Stylesheet} class. + * + * @package dompdf + */ +class Style { + + /** + * Default font size, in points. + * + * @var float + */ + static $default_font_size = 12; + + /** + * Default line height, as a fraction of the font size. + * + * @var float + */ + static $default_line_height = 1.2; + + /** + * Default "absolute" font sizes relative to the default font-size + * http://www.w3.org/TR/css3-fonts/#font-size-the-font-size-property + * @var array + */ + static $font_size_keywords = array( + "xx-small" => 0.6, // 3/5 + "x-small" => 0.75, // 3/4 + "small" => 0.889, // 8/9 + "medium" => 1, // 1 + "large" => 1.2, // 6/5 + "x-large" => 1.5, // 3/2 + "xx-large" => 2.0, // 2/1 + ); + + /** + * List of all inline types. Should really be a constant. + * + * @var array + */ + static $INLINE_TYPES = array("inline"); + + /** + * List of all block types. Should really be a constant. + * + * @var array + */ + static $BLOCK_TYPES = array("block", "inline-block", "table-cell", "list-item"); + + /** + * List of all positionned types. Should really be a constant. + * + * @var array + */ + static $POSITIONNED_TYPES = array("relative", "absolute", "fixed"); + + /** + * List of all table types. Should really be a constant. + * + * @var array; + */ + static $TABLE_TYPES = array("table", "inline-table"); + + /** + * List of valid border styles. Should also really be a constant. + * + * @var array + */ + static $BORDER_STYLES = array("none", "hidden", "dotted", "dashed", "solid", + "double", "groove", "ridge", "inset", "outset"); + + /** + * Default style values. + * + * @link http://www.w3.org/TR/CSS21/propidx.html + * + * @var array + */ + static protected $_defaults = null; + + /** + * List of inherited properties + * + * @link http://www.w3.org/TR/CSS21/propidx.html + * + * @var array + */ + static protected $_inherited = null; + + /** + * The stylesheet this style belongs to + * + * @see Stylesheet + * @var Stylesheet + */ + protected $_stylesheet; // stylesheet this style is attached to + + /** + * Main array of all CSS properties & values + * + * @var array + */ + protected $_props; + + /* var instead of protected would allow access outside of class */ + protected $_important_props; + + /** + * Cached property values + * + * @var array + */ + protected $_prop_cache; + + /** + * Font size of parent element in document tree. Used for relative font + * size resolution. + * + * @var float + */ + protected $_parent_font_size; // Font size of parent element + + /** + * @var Frame + */ + protected $_frame; + + // private members + /** + * True once the font size is resolved absolutely + * + * @var bool + */ + private $__font_size_calculated; // Cache flag + + /** + * Class constructor + * + * @param Stylesheet $stylesheet the stylesheet this Style is associated with. + */ + function __construct(Stylesheet $stylesheet) { + $this->_props = array(); + $this->_important_props = array(); + $this->_stylesheet = $stylesheet; + $this->_parent_font_size = null; + $this->__font_size_calculated = false; + + if ( !isset(self::$_defaults) ) { + + // Shorthand + $d =& self::$_defaults; + + // All CSS 2.1 properties, and their default values + $d["azimuth"] = "center"; + $d["background_attachment"] = "scroll"; + $d["background_color"] = "transparent"; + $d["background_image"] = "none"; + $d["background_position"] = "0% 0%"; + $d["background_repeat"] = "repeat"; + $d["background"] = ""; + $d["border_collapse"] = "separate"; + $d["border_color"] = ""; + $d["border_spacing"] = "0"; + $d["border_style"] = ""; + $d["border_top"] = ""; + $d["border_right"] = ""; + $d["border_bottom"] = ""; + $d["border_left"] = ""; + $d["border_top_color"] = ""; + $d["border_right_color"] = ""; + $d["border_bottom_color"] = ""; + $d["border_left_color"] = ""; + $d["border_top_style"] = "none"; + $d["border_right_style"] = "none"; + $d["border_bottom_style"] = "none"; + $d["border_left_style"] = "none"; + $d["border_top_width"] = "medium"; + $d["border_right_width"] = "medium"; + $d["border_bottom_width"] = "medium"; + $d["border_left_width"] = "medium"; + $d["border_width"] = "medium"; + $d["border"] = ""; + $d["bottom"] = "auto"; + $d["caption_side"] = "top"; + $d["clear"] = "none"; + $d["clip"] = "auto"; + $d["color"] = "#000000"; + $d["content"] = "normal"; + $d["counter_increment"] = "none"; + $d["counter_reset"] = "none"; + $d["cue_after"] = "none"; + $d["cue_before"] = "none"; + $d["cue"] = ""; + $d["cursor"] = "auto"; + $d["direction"] = "ltr"; + $d["display"] = "inline"; + $d["elevation"] = "level"; + $d["empty_cells"] = "show"; + $d["float"] = "none"; + $d["font_family"] = "serif"; + $d["font_size"] = "medium"; + $d["font_style"] = "normal"; + $d["font_variant"] = "normal"; + $d["font_weight"] = "normal"; + $d["font"] = ""; + $d["height"] = "auto"; + $d["left"] = "auto"; + $d["letter_spacing"] = "normal"; + $d["line_height"] = "normal"; + $d["list_style_image"] = "none"; + $d["list_style_position"] = "outside"; + $d["list_style_type"] = "disc"; + $d["list_style"] = ""; + $d["margin_right"] = "0"; + $d["margin_left"] = "0"; + $d["margin_top"] = "0"; + $d["margin_bottom"] = "0"; + $d["margin"] = ""; + $d["max_height"] = "none"; + $d["max_width"] = "none"; + $d["min_height"] = "0"; + $d["min_width"] = "0"; + $d["opacity"] = "1.0"; // CSS3 + $d["orphans"] = "2"; + $d["outline_color"] = ""; // "invert" special color is not supported + $d["outline_style"] = "none"; + $d["outline_width"] = "medium"; + $d["outline"] = ""; + $d["overflow"] = "visible"; + $d["padding_top"] = "0"; + $d["padding_right"] = "0"; + $d["padding_bottom"] = "0"; + $d["padding_left"] = "0"; + $d["padding"] = ""; + $d["page_break_after"] = "auto"; + $d["page_break_before"] = "auto"; + $d["page_break_inside"] = "auto"; + $d["pause_after"] = "0"; + $d["pause_before"] = "0"; + $d["pause"] = ""; + $d["pitch_range"] = "50"; + $d["pitch"] = "medium"; + $d["play_during"] = "auto"; + $d["position"] = "static"; + $d["quotes"] = ""; + $d["richness"] = "50"; + $d["right"] = "auto"; + $d["size"] = "auto"; // @page + $d["speak_header"] = "once"; + $d["speak_numeral"] = "continuous"; + $d["speak_punctuation"] = "none"; + $d["speak"] = "normal"; + $d["speech_rate"] = "medium"; + $d["stress"] = "50"; + $d["table_layout"] = "auto"; + $d["text_align"] = "left"; + $d["text_decoration"] = "none"; + $d["text_indent"] = "0"; + $d["text_transform"] = "none"; + $d["top"] = "auto"; + $d["transform"] = "none"; // CSS3 + $d["transform_origin"] = "50% 50%"; // CSS3 + $d["_webkit_transform"] = $d["transform"]; // CSS3 + $d["_webkit_transform_origin"] = $d["transform_origin"]; // CSS3 + $d["unicode_bidi"] = "normal"; + $d["vertical_align"] = "baseline"; + $d["visibility"] = "visible"; + $d["voice_family"] = ""; + $d["volume"] = "medium"; + $d["white_space"] = "normal"; + $d["widows"] = "2"; + $d["width"] = "auto"; + $d["word_spacing"] = "normal"; + $d["z_index"] = "auto"; + + // for @font-face + $d["src"] = ""; + $d["unicode_range"] = ""; + + // Properties that inherit by default + self::$_inherited = array("azimuth", + "border_collapse", + "border_spacing", + "caption_side", + "color", + "cursor", + "direction", + "elevation", + "empty_cells", + "font_family", + "font_size", + "font_style", + "font_variant", + "font_weight", + "font", + "letter_spacing", + "line_height", + "list_style_image", + "list_style_position", + "list_style_type", + "list_style", + "orphans", + "page_break_inside", + "pitch_range", + "pitch", + "quotes", + "richness", + "speak_header", + "speak_numeral", + "speak_punctuation", + "speak", + "speech_rate", + "stress", + "text_align", + "text_indent", + "text_transform", + "visibility", + "voice_family", + "volume", + "white_space", + "widows", + "word_spacing"); + } + + } + + /** + * "Destructor": forcibly free all references held by this object + */ + function dispose() { + clear_object($this); + } + + function set_frame(Frame $frame) { + $this->_frame = $frame; + } + + function get_frame() { + return $this->_frame; + } + + /** + * returns the {@link Stylesheet} this Style is associated with. + * + * @return Stylesheet + */ + function get_stylesheet() { return $this->_stylesheet; } + + /** + * Converts any CSS length value into an absolute length in points. + * + * length_in_pt() takes a single length (e.g. '1em') or an array of + * lengths and returns an absolute length. If an array is passed, then + * the return value is the sum of all elements. + * + * If a reference size is not provided, the default font size is used + * ({@link Style::$default_font_size}). + * + * @param float|array $length the length or array of lengths to resolve + * @param float $ref_size an absolute reference size to resolve percentage lengths + * @return float + */ + function length_in_pt($length, $ref_size = null) { + + if ( !is_array($length) ) + $length = array($length); + + if ( !isset($ref_size) ) + $ref_size = self::$default_font_size; + + $ret = 0; + foreach ($length as $l) { + + if ( $l === "auto" ) + return "auto"; + + if ( $l === "none" ) + return "none"; + + // Assume numeric values are already in points + if ( is_numeric($l) ) { + $ret += $l; + continue; + } + + if ( $l === "normal" ) { + $ret += $ref_size; + continue; + } + + // Border lengths + if ( $l === "thin" ) { + $ret += 0.5; + continue; + } + + if ( $l === "medium" ) { + $ret += 1.5; + continue; + } + + if ( $l === "thick" ) { + $ret += 2.5; + continue; + } + + if ( ($i = mb_strpos($l, "px")) !== false ) { + $ret += ( mb_substr($l, 0, $i) * 72 ) / DOMPDF_DPI; + continue; + } + + if ( ($i = mb_strpos($l, "pt")) !== false ) { + $ret += mb_substr($l, 0, $i); + continue; + } + + if ( ($i = mb_strpos($l, "em")) !== false ) { + $ret += mb_substr($l, 0, $i) * $this->__get("font_size"); + continue; + } + + if ( ($i = mb_strpos($l, "%")) !== false ) { + $ret += mb_substr($l, 0, $i)/100 * $ref_size; + continue; + } + + if ( ($i = mb_strpos($l, "cm")) !== false ) { + $ret += mb_substr($l, 0, $i) * 72 / 2.54; + continue; + } + + if ( ($i = mb_strpos($l, "mm")) !== false ) { + $ret += mb_substr($l, 0, $i) * 72 / 25.4; + continue; + } + + // FIXME: em:ex ratio? + if ( ($i = mb_strpos($l, "ex")) !== false ) { + $ret += mb_substr($l, 0, $i) * $this->__get("font_size"); + continue; + } + + if ( ($i = mb_strpos($l, "in")) !== false ) { + $ret += mb_substr($l, 0, $i) * 72; + continue; + } + + if ( ($i = mb_strpos($l, "pc")) !== false ) { + $ret += mb_substr($l, 0, $i) / 12; + continue; + } + + // Bogus value + $ret += $ref_size; + } + + return $ret; + } + + + /** + * Set inherited properties in this style using values in $parent + * + * @param Style $parent + */ + function inherit(Style $parent) { + + // Set parent font size + $this->_parent_font_size = $parent->get_font_size(); + + foreach (self::$_inherited as $prop) { + //inherit the !important property also. + //if local property is also !important, don't inherit. + if ( isset($parent->_props[$prop]) && + ( !isset($this->_props[$prop]) || + ( isset($parent->_important_props[$prop]) && !isset($this->_important_props[$prop]) ) + ) + ) { + if ( isset($parent->_important_props[$prop]) ) { + $this->_important_props[$prop] = true; + } + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$prop] = null; + $this->_props[$prop] = $parent->_props[$prop]; + } + } + + foreach (array_keys($this->_props) as $prop) { + if ( $this->_props[$prop] === "inherit" ) { + if ( isset($parent->_important_props[$prop]) ) { + $this->_important_props[$prop] = true; + } + //do not assign direct, but + //implicite assignment through __set, redirect to specialized, get value with __get + //This is for computing defaults if the parent setting is also missing. + //Therefore do not directly assign the value without __set + //set _important_props before that to be able to propagate. + //see __set and __get, on all assignments clear cache! + //$this->_prop_cache[$prop] = null; + //$this->_props[$prop] = $parent->_props[$prop]; + //props_set for more obvious explicite assignment not implemented, because + //too many implicite uses. + // $this->props_set($prop, $parent->$prop); + $this->$prop = $parent->$prop; + } + } + + return $this; + } + + /** + * Override properties in this style with those in $style + * + * @param Style $style + */ + function merge(Style $style) { + //treat the !important attribute + //if old rule has !important attribute, override with new rule only if + //the new rule is also !important + foreach($style->_props as $prop => $val ) { + if (isset($style->_important_props[$prop])) { + $this->_important_props[$prop] = true; + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$prop] = null; + $this->_props[$prop] = $val; + } else if ( !isset($this->_important_props[$prop]) ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$prop] = null; + $this->_props[$prop] = $val; + } + } + + if ( isset($style->_props["font_size"]) ) + $this->__font_size_calculated = false; + } + + /** + * Returns an array(r, g, b, "r"=> r, "g"=>g, "b"=>b, "hex"=>"#rrggbb") + * based on the provided CSS colour value. + * + * @param string $colour + * @return array + */ + function munge_colour($colour) { return CSS_Color::parse($colour); } + + /** + * Alias for {@link Style::munge_colour()} + * + * @param string $color + * @return array + */ + function munge_color($color) { return CSS_Color::parse($color); } + + /* direct access to _important_props array from outside would work only when declared as + * 'var $_important_props;' instead of 'protected $_important_props;' + * Don't call _set/__get on missing attribute. Therefore need a special access. + * Assume that __set will be also called when this is called, so do not check validity again. + * Only created, if !important exists -> always set true. + */ + function important_set($prop) { + $prop = str_replace("-", "_", $prop); + $this->_important_props[$prop] = true; + } + + function important_get($prop) { + isset($this->_important_props[$prop]); + } + + /** + * PHP5 overloaded setter + * + * This function along with {@link Style::__get()} permit a user of the + * Style class to access any (CSS) property using the following syntax: + * + * Style->margin_top = "1em"; + * echo (Style->margin_top); + * + * + * __set() automatically calls the provided set function, if one exists, + * otherwise it sets the property directly. Typically, __set() is not + * called directly from outside of this class. + * + * On each modification clear cache to return accurate setting. + * Also affects direct settings not using __set + * For easier finding all assignments, attempted to allowing only explicite assignment: + * Very many uses, e.g. frame_reflower.cls.php -> for now leave as it is + * function __set($prop, $val) { + * throw new DOMPDF_Exception("Implicite replacement of assignment by __set. Not good."); + * } + * function props_set($prop, $val) { ... } + * + * @param string $prop the property to set + * @param mixed $val the value of the property + * + */ + function __set($prop, $val) { + $prop = str_replace("-", "_", $prop); + $this->_prop_cache[$prop] = null; + + if ( !isset(self::$_defaults[$prop]) ) { + global $_dompdf_warnings; + $_dompdf_warnings[] = "'$prop' is not a valid CSS2 property."; + return; + } + + if ( $prop !== "content" && is_string($val) && strlen($val) > 5 && mb_strpos($val, "url") === false ) { + $val = mb_strtolower(trim(str_replace(array("\n", "\t"), array(" "), $val))); + $val = preg_replace("/([0-9]+) (pt|px|pc|em|ex|in|cm|mm|%)/S", "\\1\\2", $val); + } + + $method = "set_$prop"; + + if ( method_exists($this, $method) ) + $this->$method($val); + else + $this->_props[$prop] = $val; + } + + /** + * PHP5 overloaded getter + * + * Along with {@link Style::__set()} __get() provides access to all CSS + * properties directly. Typically __get() is not called directly outside + * of this class. + * + * On each modification clear cache to return accurate setting. + * Also affects direct settings not using __set + * + * @param string $prop + * @return mixed + */ + function __get($prop) { + if ( !isset(self::$_defaults[$prop]) ) + throw new DOMPDF_Exception("'$prop' is not a valid CSS2 property."); + + if ( isset($this->_prop_cache[$prop]) && $this->_prop_cache[$prop] != null ) + return $this->_prop_cache[$prop]; + + $method = "get_$prop"; + + // Fall back on defaults if property is not set + if ( !isset($this->_props[$prop]) ) + $this->_props[$prop] = self::$_defaults[$prop]; + + if ( method_exists($this, $method) ) + return $this->_prop_cache[$prop] = $this->$method(); + + return $this->_prop_cache[$prop] = $this->_props[$prop]; + } + + + /** + * Getter for the 'font-family' CSS property. + * + * Uses the {@link Font_Metrics} class to resolve the font family into an + * actual font file. + * + * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-family + * @return string + */ + function get_font_family() { + + $DEBUGCSS=DEBUGCSS; //=DEBUGCSS; Allow override of global setting for ad hoc debug + + // Select the appropriate font. First determine the subtype, then check + // the specified font-families for a candidate. + + // Resolve font-weight + $weight = $this->__get("font_weight"); + + if ( is_numeric($weight) ) { + + if ( $weight < 600 ) + $weight = "normal"; + else + $weight = "bold"; + + } else if ( $weight === "bold" || $weight === "bolder" ) { + $weight = "bold"; + + } else { + $weight = "normal"; + + } + + // Resolve font-style + $font_style = $this->__get("font_style"); + + if ( $weight === "bold" && ($font_style === "italic" || $font_style === "oblique") ) + $subtype = "bold_italic"; + else if ( $weight === "bold" && $font_style !== "italic" && $font_style !== "oblique" ) + $subtype = "bold"; + else if ( $weight !== "bold" && ($font_style === "italic" || $font_style === "oblique") ) + $subtype = "italic"; + else + $subtype = "normal"; + + // Resolve the font family + if ($DEBUGCSS) { + print "
[get_font_family:";
+      print '('.$this->_props["font_family"].'.'.$font_style.'.'.$this->__get("font_weight").'.'.$weight.'.'.$subtype.')';
+    }
+    $families = explode(",", $this->_props["font_family"]);
+    $families = array_map('trim',$families);
+    reset($families);
+
+    $font = null;
+    while ( current($families) ) {
+      list(,$family) = each($families);
+      //remove leading and trailing string delimiters, e.g. on font names with spaces;
+      //remove leading and trailing whitespace
+      $family=trim($family," \t\n\r\x0B\"'");
+      if ($DEBUGCSS) print '('.$family.')';
+      $font = Font_Metrics::get_font($family, $subtype);
+
+      if ( $font ) {
+        if ($DEBUGCSS)  print '('.$font.")get_font_family]\n
"; + return $font; + } + } + + $family = null; + if ($DEBUGCSS) print '(default)'; + $font = Font_Metrics::get_font($family, $subtype); + + if ( $font ) { + if ($DEBUGCSS) print '('.$font.")get_font_family]\n"; + return $font; + } + throw new DOMPDF_Exception("Unable to find a suitable font replacement for: '" . $this->_props["font_family"] ."'"); + + } + + /** + * Returns the resolved font size, in points + * + * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-size + * @return float + */ + function get_font_size() { + + if ( $this->__font_size_calculated ) + return $this->_props["font_size"]; + + if ( !isset($this->_props["font_size"]) ) + $fs = self::$_defaults["font_size"]; + else + $fs = $this->_props["font_size"]; + + if ( !isset($this->_parent_font_size) ) + $this->_parent_font_size = self::$default_font_size; + + switch ($fs) { + case "xx-small": + case "x-small": + case "small": + case "medium": + case "large": + case "x-large": + case "xx-large": + $fs = self::$default_font_size * self::$font_size_keywords[$fs]; + break; + + case "smaller": + $fs = 8/9 * $this->_parent_font_size; + break; + + case "larger": + $fs = 6/5 * $this->_parent_font_size; + break; + + default: + break; + } + + // Ensure relative sizes resolve to something + if ( ($i = mb_strpos($fs, "em")) !== false ) + $fs = mb_substr($fs, 0, $i) * $this->_parent_font_size; + + else if ( ($i = mb_strpos($fs, "ex")) !== false ) + $fs = mb_substr($fs, 0, $i) * $this->_parent_font_size; + + else + $fs = $this->length_in_pt($fs); + + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["font_size"] = null; + $this->_props["font_size"] = $fs; + $this->__font_size_calculated = true; + return $this->_props["font_size"]; + + } + + /** + * @link http://www.w3.org/TR/CSS21/text.html#propdef-word-spacing + * @return float + */ + function get_word_spacing() { + if ( $this->_props["word_spacing"] === "normal" ) + return 0; + + return $this->_props["word_spacing"]; + } + + /** + * @link http://www.w3.org/TR/CSS21/text.html#propdef-letter-spacing + * @return float + */ + function get_letter_spacing() { + if ( $this->_props["letter_spacing"] === "normal" ) + return 0; + + return $this->_props["letter_spacing"]; + } + + /** + * @link http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height + * @return float + */ + function get_line_height() { + $line_height = $this->_props["line_height"]; + + if ( $line_height === "normal" ) + return self::$default_line_height * $this->get_font_size(); + + if ( is_numeric($line_height) ) + return $this->length_in_pt( $line_height . "em", $this->get_font_size()); + + return $this->length_in_pt( $line_height, $this->get_font_size() ); + } + + /** + * Returns the colour as an array + * + * The array has the following format: + * array(r,g,b, "r" => r, "g" => g, "b" => b, "hex" => "#rrggbb") + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color + * @return array + */ + function get_color() { + return $this->munge_color( $this->_props["color"] ); + } + + /** + * Returns the background colour as an array + * + * The returned array has the same format as {@link Style::get_color()} + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color + * @return array + */ + function get_background_color() { + return $this->munge_color( $this->_props["background_color"] ); + } + + /** + * Returns the background position as an array + * + * The returned array has the following format: + * array(x,y, "x" => x, "y" => y) + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-position + * @return array + */ + function get_background_position() { + $tmp = explode(" ", $this->_props["background_position"]); + + switch ($tmp[0]) { + + case "left": + $x = "0%"; + break; + + case "right": + $x = "100%"; + break; + + case "top": + $y = "0%"; + break; + + case "bottom": + $y = "100%"; + break; + + case "center": + $x = "50%"; + $y = "50%"; + break; + + default: + $x = $tmp[0]; + break; + } + + if ( isset($tmp[1]) ) { + + switch ($tmp[1]) { + case "left": + $x = "0%"; + break; + + case "right": + $x = "100%"; + break; + + case "top": + $y = "0%"; + break; + + case "bottom": + $y = "100%"; + break; + + case "center": + if ( $tmp[0] === "left" || $tmp[0] === "right" || $tmp[0] === "center" ) + $y = "50%"; + else + $x = "50%"; + break; + + default: + $y = $tmp[1]; + break; + } + + } else { + $y = "50%"; + } + + if ( !isset($x) ) + $x = "0%"; + + if ( !isset($y) ) + $y = "0%"; + + return array( 0 => $x, "x" => $x, + 1 => $y, "y" => $y ); + } + + + /** + * Returns the background as it is currently stored + * + * (currently anyway only for completeness. + * not used for further processing) + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-attachment + * @return string + */ + function get_background_attachment() { + return $this->_props["background_attachment"]; + } + + + /** + * Returns the background_repeat as it is currently stored + * + * (currently anyway only for completeness. + * not used for further processing) + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-repeat + * @return string + */ + function get_background_repeat() { + return $this->_props["background_repeat"]; + } + + + /** + * Returns the background as it is currently stored + * + * (currently anyway only for completeness. + * not used for further processing, but the individual get_background_xxx) + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background + * @return string + */ + function get_background() { + return $this->_props["background"]; + } + + + /**#@+ + * Returns the border colour as an array + * + * See {@link Style::get_color()} + * + * @link http://www.w3.org/TR/CSS21/box.html#border-color-properties + * @return array + */ + function get_border_top_color() { + if ( $this->_props["border_top_color"] === "" ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["border_top_color"] = null; + $this->_props["border_top_color"] = $this->__get("color"); + } + return $this->munge_color($this->_props["border_top_color"]); + } + + function get_border_right_color() { + if ( $this->_props["border_right_color"] === "" ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["border_right_color"] = null; + $this->_props["border_right_color"] = $this->__get("color"); + } + return $this->munge_color($this->_props["border_right_color"]); + } + + function get_border_bottom_color() { + if ( $this->_props["border_bottom_color"] === "" ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["border_bottom_color"] = null; + $this->_props["border_bottom_color"] = $this->__get("color"); + } + return $this->munge_color($this->_props["border_bottom_color"]); + } + + function get_border_left_color() { + if ( $this->_props["border_left_color"] === "" ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["border_left_color"] = null; + $this->_props["border_left_color"] = $this->__get("color"); + } + return $this->munge_color($this->_props["border_left_color"]); + } + + /**#@-*/ + + /**#@+ + * Returns the border width, as it is currently stored + * + * @link http://www.w3.org/TR/CSS21/box.html#border-width-properties + * @return float|string + */ + function get_border_top_width() { + $style = $this->__get("border_top_style"); + return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_top_width"]) : 0; + } + + function get_border_right_width() { + $style = $this->__get("border_right_style"); + return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_right_width"]) : 0; + } + + function get_border_bottom_width() { + $style = $this->__get("border_bottom_style"); + return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_bottom_width"]) : 0; + } + + function get_border_left_width() { + $style = $this->__get("border_left_style"); + return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_left_width"]) : 0; + } + /**#@-*/ + + /** + * Return an array of all border properties. + * + * The returned array has the following structure: + * + * array("top" => array("width" => [border-width], + * "style" => [border-style], + * "color" => [border-color (array)]), + * "bottom" ... ) + * + * + * @return array + */ + function get_border_properties() { + return array("top" => array("width" => $this->__get("border_top_width"), + "style" => $this->__get("border_top_style"), + "color" => $this->__get("border_top_color")), + "bottom" => array("width" => $this->__get("border_bottom_width"), + "style" => $this->__get("border_bottom_style"), + "color" => $this->__get("border_bottom_color")), + "right" => array("width" => $this->__get("border_right_width"), + "style" => $this->__get("border_right_style"), + "color" => $this->__get("border_right_color")), + "left" => array("width" => $this->__get("border_left_width"), + "style" => $this->__get("border_left_style"), + "color" => $this->__get("border_left_color"))); + } + + /** + * Return a single border property + * + * @return mixed + */ + protected function _get_border($side) { + $color = $this->__get("border_" . $side . "_color"); + + return $this->__get("border_" . $side . "_width") . " " . + $this->__get("border_" . $side . "_style") . " " . $color["hex"]; + } + + /**#@+ + * Return full border properties as a string + * + * Border properties are returned just as specified in CSS: + *
[width] [style] [color]
+ * e.g. "1px solid blue" + * + * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties + * @return string + */ + function get_border_top() { return $this->_get_border("top"); } + function get_border_right() { return $this->_get_border("right"); } + function get_border_bottom() { return $this->_get_border("bottom"); } + function get_border_left() { return $this->_get_border("left"); } + /**#@-*/ + + /** + * Returns the outline colour as an array + * + * See {@link Style::get_color()} + * + * @link http://www.w3.org/TR/CSS21/box.html#border-color-properties + * @return array + */ + function get_outline_color() { + if ( $this->_props["outline_color"] === "" ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["outline_color"] = null; + $this->_props["outline_color"] = $this->__get("color"); + } + return $this->munge_color($this->_props["outline_color"]); + } + + /**#@+ + * Returns the outline width, as it is currently stored + * @return float|string + */ + function get_outline_width() { + $style = $this->__get("outline_style"); + return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["outline_width"]) : 0; + } + + /**#@+ + * Return full outline properties as a string + * + * Outline properties are returned just as specified in CSS: + *
[width] [style] [color]
+ * e.g. "1px solid blue" + * + * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties + * @return string + */ + function get_outline() { + $color = $this->__get("outline_color"); + return + $this->__get("outline_width") . " " . + $this->__get("outline_style") . " " . + $color["hex"]; + } + /**#@-*/ + + /** + * Returns border spacing as an array + * + * The array has the format (h_space,v_space) + * + * @link http://www.w3.org/TR/CSS21/tables.html#propdef-border-spacing + * @return array + */ + function get_border_spacing() { + return explode(" ", $this->_props["border_spacing"]); + } + +/*==============================*/ + + /* + !important attribute + For basic functionality of the !important attribute with overloading + of several styles of an element, changes in inherit(), merge() and _parse_properties() + are sufficient [helpers var $_important_props, __construct(), important_set(), important_get()] + + Only for combined attributes extra treatment needed. See below. + + div { border: 1px red; } + div { border: solid; } // Not combined! Only one occurence of same style per context + // + div { border: 1px red; } + div a { border: solid; } // Adding to border style ok by inheritance + // + div { border-style: solid; } // Adding to border style ok because of different styles + div { border: 1px red; } + // + div { border-style: solid; !important} // border: overrides, even though not !important + div { border: 1px dashed red; } + // + div { border: 1px red; !important } + div a { border-style: solid; } // Need to override because not set + + Special treatment: + At individual property like border-top-width need to check whether overriding value is also !important. + Also store the !important condition for later overrides. + Since not known who is initiating the override, need to get passed !importan as parameter. + !important Paramter taken as in the original style in the css file. + When poperty border !important given, do not mark subsets like border_style as important. Only + individual properties. + + Note: + Setting individual property directly from css with e.g. set_border_top_style() is not needed, because + missing set funcions handled by a generic handler __set(), including the !important. + Setting individual property of as sub-property is handled below. + + Implementation see at _set_style_side_type() + Callers _set_style_sides_type(), _set_style_type, _set_style_type_important() + + Related functionality for background, padding, margin, font, list_style + */ + + /* Generalized set function for individual attribute of combined style. + * With check for !important + * Applicable for background, border, padding, margin, font, list_style + * Note: $type has a leading underscore (or is empty), the others not. + */ + protected function _set_style_side_type($style,$side,$type,$val,$important) { + $prop = $style.'_'.$side.$type; + + if ( !isset($this->_important_props[$prop]) || $important) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$prop] = null; + if ($important) { + $this->_important_props[$prop] = true; + } + $this->_props[$prop] = $val; + } + } + + protected function _set_style_sides_type($style,$top,$right,$bottom,$left,$type,$important) { + $this->_set_style_side_type($style,'top',$type,$top,$important); + $this->_set_style_side_type($style,'right',$type,$right,$important); + $this->_set_style_side_type($style,'bottom',$type,$bottom,$important); + $this->_set_style_side_type($style,'left',$type,$left,$important); + } + + protected function _set_style_type($style,$type,$val,$important) { + $arr = explode(" ", $val); + switch (count($arr)) { + case 1: + $this->_set_style_sides_type($style,$arr[0],$arr[0],$arr[0],$arr[0],$type,$important); + break; + case 2: + $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[0],$arr[1],$type,$important); + break; + case 3: + $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[2],$arr[1],$type,$important); + break; + case 4: + $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[2],$arr[3],$type,$important); + break; + default: + break; + } + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$style.$type] = null; + $this->_props[$style.$type] = $val; + } + + protected function _set_style_type_important($style,$type,$val) { + $this->_set_style_type($style,$type,$val,isset($this->_important_props[$style.$type])); + } + + /* Anyway only called if _important matches and is assigned + * E.g. _set_style_side_type($style,$side,'',str_replace("none", "0px", $val),isset($this->_important_props[$style.'_'.$side])); + */ + protected function _set_style_side_width_important($style,$side,$val) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$style.'_'.$side] = null; + $this->_props[$style.'_'.$side] = str_replace("none", "0px", $val); + } + + protected function _set_style($style,$val,$important) { + if ( !isset($this->_important_props[$style]) || $important) { + if ($important) { + $this->_important_props[$style] = true; + } + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$style] = null; + $this->_props[$style] = $val; + } + } + + protected function _image($val) { + $DEBUGCSS=DEBUGCSS; + + if ( mb_strpos($val, "url") === false ) { + $path = "none"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none + } else { + $val = preg_replace("/url\(['\"]?([^'\")]+)['\"]?\)/","\\1", trim($val)); + + // Resolve the url now in the context of the current stylesheet + $parsed_url = explode_url($val); + if ( $parsed_url["protocol"] == "" && $this->_stylesheet->get_protocol() == "" ) { + if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\' ) { + $path = $_SERVER["DOCUMENT_ROOT"].'/'; + } else { + $path = $this->_stylesheet->get_base_path(); + } + $path .= $parsed_url["path"] . $parsed_url["file"]; + $path = realpath($path); + // If realpath returns FALSE then specifically state that there is no background image + if (!$path) { $path = 'none'; } + } else { + $path = build_url($this->_stylesheet->get_protocol(), + $this->_stylesheet->get_host(), + $this->_stylesheet->get_base_path(), + $val); + } + } + if ($DEBUGCSS) { + print "
[_image\n";
+      print_r($parsed_url);
+      print $this->_stylesheet->get_protocol()."\n".$this->_stylesheet->get_base_path()."\n".$path."\n";
+      print "_image]
";; + } + return $path; + } + +/*======================*/ + + /** + * Sets colour + * + * The colour parameter can be any valid CSS colour value + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color + * @param string $colour + */ + function set_color($colour) { + $col = $this->munge_colour($colour); + + if ( is_null($col) ) + $col = self::$_defaults["color"]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["color"] = null; + $this->_props["color"] = $col["hex"]; + } + + /** + * Sets the background colour + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color + * @param string $colour + */ + function set_background_color($colour) { + $col = $this->munge_colour($colour); + if ( is_null($col) ) + $col = self::$_defaults["background_color"]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background_color"] = null; + $this->_props["background_color"] = is_array($col) ? $col["hex"] : $col; + } + + /** + * Set the background image url + * + * @link http://www.w3.org/TR/CSS21/colors.html#background-properties + * @param string $url + */ + function set_background_image($val) { + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background_image"] = null; + $this->_props["background_image"] = $this->_image($val); + } + + /** + * Sets the background repeat + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-repeat + * @param string $val + */ + function set_background_repeat($val) { + if ( is_null($val) ) + $val = self::$_defaults["background_repeat"]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background_repeat"] = null; + $this->_props["background_repeat"] = $val; + } + + /** + * Sets the background attachment + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-attachment + * @param string $val + */ + function set_background_attachment($val) { + if ( is_null($val) ) + $val = self::$_defaults["background_attachment"]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background_attachment"] = null; + $this->_props["background_attachment"] = $val; + } + + /** + * Sets the background position + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-position + * @param string $val + */ + function set_background_position($val) { + if ( is_null($val) ) + $val = self::$_defaults["background_position"]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background_position"] = null; + $this->_props["background_position"] = $val; + } + + /** + * Sets the background - combined options + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background + * @param string $val + */ + function set_background($val) { + $col = null; + $pos = array(); + $tmp = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces + $tmp = explode(" ", $tmp); + $important = isset($this->_important_props["background"]); + + foreach($tmp as $attr) { + if (mb_substr($attr, 0, 3) === "url" || $attr === "none") { + $this->_set_style("background_image", $this->_image($attr), $important); + } else if ($attr === "fixed" || $attr === "scroll") { + $this->_set_style("background_attachment", $attr, $important); + } else if ($attr === "repeat" || $attr === "repeat-x" || $attr === "repeat-y" || $attr === "no-repeat") { + $this->_set_style("background_repeat", $attr, $important); + } else if (($col = $this->munge_color($attr)) != null ) { + $this->_set_style("background_color", is_array($col) ? $col["hex"] : $col, $important); + } else { + $pos[] = $attr; + } + } + + if (count($pos)) { + $this->_set_style("background_position",implode(' ',$pos), $important); + } + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background"] = null; + $this->_props["background"] = $val; + } + + /** + * Sets the font size + * + * $size can be any acceptable CSS size + * + * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-size + * @param string|float $size + */ + function set_font_size($size) { + $this->__font_size_calculated = false; + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["font_size"] = null; + $this->_props["font_size"] = $size; + } + + /** + * Sets the font style + * + * combined attributes + * set individual attributes also, respecting !important mark + * exactly this order, separate by space. Multiple fonts separated by comma: + * font-style, font-variant, font-weight, font-size, line-height, font-family + * + * Other than with border and list, existing partial attributes should + * reset when starting here, even when not mentioned. + * If individual attribute is !important and explicite or implicite replacement is not, + * keep individual attribute + * + * require whitespace as delimiters for single value attributes + * On delimiter "/" treat first as font height, second as line height + * treat all remaining at the end of line as font + * font-style, font-variant, font-weight, font-size, line-height, font-family + * + * missing font-size and font-family might be not allowed, but accept it here and + * use default (medium size, enpty font name) + * + * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style + * @param $val + */ + function set_font($val) { + $this->__font_size_calculated = false; + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["font"] = null; + $this->_props["font"] = $val; + + $important = isset($this->_important_props["font"]); + + if ( preg_match("/^(italic|oblique|normal)\s*(.*)$/i",$val,$match) ) { + $this->_set_style("font_style", $match[1], $important); + $val = $match[2]; + } else { + $this->_set_style("font_style", self::$_defaults["font_style"], $important); + } + + if ( preg_match("/^(small-caps|normal)\s*(.*)$/i",$val,$match) ) { + $this->_set_style("font_variant", $match[1], $important); + $val = $match[2]; + } else { + $this->_set_style("font_variant", self::$_defaults["font_variant"], $important); + } + + //matching numeric value followed by unit -> this is indeed a subsequent font size. Skip! + if ( preg_match("/^(bold|bolder|lighter|100|200|300|400|500|600|700|800|900|normal)\s*(.*)$/i",$val,$match) && + !preg_match("/^(?:pt|px|pc|em|ex|in|cm|mm|%)/",$match[2]) + ) { + $this->_set_style("font_weight", $match[1], $important); + $val = $match[2]; + } else { + $this->_set_style("font_weight", self::$_defaults["font_weight"], $important); + } + + 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) ) { + $this->_set_style("font_size", $match[1], $important); + $val = $match[2]; + if (preg_match("/^\/\s*(\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))\s*(.*)$/i",$val,$match) ) { + $this->_set_style("line_height", $match[1], $important); + $val = $match[2]; + } else { + $this->_set_style("line_height", self::$_defaults["line_height"], $important); + } + } else { + $this->_set_style("font_size", self::$_defaults["font_size"], $important); + $this->_set_style("line_height", self::$_defaults["line_height"], $important); + } + + if(strlen($val) != 0) { + $this->_set_style("font_family", $val, $important); + } else { + $this->_set_style("font_family", self::$_defaults["font_family"], $important); + } + } + + /**#@+ + * Sets page break properties + * + * @link http://www.w3.org/TR/CSS21/page.html#page-breaks + * @param string $break + */ + function set_page_break_before($break) { + if ($break === "left" || $break === "right") + $break = "always"; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["page_break_before"] = null; + $this->_props["page_break_before"] = $break; + } + + function set_page_break_after($break) { + if ($break === "left" || $break === "right") + $break = "always"; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["page_break_after"] = null; + $this->_props["page_break_after"] = $break; + } + /**#@-*/ + + //........................................................................ + + /**#@+ + * Sets the margin size + * + * @link http://www.w3.org/TR/CSS21/box.html#margin-properties + * @param $val + */ + function set_margin_top($val) { + $this->_set_style_side_width_important('margin','top',$val); + } + + function set_margin_right($val) { + $this->_set_style_side_width_important('margin','right',$val); + } + + function set_margin_bottom($val) { + $this->_set_style_side_width_important('margin','bottom',$val); + } + + function set_margin_left($val) { + $this->_set_style_side_width_important('margin','left',$val); + } + + function set_margin($val) { + $val = str_replace("none", "0px", $val); + $this->_set_style_type_important('margin','',$val); + } + /**#@-*/ + + /**#@+ + * Sets the padding size + * + * @link http://www.w3.org/TR/CSS21/box.html#padding-properties + * @param $val + */ + function set_padding_top($val) { + $this->_set_style_side_width_important('padding','top',$val); + } + + function set_padding_right($val) { + $this->_set_style_side_width_important('padding','right',$val); + } + + function set_padding_bottom($val) { + $this->_set_style_side_width_important('padding','bottom',$val); + } + + function set_padding_left($val) { + $this->_set_style_side_width_important('padding','left',$val); + } + + function set_padding($val) { + $val = str_replace("none", "0px", $val); + $this->_set_style_type_important('padding','',$val); + } + /**#@-*/ + + /** + * Sets a single border + * + * @param string $side + * @param string $border_spec ([width] [style] [color]) + */ + protected function _set_border($side, $border_spec, $important) { + $border_spec = preg_replace("/\s*\,\s*/", ",", $border_spec); + //$border_spec = str_replace(",", " ", $border_spec); // Why did we have this ?? rbg(10, 102, 10) > rgb(10 102 10) + $arr = explode(" ", $border_spec); + + // FIXME: handle partial values + + //For consistency of individal and combined properties, and with ie8 and firefox3 + //reset all attributes, even if only partially given + $this->_set_style_side_type('border',$side,'_style',self::$_defaults['border_'.$side.'_style'],$important); + $this->_set_style_side_type('border',$side,'_width',self::$_defaults['border_'.$side.'_width'],$important); + $this->_set_style_side_type('border',$side,'_color',self::$_defaults['border_'.$side.'_color'],$important); + + foreach ($arr as $value) { + $value = trim($value); + if ( in_array($value, self::$BORDER_STYLES) ) { + $this->_set_style_side_type('border',$side,'_style',$value,$important); + + } else if ( preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value ) ) { + $this->_set_style_side_type('border',$side,'_width',$value,$important); + + } else { + // must be colour + $this->_set_style_side_type('border',$side,'_color',$value,$important); + } + } + + //see __set and __get, on all assignments clear cache! + $this->_prop_cache['border_'.$side] = null; + $this->_props['border_'.$side] = $border_spec; + } + + /**#@+ + * Sets the border styles + * + * @link http://www.w3.org/TR/CSS21/box.html#border-properties + * @param string $val + */ + function set_border_top($val) { $this->_set_border("top", $val, isset($this->_important_props['border_top'])); } + function set_border_right($val) { $this->_set_border("right", $val, isset($this->_important_props['border_right'])); } + function set_border_bottom($val) { $this->_set_border("bottom", $val, isset($this->_important_props['border_bottom'])); } + function set_border_left($val) { $this->_set_border("left", $val, isset($this->_important_props['border_left'])); } + + function set_border($val) { + $important = isset($this->_important_props["border"]); + $this->_set_border("top", $val, $important); + $this->_set_border("right", $val, $important); + $this->_set_border("bottom", $val, $important); + $this->_set_border("left", $val, $important); + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["border"] = null; + $this->_props["border"] = $val; + } + + function set_border_width($val) { + $this->_set_style_type_important('border','_width',$val); + } + + function set_border_color($val) { + $this->_set_style_type_important('border','_color',$val); + } + + function set_border_style($val) { + $this->_set_style_type_important('border','_style',$val); + } + + /**#@+ + * Sets the outline styles + * + * @link http://www.w3.org/TR/CSS21/ui.html#dynamic-outlines + * @param string $val + */ + function set_outline($val) { + $important = isset($this->_important_props["outline"]); + + $props = array( + "outline_style", + "outline_width", + "outline_color", + ); + + foreach($props as $prop) { + $_val = self::$_defaults[$prop]; + + if ( !isset($this->_important_props[$prop]) || $important) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$prop] = null; + if ($important) { + $this->_important_props[$prop] = true; + } + $this->_props[$prop] = $_val; + } + } + + $val = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces + $arr = explode(" ", $val); + foreach ($arr as $value) { + $value = trim($value); + if ( in_array($value, self::$BORDER_STYLES) ) { + $this->set_outline_style($value); + } else if ( preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value ) ) { + $this->set_outline_width($value); + } else { + // must be colour + $this->set_outline_color($value); + } + } + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["outline"] = null; + $this->_props["outline"] = $val; + } + + function set_outline_width($val) { + $this->_set_style_type_important('outline','_width',$val); + } + + function set_outline_color($val) { + $this->_set_style_type_important('outline','_color',$val); + } + + function set_outline_style($val) { + $this->_set_style_type_important('outline','_style',$val); + } + /**#@-*/ + + + /** + * Sets the border spacing + * + * @link http://www.w3.org/TR/CSS21/box.html#border-properties + * @param float $val + */ + function set_border_spacing($val) { + $arr = explode(" ", $val); + + if ( count($arr) == 1 ) + $arr[1] = $arr[0]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["border_spacing"] = null; + $this->_props["border_spacing"] = "$arr[0] $arr[1]"; + } + + /** + * Sets the list style image + * + * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style-image + * @param $val + */ + function set_list_style_image($val) { + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["list_style_image"] = null; + $this->_props["list_style_image"] = $this->_image($val); + } + + /** + * Sets the list style + * + * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style + * @param $val + */ + function set_list_style($val) { + $important = isset($this->_important_props["list_style"]); + $arr = explode(" ", str_replace(",", " ", $val)); + + static $types = array( + "disc", "circle", "square", + "decimal-leading-zero", "decimal", "1", + "lower-roman", "upper-roman", "a", "A", + "lower-greek", + "lower-latin", "upper-latin", + "lower-alpha", "upper-alpha", + "armenian", "georgian", "hebrew", + "cjk-ideographic", "hiragana", "katakana", + "hiragana-iroha", "katakana-iroha", "none" + ); + + static $positions = array("inside", "outside"); + + foreach ($arr as $value) { + /* http://www.w3.org/TR/CSS21/generate.html#list-style + * A value of 'none' for the 'list-style' property sets both 'list-style-type' and 'list-style-image' to 'none' + */ + if ($value === "none") { + $this->_set_style("list_style_type", $value, $important); + $this->_set_style("list_style_image", $value, $important); + continue; + } + + //On setting or merging or inheriting list_style_image as well as list_style_type, + //and url exists, then url has precedence, otherwise fall back to list_style_type + //Firefox is wrong here (list_style_image gets overwritten on explicite list_style_type) + //Internet Explorer 7/8 and dompdf is right. + + if (mb_substr($value, 0, 3) === "url") { + $this->_set_style("list_style_image", $this->_image($value), $important); + continue; + } + + if ( in_array($value, $types) ) { + $this->_set_style("list_style_type", $value, $important); + } else if ( in_array($value, $positions) ) { + $this->_set_style("list_style_position", $value, $important); + } + } + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["list_style"] = null; + $this->_props["list_style"] = $val; + } + + function set_size($val) { + $length_re = "/(\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))/"; + + $val = mb_strtolower($val); + + if ( $val === "auto" ) { + return; + } + + $parts = preg_split("/\s+/", $val); + + $computed = array(); + if ( preg_match($length_re, $parts[0]) ) { + $computed[] = $this->length_in_pt($parts[0]); + + if ( isset($parts[1]) && preg_match($length_re, $parts[1]) ) { + $computed[] = $this->length_in_pt($parts[1]); + } + else { + $computed[] = $computed[0]; + } + } + elseif ( isset(CPDF_Adapter::$PAPER_SIZES[$parts[0]]) ) { + $computed = array_slice(CPDF_Adapter::$PAPER_SIZES[$parts[0]], 2, 2); + + if ( isset($parts[1]) && $parts[1] === "landscape" ) { + $computed = array_reverse($computed); + } + } + else { + return; + } + + $this->_props["size"] = $computed; + } + + /** + * Sets the CSS3 transform property + * + * @link http://www.w3.org/TR/css3-2d-transforms/#transform-property + * @param string $val + */ + function set_transform($val) { + $number = "\s*([^,\s]+)\s*"; + $tr_value = "\s*([^,\s]+)\s*"; + $angle = "\s*([^,\s]+(?:deg|rad)?)\s*"; + + if( !preg_match_all("/[a-z]+\([^\)]+\)/i", $val, $parts, PREG_SET_ORDER) ) { + return; + } + + $functions = array( + //"matrix" => "\($number,$number,$number,$number,$number,$number\)", + + "translate" => "\($tr_value(?:,$tr_value)?\)", + "translateX" => "\($tr_value\)", + "translateY" => "\($tr_value\)", + + "scale" => "\($number(?:,$number)?\)", + "scaleX" => "\($number\)", + "scaleY" => "\($number\)", + + "rotate" => "\($angle\)", + + "skew" => "\($angle(?:,$angle)?\)", + "skewX" => "\($angle\)", + "skewY" => "\($angle\)", + ); + + $transforms = array(); + + foreach($parts as $part) { + $t = $part[0]; + + foreach($functions as $name => $pattern) { + if (preg_match("/$name\s*$pattern/i", $t, $matches)) { + $values = array_slice($matches, 1); + + switch($name) { + // units + case "rotate": + case "skew": + case "skewX": + case "skewY": + + foreach($values as $i => $value) { + if ( strpos($value, "rad") ) + $values[$i] = rad2deg(floatval($value)); + else + $values[$i] = floatval($value); + } + + switch($name) { + case "skew": + if ( !isset($values[1]) ) + $values[1] = 0; + break; + case "skewX": + $name = "skew"; + $values = array($values[0], 0); + break; + case "skewY": + $name = "skew"; + $values = array(0, $values[0]); + break; + } + break; + + // units + case "translate": + $values[0] = $this->length_in_pt($values[0], $this->width); + + if ( isset($values[1]) ) + $values[1] = $this->length_in_pt($values[1], $this->height); + else + $values[1] = 0; + break; + + case "translateX": + $name = "translate"; + $values = array($this->length_in_pt($values[0], $this->width), 0); + break; + + case "translateY": + $name = "translate"; + $values = array(0, $this->length_in_pt($values[0], $this->height)); + break; + + // units + case "scale": + if ( !isset($values[1]) ) + $values[1] = $values[0]; + break; + + case "scaleX": + $name = "scale"; + $values = array($values[0], 1.0); + break; + + case "scaleY": + $name = "scale"; + $values = array(1.0, $values[0]); + break; + } + + $transforms[] = array( + $name, + $values, + ); + } + } + } + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["transform"] = null; + $this->_props["transform"] = $transforms; + } + + function set__webkit_transform($val) { + return $this->set_transform($val); + } + + function set__webkit_transform_origin($val) { + return $this->set_transform_origin($val); + } + + /** + * Sets the CSS3 transform-origin property + * + * @link http://www.w3.org/TR/css3-2d-transforms/#transform-origin + * @param string $val + */ + function set_transform_origin($val) { + $values = preg_split("/\s+/", $val); + + if ( count($values) === 0) { + return; + } + + foreach($values as &$value) { + if ( in_array($value, array("top", "left")) ) { + $value = 0; + } + + if ( in_array($value, array("bottom", "right")) ) { + $value = "100%"; + } + } + + if ( !isset($values[1]) ) { + $values[1] = $values[0]; + } + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["transform_origin"] = null; + $this->_props["transform_origin"] = $values; + } + + /** + * Generate a string representation of the Style + * + * This dumps the entire property array into a string via print_r. Useful + * for debugging. + * + * @return string + */ + /*DEBUGCSS print: see below additional debugging util*/ + function __toString() { + return print_r(array_merge(array("parent_font_size" => $this->_parent_font_size), + $this->_props), true); + } + +/*DEBUGCSS*/ function debug_print() +/*DEBUGCSS*/ { +/*DEBUGCSS*/ print "parent_font_size:".$this->_parent_font_size . ";\n"; +/*DEBUGCSS*/ foreach($this->_props as $prop => $val ) { +/*DEBUGCSS*/ print $prop.':'.$val; +/*DEBUGCSS*/ if (isset($this->_important_props[$prop])) { +/*DEBUGCSS*/ print '!important'; +/*DEBUGCSS*/ } +/*DEBUGCSS*/ print ";\n"; +/*DEBUGCSS*/ } +/*DEBUGCSS*/ } +} diff --git a/application/third_party/dompdf/include/stylesheet.cls.php b/application/third_party/dompdf/include/stylesheet.cls.php new file mode 100644 index 00000000..3107d087 --- /dev/null +++ b/application/third_party/dompdf/include/stylesheet.cls.php @@ -0,0 +1,1202 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - Specifity of css selector chain was too small because leading whitespace + * to be counted as number of elements was removed + * - On parsing css properties accept and register !important attribute + * - Add optional debug output + * @version 20090610 + * - _parse_properties on style property name and value remove augmenting superflous + * space for consistent parsing, in particular combined values like background + */ + +/* $Id: stylesheet.cls.php 360 2011-02-15 19:33:52Z fabien.menager $ */ + +/** + * The location of the default built-in CSS file. + * {@link Stylesheet::DEFAULT_STYLESHEET} + */ +define('__DEFAULT_STYLESHEET', DOMPDF_LIB_DIR . DIRECTORY_SEPARATOR . "res" . DIRECTORY_SEPARATOR . "html.css"); + +/** + * The master stylesheet class + * + * The Stylesheet class is responsible for parsing stylesheets and style + * tags/attributes. It also acts as a registry of the individual Style + * objects generated by the current set of loaded CSS files and style + * elements. + * + * @see Style + * @package dompdf + */ +class Stylesheet { + + /** + * The location of the default built-in CSS file. + */ + const DEFAULT_STYLESHEET = __DEFAULT_STYLESHEET; + + /** + * Array of currently defined styles + * @var array + */ + private $_styles; + + /** + * Base protocol of the document being parsed + * Used to handle relative urls. + * @var string + */ + private $_protocol; + + /** + * Base hostname of the document being parsed + * Used to handle relative urls. + * @var string + */ + private $_base_host; + + /** + * Base path of the document being parsed + * Used to handle relative urls. + * @var string + */ + private $_base_path; + + /** + * The style defined by @page rules + * @var Style + */ + private $_page_style; + + /** + * List of loaded files, used to prevent recursion + * @var array + */ + private $_loaded_files; + + /** + * Accepted CSS media types + * List of types and parsing rules for future extensions: + * http://www.w3.org/TR/REC-html40/types.html + * screen, tty, tv, projection, handheld, print, braille, aural, all + * The following are non standard extensions for undocumented specific environments. + * static, visual, bitmap, paged, dompdf + * Note, even though the generated pdf file is intended for print output, + * the desired content might be different (e.g. screen or projection view of html file). + * Therefore allow specification of content by dompdf setting DOMPDF_DEFAULT_MEDIA_TYPE. + * If given, replace media "print" by DOMPDF_DEFAULT_MEDIA_TYPE. + * (Previous version $ACCEPTED_MEDIA_TYPES = $ACCEPTED_GENERIC_MEDIA_TYPES + $ACCEPTED_DEFAULT_MEDIA_TYPE) + */ + static $ACCEPTED_DEFAULT_MEDIA_TYPE = "print"; + static $ACCEPTED_GENERIC_MEDIA_TYPES = array("all", "static", "visual", "bitmap", "paged", "dompdf"); + + /** + * The class constructor. + * + * The base protocol, host & path are initialized to those of + * the current script. + */ + function __construct() { + $this->_styles = array(); + $this->_loaded_files = array(); + list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($_SERVER["SCRIPT_FILENAME"]); + $this->_page_style = null; + } + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + + /** + * Set the base protocol + * + * @param string $proto + */ + function set_protocol($proto) { $this->_protocol = $proto; } + + /** + * Set the base host + * + * @param string $host + */ + function set_host($host) { $this->_base_host = $host; } + + /** + * Set the base path + * + * @param string $path + */ + function set_base_path($path) { $this->_base_path = $path; } + + /** + * Return the base protocol for this stylesheet + * + * @return string + */ + function get_protocol() { return $this->_protocol; } + + /** + * Return the base host for this stylesheet + * + * @return string + */ + function get_host() { return $this->_base_host; } + + /** + * Return the base path for this stylesheet + * + * @return string + */ + function get_base_path() { return $this->_base_path; } + + /** + * Return the page style + * + * @return Style + */ + function get_page_style() { return $this->_page_style; } + + /** + * Add a new Style object to the stylesheet + * + * add_style() adds a new Style object to the current stylesheet, or + * merges a new Style with an existing one. + * + * @param string $key the Style's selector + * @param Style $style the Style to be added + */ + function add_style($key, Style $style) { + if (!is_string($key)) + throw new DOMPDF_Exception("CSS rule must be keyed by a string."); + + if ( isset($this->_styles[$key]) ) + $this->_styles[$key]->merge($style); + else + $this->_styles[$key] = clone $style; + } + + /** + * lookup a specifc Style object + * + * lookup() returns the Style specified by $key, or null if the Style is + * not found. + * + * @param string $key the selector of the requested Style + * @return Style + */ + function lookup($key) { + if ( !isset($this->_styles[$key]) ) + return null; + + return $this->_styles[$key]; + } + + /** + * create a new Style object associated with this stylesheet + * + * @param Style $parent The style of this style's parent in the DOM tree + * @return Style + */ + function create_style(Style $parent = null) { + return new Style($this, $parent); + } + + /** + * load and parse a CSS string + * + * @param string $css + */ + function load_css(&$css) { $this->_parse_css($css); } + + + /** + * load and parse a CSS file + * + * @param string $file + */ + function load_css_file($file) { + global $_dompdf_warnings; + + // Prevent circular references + if ( isset($this->_loaded_files[$file]) ) + return; + + $this->_loaded_files[$file] = true; + $parsed_url = explode_url($file); + + list($this->_protocol, $this->_base_host, $this->_base_path, $filename) = $parsed_url; + + if ( !DOMPDF_ENABLE_REMOTE && + ($this->_protocol != "" && $this->_protocol !== "file://") ) { + record_warnings(E_USER_WARNING, "Remote CSS file '$file' requested, but DOMPDF_ENABLE_REMOTE is false.", __FILE__, __LINE__); + return; + } + + // Fix submitted by Nick Oostveen for aliased directory support: + if ( $this->_protocol == "" ) + $file = $this->_base_path . $filename; + else + $file = build_url($this->_protocol, $this->_base_host, $this->_base_path, $filename); + + set_error_handler("record_warnings"); + $css = file_get_contents($file); + restore_error_handler(); + + if ( $css == "" ) { + record_warnings(E_USER_WARNING, "Unable to load css file $file", __FILE__, __LINE__);; + return; + } + + $this->_parse_css($css); + } + + /** + * @link http://www.w3.org/TR/CSS21/cascade.html#specificity} + * + * @param string $selector + * @return int + */ + private function _specificity($selector) { + // http://www.w3.org/TR/CSS21/cascade.html#specificity + // ignoring the ":" pseudoclass modifyers + // also ignored in _css_selector_to_xpath + + $a = ($selector === "!style attribute") ? 1 : 0; + + $b = min(mb_substr_count($selector, "#"), 255); + + $c = min(mb_substr_count($selector, ".") + + mb_substr_count($selector, "["), 255); + + $d = min(mb_substr_count($selector, " ") + + mb_substr_count($selector, ">") + + mb_substr_count($selector, "+"), 255); + + //If a normal element name is at the begining of the string, + //a leading whitespace might have been removed on whitespace collapsing and removal + //therefore there might be one whitespace less as selected element names + //this can lead to a too small specificity + //see _css_selector_to_xpath + + if ( !in_array($selector[0], array(" ", ">", ".", "#", "+", ":", "[")) ) { + $d++; + } + + if (DEBUGCSS) { + /*DEBUGCSS*/ print "
\n";
+      /*DEBUGCSS*/	printf("_specificity(): 0x%08x \"%s\"\n", ($a << 24) | ($b << 16) | ($c << 8) | ($d), $selector);
+      /*DEBUGCSS*/	print "
"; + } + + return ($a << 24) | ($b << 16) | ($c << 8) | ($d); + } + + /** + * converts a CSS selector to an XPath query. + * + * @param string $selector + * @return string + */ + private function _css_selector_to_xpath($selector, $first_pass = false) { + + // Collapse white space and strip whitespace around delimiters +// $search = array("/\\s+/", "/\\s+([.>#+:])\\s+/"); +// $replace = array(" ", "\\1"); +// $selector = preg_replace($search, $replace, trim($selector)); + + // Initial query (non-absolute) + $query = "//"; + + // Will contain :before and :after if they must be created + $pseudo_elements = array(); + + // Parse the selector + //$s = preg_split("/([ :>.#+])/", $selector, -1, PREG_SPLIT_DELIM_CAPTURE); + + $delimiters = array(" ", ">", ".", "#", "+", ":", "["); + + // Add an implicit * at the beginning of the selector + // if it begins with an attribute selector + if ( $selector[0] === "[" ) + $selector = "*$selector"; + + // Add an implicit space at the beginning of the selector if there is no + // delimiter there already. + if ( !in_array($selector[0], $delimiters) ) + $selector = " $selector"; + + $tok = ""; + $len = mb_strlen($selector); + $i = 0; + + while ( $i < $len ) { + + $s = $selector[$i]; + $i++; + + // Eat characters up to the next delimiter + $tok = ""; + $in_attr = false; + + while ($i < $len) { + $c = $selector[$i]; + $c_prev = $selector[$i-1]; + + if ( !$in_attr && in_array($c, $delimiters) ) + break; + + if ( $c_prev === "[" ) { + $in_attr = true; + } + + $tok .= $selector[$i++]; + } + + switch ($s) { + + case " ": + case ">": + // All elements matching the next token that are direct children of + // the current token + $expr = $s === " " ? "descendant" : "child"; + + if ( mb_substr($query, -1, 1) !== "/" ) + $query .= "/"; + + if ( !$tok ) + $tok = "*"; + + $query .= "$expr::$tok"; + $tok = ""; + break; + + case ".": + case "#": + // All elements matching the current token with a class/id equal to + // the _next_ token. + + $attr = $s === "." ? "class" : "id"; + + // empty class/id == * + if ( mb_substr($query, -1, 1) === "/" ) + $query .= "*"; + + // Match multiple classes: $tok contains the current selected + // class. Search for class attributes with class="$tok", + // class=".* $tok .*" and class=".* $tok" + + // This doesn't work because libxml only supports XPath 1.0... + //$query .= "[matches(@$attr,\"^${tok}\$|^${tok}[ ]+|[ ]+${tok}\$|[ ]+${tok}[ ]+\")]"; + + // Query improvement by Michael Sheakoski : + $query .= "[contains(concat(' ', @$attr, ' '), concat(' ', '$tok', ' '))]"; + $tok = ""; + break; + + case "+": + // All sibling elements that folow the current token + if ( mb_substr($query, -1, 1) !== "/" ) + $query .= "/"; + + $query .= "following-sibling::$tok"; + $tok = ""; + break; + + case ":": + // Pseudo-classes + switch ($tok) { + + case "first-child": + $query .= "[1]"; + $tok = ""; + break; + + case "last-child": + $query .= "[not(following-sibling::*)]"; + $tok = ""; + break; + + case "link": + $query .= "[@href]"; + $tok = ""; + break; + + case "first-line": // TODO + case "first-letter": // TODO + + // N/A + case "active": + case "visited": + $query .= "[@dummy]"; + $tok = ""; + break; + + /* Pseudo-elements */ + case "before": + case "after": + if ( $first_pass ) + $pseudo_elements[$tok] = $tok; + else + $query .= "/*[@$tok]"; + + $tok = ""; + break; + + case "empty": + $query .= "[not(*) and not(normalize-space())]"; + $tok = ""; + break; + + case "disabled": + case "checked": + $query .= "[@$tok]"; + $tok = ""; + break; + + case "enabled": + $query .= "[not(@disabled)]"; + $tok = ""; + break; + } + + break; + + case "[": + // Attribute selectors. All with an attribute matching the following token(s) + $attr_delimiters = array("=", "]", "~", "|", "$", "^", "*"); + $tok_len = mb_strlen($tok); + $j = 0; + + $attr = ""; + $op = ""; + $value = ""; + + while ( $j < $tok_len ) { + if ( in_array($tok[$j], $attr_delimiters) ) + break; + $attr .= $tok[$j++]; + } + + switch ( $tok[$j] ) { + + case "~": + case "|": + case "$": + case "^": + case "*": + $op .= $tok[$j++]; + + if ( $tok[$j] !== "=" ) + throw new DOMPDF_Exception("Invalid CSS selector syntax: invalid attribute selector: $selector"); + + $op .= $tok[$j]; + break; + + case "=": + $op = "="; + break; + + } + + // Read the attribute value, if required + if ( $op != "" ) { + $j++; + while ( $j < $tok_len ) { + if ( $tok[$j] === "]" ) + break; + $value .= $tok[$j++]; + } + } + + if ( $attr == "" ) + throw new DOMPDF_Exception("Invalid CSS selector syntax: missing attribute name"); + + $value = trim($value, "\"'"); + + switch ( $op ) { + + case "": + $query .= "[@$attr]"; + break; + + case "=": + $query .= "[@$attr=\"$value\"]"; + break; + + case "~=": + // FIXME: this will break if $value contains quoted strings + // (e.g. [type~="a b c" "d e f"]) + $values = explode(" ", $value); + $query .= "["; + + foreach ( $values as $val ) + $query .= "@$attr=\"$val\" or "; + + $query = rtrim($query, " or ") . "]"; + break; + + case "|=": + $values = explode("-", $value); + $query .= "["; + + foreach ( $values as $val ) + $query .= "starts-with(@$attr, \"$val\") or "; + + $query = rtrim($query, " or ") . "]"; + break; + + case "$=": + $query .= "[substring(@$attr, string-length(@$attr)-".(strlen($value) - 1).")=\"$value\"]"; + break; + + case "^=": + $query .= "[starts-with(@$attr,\"$value\")]"; + break; + + case "*=": + $query .= "[contains(@$attr,\"$value\")]"; + break; + } + + break; + } + } + $i++; + +// case ":": +// // Pseudo selectors: ignore for now. Partially handled directly +// // below. + +// // Skip until the next special character, leaving the token as-is +// while ( $i < $len ) { +// if ( in_array($selector[$i], $delimiters) ) +// break; +// $i++; +// } +// break; + +// default: +// // Add the character to the token +// $tok .= $selector[$i++]; +// break; +// } + +// } + + + // Trim the trailing '/' from the query + if ( mb_strlen($query) > 2 ) + $query = rtrim($query, "/"); + + return array("query" => $query, "pseudo_elements" => $pseudo_elements); + } + + /** + * applies all current styles to a particular document tree + * + * apply_styles() applies all currently loaded styles to the provided + * {@link Frame_Tree}. Aside from parsing CSS, this is the main purpose + * of this class. + * + * @param Frame_Tree $tree + */ + function apply_styles(Frame_Tree $tree) { + + // Use XPath to select nodes. This would be easier if we could attach + // Frame objects directly to DOMNodes using the setUserData() method, but + // we can't do that just yet. Instead, we set a _node attribute_ in + // Frame->set_id() and use that as a handle on the Frame object via + // Frame_Tree::$_registry. + + // We create a scratch array of styles indexed by frame id. Once all + // styles have been assigned, we order the cached styles by specificity + // and create a final style object to assign to the frame. + + // FIXME: this is not particularly robust... + + $styles = array(); + $xp = new DOMXPath($tree->get_dom()); + + // Add generated content + foreach ($this->_styles as $selector => $style) { + if (strpos($selector, ":before") === false && + strpos($selector, ":after") === false) continue; + + $query = $this->_css_selector_to_xpath($selector, true); + + // Retrieve the nodes + $nodes = @$xp->query($query["query"]); + if ($nodes == null) { + record_warnings(E_USER_WARNING, "The CSS selector '$selector' is not valid", __FILE__, __LINE__); + continue; + } + + foreach ($nodes as $i => $node) { + foreach ($query["pseudo_elements"] as $pos) { + if (($src = $this->_image($style->content)) !== "none") { + $new_node = $node->ownerDocument->createElement("img_generated"); + $new_node->setAttribute("src", $src); + } + else { + $new_node = $node->ownerDocument->createElement("dompdf_generated"); + } + $new_node->setAttribute($pos, $pos); + + $tree->insert_node($node, $new_node, $pos); + } + } + } + + // Apply all styles in stylesheet + foreach ($this->_styles as $selector => $style) { + $query = $this->_css_selector_to_xpath($selector); + + // Retrieve the nodes + $nodes = @$xp->query($query["query"]); + if ($nodes == null) { + record_warnings(E_USER_WARNING, "The CSS selector '$selector' is not valid", __FILE__, __LINE__); + continue; + } + + foreach ($nodes as $node) { + // Retrieve the node id + if ( $node->nodeType != XML_ELEMENT_NODE ) // Only DOMElements get styles + continue; + + $id = $node->getAttribute("frame_id"); + + // Assign the current style to the scratch array + $spec = $this->_specificity($selector); + $styles[$id][$spec][] = $style; + } + } + + // Now create the styles and assign them to the appropriate frames. (We + // iterate over the tree using an implicit Frame_Tree iterator.) + $root_flg = false; + foreach ($tree->get_frames() as $frame) { + // pre_r($frame->get_node()->nodeName . ":"); + if ( !$root_flg && $this->_page_style ) { + $style = $this->_page_style; + $root_flg = true; + } else + $style = $this->create_style(); + + // Find nearest DOMElement parent + $p = $frame; + while ( $p = $p->get_parent() ) + if ($p->get_node()->nodeType == XML_ELEMENT_NODE ) + break; + + // Styles can only be applied directly to DOMElements; anonymous + // frames inherit from their parent + if ( $frame->get_node()->nodeType != XML_ELEMENT_NODE ) { + if ( $p ) + $style->inherit($p->get_style()); + $frame->set_style($style); + continue; + } + + $id = $frame->get_id(); + + // Handle HTML 4.0 attributes + Attribute_Translator::translate_attributes($frame); + + // Locate any additional style attributes + if ( ($str = $frame->get_node()->getAttribute("style")) !== "" ) { + // Destroy CSS comments + $str = preg_replace("'/\*.*?\*/'si", "", $str); + + $spec = $this->_specificity("!style attribute"); + $styles[$id][$spec][] = $this->_parse_properties($str); + } + + // Grab the applicable styles + if ( isset($styles[$id]) ) { + + $applied_styles = $styles[ $frame->get_id() ]; + + // Sort by specificity + ksort($applied_styles); + + if (DEBUGCSS) { + $debug_nodename = $frame->get_node()->nodeName; + print "
\n[$debug_nodename\n";
+          foreach ($applied_styles as $spec => $arr) {
+            printf("specificity: 0x%08x\n",$spec);
+            foreach ($arr as $s) {
+              print "[\n";
+              $s->debug_print();
+              print "]\n";
+            }
+          }
+        }
+        
+        // Merge the new styles with the inherited styles
+        foreach ($applied_styles as $arr) {
+          foreach ($arr as $s)
+            $style->merge($s);
+        }
+      }
+
+      // Inherit parent's styles if required
+      if ( $p ) {
+
+        if (DEBUGCSS) {
+          print "inherit:\n";
+          print "[\n";
+          $p->get_style()->debug_print();
+          print "]\n";
+        }
+
+        $style->inherit( $p->get_style() );
+      }
+
+      if (DEBUGCSS) {
+        print "DomElementStyle:\n";
+        print "[\n";
+        $style->debug_print();
+        print "]\n";
+        print "/$debug_nodename]\n
"; + } + + /*DEBUGCSS print: see below different print debugging method + pre_r($frame->get_node()->nodeName . ":"); + echo "
";
+      echo $style;
+      echo "
";*/ + $frame->set_style($style); + + } + + // We're done! Clean out the registry of all styles since we + // won't be needing this later. + foreach ( array_keys($this->_styles) as $key ) { + $this->_styles[$key] = null; + unset($this->_styles[$key]); + } + + } + + + /** + * parse a CSS string using a regex parser + * + * Called by {@link Stylesheet::parse_css()} + * + * @param string $str + */ + private function _parse_css($str) { + + $str = trim($str); + + // Destroy comments and remove HTML comments + $css = preg_replace(array( + "'/\*.*?\*/'si", + "/^$/" + ), "", $str); + + // FIXME: handle '{' within strings, e.g. [attr="string {}"] + + // Something more legible: + $re = + "/\s* # Skip leading whitespace \n". + "( @([^\s]+)\s+([^{;]*) (?:;|({)) )? # Match @rules followed by ';' or '{' \n". + "(?(1) # Only parse sub-sections if we're in an @rule... \n". + " (?(4) # ...and if there was a leading '{' \n". + " \s*( (?:(?>[^{}]+) ({)? # Parse rulesets and individual @page rules \n". + " (?(6) (?>[^}]*) }) \s*)+? \n". + " ) \n". + " }) # Balancing '}' \n". + "| # Branch to match regular rules (not preceeded by '@')\n". + "([^{]*{[^}]*})) # Parse normal rulesets\n". + "/xs"; + + if ( preg_match_all($re, $css, $matches, PREG_SET_ORDER) === false ) + // An error occured + throw new DOMPDF_Exception("Error parsing css file: preg_match_all() failed."); + + // After matching, the array indicies are set as follows: + // + // [0] => complete text of match + // [1] => contains '@import ...;' or '@media {' if applicable + // [2] => text following @ for cases where [1] is set + // [3] => media types or full text following '@import ...;' + // [4] => '{', if present + // [5] => rulesets within media rules + // [6] => '{', within media rules + // [7] => individual rules, outside of media rules + // + //pre_r($matches); + foreach ( $matches as $match ) { + $match[2] = trim($match[2]); + + if ( $match[2] !== "" ) { + // Handle @rules + switch ($match[2]) { + + case "import": + $this->_parse_import($match[3]); + break; + + case "media": + $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES; + if ( defined("DOMPDF_DEFAULT_MEDIA_TYPE") ) { + $acceptedmedia[] = DOMPDF_DEFAULT_MEDIA_TYPE; + } else { + $acceptedmedia[] = self::$ACCEPTED_DEFAULT_MEDIA_TYPE; + } + if ( in_array(mb_strtolower(trim($match[3])), $acceptedmedia ) ) { + $this->_parse_sections($match[5]); + } + break; + + case "page": + //This handles @page to be applied to page oriented media + //Note: This has a reduced syntax: + //@page { margin:1cm; color:blue; } + //Not a sequence of styles like a full.css, but only the properties + //of a single style, which is applied to the very first "root" frame before + //processing other styles of the frame. + //Working properties: + // margin (for margin around edge of paper) + // font-family (default font of pages) + // color (default text color of pages) + //Non working properties: + // border + // padding + // background-color + //Todo:Reason is unknown + //Other properties (like further font or border attributes) not tested. + //If a border or background color around each paper sheet is desired, + //assign it to the tag, possibly only for the css of the correct media type. + + // If the page has a name, skip the style. + if ($match[3] !== "") + return; + + // Store the style for later... + if ( is_null($this->_page_style) ) + $this->_page_style = $this->_parse_properties($match[5]); + else + $this->_page_style->merge($this->_parse_properties($match[5])); + break; + + case "font-face": + $this->_parse_font_face($match[5]); + break; + + default: + // ignore everything else + break; + } + + continue; + } + + if ( $match[7] !== "" ) + $this->_parse_sections($match[7]); + + } + } + + /* See also style.cls Style::_image(), refactoring?, works also for imported css files */ + protected function _image($val) { + $DEBUGCSS=DEBUGCSS; + + if ( mb_strpos($val, "url") === false ) { + $path = "none"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none + } + else { + $val = preg_replace("/url\(['\"]?([^'\")]+)['\"]?\)/","\\1", trim($val)); + + // Resolve the url now in the context of the current stylesheet + $parsed_url = explode_url($val); + if ( $parsed_url["protocol"] == "" && $this->get_protocol() == "" ) { + if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\' ) { + $path = $_SERVER["DOCUMENT_ROOT"].'/'; + } else { + $path = $this->get_base_path(); + } + $path .= $parsed_url["path"] . $parsed_url["file"]; + $path = realpath($path); + // If realpath returns FALSE then specifically state that there is no background image + // FIXME: Is this causing problems for imported CSS files? There are some './none' references when running the test cases. + if (!$path) { $path = 'none'; } + } else { + $path = build_url($this->get_protocol(), + $this->get_host(), + $this->get_base_path(), + $val); + } + } + if ($DEBUGCSS) { + print "
[_image\n";
+      print_r($parsed_url);
+      print $this->get_protocol()."\n".$this->get_base_path()."\n".$path."\n";
+      print "_image]
";; + } + return $path; + } + + /** + * parse @import{} sections + * + * @param string $url the url of the imported CSS file + */ + private function _parse_import($url) { + $arr = preg_split("/[\s\n,]/", $url,-1, PREG_SPLIT_NO_EMPTY); + $url = array_shift($arr); + $accept = false; + + if ( count($arr) > 0 ) { + + $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES; + if ( defined("DOMPDF_DEFAULT_MEDIA_TYPE") ) { + $acceptedmedia[] = DOMPDF_DEFAULT_MEDIA_TYPE; + } else { + $acceptedmedia[] = self::$ACCEPTED_DEFAULT_MEDIA_TYPE; + } + + // @import url media_type [media_type...] + foreach ( $arr as $type ) { + if ( in_array(mb_strtolower(trim($type)), $acceptedmedia) ) { + $accept = true; + break; + } + } + + } else { + // unconditional import + $accept = true; + } + + if ( $accept ) { + // Store our current base url properties in case the new url is elsewhere + $protocol = $this->_protocol; + $host = $this->_base_host; + $path = $this->_base_path; + + // $url = str_replace(array('"',"url", "(", ")"), "", $url); + // If the protocol is php, assume that we will import using file:// + // $url = build_url($protocol == "php://" ? "file://" : $protocol, $host, $path, $url); + // Above does not work for subfolders and absolute urls. + // Todo: As above, do we need to replace php or file to an empty protocol for local files? + + $url = $this->_image($url); + + $this->load_css_file($url); + + // Restore the current base url + $this->_protocol = $protocol; + $this->_base_host = $host; + $this->_base_path = $path; + } + + } + + /** + * parse @font-face{} sections + * http://www.w3.org/TR/css3-fonts/#the-font-face-rule + * + * @param string $str CSS @font-face rules + * @return Style + */ + private function _parse_font_face($str) { + $descriptors = $this->_parse_properties($str); + + preg_match_all("/(url|local)\s*\([\"\']?([^\"\'\)]+)[\"\']?\)\s*(format\s*\([\"\']?([^\"\'\)]+)[\"\']?\))?/i", $descriptors->src, $src); + + $sources = array(); + foreach($src[0] as $i => $value) { + $sources[] = array( + "local" => strtolower($src[1][$i]) === "local", + "uri" => $src[2][$i], + "format" => $src[4][$i], + ); + } + + //@todo download font file, ttf2afm, etc + } + + /** + * parse regular CSS blocks + * + * _parse_properties() creates a new Style object based on the provided + * CSS rules. + * + * @param string $str CSS rules + * @return Style + */ + private function _parse_properties($str) { + $properties = preg_split("/;(?=(?:[^\(]*\([^\)]*\))*(?![^\)]*\)))/", $str); + + if (DEBUGCSS) print '[_parse_properties'; + + // Create the style + $style = new Style($this); + foreach ($properties as $prop) { + // If the $prop contains an url, the regex may be wrong + // @todo: fix the regex so that it works everytime + /*if (strpos($prop, "url(") === false) { + if (preg_match("/([a-z-]+)\s*:\s*[^:]+$/i", $prop, $m)) + $prop = $m[0]; + }*/ + //A css property can have " ! important" appended (whitespace optional) + //strip this off to decode core of the property correctly. + //Pass on in the style to allow proper handling: + //!important properties can only be overridden by other !important ones. + //$style->$prop_name = is a shortcut of $style->__set($prop_name,$value);. + //If no specific set function available, set _props["prop_name"] + //style is always copied completely, or $_props handled separately + //Therefore set a _important_props["prop_name"]=true to indicate the modifier + + /* Instead of short code, prefer the typical case with fast code + $important = preg_match("/(.*?)!\s*important/",$prop,$match); + if ( $important ) { + $prop = $match[1]; + } + $prop = trim($prop); + */ + if (DEBUGCSS) print '('; + $important = false; + $prop = trim($prop); + if (substr($prop,-9) === 'important') { + $prop_tmp = rtrim(substr($prop,0,-9)); + if (substr($prop_tmp,-1) === '!') { + $prop = rtrim(substr($prop_tmp,0,-1)); + $important = true; + } + } + + if ($prop == "") { + if (DEBUGCSS) print 'empty)'; + continue; + } + + $i = mb_strpos($prop, ":"); + if ( $i === false ) { + if (DEBUGCSS) print 'novalue'.$prop.')'; + continue; + } + + $prop_name = rtrim(mb_strtolower(mb_substr($prop, 0, $i))); + $value = ltrim(mb_substr($prop, $i+1)); + if (DEBUGCSS) print $prop_name.':='.$value.($important?'!IMPORTANT':'').')'; + //New style, anyway empty + //if ($important || !$style->important_get($prop_name) ) { + //$style->$prop_name = array($value,$important); + //assignment might be replaced by overloading through __set, + //and overloaded functions might check _important_props, + //therefore set _important_props first. + if ($important) { + $style->important_set($prop_name); + } + //For easier debugging, don't use overloading of assignments with __set + $style->$prop_name = $value; + //$style->props_set($prop_name, $value); + } + if (DEBUGCSS) print '_parse_properties]'; + + return $style; + } + + /** + * parse selector + rulesets + * + * @param string $str CSS selectors and rulesets + */ + private function _parse_sections($str) { + // Pre-process: collapse all whitespace and strip whitespace around '>', + // '.', ':', '+', '#' + + $patterns = array("/[\\s\n]+/", "/\\s+([>.:+#])\\s+/"); + $replacements = array(" ", "\\1"); + $str = preg_replace($patterns, $replacements, $str); + + $sections = explode("}", $str); + if (DEBUGCSS) print '[_parse_sections'; + foreach ($sections as $sect) { + $i = mb_strpos($sect, "{"); + + $selectors = explode(",", mb_substr($sect, 0, $i)); + if (DEBUGCSS) print '[section'; + $style = $this->_parse_properties(trim(mb_substr($sect, $i+1))); + + // Assign it to the selected elements + foreach ($selectors as $selector) { + $selector = trim($selector); + + if ($selector == "") { + if (DEBUGCSS) print '#empty#'; + continue; + } + if (DEBUGCSS) print '#'.$selector.'#'; + //if (DEBUGCSS) { if (strpos($selector,'p') !== false) print '!!!p!!!#'; } + + $this->add_style($selector, $style); + } + if (DEBUGCSS) print 'section]'; + } + if (DEBUGCSS) print '_parse_sections]'; + } + + /** + * dumps the entire stylesheet as a string + * + * Generates a string of each selector and associated style in the + * Stylesheet. Useful for debugging. + * + * @return string + */ + function __toString() { + $str = ""; + foreach ($this->_styles as $selector => $style) + $str .= "$selector => " . $style->__toString() . "\n"; + + return $str; + } +} diff --git a/application/third_party/dompdf/include/table_cell_frame_decorator.cls.php b/application/third_party/dompdf/include/table_cell_frame_decorator.cls.php new file mode 100644 index 00000000..d23eaa44 --- /dev/null +++ b/application/third_party/dompdf/include/table_cell_frame_decorator.cls.php @@ -0,0 +1,135 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_cell_frame_decorator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Decorates table cells for layout + * + * @access private + * @package dompdf + */ +class Table_Cell_Frame_Decorator extends Block_Frame_Decorator { + + protected $_resolved_borders; + protected $_content_height; + + //........................................................................ + + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + $this->_resolved_borders = array(); + $this->_content_height = 0; + } + + //........................................................................ + + function reset() { + parent::reset(); + $this->_resolved_borders = array(); + $this->_content_height = 0; + $this->_frame->reset(); + } + + function get_content_height() { + return $this->_content_height; + } + + function set_content_height($height) { + $this->_content_height = $height; + } + + function set_cell_height($height) { + $style = $this->get_style(); + $v_space = $style->length_in_pt(array($style->margin_top, + $style->padding_top, + $style->border_top_width, + $style->border_bottom_width, + $style->padding_bottom, + $style->margin_bottom), + $style->width); + + $new_height = $height - $v_space; + $style->height = $new_height; + + if ( $new_height > $this->_content_height ) { + // Adjust our vertical alignment + $valign = $style->vertical_align; + + switch ($valign) { + + default: + case "baseline": + // FIXME: this isn't right + + case "top": + // Don't need to do anything + return; + + case "middle": + $delta = ($new_height - $this->_content_height) / 2; + break; + + case "bottom": + $delta = $new_height - $this->_content_height; + break; + + } + + // Move our children + foreach ( $this->get_lines() as $i => $line ) { + foreach ( $line["frames"] as $frame ) + $frame->set_position( null, $frame->get_position("y") + $delta ); + } + } + + } + + function set_resolved_border($side, $border_spec) { + $this->_resolved_borders[$side] = $border_spec; + } + + //........................................................................ + + function get_resolved_border($side) { + return $this->_resolved_borders[$side]; + } + + function get_resolved_borders() { return $this->_resolved_borders; } +} diff --git a/application/third_party/dompdf/include/table_cell_frame_reflower.cls.php b/application/third_party/dompdf/include/table_cell_frame_reflower.cls.php new file mode 100644 index 00000000..0393c85b --- /dev/null +++ b/application/third_party/dompdf/include/table_cell_frame_reflower.cls.php @@ -0,0 +1,147 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_cell_frame_reflower.cls.php 358 2011-01-30 22:22:47Z fabien.menager $ */ + + +/** + * Reflows table cells + * + * @access private + * @package dompdf + */ +class Table_Cell_Frame_Reflower extends Block_Frame_Reflower { + + //........................................................................ + + function __construct(Frame $frame) { + parent::__construct($frame); + } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + + $style = $this->_frame->get_style(); + + $table = Table_Frame_Decorator::find_parent_table($this->_frame); + $cellmap = $table->get_cellmap(); + + list($x, $y) = $cellmap->get_frame_position($this->_frame); + $this->_frame->set_position($x, $y); + + $cells = $cellmap->get_spanned_cells($this->_frame); + + $w = 0; + foreach ( $cells["columns"] as $i ) { + $col = $cellmap->get_column( $i ); + $w += $col["used-width"]; + } + + //FIXME? + $h = $this->_frame->get_containing_block("h"); + + $left_space = $style->length_in_pt(array($style->margin_left, + $style->padding_left, + $style->border_left_width), + $w); + + $right_space = $style->length_in_pt(array($style->padding_right, + $style->margin_right, + $style->border_right_width), + $w); + + $top_space = $style->length_in_pt(array($style->margin_top, + $style->padding_top, + $style->border_top_width), + $h); + $bottom_space = $style->length_in_pt(array($style->margin_bottom, + $style->padding_bottom, + $style->border_bottom_width), + $h); + + $style->width = $cb_w = $w - $left_space - $right_space; + + $content_x = $x + $left_space; + $content_y = $line_y = $y + $top_space; + + // Adjust the first line based on the text-indent property + $indent = $style->length_in_pt($style->text_indent, $w); + $this->_frame->increase_line_width($indent); + + // Set the y position of the first line in the cell + $page = $this->_frame->get_root(); + $this->_frame->set_current_line($line_y); + + // Set the containing blocks and reflow each child + foreach ( $this->_frame->get_children() as $child ) { + + if ( $page->is_full() ) + break; + + $child->set_containing_block($content_x, $content_y, $cb_w, $h); + $child->reflow($this->_frame); + + } + + // Determine our height + $style_height = $style->length_in_pt($style->height, $h); + + $this->_frame->set_content_height($this->_calculate_content_height()); + + $height = max($style_height, $this->_frame->get_content_height()); + + // Let the cellmap know our height + $cell_height = $height / count($cells["rows"]); + + if ($style_height <= $height) + $cell_height += $top_space + $bottom_space; + + foreach ($cells["rows"] as $i) + $cellmap->set_row_height($i, $cell_height); + + $style->height = $height; + + $this->_text_align(); + + $this->vertical_align(); + + } + +} diff --git a/application/third_party/dompdf/include/table_cell_positioner.cls.php b/application/third_party/dompdf/include/table_cell_positioner.cls.php new file mode 100644 index 00000000..29842ace --- /dev/null +++ b/application/third_party/dompdf/include/table_cell_positioner.cls.php @@ -0,0 +1,61 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_cell_positioner.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Positions table cells + * + * @access private + * @package dompdf + */ +class Table_Cell_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function position() { + + $table = Table_Frame_Decorator::find_parent_table($this->_frame); + $cellmap = $table->get_cellmap(); + $this->_frame->set_position($cellmap->get_frame_position($this->_frame)); + + } +} diff --git a/application/third_party/dompdf/include/table_cell_renderer.cls.php b/application/third_party/dompdf/include/table_cell_renderer.cls.php new file mode 100644 index 00000000..5417032b --- /dev/null +++ b/application/third_party/dompdf/include/table_cell_renderer.cls.php @@ -0,0 +1,185 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_cell_renderer.cls.php 311 2010-09-05 20:02:01Z fabien.menager $ */ + +/** + * Renders table cells + * + * @access private + * @package dompdf + */ +class Table_Cell_Renderer extends Block_Renderer { + + //........................................................................ + + function render(Frame $frame) { + $style = $frame->get_style(); + + $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); + + // Draw our background, border and content + if ( ($bg = $style->background_color) !== "transparent" ) { + list($x, $y, $w, $h) = $frame->get_padding_box(); + $this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg ); + } + else { + list($x, $y, $w, $h) = $frame->get_padding_box(); + } + + if ( ($url = $style->background_image) && $url !== "none" ) { + $this->_background_image($url, $x, $y, $w, $h, $style); + } + + if ( $style->border_collapse !== "collapse" ) { + $this->_render_border($frame, "bevel"); + $this->_render_outline($frame, "bevel"); + return; + } + + // The collapsed case is slightly complicated... + // @todo Add support for outlines here + + $cellmap = Table_Frame_Decorator::find_parent_table($frame)->get_cellmap(); + $cells = $cellmap->get_spanned_cells($frame); + $num_rows = $cellmap->get_num_rows(); + $num_cols = $cellmap->get_num_cols(); + + // Determine the top row spanned by this cell + $i = $cells["rows"][0]; + $top_row = $cellmap->get_row($i); + + // Determine if this cell borders on the bottom of the table. If so, + // then we draw its bottom border. Otherwise the next row down will + // draw its top border instead. + if (in_array( $num_rows - 1, $cells["rows"])) { + $draw_bottom = true; + $bottom_row = $cellmap->get_row($num_rows - 1); + } else + $draw_bottom = false; + + + // Draw the horizontal borders + foreach ( $cells["columns"] as $j ) { + $bp = $cellmap->get_border_properties($i, $j); + + $y = $top_row["y"] - $bp["top"]["width"] / 2; + + $col = $cellmap->get_column($j); + $x = $col["x"] - $bp["left"]["width"] / 2; + $w = $col["used-width"] + ($bp["left"]["width"] + $bp["right"]["width"] ) / 2; + + if ( $bp["top"]["style"] !== "none" && $bp["top"]["width"] > 0 ) { + $widths = array($bp["top"]["width"], + $bp["right"]["width"], + $bp["bottom"]["width"], + $bp["left"]["width"]); + $method = "_border_". $bp["top"]["style"]; + $this->$method($x, $y, $w, $bp["top"]["color"], $widths, "top", "square"); + } + + if ( $draw_bottom ) { + $bp = $cellmap->get_border_properties($num_rows - 1, $j); + if ( $bp["bottom"]["style"] === "none" || $bp["bottom"]["width"] <= 0 ) + continue; + + $y = $bottom_row["y"] + $bottom_row["height"] + $bp["bottom"]["width"] / 2; + + $widths = array($bp["top"]["width"], + $bp["right"]["width"], + $bp["bottom"]["width"], + $bp["left"]["width"]); + $method = "_border_". $bp["bottom"]["style"]; + $this->$method($x, $y, $w, $bp["bottom"]["color"], $widths, "bottom", "square"); + + } + } + + $j = $cells["columns"][0]; + + $left_col = $cellmap->get_column($j); + + if (in_array($num_cols - 1, $cells["columns"])) { + $draw_right = true; + $right_col = $cellmap->get_column($num_cols - 1); + } else + $draw_right = false; + + // Draw the vertical borders + foreach ( $cells["rows"] as $i ) { + $bp = $cellmap->get_border_properties($i, $j); + + $x = $left_col["x"] - $bp["left"]["width"] / 2; + + $row = $cellmap->get_row($i); + + $y = $row["y"] - $bp["top"]["width"] / 2; + $h = $row["height"] + ($bp["top"]["width"] + $bp["bottom"]["width"])/ 2; + + if ( $bp["left"]["style"] !== "none" && $bp["left"]["width"] > 0 ) { + + $widths = array($bp["top"]["width"], + $bp["right"]["width"], + $bp["bottom"]["width"], + $bp["left"]["width"]); + + $method = "_border_" . $bp["left"]["style"]; + $this->$method($x, $y, $h, $bp["left"]["color"], $widths, "left", "square"); + } + + if ( $draw_right ) { + $bp = $cellmap->get_border_properties($i, $num_cols - 1); + if ( $bp["right"]["style"] === "none" || $bp["right"]["width"] <= 0 ) + continue; + + $x = $right_col["x"] + $right_col["used-width"] + $bp["right"]["width"] / 2; + + $widths = array($bp["top"]["width"], + $bp["right"]["width"], + $bp["bottom"]["width"], + $bp["left"]["width"]); + + $method = "_border_" . $bp["right"]["style"]; + $this->$method($x, $y, $h, $bp["right"]["color"], $widths, "right", "square"); + + } + } + + } +} diff --git a/application/third_party/dompdf/include/table_frame_decorator.cls.php b/application/third_party/dompdf/include/table_frame_decorator.cls.php new file mode 100644 index 00000000..713cce4d --- /dev/null +++ b/application/third_party/dompdf/include/table_frame_decorator.cls.php @@ -0,0 +1,342 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_frame_decorator.cls.php 317 2010-10-06 13:06:57Z fabien.menager $ */ + +/** + * Decorates Frames for table layout + * + * @access private + * @package dompdf + */ +class Table_Frame_Decorator extends Frame_Decorator { + static $VALID_CHILDREN = array("table-row-group", + "table-row", + "table-header-group", + "table-footer-group", + "table-column", + "table-column-group", + "table-caption", + "table-cell"); + + static $ROW_GROUPS = array('table-row-group', + 'table-header-group', + 'table-footer-group'); + + /** + * The Cellmap object for this table. The cellmap maps table cells + * to rows and columns, and aids in calculating column widths. + * + * @var Cellmap + */ + protected $_cellmap; + + /** + * The minimum width of the table, in pt + * + * @var float + */ + protected $_min_width; + + /** + * The maximum width of the table, in pt + * + * @var float + */ + protected $_max_width; + + /** + * Table header rows. Each table header is duplicated when a table + * spans pages. + * + * @var array + */ + protected $_headers; + + /** + * Table footer rows. Each table footer is duplicated when a table + * spans pages. + * + * @var array + */ + protected $_footers; + + /** + * Class constructor + * + * @param Frame $frame the frame to decorate + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + $this->_cellmap = new Cellmap($this); + $this->_min_width = null; + $this->_max_width = null; + $this->_headers = array(); + $this->_footers = array(); + } + + + function reset() { + parent::reset(); + $this->_cellmap->reset(); + $this->_min_width = null; + $this->_max_width = null; + $this->_headers = array(); + $this->_footers = array(); + $this->_reflower->reset(); + } + + //........................................................................ + + /** + * split the table at $row. $row and all subsequent rows will be + * added to the clone. This method is overidden in order to remove + * frames from the cellmap properly. + * + * @param Frame $row + */ + function split($child = null, $force_pagebreak = false) { + + if ( is_null($child) ) { + parent::split(); + return; + } + + // If $child is a header or if it is the first non-header row, do + // not duplicate headers, simply move the table to the next page. + if ( count($this->_headers) && !in_array($child, $this->_headers, true) && + !in_array($child->get_prev_sibling(), $this->_headers, true) ) { + + $first_header = null; + + // Insert copies of the table headers before $child + foreach ($this->_headers as $header) { + + $new_header = $header->deep_copy(); + + if ( is_null($first_header) ) + $first_header = $new_header; + + $this->insert_child_before($new_header, $child); + } + + parent::split($first_header); + + } else if ( in_array($child->get_style()->display, self::$ROW_GROUPS) ) { + + // Individual rows should have already been handled + parent::split($child); + + } else { + + $iter = $child; + + while ($iter) { + $this->_cellmap->remove_row($iter); + $iter = $iter->get_next_sibling(); + } + + parent::split($child); + } + } + + /** + * Static function to locate the parent table of a frame + * + * @param Frame $frame + * @return Table_Frame_Decorator the table that is an ancestor of $frame + */ + static function find_parent_table(Frame $frame) { + + while ( $frame = $frame->get_parent() ) + if ( in_array($frame->get_style()->display, Style::$TABLE_TYPES) ) + break; + + return $frame; + } + + /** + * Return this table's Cellmap + * + * @return Cellmap + */ + function get_cellmap() { return $this->_cellmap; } + + /** + * Return the minimum width of this table + * + * @return float + */ + function get_min_width() { return $this->_min_width; } + + /** + * Return the maximum width of this table + * + * @return float + */ + function get_max_width() { return $this->_max_width; } + + /** + * Set the minimum width of the table + * + * @param float $width the new minimum width + */ + function set_min_width($width) { $this->_min_width = $width; } + + /** + * Set the maximum width of the table + * + * @param float $width the new maximum width + */ + function set_max_width($width) { $this->_max_width = $width; } + + /** + * Restructure tree so that the table has the correct structure. + * Invalid children (i.e. all non-table-rows) are moved below the + * table. + */ + function normalise() { + + // Store frames generated by invalid tags and move them outside the table + $erroneous_frames = array(); + $anon_row = false; + $iter = $this->get_first_child(); + while ( $iter ) { + $child = $iter; + $iter = $iter->get_next_sibling(); + + $display = $child->get_style()->display; + + if ( $anon_row ) { + + if ( $display === "table-row" ) { + // Add the previous anonymous row + $this->insert_child_before($table_row, $child); + + $table_row->normalise(); + $child->normalise(); + $anon_row = false; + continue; + } + + // add the child to the anonymous row + $table_row->append_child($child); + continue; + + } else { + + if ( $display === "table-row" ) { + $child->normalise(); + continue; + } + + if ( $display === "table-cell") { + // Create an anonymous table row + $tr = $this->get_node()->ownerDocument->createElement("tr"); + + $frame = new Frame($tr); + + $css = $this->get_style()->get_stylesheet(); + $style = $css->create_style(); + $style->inherit($this->get_style()); + + // Lookup styles for tr tags. If the user wants styles to work + // better, they should make the tr explicit... I'm not going to + // try to guess what they intended. + if ( $tr_style = $css->lookup("tr") ) + $style->merge($tr_style); + + // Okay, I have absolutely no idea why I need this clone here, but + // if it's omitted, php (as of 2004-07-28) segfaults. + $frame->set_style(clone $style); + $table_row = Frame_Factory::decorate_frame($frame, $this->_dompdf); + $table_row->set_root($this->_root); + + // Add the cell to the row + $table_row->append_child($child); + + $anon_row = true; + continue; + } + + if ( !in_array($display, self::$VALID_CHILDREN) ) { + $erroneous_frames[] = $child; + continue; + } + + // Normalise other table parts (i.e. row groups) + foreach ($child->get_children() as $grandchild) { + if ( $grandchild->get_style()->display === "table-row" ) + $grandchild->normalise(); + } + + // Add headers and footers + if ( $display === "table-header-group" ) + $this->_headers[] = $child; + + else if ( $display === "table-footer-group" ) + $this->_footers[] = $child; + } + } + + if ( $anon_row ) { + // Add the row to the table + $this->_frame->append_child($table_row); + $table_row->normalise(); + $this->_cellmap->add_row(); + } + + foreach ($erroneous_frames as $frame) + $this->move_after($frame); + + } + + //........................................................................ + + /** + * Moves the specified frame and it's corresponding node outside of + * the table. + * + * @param Frame $frame the frame to move + */ + function move_after(Frame $frame) { + $this->get_parent()->insert_child_after($frame, $this); + } + +} diff --git a/application/third_party/dompdf/include/table_frame_reflower.cls.php b/application/third_party/dompdf/include/table_frame_reflower.cls.php new file mode 100644 index 00000000..5e4a9a1f --- /dev/null +++ b/application/third_party/dompdf/include/table_frame_reflower.cls.php @@ -0,0 +1,574 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_frame_reflower.cls.php 359 2011-02-05 12:15:06Z fabien.menager $ */ + +/** + * Reflows tables + * + * @access private + * @package dompdf + */ +class Table_Frame_Reflower extends Frame_Reflower { + + /** + * Cache of results between call to get_min_max_width and assign_widths + * + * @var array + */ + protected $_state; + + function __construct(Table_Frame_Decorator $frame) { + $this->_state = null; + parent::__construct($frame); + } + + /** + * State is held here so it needs to be reset along with the decorator + */ + function reset() { + $this->_state = null; + $this->_min_max_cache = null; + } + + //........................................................................ + + protected function _assign_widths() { + $style = $this->_frame->get_style(); + + // Find the min/max width of the table and sort the columns into + // absolute/percent/auto arrays + $min_width = $this->_state["min_width"]; + $max_width = $this->_state["max_width"]; + $percent_used = $this->_state["percent_used"]; + $absolute_used = $this->_state["absolute_used"]; + $auto_min = $this->_state["auto_min"]; + + $absolute =& $this->_state["absolute"]; + $percent =& $this->_state["percent"]; + $auto =& $this->_state["auto"]; + + // Determine the actual width of the table + $cb = $this->_frame->get_containing_block(); + $columns =& $this->_frame->get_cellmap()->get_columns(); + + $width = $style->width; + + // Calculate padding & border fudge factor + $left = $style->margin_left; + $right = $style->margin_right; + + $left = $left === "auto" ? 0 : $style->length_in_pt($left, $cb["w"]); + $right = $right === "auto" ? 0 : $style->length_in_pt($right, $cb["w"]); + + $delta = $left + $right + $style->length_in_pt(array($style->padding_left, + $style->border_left_width, + $style->border_right_width, + $style->padding_right), $cb["w"]); + + $min_table_width = $style->length_in_pt( $style->min_width, $cb["w"] - $delta ); + + // min & max widths already include borders & padding + $min_width -= $delta; + $max_width -= $delta; + + if ( $width !== "auto" ) { + + $preferred_width = $style->length_in_pt($width, $cb["w"]) - $delta; + + if ( $preferred_width < $min_table_width ) + $preferred_width = $min_table_width; + + if ( $preferred_width > $min_width ) + $width = $preferred_width; + else + $width = $min_width; + + } else { + + if ( $max_width + $delta < $cb["w"] ) + $width = $max_width; + else if ( $cb["w"] - $delta > $min_width ) + $width = $cb["w"] - $delta; + else + $width = $min_width; + + if ( $width < $min_table_width ) + $width = $min_table_width; + + } + + // Store our resolved width + $style->width = $width; + + $cellmap = $this->_frame->get_cellmap(); + + // If the whole table fits on the page, then assign each column it's max width + if ( $width == $max_width ) { + + foreach (array_keys($columns) as $i) + $cellmap->set_column_width($i, $columns[$i]["max-width"]); + + return; + } + + // Determine leftover and assign it evenly to all columns + if ( $width > $min_width ) { + + // We have four cases to deal with: + // + // 1. All columns are auto--no widths have been specified. In this + // case we distribute extra space across all columns weighted by max-width. + // + // 2. Only absolute widths have been specified. In this case we + // distribute any extra space equally among 'width: auto' columns, or all + // columns if no auto columns have been specified. + // + // 3. Only percentage widths have been specified. In this case we + // normalize the percentage values and distribute any remaining % to + // width: auto columns. We then proceed to assign widths as fractions + // of the table width. + // + // 4. Both absolute and percentage widths have been specified. + + // Case 1: + if ( $absolute_used == 0 && $percent_used == 0 ) { + $increment = $width - $min_width; + + foreach (array_keys($columns) as $i) + $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment * ($columns[$i]["max-width"] / $max_width)); + return; + } + + + // Case 2 + if ( $absolute_used > 0 && $percent_used == 0 ) { + + if ( count($auto) > 0 ) + $increment = ($width - $auto_min - $absolute_used) / count($auto); + + // Use the absolutely specified width or the increment + foreach (array_keys($columns) as $i) { + + if ( $columns[$i]["absolute"] > 0 && count($auto) ) + $cellmap->set_column_width($i, $columns[$i]["min-width"]); + else if ( count($auto) ) + $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); + else { + // All absolute columns + $increment = ($width - $absolute_used) * $columns[$i]["absolute"] / $absolute_used; + + $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); + } + + } + return; + } + + + // Case 3: + if ( $absolute_used == 0 && $percent_used > 0 ) { + + $scale = null; + $remaining = null; + + // Scale percent values if the total percentage is > 100, or if all + // values are specified as percentages. + if ( $percent_used > 100 || count($auto) == 0) + $scale = 100 / $percent_used; + else + $scale = 1; + + // Account for the minimum space used by the unassigned auto columns + $used_width = $auto_min; + + foreach ($percent as $i) { + $columns[$i]["percent"] *= $scale; + + $slack = $width - $used_width; + + $w = min($columns[$i]["percent"] * $width/100, $slack); + + if ( $w < $columns[$i]["min-width"] ) + $w = $columns[$i]["min-width"]; + + $cellmap->set_column_width($i, $w); + $used_width += $w; + + } + + // This works because $used_width includes the min-width of each + // unassigned column + if ( count($auto) > 0 ) { + $increment = ($width - $used_width) / count($auto); + + foreach ($auto as $i) + $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); + + } + return; + } + + // Case 4: + + // First-come, first served + if ( $absolute_used > 0 && $percent_used > 0 ) { + + $used_width = $auto_min; + + foreach ($absolute as $i) { + $cellmap->set_column_width($i, $columns[$i]["min-width"]); + $used_width += $columns[$i]["min-width"]; + } + + // Scale percent values if the total percentage is > 100 or there + // are no auto values to take up slack + if ( $percent_used > 100 || count($auto) == 0 ) + $scale = 100 / $percent_used; + else + $scale = 1; + + $remaining_width = $width - $used_width; + + foreach ($percent as $i) { + $slack = $remaining_width - $used_width; + + $columns[$i]["percent"] *= $scale; + $w = min($columns[$i]["percent"] * $remaining_width / 100, $slack); + + if ( $w < $columns[$i]["min-width"] ) + $w = $columns[$i]["min-width"]; + + $columns[$i]["used-width"] = $w; + $used_width += $w; + } + + if ( count($auto) > 0 ) { + $increment = ($width - $used_width) / count($auto); + + foreach ($auto as $i) + $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); + + } + + return; + } + + + } else { // we are over constrained + + // Each column gets its minimum width + foreach (array_keys($columns) as $i) + $cellmap->set_column_width($i, $columns[$i]["min-width"]); + + } + } + + //........................................................................ + + // Determine the frame's height based on min/max height + protected function _calculate_height() { + + $style = $this->_frame->get_style(); + $height = $style->height; + + $cellmap = $this->_frame->get_cellmap(); + $cellmap->assign_frame_heights(); + $rows = $cellmap->get_rows(); + + // Determine our content height + $content_height = 0; + foreach ( $rows as $r ) + $content_height += $r["height"]; + + $cb = $this->_frame->get_containing_block(); + + if ( !($style->overflow === "visible" || + ($style->overflow === "hidden" && $height === "auto")) ) { + + // Only handle min/max height if the height is independent of the frame's content + + $min_height = $style->min_height; + $max_height = $style->max_height; + + if ( isset($cb["h"]) ) { + $min_height = $style->length_in_pt($min_height, $cb["h"]); + $max_height = $style->length_in_pt($max_height, $cb["h"]); + + } else if ( isset($cb["w"]) ) { + + if ( mb_strpos($min_height, "%") !== false ) + $min_height = 0; + else + $min_height = $style->length_in_pt($min_height, $cb["w"]); + + if ( mb_strpos($max_height, "%") !== false ) + $max_height = "none"; + else + $max_height = $style->length_in_pt($max_height, $cb["w"]); + } + + if ( $max_height !== "none" && $min_height > $max_height ) + // Swap 'em + list($max_height, $min_height) = array($min_height, $max_height); + + if ( $max_height !== "none" && $height > $max_height ) + $height = $max_height; + + if ( $height < $min_height ) + $height = $min_height; + + } else { + + // Use the content height or the height value, whichever is greater + if ( $height !== "auto" ) { + $height = $style->length_in_pt($height, $cb["h"]); + + if ( $height <= $content_height ) + $height = $content_height; + else + $cellmap->set_frame_heights($height,$content_height); + + } else + $height = $content_height; + + } + + return $height; + + } + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + $frame = $this->_frame; + + // Check if a page break is forced + $page = $frame->get_root(); + $page->check_forced_page_break($frame); + + // Bail if the page is full + if ( $page->is_full() ) + return; + + // Let the page know that we're reflowing a table so that splits + // are suppressed (simply setting page-break-inside: avoid won't + // work because we may have an arbitrary number of block elements + // inside tds.) + $page->table_reflow_start(); + + // Collapse vertical margins, if required + $this->_collapse_margins(); + + $frame->position(); + + // Table layout algorithm: + // http://www.w3.org/TR/CSS21/tables.html#auto-table-layout + + if ( is_null($this->_state) ) + $this->get_min_max_width(); + + $cb = $frame->get_containing_block(); + $style = $frame->get_style(); + + // This is slightly inexact, but should be okay. Add half the + // border-spacing to the table as padding. The other half is added to + // the cells themselves. + if ( $style->border_collapse === "separate" ) { + list($h, $v) = $style->border_spacing; + + $v = $style->length_in_pt($v) / 2; + $h = $style->length_in_pt($h) / 2; + + $style->padding_left = $style->length_in_pt($style->padding_left, $cb["w"]) + $h; + $style->padding_right = $style->length_in_pt($style->padding_right, $cb["w"]) + $h; + $style->padding_top = $style->length_in_pt($style->padding_top, $cb["h"]) + $v; + $style->padding_bottom = $style->length_in_pt($style->padding_bottom, $cb["h"]) + $v; + + } + + $this->_assign_widths(); + + // Adjust left & right margins, if they are auto + $width = $style->width; + $left = $style->margin_left; + $right = $style->margin_right; + + $diff = $cb["w"] - $width; + + if ( $left === "auto" && $right === "auto" && $diff > 0 ) { + $left = $right = $diff / 2; + $style->margin_left = "$left pt"; + $style->margin_right = "$right pt"; + + } else { + if($left === "auto") { + $left = $style->length_in_pt($cb["w"] - $right - $width, $cb["w"]); + } + if($right === "auto") { + $left = $style->length_in_pt($left, $cb["w"]); + } + } + + + list($x, $y) = $frame->get_position(); + + // Determine the content edge + $content_x = $x + $left + $style->length_in_pt(array($style->padding_left, + $style->border_left_width), $cb["w"]); + $content_y = $y + $style->length_in_pt(array($style->margin_top, + $style->border_top_width, + $style->padding_top), $cb["h"]); + + if ( isset($cb["h"]) ) + $h = $cb["h"]; + else + $h = null; + + + $cellmap = $frame->get_cellmap(); + $col =& $cellmap->get_column(0); + $col["x"] = $content_x; + + $row =& $cellmap->get_row(0); + $row["y"] = $content_y; + + $cellmap->assign_x_positions(); + + // Set the containing block of each child & reflow + foreach ( $frame->get_children() as $child ) { + + // Bail if the page is full + if ( !$page->in_nested_table() && $page->is_full() ) + break; + + $child->set_containing_block($content_x, $content_y, $width, $h); + $child->reflow(); + + if ( !$page->in_nested_table() ) + // Check if a split has occured + $page->check_page_break($child); + + } + + // Assign heights to our cells: + $style->height = $this->_calculate_height(); + + if ( $style->border_collapse === "collapse" ) { + // Unset our borders because our cells are now using them + $style->border_style = "none"; + } + + $page->table_reflow_end(); + + // Debugging: + //echo ($this->_frame->get_cellmap()); + + if ( $block ) { + $block->add_frame_to_line($this->_frame); + } + } + + //........................................................................ + + function get_min_max_width() { + + if ( !is_null($this->_min_max_cache) ) + return $this->_min_max_cache; + + $style = $this->_frame->get_style(); + + $this->_frame->normalise(); + + // Add the cells to the cellmap (this will calcluate column widths as + // frames are added) + $this->_frame->get_cellmap()->add_frame($this->_frame); + + // Find the min/max width of the table and sort the columns into + // absolute/percent/auto arrays + $this->_state = array(); + $this->_state["min_width"] = 0; + $this->_state["max_width"] = 0; + + $this->_state["percent_used"] = 0; + $this->_state["absolute_used"] = 0; + $this->_state["auto_min"] = 0; + + $this->_state["absolute"] = array(); + $this->_state["percent"] = array(); + $this->_state["auto"] = array(); + + $columns =& $this->_frame->get_cellmap()->get_columns(); + foreach (array_keys($columns) as $i) { + $this->_state["min_width"] += $columns[$i]["min-width"]; + $this->_state["max_width"] += $columns[$i]["max-width"]; + + if ( $columns[$i]["absolute"] > 0 ) { + $this->_state["absolute"][] = $i; + $this->_state["absolute_used"] += $columns[$i]["absolute"]; + + } else if ( $columns[$i]["percent"] > 0 ) { + $this->_state["percent"][] = $i; + $this->_state["percent_used"] += $columns[$i]["percent"]; + + } else { + $this->_state["auto"][] = $i; + $this->_state["auto_min"] += $columns[$i]["min-width"]; + } + } + + // Account for margins & padding + $dims = array($style->border_left_width, + $style->border_right_width, + $style->padding_left, + $style->padding_right, + $style->margin_left, + $style->margin_right); + + if ( $style->border_collapse !== "collapse" ) + list($dims[]) = $style->border_spacing; + + $delta = $style->length_in_pt($dims, $this->_frame->get_containing_block("w")); + + $this->_state["min_width"] += $delta; + $this->_state["max_width"] += $delta; + + return $this->_min_max_cache = array($this->_state["min_width"], $this->_state["max_width"], + "min" => $this->_state["min_width"], "max" => $this->_state["max_width"]); + } +} diff --git a/application/third_party/dompdf/include/table_row_frame_decorator.cls.php b/application/third_party/dompdf/include/table_row_frame_decorator.cls.php new file mode 100644 index 00000000..1bf7911b --- /dev/null +++ b/application/third_party/dompdf/include/table_row_frame_decorator.cls.php @@ -0,0 +1,81 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_row_frame_decorator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Decorates Frames for table row layout + * + * @access private + * @package dompdf + */ +class Table_Row_Frame_Decorator extends Frame_Decorator { + + // protected members + + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + } + + //........................................................................ + + /** + * Remove all non table-cell frames from this row and move them after + * the table. + */ + function normalise() { + + // Find our table parent + $p = Table_Frame_Decorator::find_parent_table($this); + + $erroneous_frames = array(); + foreach ($this->get_children() as $child) { + $display = $child->get_style()->display; + + if ( $display !== "table-cell" ) + $erroneous_frames[] = $child; + } + + // dump the extra nodes after the table. + foreach ($erroneous_frames as $frame) + $p->move_after($frame); + } + + +} diff --git a/application/third_party/dompdf/include/table_row_frame_reflower.cls.php b/application/third_party/dompdf/include/table_row_frame_reflower.cls.php new file mode 100644 index 00000000..d44d3169 --- /dev/null +++ b/application/third_party/dompdf/include/table_row_frame_reflower.cls.php @@ -0,0 +1,94 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_row_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Reflows table rows + * + * @access private + * @package dompdf + */ +class Table_Row_Frame_Reflower extends Frame_Reflower { + + + function __construct(Table_Row_Frame_Decorator $frame) { + parent::__construct($frame); + } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + $page = $this->_frame->get_root(); + + if ( $page->is_full() ) + return; + + $this->_frame->position(); + $style = $this->_frame->get_style(); + $cb = $this->_frame->get_containing_block(); + + foreach ($this->_frame->get_children() as $child) { + + if ( $page->is_full() ) + return; + + $child->set_containing_block($cb); + $child->reflow(); + + } + + if ( $page->is_full() ) + return; + + $table = Table_Frame_Decorator::find_parent_table($this->_frame); + $cellmap = $table->get_cellmap(); + $style->width = $cellmap->get_frame_width($this->_frame); + $style->height = $cellmap->get_frame_height($this->_frame); + + $this->_frame->set_position($cellmap->get_frame_position($this->_frame)); + + } + + //........................................................................ + + function get_min_max_width() { + throw new DOMPDF_Exception("Min/max width is undefined for table rows"); + } +} diff --git a/application/third_party/dompdf/include/table_row_group_frame_decorator.cls.php b/application/third_party/dompdf/include/table_row_group_frame_decorator.cls.php new file mode 100644 index 00000000..10c64baa --- /dev/null +++ b/application/third_party/dompdf/include/table_row_group_frame_decorator.cls.php @@ -0,0 +1,96 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004-6 Benj Carson + * @author Benj Carson + * @package dompdf + */ + +/* $Id: table_row_group_frame_decorator.cls.php 317 2010-10-06 13:06:57Z fabien.menager $ */ + +/** + * Table row group decorator + * + * Overrides split() method for tbody, thead & tfoot elements + * + * @access private + * @package dompdf + */ +class Table_Row_Group_Frame_Decorator extends Frame_Decorator { + + /** + * Class constructor + * + * @param Frame $frame Frame to decorate + * @param DOMPDF $dompdf Current dompdf instance + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + } + + /** + * Override split() to remove all child rows and this element from the cellmap + * + * @param Frame $child + */ + function split($child = null, $force_pagebreak = false) { + + if ( is_null($child) ) { + parent::split(); + return; + } + + + // Remove child & all subsequent rows from the cellmap + $cellmap = $this->get_parent()->get_cellmap(); + $iter = $child; + + while ( $iter ) { + $cellmap->remove_row($iter); + $iter = $iter->get_next_sibling(); + } + + // If we are splitting at the first child remove the + // table-row-group from the cellmap as well + if ( $child === $this->get_first_child() ) { + $cellmap->remove_row_group($this); + parent::split(); + return; + } + + $cellmap->update_row_group($this, $child->get_prev_sibling()); + parent::split($child); + + } +} + diff --git a/application/third_party/dompdf/include/table_row_group_frame_reflower.cls.php b/application/third_party/dompdf/include/table_row_group_frame_reflower.cls.php new file mode 100644 index 00000000..5298876d --- /dev/null +++ b/application/third_party/dompdf/include/table_row_group_frame_reflower.cls.php @@ -0,0 +1,92 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_row_group_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Reflows table row groups (e.g. tbody tags) + * + * @access private + * @package dompdf + */ +class Table_Row_Group_Frame_Reflower extends Frame_Reflower { + + function __construct($frame) { + parent::__construct($frame); + } + + function reflow(Frame_Decorator $block = null) { + $page = $this->_frame->get_root(); + + $style = $this->_frame->get_style(); + + // Our width is equal to the width of our parent table + $table = Table_Frame_Decorator::find_parent_table($this->_frame); + + $cb = $this->_frame->get_containing_block(); + + foreach ( $this->_frame->get_children() as $child) { + // Bail if the page is full + if ( $page->is_full() ) + return; + + $child->set_containing_block($cb["x"], $cb["y"], $cb["w"], $cb["h"]); + $child->reflow(); + + // Check if a split has occured + $page->check_page_break($child); + + } + + if ( $page->is_full() ) + return; + + $cellmap = $table->get_cellmap(); + $style->width = $cellmap->get_frame_width($this->_frame); + $style->height = $cellmap->get_frame_height($this->_frame); + + $this->_frame->set_position($cellmap->get_frame_position($this->_frame)); + + if ( $table->get_style()->border_collapse === "collapse" ) + // Unset our borders because our cells are now using them + $style->border_style = "none"; + + } + +} diff --git a/application/third_party/dompdf/include/table_row_positioner.cls.php b/application/third_party/dompdf/include/table_row_positioner.cls.php new file mode 100644 index 00000000..7a15929f --- /dev/null +++ b/application/third_party/dompdf/include/table_row_positioner.cls.php @@ -0,0 +1,68 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_row_positioner.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Positions table rows + * + * @access private + * @package dompdf + */ +class Table_Row_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function position() { + + $cb = $this->_frame->get_containing_block(); + $p = $this->_frame->get_prev_sibling(); + + if ( $p ) + $y = $p->get_position("y") + $p->get_margin_height(); + + else + $y = $cb["y"]; + + $this->_frame->set_position($cb["x"], $y); + + } +} diff --git a/application/third_party/dompdf/include/tcpdf_adapter.cls.php b/application/third_party/dompdf/include/tcpdf_adapter.cls.php new file mode 100644 index 00000000..47ed71ae --- /dev/null +++ b/application/third_party/dompdf/include/tcpdf_adapter.cls.php @@ -0,0 +1,498 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: tcpdf_adapter.cls.php 311 2010-09-05 20:02:01Z fabien.menager $ */ + +require_once(DOMPDF_LIB_DIR . '/tcpdf/tcpdf.php'); + +/** + * TCPDF PDF Rendering interface + * + * TCPDF_Adapter provides a simple, stateless interface to TCPDF. + * + * Unless otherwise mentioned, all dimensions are in points (1/72 in). + * The coordinate origin is in the top left corner and y values + * increase downwards. + * + * See {@link http://tcpdf.sourceforge.net} for more information on + * the underlying TCPDF class. + * + * @package dompdf + */ +class TCPDF_Adapter implements Canvas { + + /** + * Dimensions of paper sizes in points + * + * @var array; + */ + static public $PAPER_SIZES = array(); // Set to + // CPDF_Adapter::$PAPER_SIZES below. + + + /** + * Instance of the TCPDF class + * + * @var TCPDF + */ + private $_pdf; + + /** + * PDF width in points + * + * @var float + */ + private $_width; + + /** + * PDF height in points + * + * @var float + */ + private $_height; + + /** + * Last fill colour used + * + * @var array + */ + private $_last_fill_color; + + /** + * Last stroke colour used + * + * @var array + */ + private $_last_stroke_color; + + /** + * Last line width used + * + * @var float + */ + private $_last_line_width; + + /** + * Total number of pages + * + * @var int + */ + private $_page_count; + + /** + * Text to display on every page + * + * @var array + */ + private $_page_text; + + /** + * Array of pages for accessing after initial rendering is complete + * + * @var array + */ + private $_pages; + + /** + * Class constructor + * + * @param mixed $paper The size of paper to use either a string (see {@link CPDF_Adapter::$PAPER_SIZES}) or + * an array(xmin,ymin,xmax,ymax) + * @param string $orientation The orientation of the document (either 'landscape' or 'portrait') + */ + function __construct($paper = "letter", $orientation = "portrait") { + + if ( is_array($paper) ) + $size = $paper; + else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) ) + $size = self::$PAPER_SIZE[$paper]; + else + $size = self::$PAPER_SIZE["letter"]; + + if ( mb_strtolower($orientation) === "landscape" ) { + list($size[2], $size[3]) = array($size[3], $size[2]); + } + + $this->_width = $size[2] - $size[0]; + $this->_height = $size[3] - $size[1]; + + $this->_pdf = new TCPDF("P", "pt", array($this->_width, $this->_height)); + $this->_pdf->Setcreator("DOMPDF Converter"); + + $this->_pdf->AddPage(); + + $this->_page_number = $this->_page_count = 1; + $this->_page_text = array(); + + $this->_last_fill_color = + $this->_last_stroke_color = + $this->_last_line_width = null; + + } + + /** + * Remaps y coords from 4th to 1st quadrant + * + * @param float $y + * @return float + */ + protected function y($y) { return $this->_height - $y; } + + /** + * Sets the stroke colour + * + * @param array $color + */ + protected function _set_stroke_colour($colour) { + $colour[0] = round(255 * $colour[0]); + $colour[1] = round(255 * $colour[1]); + $colour[2] = round(255 * $colour[2]); + + if ( is_null($this->_last_stroke_color) || $color != $this->_last_stroke_color ) { + $this->_pdf->SetDrawColor($color[0],$color[1],$color[2]); + $this->_last_stroke_color = $color; + } + + } + + /** + * Sets the fill colour + * + * @param array $color + */ + protected function _set_fill_colour($colour) { + $colour[0] = round(255 * $colour[0]); + $colour[1] = round(255 * $colour[1]); + $colour[2] = round(255 * $colour[2]); + + if ( is_null($this->_last_fill_color) || $color != $this->_last_fill_color ) { + $this->_pdf->SetDrawColor($color[0],$color[1],$color[2]); + $this->_last_fill_color = $color; + } + + } + + /** + * Return the TCPDF instance + * + * @return TCPDF + */ + function get_tcpdf() { return $this->_pdf; } + + /** + * Returns the current page number + * + * @return int + */ + function get_page_number() { + return $this->_page_number; + } + + /** + * Returns the total number of pages + * + * @return int + */ + function get_page_count() { + return $this->_page_count; + } + + /** + * Sets the total number of pages + * + * @param int $count + */ + function set_page_count($count) { + $this->_page_count = (int)$count; + } + + /** + * Draws a line from x1,y1 to x2,y2 + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the format of the + * $style parameter (aka dash). + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param array $color + * @param float $width + * @param array $style + */ + function line($x1, $y1, $x2, $y2, $color, $width, $style = null) { + + if ( is_null($this->_last_line_width) || $width != $this->_last_line_width ) { + $this->_pdf->SetLineWidth($width); + $this->_last_line_width = $width; + } + + $this->_set_stroke_colour($color); + + // FIXME: ugh, need to handle different styles here + $this->_pdf->line($x1, $y1, $x2, $y2); + } + + /** + * Draws a rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + * @param float $width + * @param array $style + */ + function rectangle($x1, $y1, $w, $h, $color, $width, $style = null) { + + if ( is_null($this->_last_line_width) || $width != $this->_last_line_width ) { + $this->_pdf->SetLineWidth($width); + $this->_last_line_width = $width; + } + + $this->_set_stroke_colour($color); + + // FIXME: ugh, need to handle styles here + $this->_pdf->rect($x1, $y1, $w, $h); + + } + + /** + * Draws a filled rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + */ + function filled_rectangle($x1, $y1, $w, $h, $color) { + + $this->_set_fill_colour($color); + + // FIXME: ugh, need to handle styles here + $this->_pdf->rect($x1, $y1, $w, $h, "F"); + } + + /** + * Draws a polygon + * + * The polygon is formed by joining all the points stored in the $points + * array. $points has the following structure: + * + * array(0 => x1, + * 1 => y1, + * 2 => x2, + * 3 => y2, + * ... + * ); + * + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param array $points + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the polygon if true + */ + function polygon($points, $color, $width = null, $style = null, $fill = false) { + // FIXME + } + + /** + * Draws a circle at $x,$y with radius $r + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x + * @param float $y + * @param float $r + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the circle if true + */ + function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false) { + // FIXME + } + + /** + * Add an image to the pdf. + * + * The image is placed at the specified x and y coordinates with the + * given width and height. + * + * @param string $img_url the path to the image + * @param string $img_type the type (e.g. extension) of the image + * @param float $x x position + * @param float $y y position + * @param int $w width (in pixels) + * @param int $h height (in pixels) + */ + function image($img_url, $img_type, $x, $y, $w, $h) { + // FIXME + } + + /** + * Writes text at the specified x and y coordinates + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x + * @param float $y + * @param string $text the text to write + * @param string $font the font file to use + * @param float $size the font size, in points + * @param array $color + * @param float $adjust word spacing adjustment + */ + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0) { + // FIXME + } + + function javascript($code) { + // FIXME + } + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname) { + // FIXME + } + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height) { + // FIXME + } + + /** + * Add meta information to the PDF + * + * @param string $label label of the value (Creator, Producer, etc.) + * @param string $value the text to set + */ + function add_info($label, $value) { + $method = "Set$label"; + if ( in_array("Title", "Author", "Keywords", "Subject") && method_exists($this->_pdf, $method) ) { + $this->_pdf->$method($value); + } + } + + /** + * Calculates text size, in points + * + * @param string $text the text to be sized + * @param string $font the desired font + * @param float $size the desired font size + * @param float $spacing word spacing, if any + * @return float + */ + function get_text_width($text, $font, $size, $spacing = 0) { + // FIXME + } + + /** + * Calculates font height, in points + * + * @param string $font + * @param float $size + * @return float + */ + function get_font_height($font, $size) { + // FIXME + } + + + /** + * Starts a new page + * + * Subsequent drawing operations will appear on the new page. + */ + function new_page() { + // FIXME + } + + /** + * Streams the PDF directly to the browser + * + * @param string $filename the name of the PDF file + * @param array $options associative array, 'Attachment' => 0 or 1, 'compress' => 1 or 0 + */ + function stream($filename, $options = null) { + // FIXME + } + + /** + * Returns the PDF as a string + * + * @param array $options associative array: 'compress' => 1 or 0 + * @return string + */ + function output($options = null) { + // FIXME + } + +} + +// Workaround for idiotic limitation on statics... +PDFLib_Adapter::$PAPER_SIZES = CPDF_Adapter::$PAPER_SIZES; diff --git a/application/third_party/dompdf/include/text_frame_decorator.cls.php b/application/third_party/dompdf/include/text_frame_decorator.cls.php new file mode 100644 index 00000000..0bcb77f2 --- /dev/null +++ b/application/third_party/dompdf/include/text_frame_decorator.cls.php @@ -0,0 +1,204 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: text_frame_decorator.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */ + +/** + * Decorates Frame objects for text layout + * + * @access private + * @package dompdf + */ +class Text_Frame_Decorator extends Frame_Decorator { + + // protected members + protected $_text_spacing; + + // buggy DOMText::splitText (PHP < 5.2.7) + public static $_buggy_splittext; + + function __construct(Frame $frame, DOMPDF $dompdf) { + if ( $frame->get_node()->nodeName !== "#text" ) + throw new DOMPDF_Exception("Text_Decorator can only be applied to #text nodes."); + + parent::__construct($frame, $dompdf); + $this->_text_spacing = null; + } + + //........................................................................ + + function reset() { + parent::reset(); + $this->_text_spacing = null; + } + + //........................................................................ + + // Accessor methods + function get_text_spacing() { return $this->_text_spacing; } + + function get_text() { + // FIXME: this should be in a child class (and is incorrect) +// if ( $this->_frame->get_style()->content !== "normal" ) { +// $this->_frame->get_node()->data = $this->_frame->get_style()->content; +// $this->_frame->get_style()->content = "normal"; +// } + +// pre_r("---"); +// $style = $this->_frame->get_style(); +// var_dump($text = $this->_frame->get_node()->data); +// var_dump($asc = utf8_decode($text)); +// for ($i = 0; $i < strlen($asc); $i++) +// pre_r("$i: " . $asc[$i] . " - " . ord($asc[$i])); +// pre_r("width: " . Font_Metrics::get_text_width($text, $style->font_family, $style->font_size)); + + return $this->_frame->get_node()->data; + } + + //........................................................................ + + // Vertical margins & padding do not apply to text frames + + // http://www.w3.org/TR/CSS21/visudet.html#inline-non-replaced: + // + // The vertical padding, border and margin of an inline, non-replaced box + // start at the top and bottom of the content area, not the + // 'line-height'. But only the 'line-height' is used to calculate the + // height of the line box. + function get_margin_height() { + // This function is called in add_frame_to_line() and is used to + // determine the line height, so we actually want to return the + // 'line-height' property, not the actual margin box + $style = $this->get_style(); + $font = $style->font_family; + $size = $style->font_size; + + /* + pre_r('-----'); + pre_r($style->line_height); + pre_r($style->font_size); + pre_r(Font_Metrics::get_font_height($font, $size)); + pre_r(($style->line_height / $size) * Font_Metrics::get_font_height($font, $size)); + */ + + return ($style->line_height / $size) * Font_Metrics::get_font_height($font, $size); + + } + + function get_padding_box() { + $pb = $this->_frame->get_padding_box(); + $pb[3] = $pb["h"] = $this->_frame->get_style()->height; + return $pb; + } + //........................................................................ + + // Set method + function set_text_spacing($spacing) { + $style = $this->_frame->get_style(); + + $this->_text_spacing = $spacing; + $char_spacing = $style->length_in_pt($style->letter_spacing); + + // Re-adjust our width to account for the change in spacing + $style->width = Font_Metrics::get_text_width($this->get_text(), $style->font_family, $style->font_size, $spacing, $char_spacing); + } + + //........................................................................ + + // Recalculate the text width + function recalculate_width() { + $style = $this->get_style(); + $text = $this->get_text(); + $size = $style->font_size; + $font = $style->font_family; + $word_spacing = $style->length_in_pt($style->word_spacing); + $char_spacing = $style->length_in_pt($style->letter_spacing); + + return $style->width = Font_Metrics::get_text_width($text, $font, $size, $word_spacing, $char_spacing); + } + + //........................................................................ + + // Text manipulation methods + + // split the text in this frame at the offset specified. The remaining + // text is added a sibling frame following this one and is returned. + function split_text($offset) { + if ( $offset == 0 ) + return; + + if ( self::$_buggy_splittext ) { + // workaround to solve DOMText::spliText() bug parsing multibyte strings + $node = $this->_frame->get_node(); + $txt0 = $node->substringData(0, $offset); + $txt1 = $node->substringData($offset, mb_strlen($node->textContent)-1); + + $node->replaceData(0, mb_strlen($node->textContent), $txt0); + $split = $node->parentNode->appendChild(new DOMText($txt1)); + } + else { + $split = $this->_frame->get_node()->splitText($offset); + } + + $deco = $this->copy($split); + + $p = $this->get_parent(); + $p->insert_child_after($deco, $this, false); + + if ( $p instanceof Inline_Frame_Decorator ) + $p->split($deco); + + return $deco; + } + + //........................................................................ + + function delete_text($offset, $count) { + $this->_frame->get_node()->deleteData($offset, $count); + } + + //........................................................................ + + function set_text($text) { + $this->_frame->get_node()->data = $text; + } + +} + +Text_Frame_Decorator::$_buggy_splittext = version_compare(PHP_VERSION, '5.2.6', '<='); diff --git a/application/third_party/dompdf/include/text_frame_reflower.cls.php b/application/third_party/dompdf/include/text_frame_reflower.cls.php new file mode 100644 index 00000000..622fb86b --- /dev/null +++ b/application/third_party/dompdf/include/text_frame_reflower.cls.php @@ -0,0 +1,440 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: text_frame_reflower.cls.php 360 2011-02-15 19:33:52Z fabien.menager $ */ + +/** + * Reflows text frames. + * + * @access private + * @package dompdf + */ +class Text_Frame_Reflower extends Frame_Reflower { + + /** + * @var Block_Frame_Decorator + */ + protected $_block_parent; // Nearest block-level ancestor + + /** + * @var Text_Frame_Decorator + */ + protected $_frame; + + public static $_whitespace_pattern = "/[ \t\r\n\f]+/u"; + + function __construct(Text_Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + protected function _collapse_white_space($text) { + //$text = $this->_frame->get_text(); +// if ( $this->_block_parent->get_current_line("w") == 0 ) +// $text = ltrim($text, " \n\r\t"); + return preg_replace(self::$_whitespace_pattern, " ", $text); + } + + //........................................................................ + + protected function _line_break($text) { + $style = $this->_frame->get_style(); + $size = $style->font_size; + $font = $style->font_family; + $current_line = $this->_block_parent->get_current_line(); + + // Determine the available width + $line_width = $this->_frame->get_containing_block("w"); + $current_line_width = $current_line["left"] + $current_line["w"] + $current_line["right"]; + + $available_width = $line_width - $current_line_width; + + // split the text into words + $words = preg_split('/([\s-]+)/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE); + $wc = count($words); + + // Account for word-spacing + $word_spacing = $style->length_in_pt($style->word_spacing); + $char_spacing = $style->length_in_pt($style->letter_spacing); + + // Determine the frame width including margin, padding & border + $text_width = Font_Metrics::get_text_width($text, $font, $size, $word_spacing, $char_spacing); + $mbp_width = + $style->length_in_pt( array( $style->margin_left, + $style->border_left_width, + $style->padding_left, + $style->padding_right, + $style->border_right_width, + $style->margin_right), $line_width ); + + $frame_width = $text_width + $mbp_width; + +// Debugging: +// pre_r("Text: '" . htmlspecialchars($text). "'"); +// pre_r("width: " .$frame_width); +// pre_r("textwidth + delta: $text_width + $mbp_width"); +// pre_r("font-size: $size"); +// pre_r("cb[w]: " .$line_width); +// pre_r("available width: " . $available_width); +// pre_r("current line width: " . $current_line_width); + +// pre_r($words); + + if ( $frame_width <= $available_width ) + return false; + + // Determine the split point + $width = 0; + $str = ""; + reset($words); + + // @todo support , + for ($i = 0; $i < $wc; $i += 2) { + $word = $words[$i] . (isset($words[$i+1]) ? $words[$i+1] : ""); + $word_width = Font_Metrics::get_text_width($word, $font, $size, $word_spacing, $char_spacing); + if ( $width + $word_width + $mbp_width > $available_width ) + break; + + $width += $word_width; + $str .= $word; + + } + + // The first word has overflowed. Force it onto the line + if ( $current_line_width == 0 && $width == 0 ) { + $width += $word_width; + $str .= $word; + } + + $offset = mb_strlen($str); + +// More debugging: +// pre_var_dump($str); +// pre_r("Width: ". $width); +// pre_r("Offset: " . $offset); + + return $offset; + + } + + //........................................................................ + + protected function _newline_break($text) { + + if ( ($i = mb_strpos($text, "\n")) === false) + return false; + + return $i+1; + + } + + //........................................................................ + + protected function _layout_line() { + $style = $this->_frame->get_style(); + $text = $this->_frame->get_text(); + $size = $style->font_size; + $font = $style->font_family; + $word_spacing = $style->length_in_pt($style->word_spacing); + $char_spacing = $style->length_in_pt($style->letter_spacing); + + // Determine the text height + $style->height = Font_Metrics::get_font_height( $font, $size ); + + $split = false; + $add_line = false; + + // Handle text transform: + // http://www.w3.org/TR/CSS21/text.html#propdef-text-transform + switch (strtolower($style->text_transform)) { + default: break; + case "capitalize": $text = mb_convert_case($text, MB_CASE_TITLE); break; + case "uppercase": $text = mb_convert_case($text, MB_CASE_UPPER); break; + case "lowercase": $text = mb_convert_case($text, MB_CASE_LOWER); break; + } + + // Handle white-space property: + // http://www.w3.org/TR/CSS21/text.html#propdef-white-space + switch ($style->white_space) { + + default: + case "normal": + $this->_frame->set_text( $text = $this->_collapse_white_space($text) ); + if ( $text == "" ) + break; + + $split = $this->_line_break($text); + break; + + case "pre": + $split = $this->_newline_break($text); + $add_line = $split !== false; + break; + + case "nowrap": + $this->_frame->set_text( $text = $this->_collapse_white_space($text) ); + break; + + case "pre-wrap": + $split = $this->_newline_break($text); + + if ( ($tmp = $this->_line_break($text)) !== false ) { + $add_line = $split < $tmp; + $split = min($tmp, $split); + } else + $add_line = true; + + break; + + case "pre-line": + // Collapse white-space except for \n + $this->_frame->set_text( $text = preg_replace( "/[ \t]+/u", " ", $text ) ); + + if ( $text == "" ) + break; + + $split = $this->_newline_break($text); + + if ( ($tmp = $this->_line_break($text)) !== false ) { + $add_line = $split < $tmp; + $split = min($tmp, $split); + } else + $add_line = true; + + break; + + } + + // Handle degenerate case + if ( $text === "" ) + return; + + if ( $split !== false) { + + // Handle edge cases + if ( $split == 0 && $text === " " ) { + $this->_frame->set_text(""); + return; + } + + if ( $split == 0 ) { + + // Trim newlines from the beginning of the line + //$this->_frame->set_text(ltrim($text, "\n\r")); + + $this->_block_parent->add_line(); + $this->_frame->position(); + + // Layout the new line + $this->_layout_line(); + + } + + else if ( $split < mb_strlen($this->_frame->get_text()) ) { + // split the line if required + $this->_frame->split_text($split); + + $t = $this->_frame->get_text(); + + // Remove any trailing newlines + if ( $split > 1 && $t[$split-1] === "\n" ) + $this->_frame->set_text( mb_substr($t, 0, -1) ); + + // Do we need to trim spaces on wrapped lines? This might be desired, however, we + // can't trim the lines here or the layout will be affected if trimming the line + // leaves enough space to fit the next word in the text stream (because pdf layout + // is performed elsewhere). + /*if (!$this->_frame->get_prev_sibling() && !$this->_frame->get_next_sibling()) { + $t = $this->_frame->get_text(); + $this->_frame->set_text( trim($t) ); + }*/ + } + + if ( $add_line ) { + $this->_block_parent->add_line(); + $this->_frame->position(); + } + + } else { + + // Remove empty space from start and end of line, but only where there isn't an inline sibling + // and the parent node isn't an inline element with siblings + // FIXME: Include non-breaking spaces? + $t = $this->_frame->get_text(); + $parent = $this->_frame->get_parent(); + $is_inline_frame = get_class($parent) === 'Inline_Frame_Decorator'; + + if ((!$is_inline_frame && !$this->_frame->get_next_sibling()) || + ( $is_inline_frame && !$parent->get_next_sibling())) { + $t = rtrim($t); + } + + if ((!$is_inline_frame && !$this->_frame->get_prev_sibling()) || + ( $is_inline_frame && !$parent->get_prev_sibling())) { + $t = ltrim($t); + } + + $this->_frame->set_text( $t ); + + } + + // Set our new width + $width = $this->_frame->recalculate_width(); + } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + + $page = $this->_frame->get_root(); + $page->check_forced_page_break($this->_frame); + + if ( $page->is_full() ) + return; + + $this->_block_parent = $this->_frame->find_block_parent(); + + // Left trim the text if this is the first text on the line and we're + // collapsing white space +// if ( $this->_block_parent->get_current_line("w") == 0 && +// ($this->_frame->get_style()->white_space !== "pre" || +// $this->_frame->get_style()->white_space !== "pre-wrap") ) { +// $this->_frame->set_text( ltrim( $this->_frame->get_text() ) ); +// } + + $this->_frame->position(); + + $this->_layout_line(); + + if ( $block ) { + $block->add_frame_to_line($this->_frame); + } + } + + //........................................................................ + + // Returns an array(0 => min, 1 => max, "min" => min, "max" => max) of the + // minimum and maximum widths of this frame + function get_min_max_width() { + + $style = $this->_frame->get_style(); + $this->_block_parent = $this->_frame->find_block_parent(); + $line_width = $this->_frame->get_containing_block("w"); + + $str = $text = $this->_frame->get_text(); + $size = $style->font_size; + $font = $style->font_family; + + $word_spacing = $style->length_in_pt($style->word_spacing); + $char_spacing = $style->length_in_pt($style->letter_spacing); + + switch($style->white_space) { + + default: + case "normal": + $str = preg_replace(self::$_whitespace_pattern," ", $str); + case "pre-wrap": + case "pre-line": + + // Find the longest word (i.e. minimum length) + + // This technique (using arrays & an anonymous function) is actually + // faster than doing a single-pass character by character scan. Heh, + // yes I took the time to bench it ;) + $words = array_flip(preg_split("/[\s-]+/u",$str, -1, PREG_SPLIT_DELIM_CAPTURE)); + array_walk($words, create_function('&$val,$str', + '$val = Font_Metrics::get_text_width($str, "'.addslashes($font).'", '.$size.', '.$word_spacing.', '.$char_spacing.');')); + arsort($words); + $min = reset($words); + break; + + case "pre": + $lines = array_flip(preg_split("/\n/u", $str)); + array_walk($lines, create_function('&$val,$str', + '$val = Font_Metrics::get_text_width($str, "'.addslashes($font).'", '.$size.', '.$word_spacing.', '.$char_spacing.');')); + + arsort($lines); + $min = reset($lines); + break; + + case "nowrap": + $min = Font_Metrics::get_text_width($this->_collapse_white_space($str), $font, $size, $word_spacing, $char_spacing); + break; + + } + + switch ($style->white_space) { + + default: + case "normal": + case "nowrap": + $str = preg_replace(self::$_whitespace_pattern," ", $text); + break; + + case "pre-line": + //XXX: Is this correct? + $str = preg_replace( "/[ \t]+/u", " ", $text); + + case "pre-wrap": + // Find the longest word (i.e. minimum length) + $lines = array_flip(preg_split("/\n/", $text)); + array_walk($lines, create_function('&$val,$str', + '$val = Font_Metrics::get_text_width($str, "'.$font.'", '.$size.', '.$word_spacing.', '.$char_spacing.');')); + arsort($lines); + reset($lines); + $str = key($lines); + break; + + } + + $max = Font_Metrics::get_text_width($str, $font, $size, $word_spacing, $char_spacing); + + $delta = $style->length_in_pt(array($style->margin_left, + $style->border_left_width, + $style->padding_left, + $style->padding_right, + $style->border_right_width, + $style->margin_right), $line_width); + $min += $delta; + $max += $delta; + + return array($min, $max, "min" => $min, "max" => $max); + + } + +} diff --git a/application/third_party/dompdf/include/text_renderer.cls.php b/application/third_party/dompdf/include/text_renderer.cls.php new file mode 100644 index 00000000..56ba38f1 --- /dev/null +++ b/application/third_party/dompdf/include/text_renderer.cls.php @@ -0,0 +1,182 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + + * + * Changes + * @contributor Helmut Tischer + * @version dompdf_trunk_with_helmut_mods.20090528 + * - fix text decoration positions according to font metrics + * @version 20090610 + * - better accuracy on using different renderer as cpdf, added comments + */ + +/* $Id: text_renderer.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ +/** + * Renders text frames + * + * @access private + * @package dompdf + */ +class Text_Renderer extends Abstract_Renderer { + + const DECO_THICKNESS = 0.02; // Thickness of underline. Screen: 0.08, print: better less, e.g. 0.04 + + //Tweaking if $base and $descent are not accurate. + //Check method_exists( $this->_canvas, "get_cpdf" ) + //- For cpdf these can and must stay 0, because font metrics are used directly. + //- For other renderers, if different values are wanted, separate the parameter sets. + // But $size and $size-$height seem to be accurate enough + const UNDERLINE_OFFSET = 0.0; // Relative to bottom of text, as fraction of height. + const OVERLINE_OFFSET = 0.0; // Relative to top of text + const LINETHROUGH_OFFSET = 0.0; // Relative to centre of text. + const DECO_EXTENSION = 0.0; // How far to extend lines past either end, in pt + + //........................................................................ + + function render(Frame $frame) { + $text = $frame->get_text(); + if ( trim($text) === "" ) + return; + + $style = $frame->get_style(); + list($x, $y) = $frame->get_position(); + $cb = $frame->get_containing_block(); + + if ( ($ml = $style->margin_left) === "auto" || $ml === "none" ) + $ml = 0; + + if ( ($pl = $style->padding_left) === "auto" || $pl === "none" ) + $pl = 0; + + if ( ($bl = $style->border_left_width) === "auto" || $bl === "none" ) + $bl = 0; + + $x += $style->length_in_pt( array($ml, $pl, $bl), $cb["w"] ); + + $font = $style->font_family; + $size = $frame_font_size = $style->font_size; + $height = $style->height; + $word_spacing = $frame->get_text_spacing() + $style->length_in_pt($style->word_spacing); + $char_spacing = $style->length_in_pt($style->letter_spacing); + $width = $style->width; + + /*$text = str_replace( + array("{PAGE_NUM}"), + array($this->_canvas->get_page_number()), + $text + );*/ + + $this->_canvas->text($x, $y, $text, + $font, $size, + $style->color, $word_spacing, $char_spacing); + + $line = $frame->get_containing_line(); + + // FIXME Instead of using the tallest frame to position, + // the decoration, the text should be well placed + if ( false && $line["tallest_frame"] ) { + $base_frame = $line["tallest_frame"]; + $style = $base_frame->get_style(); + $size = $style->font_size; + $height = $line["h"] * ($size / $style->line_height); + } + + if ( method_exists( $this->_canvas, "get_cpdf" ) ) { + $cpdf = $this->_canvas->get_cpdf(); + $fontBBox = $cpdf->fonts[$style->font_family]['FontBBox']; + $base = (($fontBBox[3]*$size)/1000) * 0.90; + $descent = ($fontBBox[1]*$size)/1000; + //print '
Text_Renderer cpdf:'.$base.' '.$descent.' '.$size.'
'; + } else { + //Descent is font part below baseline, typically negative. $height is about full height of font box. + //$descent = -$size/6; is less accurate, depends on font family. + // @todo Could we get font info for PDFlib adapter and others ? + $base = $size*1.08; + $descent = $size-$height; + //print '
Text_Renderer other than cpdf:'.$base.' '.$descent.' '.$size.'
'; + } + + // Handle text decoration: + // http://www.w3.org/TR/CSS21/text.html#propdef-text-decoration + + // Draw all applicable text-decorations. Start with the root and work our way down. + $p = $frame; + $stack = array(); + while ( $p = $p->get_parent() ) + $stack[] = $p; + + while ( count($stack) > 0 ) { + $f = array_pop($stack); + + if ( ($text_deco = $f->get_style()->text_decoration) === "none" ) + continue; + + $deco_y = $y; //$line["y"]; + $color = $f->get_style()->color; + + switch ($text_deco) { + + default: + continue; + + case "underline": + $deco_y += $base - $descent + $size * (self::UNDERLINE_OFFSET - self::DECO_THICKNESS/2); + break; + + case "overline": + $deco_y += $size * (self::OVERLINE_OFFSET + self::DECO_THICKNESS/2); + break; + + case "line-through": + $deco_y += $base * 0.7 + $size * self::LINETHROUGH_OFFSET; + break; + } + + $dx = 0; + $x1 = $x - self::DECO_EXTENSION; + $x2 = $x + $width + $dx + self::DECO_EXTENSION; + $this->_canvas->line($x1, $deco_y, $x2, $deco_y, $color, $size * self::DECO_THICKNESS); + + } + + if (DEBUG_LAYOUT && DEBUG_LAYOUT_LINES) { + $text_width = Font_Metrics::get_text_width($text, $font, $frame_font_size); + $this->_debug_layout(array($x, $y, $text_width+($line["wc"]-1)*$word_spacing, $frame_font_size), "orange", array(0.5, 0.5)); + } + } +} diff --git a/application/third_party/dompdf/include/ttf_info.cls.php b/application/third_party/dompdf/include/ttf_info.cls.php new file mode 100644 index 00000000..8fdeb3bc --- /dev/null +++ b/application/third_party/dompdf/include/ttf_info.cls.php @@ -0,0 +1,306 @@ +_dirRestriction && preg_match('[\.\/|\.\.\/]', $data)) + { + $this->exitClass('Error: Directory restriction is enforced!'); + } + + $this->filename = $data; + return $this; + } // public function setFontFile + + /** + * function setFontsDir() + * set the Font Directory + * @public + * @param string $data the new value + * @return object referrence to this + */ + public function setFontsDir($data) + { + if ($this->_dirRestriction && preg_match('[\.\/|\.\.\/]', $data)) + { + $this->exitClass('Error: Directory restriction is enforced!'); + } + + $this->fontsdir = $data; + return $this; + } // public function setFontsDir + + /** + * function readFontsDir() + * @public + * @return information contained in the TTF 'name' table of all fonts in a directory. + */ + public function readFontsDir() + { + if (empty($this->fontsdir)) { $this->exitClass('Error: Fonts Directory has not been set with setFontsDir().'); } + if (empty($this->backupDir)){ $this->backupDir = $this->fontsdir; } + + //$this->array = array(); + $d = dir($this->fontsdir); + + while (false !== ($e = $d->read())) + { + if($e != '.' && $e != '..') + { + $e = $this->fontsdir . $e; + if($this->_recursive && is_dir($e)) + { + $this->setFontsDir($e); + $this->readFontsDir(); + } + else if ($this->is_ttf($e) === true) + { + $this->setFontFile($e); + $this->array[] = $this->getFontInfo(); + } + } + } + + if (!empty($this->backupDir)){ $this->fontsdir = $this->backupDir; } + + $d->close(); + return $this; + } // public function readFontsDir + + /** + * function setProtectedVar() + * @public + * @param string $var the new variable + * @param string $data the new value + * @return object reference to this + + * DISABLED, NO REAL USE YET + + public function setProtectedVar($var, $data) + { + if ($var == 'filename') + { + $this->setFontFile($data); + } else { + //if (isset($var) && !empty($data)) + $this->$var = $data; + } + return $this; + } + */ + /** + * function getFontInfo() + * @public + * @return information contained in the TTF 'name' table. + */ + public function getFontInfo() + { + $fd = fopen ($this->filename, "r"); + $this->text = fread ($fd, filesize($this->filename)); + fclose ($fd); + + $number_of_tables = hexdec($this->dec2ord($this->text[4]).$this->dec2ord($this->text[5])); + + for ($i=0;$i<$number_of_tables;$i++) + { + $tag = $this->text[12+$i*16].$this->text[12+$i*16+1].$this->text[12+$i*16+2].$this->text[12+$i*16+3]; + + if ($tag == 'name') + { + $this->ntOffset = hexdec( + $this->dec2ord($this->text[12+$i*16+8]).$this->dec2ord($this->text[12+$i*16+8+1]). + $this->dec2ord($this->text[12+$i*16+8+2]).$this->dec2ord($this->text[12+$i*16+8+3])); + + $offset_storage_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+4]).$this->dec2ord($this->text[$this->ntOffset+5])); + $number_name_records_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+2]).$this->dec2ord($this->text[$this->ntOffset+3])); + } + } + + $storage_dec = $offset_storage_dec + $this->ntOffset; + $storage_hex = strtoupper(dechex($storage_dec)); + + for ($j=0;$j<$number_name_records_dec;$j++) + { + $platform_id_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+6+$j*12+0]).$this->dec2ord($this->text[$this->ntOffset+6+$j*12+1])); + $name_id_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+6+$j*12+6]).$this->dec2ord($this->text[$this->ntOffset+6+$j*12+7])); + $string_length_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+6+$j*12+8]).$this->dec2ord($this->text[$this->ntOffset+6+$j*12+9])); + $string_offset_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+6+$j*12+10]).$this->dec2ord($this->text[$this->ntOffset+6+$j*12+11])); + + if (!empty($name_id_dec) and empty($font_tags[$name_id_dec])) + { + for($l=0;$l<$string_length_dec;$l++) + { + if (ord($this->text[$storage_dec+$string_offset_dec+$l]) == '0') { continue; } + else { $font_tags[$name_id_dec] .= ($this->text[$storage_dec+$string_offset_dec+$l]); } + } + } + } + return $font_tags; + } // public function getFontInfo + + /** + * function getCopyright() + * @public + * @return 'Copyright notice' contained in the TTF 'name' table at index 0 + */ + public function getCopyright() + { + $this->info = $this->getFontInfo(); + return $this->info[0]; + } // public function getCopyright + + /** + * function getFontFamily() + * @public + * @return 'Font Family name' contained in the TTF 'name' table at index 1 + */ + public function getFontFamily() + { + $this->info = $this->getFontInfo(); + return $this->info[1]; + } // public function getFontFamily + + /** + * function getFontSubFamily() + * @public + * @return 'Font Subfamily name' contained in the TTF 'name' table at index 2 + */ + public function getFontSubFamily() + { + $this->info = $this->getFontInfo(); + return $this->info[2]; + } // public function getFontSubFamily + + /** + * function getFontId() + * @public + * @return 'Unique font identifier' contained in the TTF 'name' table at index 3 + */ + public function getFontId() + { + $this->info = $this->getFontInfo(); + return $this->info[3]; + } // public function getFontId + + /** + * function getFullFontName() + * @public + * @return 'Full font name' contained in the TTF 'name' table at index 4 + */ + public function getFullFontName() + { + $this->info = $this->getFontInfo(); + return $this->info[4]; + } // public function getFullFontName + + /** + * function dec2ord() + * Used to lessen redundant calls to multiple functions. + * @protected + * @return object + */ + protected function dec2ord($dec) + { + return $this->dec2hex(ord($dec)); + } // protected function dec2ord + + /** + * function dec2hex() + * private function to perform Hexadecimal to decimal with proper padding. + * @protected + * @return object + */ + protected function dec2hex($dec) + { + return str_repeat('0', 2-strlen(($hex=strtoupper(dechex($dec))))) . $hex; + } // protected function dec2hex + + /** + * function dec2hex() + * private function to perform Hexadecimal to decimal with proper padding. + * @protected + * @return object + */ + protected function exitClass($message) + { + echo $message; + exit; + } // protected function dec2hex + + /** + * function dec2hex() + * private helper function to test in the file in question is a ttf. + * @protected + * @return object + */ + protected function is_ttf($file) + { + $ext = explode('.', $file); + $ext = $ext[count($ext)-1]; + return preg_match("/ttf$/i",$ext) ? true : false; + } // protected function is_ttf +} // class ttfInfo + +function getFontInfo($resource) +{ + $ttfInfo = new TTF_Info; + $ttfInfo->setFontFile($resource); + return $ttfInfo->getFontInfo(); +} +?> \ No newline at end of file diff --git a/application/third_party/dompdf/index.php b/application/third_party/dompdf/index.php new file mode 100644 index 00000000..7ed173a8 --- /dev/null +++ b/application/third_party/dompdf/index.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/application/third_party/dompdf/lib/class.pdf.php b/application/third_party/dompdf/lib/class.pdf.php new file mode 100644 index 00000000..3478e05d --- /dev/null +++ b/application/third_party/dompdf/lib/class.pdf.php @@ -0,0 +1,4897 @@ + + * @contributor Orion Richardson + * @contributor Helmut Tischer + * @contributor Ryan H. Masten + * @version 009 + * @package Cpdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - On multiple identical png and jpg images, put only one copy into the pdf file and refer to it. + * This reduces file size and rendering time. + * - Allow font metrics cache to be a different folder as the font metrics. This allows a read only installation. + * - Allow adding images directly from a gd object. This increases performance by avoiding temporary files. + * - On png image files remove alpa channel to allow display of typical png files in pdf. + * - On addImage avoid temporary file. Todo: Duplicate Image (currently not used) + * - Add a check function, whether image is already cached, This avoids double creation by caller which saves + * CPU time and memory. + * @contributor Helmut Tischer + * @version dompdf_trunk_with_helmut_mods.20090524 + * - Allow temp and fontcache folders to be passed in by class creator + * @version dompdf_trunk_with_helmut_mods.20090528 + * - typo 'decent' instead of 'descent' at various locations made getFontDescender worthless + */ + +/* $Id: class.pdf.php 360 2011-02-15 19:33:52Z fabien.menager $ */ + +class Cpdf { + + + /** + * the current number of pdf objects in the document + */ + public $numObj = 0; + + /** + * this array contains all of the pdf objects, ready for final assembly + */ + public $objects = array(); + + /** + * the objectId (number within the objects array) of the document catalog + */ + public $catalogId; + + /** + * array carrying information about the fonts that the system currently knows about + * used to ensure that a font is not loaded twice, among other things + */ + public $fonts = array(); + + /** + * the default font metrics file to use if no other font has been loaded + * the path to the directory containing the font metrics should be included + */ + public $defaultFont = './fonts/Helvetica.afm'; + + /** + * a record of the current font + */ + public $currentFont = ''; + + /** + * the current base font + */ + public $currentBaseFont = ''; + + /** + * the number of the current font within the font array + */ + public $currentFontNum = 0; + + /** + * + */ + public $currentNode; + + /** + * object number of the current page + */ + public $currentPage; + + /** + * object number of the currently active contents block + */ + public $currentContents; + + /** + * number of fonts within the system + */ + public $numFonts = 0; + + /** + * Number of graphic state resources used + */ + private $numStates = 0; + + /** + * current colour for fill operations, defaults to inactive value, all three components should be between 0 and 1 inclusive when active + */ + public $currentColour = null; + + /** + * current colour for stroke operations (lines etc.) + */ + public $currentStrokeColour = null; + + /** + * current style that lines are drawn in + */ + public $currentLineStyle = ''; + + /** + * current line transparency (partial graphics state) + */ + public $currentLineTransparency = array("mode" => "Normal", "opacity" => 1.0); + + /** + * current fill transparency (partial graphics state) + */ + public $currentFillTransparency = array("mode" => "Normal", "opacity" => 1.0); + + /** + * an array which is used to save the state of the document, mainly the colours and styles + * it is used to temporarily change to another state, the change back to what it was before + */ + public $stateStack = array(); + + /** + * number of elements within the state stack + */ + public $nStateStack = 0; + + /** + * number of page objects within the document + */ + public $numPages = 0; + + /** + * object Id storage stack + */ + public $stack = array(); + + /** + * number of elements within the object Id storage stack + */ + public $nStack = 0; + + /** + * an array which contains information about the objects which are not firmly attached to pages + * these have been added with the addObject function + */ + public $looseObjects = array(); + + /** + * array contains infomation about how the loose objects are to be added to the document + */ + public $addLooseObjects = array(); + + /** + * the objectId of the information object for the document + * this contains authorship, title etc. + */ + public $infoObject = 0; + + /** + * number of images being tracked within the document + */ + public $numImages = 0; + + /** + * an array containing options about the document + * it defaults to turning on the compression of the objects + */ + public $options = array('compression'=>true); + + /** + * the objectId of the first page of the document + */ + public $firstPageId; + + /** + * used to track the last used value of the inter-word spacing, this is so that it is known + * when the spacing is changed. + */ + public $wordSpaceAdjust = 0; + + /** + * used to track the last used value of the inter-letter spacing, this is so that it is known + * when the spacing is changed. + */ + public $charSpaceAdjust = 0; + + /** + * the object Id of the procset object + */ + public $procsetObjectId; + + /** + * store the information about the relationship between font families + * this used so that the code knows which font is the bold version of another font, etc. + * the value of this array is initialised in the constuctor function. + */ + public $fontFamilies = array(); + + /** + * folder for php serialized formats of font metrics files. + * If empty string, use same folder as original metrics files. + * This can be passed in from class creator. + * If this folder does not exist or is not writable, Cpdf will be **much** slower. + * Because of potential trouble with php safe mode, folder cannot be created at runtime. + */ + public $fontcache = ''; + + /** + * The version of the font metrics cache file. + * This value must be manually incremented whenever the internal font data structure is modified. + */ + public $fontcacheVersion = 4; + + /** + * temporary folder. + * If empty string, will attempty system tmp folder. + * This can be passed in from class creator. + * Only used for conversion of gd images to jpeg images. + */ + public $tmp = ''; + + /** + * track if the current font is bolded or italicised + */ + public $currentTextState = ''; + + /** + * messages are stored here during processing, these can be selected afterwards to give some useful debug information + */ + public $messages = ''; + + /** + * the ancryption array for the document encryption is stored here + */ + public $arc4 = ''; + + /** + * the object Id of the encryption information + */ + public $arc4_objnum = 0; + + /** + * the file identifier, used to uniquely identify a pdf document + */ + public $fileIdentifier = ''; + + /** + * a flag to say if a document is to be encrypted or not + */ + public $encrypted = 0; + + /** + * the ancryption key for the encryption of all the document content (structure is not encrypted) + */ + public $encryptionKey = ''; + + /** + * array which forms a stack to keep track of nested callback functions + */ + public $callback = array(); + + /** + * the number of callback functions in the callback array + */ + public $nCallback = 0; + + /** + * store label->id pairs for named destinations, these will be used to replace internal links + * done this way so that destinations can be defined after the location that links to them + */ + public $destinations = array(); + + /** + * store the stack for the transaction commands, each item in here is a record of the values of all the + * publiciables within the class, so that the user can rollback at will (from each 'start' command) + * note that this includes the objects array, so these can be large. + */ + public $checkpoint = ''; + + /* Table of Image origin filenames and image labels which were already added with o_image(). + * Allows to merge identical images + */ + public $imagelist = array(); + + /** + * whether the text passed in should be treated as Unicode or just local character set. + */ + public $isUnicode = false; + + /** + * @var string the JavaScript code of the document + */ + public $javascript = ''; + + /** + * @var boolean whether the compression is possible + */ + protected $compressionReady = false; + + /** + * @var array current page size + */ + protected $currentPageSize = array("width" => 0, "height" => 0); + + /** + * @var string the target internal encoding + */ + static protected $targetEncoding = 'iso-8859-1'; + + /** + * class constructor + * this will start a new document + * @var array array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero. + * @var boolean whether text will be treated as Unicode or not. + */ + function __construct ($pageSize = array(0, 0, 612, 792), $isUnicode = false, $fontcache = '', $tmp = '') { + $this->isUnicode = $isUnicode; + $this->fontcache = $fontcache; + $this->tmp = $tmp; + $this->newDocument($pageSize); + + $this->compressionReady = function_exists('gzcompress'); + + if ( in_array('Windows-1252', mb_list_encodings()) ) { + self::$targetEncoding = 'Windows-1252'; + } + + // also initialize the font families that are known about already + $this->setFontFamily('init'); + // $this->fileIdentifier = md5('xxxxxxxx'.time()); + } + + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + + /** + * Document object methods (internal use only) + * + * There is about one object method for each type of object in the pdf document + * Each function has the same call list ($id,$action,$options). + * $id = the object ID of the object, or what it is to be if it is being created + * $action = a string specifying the action to be performed, though ALL must support: + * 'new' - create the object with the id $id + * 'out' - produce the output for the pdf object + * $options = optional, a string or array containing the various parameters for the object + * + * These, in conjunction with the output function are the ONLY way for output to be produced + * within the pdf 'file'. + */ + + /** + *destination object, used to specify the location for the user to jump to, presently on opening + */ + protected function o_destination($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'destination', 'info'=>array()); + $tmp = ''; + switch ($options['type']) { + case 'XYZ': + case 'FitR': + $tmp = ' '.$options['p3'].$tmp; + case 'FitH': + case 'FitV': + case 'FitBH': + case 'FitBV': + $tmp = ' '.$options['p1'].' '.$options['p2'].$tmp; + case 'Fit': + case 'FitB': + $tmp = $options['type'].$tmp; + $this->objects[$id]['info']['string'] = $tmp; + $this->objects[$id]['info']['page'] = $options['page']; + } + break; + + case 'out': + $tmp = $o['info']; + $res = "\n$id 0 obj\n".'['.$tmp['page'].' 0 R /'.$tmp['string']."]\nendobj"; + return $res; + } + } + + + /** + * set the viewer preferences + */ + protected function o_viewerPreferences($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'viewerPreferences', 'info'=>array()); + break; + + case 'add': + foreach($options as $k=>$v) { + switch ($k) { + case 'HideToolbar': + case 'HideMenubar': + case 'HideWindowUI': + case 'FitWindow': + case 'CenterWindow': + case 'NonFullScreenPageMode': + case 'Direction': + $o['info'][$k] = $v; + break; + } + } + break; + + case 'out': + $res = "\n$id 0 obj\n<< "; + foreach($o['info'] as $k=>$v) { + $res.= "\n/$k $v"; + } + $res.= "\n>>\n"; + return $res; + } + } + + + /** + * define the document catalog, the overall controller for the document + */ + protected function o_catalog($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'catalog', 'info'=>array()); + $this->catalogId = $id; + break; + + case 'outlines': + case 'pages': + case 'openHere': + case 'javascript': + $o['info'][$action] = $options; + break; + + case 'viewerPreferences': + if (!isset($o['info']['viewerPreferences'])) { + $this->numObj++; + $this->o_viewerPreferences($this->numObj, 'new'); + $o['info']['viewerPreferences'] = $this->numObj; + } + + $vp = $o['info']['viewerPreferences']; + $this->o_viewerPreferences($vp, 'add', $options); + + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Catalog"; + + foreach($o['info'] as $k=>$v) { + switch ($k) { + case 'outlines': + $res.= "\n/Outlines $v 0 R"; + break; + + case 'pages': + $res.= "\n/Pages $v 0 R"; + break; + + case 'viewerPreferences': + $res.= "\n/ViewerPreferences $v 0 R"; + break; + + case 'openHere': + $res.= "\n/OpenAction $v 0 R"; + break; + + case 'javascript': + $res.= "\n/Names <>"; + break; + } + } + + $res.= " >>\nendobj"; + return $res; + } + } + + + /** + * object which is a parent to the pages in the document + */ + protected function o_pages($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'pages', 'info'=>array()); + $this->o_catalog($this->catalogId, 'pages', $id); + break; + + case 'page': + if (!is_array($options)) { + // then it will just be the id of the new page + $o['info']['pages'][] = $options; + } else { + // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative + // and pos is either 'before' or 'after', saying where this page will fit. + if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) { + $i = array_search($options['rid'], $o['info']['pages']); + if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) { + + // then there is a match + // make a space + switch ($options['pos']) { + case 'before': + $k = $i; + break; + + case 'after': + $k = $i+1; + break; + + default: + $k = -1; + break; + } + + if ($k >= 0) { + for ($j = count($o['info']['pages']) -1;$j >= $k;$j--) { + $o['info']['pages'][$j+1] = $o['info']['pages'][$j]; + } + + $o['info']['pages'][$k] = $options['id']; + } + } + } + } + break; + + case 'procset': + $o['info']['procset'] = $options; + break; + + case 'mediaBox': + $o['info']['mediaBox'] = $options; + // which should be an array of 4 numbers + $this->currentPageSize = array('width' => $options[2], 'height' => $options[3]); + break; + + case 'font': + $o['info']['fonts'][] = array('objNum'=>$options['objNum'], 'fontNum'=>$options['fontNum']); + break; + + case 'extGState': + $o['info']['extGStates'][] = array('objNum' => $options['objNum'], 'stateNum' => $options['stateNum']); + break; + + case 'xObject': + $o['info']['xObjects'][] = array('objNum'=>$options['objNum'], 'label'=>$options['label']); + break; + + case 'out': + if (count($o['info']['pages'])) { + $res = "\n$id 0 obj\n<< /Type /Pages\n/Kids ["; + foreach($o['info']['pages'] as $v) { + $res.= "$v 0 R\n"; + } + + $res.= "]\n/Count ".count($this->objects[$id]['info']['pages']); + + if ( (isset($o['info']['fonts']) && count($o['info']['fonts'])) || + isset($o['info']['procset']) || + (isset($o['info']['extGStates']) && count($o['info']['extGStates']))) { + $res.= "\n/Resources <<"; + + if (isset($o['info']['procset'])) { + $res.= "\n/ProcSet ".$o['info']['procset']." 0 R"; + } + + if (isset($o['info']['fonts']) && count($o['info']['fonts'])) { + $res.= "\n/Font << "; + foreach($o['info']['fonts'] as $finfo) { + $res.= "\n/F".$finfo['fontNum']." ".$finfo['objNum']." 0 R"; + } + $res.= "\n>>"; + } + + if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) { + $res.= "\n/XObject << "; + foreach($o['info']['xObjects'] as $finfo) { + $res.= "\n/".$finfo['label']." ".$finfo['objNum']." 0 R"; + } + $res.= "\n>>"; + } + + if ( isset($o['info']['extGStates']) && count($o['info']['extGStates'])) { + $res.= "\n/ExtGState << "; + foreach ($o['info']['extGStates'] as $gstate) { + $res.= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R"; + } + $res.= "\n>>"; + } + + $res.= "\n>>"; + if (isset($o['info']['mediaBox'])) { + $tmp = $o['info']['mediaBox']; + $res.= "\n/MediaBox [".sprintf('%.3F %.3F %.3F %.3F', $tmp[0], $tmp[1], $tmp[2], $tmp[3]) .']'; + } + } + + $res.= "\n >>\nendobj"; + } else { + $res = "\n$id 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj"; + } + + return $res; + } + } + + + /** + * define the outlines in the doc, empty for now + */ + protected function o_outlines($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'outlines', 'info'=>array('outlines'=>array())); + $this->o_catalog($this->catalogId, 'outlines', $id); + break; + + case 'outline': + $o['info']['outlines'][] = $options; + break; + + case 'out': + if (count($o['info']['outlines'])) { + $res = "\n$id 0 obj\n<< /Type /Outlines /Kids ["; + foreach($o['info']['outlines'] as $v) { + $res.= "$v 0 R "; + } + + $res.= "] /Count ".count($o['info']['outlines']) ." >>\nendobj"; + } else { + $res = "\n$id 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj"; + } + + return $res; + } + } + + + /** + * an object to hold the font description + */ + protected function o_font($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t' => 'font', 'info' => array('name' => $options['name'], 'fontFileName' => $options['fontFileName'], 'SubType' => 'Type1')); + $fontNum = $this->numFonts; + $this->objects[$id]['info']['fontNum'] = $fontNum; + + // deal with the encoding and the differences + if (isset($options['differences'])) { + // then we'll need an encoding dictionary + $this->numObj++; + $this->o_fontEncoding($this->numObj, 'new', $options); + $this->objects[$id]['info']['encodingDictionary'] = $this->numObj; + } else if (isset($options['encoding'])) { + // we can specify encoding here + switch ($options['encoding']) { + case 'WinAnsiEncoding': + case 'MacRomanEncoding': + case 'MacExpertEncoding': + $this->objects[$id]['info']['encoding'] = $options['encoding']; + break; + + case 'none': + break; + + default: + $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; + break; + } + } else { + $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; + } + + if ($this->fonts[$options['fontFileName']]['isUnicode']) { + // For Unicode fonts, we need to incorporate font data into + // sub-sections that are linked from the primary font section. + // Look at o_fontGIDtoCID and o_fontDescendentCID functions + // for more informaiton. + // + // All of this code is adapted from the excellent changes made to + // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) + + $toUnicodeId = ++$this->numObj; + $this->o_contents($toUnicodeId, 'new', 'raw'); + $this->objects[$id]['info']['toUnicode'] = $toUnicodeId; + + $stream = <<> def +/CMapName /Adobe-Identity-UCS def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +1 beginbfrange +<0000> <0000> +endbfrange +endcmap +CMapName currentdict /CMap defineresource pop +end +end +EOT; + + $res = "<>\n"; + $res .= "stream\n" . $stream . "endstream"; + + $this->objects[$toUnicodeId]['c'] = $res; + + $cidFontId = ++$this->numObj; + $this->o_fontDescendentCID($cidFontId, 'new', $options); + $this->objects[$id]['info']['cidFont'] = $cidFontId; + } + + // also tell the pages node about the new font + $this->o_pages($this->currentNode, 'font', array('fontNum' => $fontNum, 'objNum' => $id)); + break; + + case 'add': + foreach ($options as $k => $v) { + switch ($k) { + case 'BaseFont': + $o['info']['name'] = $v; + break; + case 'FirstChar': + case 'LastChar': + case 'Widths': + case 'FontDescriptor': + case 'SubType': + $this->addMessage('o_font '.$k." : ".$v); + $o['info'][$k] = $v; + break; + } + } + + // pass values down to descendent font + if (isset($o['info']['cidFont'])) { + $this->o_fontDescendentCID($o['info']['cidFont'], 'add', $options); + } + break; + + case 'out': + if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) { + // For Unicode fonts, we need to incorporate font data into + // sub-sections that are linked from the primary font section. + // Look at o_fontGIDtoCID and o_fontDescendentCID functions + // for more informaiton. + // + // All of this code is adapted from the excellent changes made to + // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) + + $res = "\n$id 0 obj\n<objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'fontDescriptor', 'info'=>$options); + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /FontDescriptor\n"; + foreach ($o['info'] as $label => $value) { + switch ($label) { + case 'Ascent': + case 'CapHeight': + case 'Descent': + case 'Flags': + case 'ItalicAngle': + case 'StemV': + case 'AvgWidth': + case 'Leading': + case 'MaxWidth': + case 'MissingWidth': + case 'StemH': + case 'XHeight': + case 'CharSet': + if (mb_strlen($value, '8bit')) { + $res.= "/$label $value\n"; + } + + break; + case 'FontFile': + case 'FontFile2': + case 'FontFile3': + $res.= "/$label $value 0 R\n"; + break; + + case 'FontBBox': + $res.= "/$label [$value[0] $value[1] $value[2] $value[3]]\n"; + break; + + case 'FontName': + $res.= "/$label /$value\n"; + break; + } + } + + $res.= ">>\nendobj"; + + return $res; + } + } + + + /** + * the font encoding + */ + protected function o_fontEncoding($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + // the options array should contain 'differences' and maybe 'encoding' + $this->objects[$id] = array('t'=>'fontEncoding', 'info'=>$options); + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Encoding\n"; + if (!isset($o['info']['encoding'])) { + $o['info']['encoding'] = 'WinAnsiEncoding'; + } + + if ($o['info']['encoding'] !== 'none') { + $res.= "/BaseEncoding /".$o['info']['encoding']."\n"; + } + + $res.= "/Differences \n["; + + $onum = -100; + + foreach($o['info']['differences'] as $num=>$label) { + if ($num != $onum+1) { + // we cannot make use of consecutive numbering + $res.= "\n$num /$label"; + } else { + $res.= " /$label"; + } + + $onum = $num; + } + + $res.= "\n]\n>>\nendobj"; + return $res; + } + } + + + /** + * a descendent cid font, needed for unicode fonts + */ + protected function o_fontDescendentCID($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'fontDescendentCID', 'info'=>$options); + + // we need a CID system info section + $cidSystemInfoId = ++$this->numObj; + $this->o_contents($cidSystemInfoId, 'new', 'raw'); + $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId; + $res= "<objects[$cidSystemInfoId]['c'] = $res; + + // and a CID to GID map + $cidToGidMapId = ++$this->numObj; + $this->o_fontGIDtoCIDMap($cidToGidMapId, 'new', $options); + $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId; + break; + + case 'add': + foreach ($options as $k => $v) { + switch ($k) { + case 'BaseFont': + $o['info']['name'] = $v; + break; + + case 'FirstChar': + case 'LastChar': + case 'MissingWidth': + case 'FontDescriptor': + case 'SubType': + $this->addMessage("o_fontDescendentCID $k : $v"); + $o['info'][$k] = $v; + break; + } + } + + // pass values down to cid to gid map + $this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options); + break; + + case 'out': + $res = "\n$id 0 obj\n"; + $res.= "<fonts[$o['info']['fontFileName']]['CIDWidths'])) { + $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths']; + $w = ''; + foreach ($cid_widths as $cid => $width) { + $w .= "$cid [$width] "; + } + $res.= "/W [$w]\n"; + } + + $res.= "/CIDToGIDMap ".$o['info']['cidToGidMap']." 0 R\n"; + $res.= ">>\n"; + $res.= "endobj"; + + return $res; + } + } + + + /** + * a font glyph to character map, needed for unicode fonts + */ + protected function o_fontGIDtoCIDMap($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'fontGIDtoCIDMap', 'info'=>$options); + break; + + case 'out': + $res = "\n$id 0 obj\n"; + $fontFileName = $o['info']['fontFileName']; + $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']); + + $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) && + $this->fonts[$fontFileName]['CIDtoGID_Compressed']; + + if (!$compressed && isset($o['raw'])) { + $res.= $tmp; + } else { + $res.= "<<"; + + if (!$compressed && $this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on this content stream + $compressed = true; + $tmp = gzcompress($tmp, 6); + } + if ($compressed) { + $res.= "\n/Filter /FlateDecode"; + } + + $res.= "\n/Length ".mb_strlen($tmp, '8bit') .">>\nstream\n$tmp\nendstream"; + } + + $res.= "\nendobj"; + return $res; + } + } + + + /** + * the document procset, solves some problems with printing to old PS printers + */ + protected function o_procset($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'procset', 'info'=>array('PDF'=>1, 'Text'=>1)); + $this->o_pages($this->currentNode, 'procset', $id); + $this->procsetObjectId = $id; + break; + + case 'add': + // this is to add new items to the procset list, despite the fact that this is considered + // obselete, the items are required for printing to some postscript printers + switch ($options) { + case 'ImageB': + case 'ImageC': + case 'ImageI': + $o['info'][$options] = 1; + break; + } + break; + + case 'out': + $res = "\n$id 0 obj\n["; + foreach ($o['info'] as $label=>$val) { + $res.= "/$label "; + } + $res.= "]\nendobj"; + return $res; + } + } + + + /** + * define the document information + */ + protected function o_info($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->infoObject = $id; + $date = 'D:'.@date('Ymd'); + $this->objects[$id] = array('t'=>'info', 'info'=>array('Creator'=>'R and OS php pdf writer, http://www.ros.co.nz', 'CreationDate'=>$date)); + break; + case 'Title': + case 'Author': + case 'Subject': + case 'Keywords': + case 'Creator': + case 'Producer': + case 'CreationDate': + case 'ModDate': + case 'Trapped': + $o['info'][$action] = $options; + break; + + case 'out': + if ($this->encrypted) { + $this->encryptInit($id); + } + + $res = "\n$id 0 obj\n<<\n"; + foreach ($o['info'] as $k=>$v) { + $res.= "/$k ("; + // dates must be outputted as-is, without Unicode transformations + $raw = ($k === 'CreationDate' || $k === 'ModDate'); + $c = $v; + + if ($this->encrypted) { + $c = $this->ARC4($c); + } + + $res.= ($raw) ? $c : $this->filterText($c); + $res.= ")\n"; + } + + $res.= ">>\nendobj"; + return $res; + } + } + + + /** + * an action object, used to link to URLS initially + */ + protected function o_action($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + if (is_array($options)) { + $this->objects[$id] = array('t'=>'action', 'info'=>$options, 'type'=>$options['type']); + } else { + // then assume a URI action + $this->objects[$id] = array('t'=>'action', 'info'=>$options, 'type'=>'URI'); + } + break; + + case 'out': + if ($this->encrypted) { + $this->encryptInit($id); + } + + $res = "\n$id 0 obj\n<< /Type /Action"; + switch ($o['type']) { + case 'ilink': + // there will be an 'label' setting, this is the name of the destination + $res.= "\n/S /GoTo\n/D ".$this->destinations[(string)$o['info']['label']]." 0 R"; + break; + + case 'URI': + $res.= "\n/S /URI\n/URI ("; + if ($this->encrypted) { + $res.= $this->filterText($this->ARC4($o['info'])); + } else { + $res.= $this->filterText($o['info']); + } + + $res.= ")"; + break; + } + + $res.= "\n>>\nendobj"; + return $res; + } + } + + + /** + * an annotation object, this will add an annotation to the current page. + * initially will support just link annotations + */ + protected function o_annotation($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + // add the annotation to the current page + $pageId = $this->currentPage; + $this->o_page($pageId, 'annot', $id); + + // and add the action object which is going to be required + switch ($options['type']) { + case 'link': + $this->objects[$id] = array('t'=>'annotation', 'info'=>$options); + $this->numObj++; + $this->o_action($this->numObj, 'new', $options['url']); + $this->objects[$id]['info']['actionId'] = $this->numObj; + break; + + case 'ilink': + // this is to a named internal link + $label = $options['label']; + $this->objects[$id] = array('t'=>'annotation', 'info'=>$options); + $this->numObj++; + $this->o_action($this->numObj, 'new', array('type'=>'ilink', 'label'=>$label)); + $this->objects[$id]['info']['actionId'] = $this->numObj; + break; + } + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Annot"; + switch ($o['info']['type']) { + case 'link': + case 'ilink': + $res.= "\n/Subtype /Link"; + break; + } + $res.= "\n/A ".$o['info']['actionId']." 0 R"; + $res.= "\n/Border [0 0 0]"; + $res.= "\n/H /I"; + $res.= "\n/Rect [ "; + + foreach($o['info']['rect'] as $v) { + $res.= sprintf("%.4F ", $v); + } + + $res.= "]"; + $res.= "\n>>\nendobj"; + return $res; + } + } + + + /** + * a page object, it also creates a contents object to hold its contents + */ + protected function o_page($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->numPages++; + $this->objects[$id] = array('t'=>'page', 'info'=>array('parent'=>$this->currentNode, 'pageNum'=>$this->numPages)); + + if (is_array($options)) { + // then this must be a page insertion, array should contain 'rid','pos'=[before|after] + $options['id'] = $id; + $this->o_pages($this->currentNode, 'page', $options); + } else { + $this->o_pages($this->currentNode, 'page', $id); + } + + $this->currentPage = $id; + //make a contents object to go with this page + $this->numObj++; + $this->o_contents($this->numObj, 'new', $id); + $this->currentContents = $this->numObj; + $this->objects[$id]['info']['contents'] = array(); + $this->objects[$id]['info']['contents'][] = $this->numObj; + + $match = ($this->numPages%2 ? 'odd' : 'even'); + foreach($this->addLooseObjects as $oId=>$target) { + if ($target === 'all' || $match === $target) { + $this->objects[$id]['info']['contents'][] = $oId; + } + } + break; + + case 'content': + $o['info']['contents'][] = $options; + break; + + case 'annot': + // add an annotation to this page + if (!isset($o['info']['annot'])) { + $o['info']['annot'] = array(); + } + + // $options should contain the id of the annotation dictionary + $o['info']['annot'][] = $options; + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Page"; + $res.= "\n/Parent ".$o['info']['parent']." 0 R"; + + if (isset($o['info']['annot'])) { + $res.= "\n/Annots ["; + foreach($o['info']['annot'] as $aId) { + $res.= " $aId 0 R"; + } + $res.= " ]"; + } + + $count = count($o['info']['contents']); + if ($count == 1) { + $res.= "\n/Contents ".$o['info']['contents'][0]." 0 R"; + } else if ($count>1) { + $res.= "\n/Contents [\n"; + + // reverse the page contents so added objects are below normal content + //foreach (array_reverse($o['info']['contents']) as $cId) { + // Back to normal now that I've got transparency working --Benj + foreach ($o['info']['contents'] as $cId) { + $res.= "$cId 0 R\n"; + } + $res.= "]"; + } + + $res.= "\n>>\nendobj"; + return $res; + } + } + + + /** + * the contents objects hold all of the content which appears on pages + */ + protected function o_contents($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'contents', 'c'=>'', 'info'=>array()); + if (mb_strlen($options, '8bit') && intval($options)) { + // then this contents is the primary for a page + $this->objects[$id]['onPage'] = $options; + } else if ($options === 'raw') { + // then this page contains some other type of system object + $this->objects[$id]['raw'] = 1; + } + break; + + case 'add': + // add more options to the decleration + foreach ($options as $k=>$v) { + $o['info'][$k] = $v; + } + + case 'out': + $tmp = $o['c']; + $res = "\n$id 0 obj\n"; + + if (isset($this->objects[$id]['raw'])) { + $res.= $tmp; + } else { + $res.= "<<"; + if ($this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on this content stream + $res.= " /Filter /FlateDecode"; + $tmp = gzcompress($tmp, 6); + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + foreach($o['info'] as $k=>$v) { + $res.= "\n/$k $v"; + } + + $res.= "\n/Length ".mb_strlen($tmp, '8bit') ." >>\nstream\n$tmp\nendstream"; + } + + $res.= "\nendobj"; + return $res; + } + } + + protected function o_embedjs($id, $action, $code = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'embedjs', 'info'=>array( + 'Names' => '[(EmbeddedJS) '.($id+1).' 0 R]' + )); + break; + + case 'out': + $res = "\n$id 0 obj\n<< "; + foreach($o['info'] as $k=>$v) { + $res.= "\n/$k $v"; + } + $res.= "\n>>\nendobj"; + return $res; + } + } + + protected function o_javascript($id, $action, $code = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'javascript', 'info'=>array( + 'S' => '/JavaScript', + 'JS' => '('.$this->filterText($code).')', + )); + break; + + case 'out': + $res = "\n$id 0 obj\n<< "; + foreach($o['info'] as $k=>$v) { + $res.= "\n/$k $v"; + } + $res.= "\n>>\nendobj"; + return $res; + } + } + + /** + * an image object, will be an XObject in the document, includes description and data + */ + protected function o_image($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + // make the new object + $this->objects[$id] = array('t'=>'image', 'data'=>&$options['data'], 'info'=>array()); + + $info =& $this->objects[$id]['info']; + + $info['Type'] = '/XObject'; + $info['Subtype'] = '/Image'; + $info['Width'] = $options['iw']; + $info['Height'] = $options['ih']; + + if (isset($options['masked']) && $options['masked']) { + $info['SMask'] = ($this->numObj-1).' 0 R'; + } + + if (!isset($options['type']) || $options['type'] === 'jpg') { + if (!isset($options['channels'])) { + $options['channels'] = 3; + } + + switch ($options['channels']) { + case 1: $info['ColorSpace'] = '/DeviceGray'; break; + case 4: $info['ColorSpace'] = '/DeviceCMYK'; break; + default: $info['ColorSpace'] = '/DeviceRGB'; break; + } + + if ($info['ColorSpace'] === '/DeviceCMYK') { + $info['Decode'] = '[1 0 1 0 1 0 1 0]'; + } + + $info['Filter'] = '/DCTDecode'; + $info['BitsPerComponent'] = 8; + } + + else if ($options['type'] === 'png') { + $info['Filter'] = '/FlateDecode'; + $info['DecodeParms'] = '<< /Predictor 15 /Colors '.$options['ncolor'].' /Columns '.$options['iw'].' /BitsPerComponent '.$options['bitsPerComponent'].'>>'; + + if ($options['isMask']) { + $info['ColorSpace'] = '/DeviceGray'; + } + else { + if (mb_strlen($options['pdata'], '8bit')) { + $tmp = ' [ /Indexed /DeviceRGB '.(mb_strlen($options['pdata'], '8bit') /3-1) .' '; + $this->numObj++; + $this->o_contents($this->numObj, 'new'); + $this->objects[$this->numObj]['c'] = $options['pdata']; + $tmp.= $this->numObj.' 0 R'; + $tmp.= ' ]'; + $info['ColorSpace'] = $tmp; + + if (isset($options['transparency'])) { + $transparency = $options['transparency']; + switch ($transparency['type']) { + case 'indexed': + $tmp = ' [ '.$transparency['data'].' '.$transparency['data'].'] '; + $info['Mask'] = $tmp; + break; + + case 'color-key': + $tmp = ' [ '. + $transparency['r'] . ' ' . $transparency['r'] . + $transparency['g'] . ' ' . $transparency['g'] . + $transparency['b'] . ' ' . $transparency['b'] . + ' ] '; + $info['Mask'] = $tmp; + break; + } + } + } else { + if (isset($options['transparency'])) { + $transparency = $options['transparency']; + + switch ($transparency['type']) { + case 'indexed': + $tmp = ' [ '.$transparency['data'].' '.$transparency['data'].'] '; + $info['Mask'] = $tmp; + break; + + case 'color-key': + $tmp = ' [ '. + $transparency['r'] . ' ' . $transparency['r'] . ' ' . + $transparency['g'] . ' ' . $transparency['g'] . ' ' . + $transparency['b'] . ' ' . $transparency['b'] . + ' ] '; + $info['Mask'] = $tmp; + break; + } + } + $info['ColorSpace'] = '/'.$options['color']; + } + } + + $info['BitsPerComponent'] = $options['bitsPerComponent']; + } + + // assign it a place in the named resource dictionary as an external object, according to + // the label passed in with it. + $this->o_pages($this->currentNode, 'xObject', array('label'=>$options['label'], 'objNum'=>$id)); + + // also make sure that we have the right procset object for it. + $this->o_procset($this->procsetObjectId, 'add', 'ImageC'); + break; + + case 'out': + $tmp = &$o['data']; + $res = "\n$id 0 obj\n<<"; + + foreach($o['info'] as $k=>$v) { + $res.= "\n/$k $v"; + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + $res.= "\n/Length ".mb_strlen($tmp, '8bit') .">>\nstream\n$tmp\nendstream\nendobj"; + + return $res; + } + } + + + /** + * graphics state object + */ + protected function o_extGState($id, $action, $options = "") { + static $valid_params = array("LW", "LC", "LC", "LJ", "ML", + "D", "RI", "OP", "op", "OPM", + "Font", "BG", "BG2", "UCR", + "TR", "TR2", "HT", "FL", + "SM", "SA", "BM", "SMask", + "CA", "ca", "AIS", "TK"); + + if ($action !== "new") { + $o = & $this->objects[$id]; + } + + switch ($action) { + case "new": + $this->objects[$id] = array('t' => 'extGState', 'info' => $options); + + // Tell the pages about the new resource + $this->numStates++; + $this->o_pages($this->currentNode, 'extGState', array("objNum" => $id, "stateNum" => $this->numStates)); + break; + + case "out": + $res = "\n$id 0 obj\n<< /Type /ExtGState\n"; + + foreach ($o["info"] as $k => $v) { + if ( !in_array($k, $valid_params)) + continue; + $res.= "/$k $v\n"; + } + + $res.= ">>\nendobj"; + return $res; + } + } + + + /** + * encryption object. + */ + protected function o_encryption($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + // make the new object + $this->objects[$id] = array('t'=>'encryption', 'info'=>$options); + $this->arc4_objnum = $id; + + // figure out the additional paramaters required + $pad = chr(0x28) .chr(0xBF) .chr(0x4E) .chr(0x5E) .chr(0x4E) .chr(0x75) .chr(0x8A) .chr(0x41) + .chr(0x64) .chr(0x00) .chr(0x4E) .chr(0x56) .chr(0xFF) .chr(0xFA) .chr(0x01) .chr(0x08) + .chr(0x2E) .chr(0x2E) .chr(0x00) .chr(0xB6) .chr(0xD0) .chr(0x68) .chr(0x3E) .chr(0x80) + .chr(0x2F) .chr(0x0C) .chr(0xA9) .chr(0xFE) .chr(0x64) .chr(0x53) .chr(0x69) .chr(0x7A); + + $len = mb_strlen($options['owner'], '8bit'); + + if ($len>32) { + $owner = substr($options['owner'], 0, 32); + } else if ($len<32) { + $owner = $options['owner'].substr($pad, 0, 32-$len); + } else { + $owner = $options['owner']; + } + + $len = mb_strlen($options['user'], '8bit'); + if ($len>32) { + $user = substr($options['user'], 0, 32); + } else if ($len<32) { + $user = $options['user'].substr($pad, 0, 32-$len); + } else { + $user = $options['user']; + } + + $tmp = $this->md5_16($owner); + $okey = substr($tmp, 0, 5); + $this->ARC4_init($okey); + $ovalue = $this->ARC4($user); + $this->objects[$id]['info']['O'] = $ovalue; + + // now make the u value, phew. + $tmp = $this->md5_16($user.$ovalue.chr($options['p']) .chr(255) .chr(255) .chr(255) .$this->fileIdentifier); + + $ukey = substr($tmp, 0, 5); + $this->ARC4_init($ukey); + $this->encryptionKey = $ukey; + $this->encrypted = 1; + $uvalue = $this->ARC4($pad); + $this->objects[$id]['info']['U'] = $uvalue; + $this->encryptionKey = $ukey; + // initialize the arc4 array + break; + + case 'out': + $res = "\n$id 0 obj\n<<"; + $res.= "\n/Filter /Standard"; + $res.= "\n/V 1"; + $res.= "\n/R 2"; + $res.= "\n/O (".$this->filterText($o['info']['O'], true, false) .')'; + $res.= "\n/U (".$this->filterText($o['info']['U'], true, false) .')'; + // and the p-value needs to be converted to account for the twos-complement approach + $o['info']['p'] = (($o['info']['p']^255) +1) *-1; + $res.= "\n/P ".($o['info']['p']); + $res.= "\n>>\nendobj"; + return $res; + } + } + + + /** + * ARC4 functions + * A series of function to implement ARC4 encoding in PHP + */ + + /** + * calculate the 16 byte version of the 128 bit md5 digest of the string + */ + function md5_16($string) { + $tmp = md5($string); + $out = ''; + for ($i = 0;$i <= 30;$i = $i+2) { + $out.= chr(hexdec(substr($tmp, $i, 2))); + } + return $out; + } + + + /** + * initialize the encryption for processing a particular object + */ + function encryptInit($id) { + $tmp = $this->encryptionKey; + $hex = dechex($id); + if (mb_strlen($hex, '8bit') <6) { + $hex = substr('000000', 0, 6-mb_strlen($hex, '8bit')) .$hex; + } + $tmp.= chr(hexdec(substr($hex, 4, 2))) .chr(hexdec(substr($hex, 2, 2))) .chr(hexdec(substr($hex, 0, 2))) .chr(0) .chr(0); + $key = $this->md5_16($tmp); + $this->ARC4_init(substr($key, 0, 10)); + } + + + /** + * initialize the ARC4 encryption + */ + function ARC4_init($key = '') { + $this->arc4 = ''; + + // setup the control array + if (mb_strlen($key, '8bit') == 0) { + return; + } + + $k = ''; + while (mb_strlen($k, '8bit') <256) { + $k.= $key; + } + + $k = substr($k, 0, 256); + for ($i = 0;$i<256;$i++) { + $this->arc4.= chr($i); + } + + $j = 0; + + for ($i = 0;$i<256;$i++) { + $t = $this->arc4[$i]; + $j = ($j + ord($t) + ord($k[$i])) %256; + $this->arc4[$i] = $this->arc4[$j]; + $this->arc4[$j] = $t; + } + } + + + /** + * ARC4 encrypt a text string + */ + function ARC4($text) { + $len = mb_strlen($text, '8bit'); + $a = 0; + $b = 0; + $c = $this->arc4; + $out = ''; + for ($i = 0;$i<$len;$i++) { + $a = ($a+1) %256; + $t = $c[$a]; + $b = ($b+ord($t)) %256; + $c[$a] = $c[$b]; + $c[$b] = $t; + $k = ord($c[(ord($c[$a]) +ord($c[$b])) %256]); + $out.= chr(ord($text[$i]) ^ $k); + } + return $out; + } + + + /** + * functions which can be called to adjust or add to the document + */ + + /** + * add a link in the document to an external URL + */ + function addLink($url, $x0, $y0, $x1, $y1) { + $this->numObj++; + $info = array('type'=>'link', 'url'=>$url, 'rect'=>array($x0, $y0, $x1, $y1)); + $this->o_annotation($this->numObj, 'new', $info); + } + + + /** + * add a link in the document to an internal destination (ie. within the document) + */ + function addInternalLink($label, $x0, $y0, $x1, $y1) { + $this->numObj++; + $info = array('type'=>'ilink', 'label'=>$label, 'rect'=>array($x0, $y0, $x1, $y1)); + $this->o_annotation($this->numObj, 'new', $info); + } + + + /** + * set the encryption of the document + * can be used to turn it on and/or set the passwords which it will have. + * also the functions that the user will have are set here, such as print, modify, add + */ + function setEncryption($userPass = '', $ownerPass = '', $pc = array()) { + $p = bindec("11000000"); + + $options = array('print'=>4, 'modify'=>8, 'copy'=>16, 'add'=>32); + + foreach($pc as $k=>$v) { + if ($v && isset($options[$k])) { + $p+= $options[$k]; + } else if (isset($options[$v])) { + $p+= $options[$v]; + } + } + + // implement encryption on the document + if ($this->arc4_objnum == 0) { + // then the block does not exist already, add it. + $this->numObj++; + if (mb_strlen($ownerPass) == 0) { + $ownerPass = $userPass; + } + + $this->o_encryption($this->numObj, 'new', array('user'=>$userPass, 'owner'=>$ownerPass, 'p'=>$p)); + } + } + + + /** + * should be used for internal checks, not implemented as yet + */ + function checkAllHere() { + } + + + /** + * return the pdf stream as a string returned from the function + */ + function output($debug = false) { + if ($debug) { + // turn compression off + $this->options['compression'] = false; + } + + if ($this->javascript) { + $this->numObj++; + + $js_id = $this->numObj; + $this->o_embedjs($js_id, 'new'); + $this->o_javascript(++$this->numObj, 'new', $this->javascript); + + $id = $this->catalogId; + + $this->o_catalog($id, 'javascript', $js_id); + } + + if ($this->arc4_objnum) { + $this->ARC4_init($this->encryptionKey); + } + + $this->checkAllHere(); + + + $xref = array(); + $content = '%PDF-1.3'; + $pos = mb_strlen($content, '8bit'); + + foreach($this->objects as $k=>$v) { + $tmp = 'o_'.$v['t']; + $cont = $this->$tmp($k, 'out'); + $content.= $cont; + $xref[] = $pos; + $pos+= mb_strlen($cont, '8bit'); + } + + $content.= "\nxref\n0 ".(count($xref) +1) ."\n0000000000 65535 f \n"; + + foreach($xref as $p) { + $content.= str_pad($p, 10, "0", STR_PAD_LEFT) . " 00000 n \n"; + } + + $content.= "trailer\n<<\n/Size ".(count($xref) +1) ."\n/Root 1 0 R\n/Info $this->infoObject 0 R\n"; + + // if encryption has been applied to this document then add the marker for this dictionary + if ($this->arc4_objnum > 0) { + $content.= "/Encrypt $this->arc4_objnum 0 R\n"; + } + + if (mb_strlen($this->fileIdentifier, '8bit')) { + $content.= "/ID[<$this->fileIdentifier><$this->fileIdentifier>]\n"; + } + + $content.= ">>\nstartxref\n$pos\n%%EOF\n"; + + return $content; + } + + /** + * intialize a new document + * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum + * this function is called automatically by the constructor function + * + * @access private + */ + function newDocument($pageSize = array(0, 0, 612, 792)) { + $this->numObj = 0; + $this->objects = array(); + + $this->numObj++; + $this->o_catalog($this->numObj, 'new'); + + $this->numObj++; + $this->o_outlines($this->numObj, 'new'); + + $this->numObj++; + $this->o_pages($this->numObj, 'new'); + + $this->o_pages($this->numObj, 'mediaBox', $pageSize); + $this->currentNode = 3; + + $this->numObj++; + $this->o_procset($this->numObj, 'new'); + + $this->numObj++; + $this->o_info($this->numObj, 'new'); + + $this->numObj++; + $this->o_page($this->numObj, 'new'); + + // need to store the first page id as there is no way to get it to the user during + // startup + $this->firstPageId = $this->currentContents; + } + + /** + * open the font file and return a php structure containing it. + * first check if this one has been done before and saved in a form more suited to php + * note that if a php serialized version does not exist it will try and make one, but will + * require write access to the directory to do it... it is MUCH faster to have these serialized + * files. + * + * @access private + */ + function openFont($font) { + // assume that $font contains the path and file but not the extension + $pos = strrpos($font, '/'); + + if ($pos === false) { + $dir = './'; + $name = $font; + } else { + $dir = substr($font, 0, $pos+1); + $name = substr($font, $pos+1); + } + + $fontcache = $this->fontcache; + if ($fontcache == '') { + $fontcache = $dir; + } + + //$name filename without folder and extension of font metrics + //$dir folder of font metrics + //$fontcache folder of runtime created php serialized version of font metrics. + // If this is not given, the same folder as the font metrics will be used. + // Storing and reusing serialized versions improves speed much + + $this->addMessage("openFont: $font - $name"); + + $metrics_name = $name . ($this->isUnicode ? '.ufm' : '.afm'); + + // Core fonts don't currently work with composite fonts (for Unicode support). + // The .ufm files have been removed so we need to check whether or not to use the + // .ufm or .afm. + if ($this->isUnicode && !file_exists("$dir/$metrics_name")) { $metrics_name = $name . '.afm'; } + + $cache_name = "$metrics_name.php"; + $this->addMessage("metrics: $metrics_name, cache: $cache_name"); + if (file_exists($fontcache . $cache_name)) { + $this->addMessage("openFont: php file exists $fontcache$cache_name"); + $this->fonts[$font] = require($fontcache . $cache_name); + + if (!isset($this->fonts[$font]['_version_']) || $this->fonts[$font]['_version_'] != $this->fontcacheVersion) { + // if the font file is old, then clear it out and prepare for re-creation + $this->addMessage('openFont: clear out, make way for new version.'); + $this->fonts[$font] = null; + unset($this->fonts[$font]); + } + } + else { + $old_cache_name = "php_$metrics_name"; + if (file_exists($fontcache . $old_cache_name)) { + $this->addMessage("openFont: php file doesn't exist $fontcache$cache_name, creating it from the old format"); + $old_cache = file_get_contents($fontcache . $old_cache_name); + file_put_contents($fontcache . $cache_name, 'openFont($font); + } + } + + if (!isset($this->fonts[$font]) && file_exists($dir . $metrics_name)) { + // then rebuild the php_.afm file from the .afm file + $this->addMessage("openFont: build php file from $dir$metrics_name"); + $data = array(); + + // 20 => 'space' + $data['codeToName'] = array(); + + // Since we're not going to enable Unicode for the core fonts we need to use a font-based + // setting for Unicode support rather than a global setting. + $data['isUnicode'] = (strtolower(substr($metrics_name, -3)) !== 'afm'); + + $cidtogid = ''; + if ($data['isUnicode']) { + $cidtogid = str_pad('', 256*256*2, "\x00"); + } + + $file = file($dir . $metrics_name); + + foreach ($file as $rowA) { + $row = trim($rowA); + $pos = strpos($row, ' '); + + if ($pos) { + // then there must be some keyword + $key = substr($row, 0, $pos); + switch ($key) { + case 'FontName': + case 'FullName': + case 'FamilyName': + case 'Weight': + case 'ItalicAngle': + case 'IsFixedPitch': + case 'CharacterSet': + case 'UnderlinePosition': + case 'UnderlineThickness': + case 'Version': + case 'EncodingScheme': + case 'CapHeight': + case 'XHeight': + case 'Ascender': + case 'Descender': + case 'StdHW': + case 'StdVW': + case 'StartCharMetrics': + case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font. Otherwise it's too big. + $data[$key] = trim(substr($row, $pos)); + break; + + case 'FontBBox': + $data[$key] = explode(' ', trim(substr($row, $pos))); + break; + + //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; + case 'C': // Found in AFM files + $bits = explode(';', trim($row)); + $dtmp = array(); + + foreach($bits as $bit) { + $bits2 = explode(' ', trim($bit)); + if (mb_strlen($bits2[0], '8bit') == 0) continue; + + if (count($bits2) >2) { + $dtmp[$bits2[0]] = array(); + for ($i = 1;$i= 0) { + if ($c != hexdec($n)) { + $data['codeToName'][$c] = $n; + } + $data['C'][$c] = $width; + } else { + $data['C'][$n] = $width; + } + + if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') { + $data['MissingWidth'] = $width; + } + + break; + + // U 827 ; WX 0 ; N squaresubnosp ; G 675 ; + case 'U': // Found in UFM files + if (!$data['isUnicode']) break; + + $bits = explode(';', trim($row)); + $dtmp = array(); + + foreach($bits as $bit) { + $bits2 = explode(' ', trim($bit)); + if (mb_strlen($bits2[0], '8bit') === 0) continue; + + if (count($bits2) >2) { + $dtmp[$bits2[0]] = array(); + for ($i = 1;$i= 0) { + // Set values in CID to GID map + if ($c >= 0 && $c < 0xFFFF && $glyph) { + $cidtogid[$c*2] = chr($glyph >> 8); + $cidtogid[$c*2 + 1] = chr($glyph & 0xFF); + } + + if ($c != hexdec($n)) { + $data['codeToName'][$c] = $n; + } + $data['C'][$c] = $width; + } else { + $data['C'][$n] = $width; + } + + if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') { + $data['MissingWidth'] = $width; + } + + break; + + case 'KPX': + break; // don't include them as they are not used yet + //KPX Adieresis yacute -40 + $bits = explode(' ', trim($row)); + $data['KPX'][$bits[1]][$bits[2]] = $bits[3]; + break; + } + } + } + + // echo $cidtogid; die("CIDtoGID Displayed!"); + if ($this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on CIDtoGID string + $data['CIDtoGID_Compressed'] = true; + $cidtogid = gzcompress($cidtogid, 6); + } + $data['CIDtoGID'] = base64_encode($cidtogid); + $data['_version_'] = $this->fontcacheVersion; + $this->fonts[$font] = $data; + + //Because of potential trouble with php safe mode, expect that the folder already exists. + //If not existing, this will hit performance because of missing cached results. + if ( is_dir(substr($fontcache,0,-1)) && is_writable(substr($fontcache,0,-1)) ) { + file_put_contents($fontcache . $cache_name, 'fonts[$font])) { + $this->addMessage("openFont: no font file found for $font. Do you need to run load_font.php?"); + //echo 'Font not Found '.$font; + } + + //pre_r($this->messages); + } + + /** + * if the font is not loaded then load it and make the required object + * else just make it the current font + * the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding' + * note that encoding='none' will need to be used for symbolic fonts + * and 'differences' => an array of mappings between numbers 0->255 and character names. + * + */ + function selectFont($fontName, $encoding = '', $set = true) { + $ext = substr($fontName, -4); + if ($ext === '.afm' || $ext === '.ufm') { + $fontName = substr($fontName, 0, mb_strlen($fontName)-4); + } + + if (!isset($this->fonts[$fontName])) { + $this->addMessage("selectFont: selecting - $fontName - $encoding, $set"); + + // load the file + $this->openFont($fontName); + + if (isset($this->fonts[$fontName])) { + $this->numObj++; + $this->numFonts++; + + //$this->numFonts = md5($fontName); + $pos = strrpos($fontName, '/'); + // $dir = substr($fontName,0,$pos+1); + $name = substr($fontName, $pos+1); + $options = array('name' => $name, 'fontFileName' => $fontName); + + if (is_array($encoding)) { + // then encoding and differences might be set + if (isset($encoding['encoding'])) { + $options['encoding'] = $encoding['encoding']; + } + + if (isset($encoding['differences'])) { + $options['differences'] = $encoding['differences']; + } + } else if (mb_strlen($encoding, '8bit')) { + // then perhaps only the encoding has been set + $options['encoding'] = $encoding; + } + + $fontObj = $this->numObj; + $this->o_font($this->numObj, 'new', $options); + $this->fonts[$fontName]['fontNum'] = $this->numFonts; + + // if this is a '.afm' font, and there is a '.pfa' file to go with it ( as there + // should be for all non-basic fonts), then load it into an object and put the + // references into the font object + $basefile = $fontName; + if (file_exists($basefile.'.pfb')) { + $fbtype = 'pfb'; + } else if (file_exists($basefile.'.ttf')) { + $fbtype = 'ttf'; + } else { + $fbtype = ''; + } + + $fbfile = $basefile.'.'.$fbtype; + + // $pfbfile = substr($fontName,0,strlen($fontName)-4).'.pfb'; + // $ttffile = substr($fontName,0,strlen($fontName)-4).'.ttf'; + $this->addMessage('selectFont: checking for - '.$fbfile); + + // OAR - I don't understand this old check + // if (substr($fontName, -4) === '.afm' && strlen($fbtype)) { + if (mb_strlen($fbtype, '8bit')) { + $adobeFontName = $this->fonts[$fontName]['FontName']; + // $fontObj = $this->numObj; + $this->addMessage('selectFont: adding font file - '.$fbfile.' - '.$adobeFontName); + + // find the array of font widths, and put that into an object. + $firstChar = -1; + $lastChar = 0; + $widths = array(); + $cid_widths = array(); + + foreach ($this->fonts[$fontName]['C'] as $num => $d) { + if (intval($num) >0 || $num == '0') { + if (!$this->fonts[$fontName]['isUnicode']) { + // With Unicode, widths array isn't used + if ($lastChar>0 && $num>$lastChar+1) { + for ($i = $lastChar+1;$i<$num;$i++) { + $widths[] = 0; + } + } + } + + $widths[] = $d; + + if ($this->fonts[$fontName]['isUnicode']) { + $cid_widths[$num] = $d; + } + + if ($firstChar == -1) { + $firstChar = $num; + } + + $lastChar = $num; + } + } + + // also need to adjust the widths for the differences array + if (isset($options['differences'])) { + foreach($options['differences'] as $charNum => $charName) { + if ($charNum > $lastChar) { + if (!$this->fonts[$fontName]['isUnicode']) { + // With Unicode, widths array isn't used + for ($i = $lastChar + 1; $i <= $charNum; $i++) { + $widths[] = 0; + } + } + + $lastChar = $charNum; + } + + if (isset($this->fonts[$fontName]['C'][$charName])) { + $widths[$charNum-$firstChar] = $this->fonts[$fontName]['C'][$charName]; + if ($this->fonts[$fontName]['isUnicode']) { + $cid_widths[$charName] = $this->fonts[$fontName]['C'][$charName]; + } + } + } + } + + if ($this->fonts[$fontName]['isUnicode']) { + $this->fonts[$fontName]['CIDWidths'] = $cid_widths; + } + + $this->addMessage('selectFont: FirstChar = '.$firstChar); + $this->addMessage('selectFont: LastChar = '.$lastChar); + + $widthid = -1; + + if (!$this->fonts[$fontName]['isUnicode']) { + // With Unicode, widths array isn't used + + $this->numObj++; + $this->o_contents($this->numObj, 'new', 'raw'); + $this->objects[$this->numObj]['c'].= '['; + + foreach($widths as $width) { + $this->objects[$this->numObj]['c'].= ' '.$width; + } + + $this->objects[$this->numObj]['c'].= ' ]'; + $widthid = $this->numObj; + } + + $missing_width = 500; + $stemV = 70; + + if (isset($this->fonts[$fontName]['MissingWidth'])) { + $missing_width = $this->fonts[$fontName]['MissingWidth']; + } + if (isset($this->fonts[$fontName]['StdVW'])) { + $stemV = $this->fonts[$fontName]['StdVW']; + } elseif (isset($this->fonts[$fontName]['Weight']) && preg_match('!(bold|black)!i', $this->fonts[$fontName]['Weight'])) { + $stemV = 120; + } + + // load the pfb file, and put that into an object too. + // note that pdf supports only binary format type 1 font files, though there is a + // simple utility to convert them from pfa to pfb. + $data = file_get_contents($fbfile); + + // create the font descriptor + $this->numObj++; + $fontDescriptorId = $this->numObj; + + $this->numObj++; + $pfbid = $this->numObj; + + // determine flags (more than a little flakey, hopefully will not matter much) + $flags = 0; + + if ($this->fonts[$fontName]['ItalicAngle'] != 0) { + $flags+= pow(2, 6); + } + + if ($this->fonts[$fontName]['IsFixedPitch'] === 'true') { + $flags+= 1; + } + + $flags+= pow(2, 5); // assume non-sybolic + $list = array( + 'Ascent' => 'Ascender', + 'CapHeight' => 'CapHeight', + 'MissingWidth' => 'MissingWidth', + 'Descent' => 'Descender', + 'FontBBox' => 'FontBBox', + 'ItalicAngle' => 'ItalicAngle' + ); + $fdopt = array( + 'Flags' => $flags, + 'FontName' => $adobeFontName, + 'StemV' => $stemV + ); + + foreach($list as $k => $v) { + if (isset($this->fonts[$fontName][$v])) { + $fdopt[$k] = $this->fonts[$fontName][$v]; + } + } + + if ($fbtype === 'pfb') { + $fdopt['FontFile'] = $pfbid; + } else if ($fbtype === 'ttf') { + $fdopt['FontFile2'] = $pfbid; + } + + $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt); + + // embed the font program + $this->o_contents($this->numObj, 'new'); + $this->objects[$pfbid]['c'].= $data; + + // determine the cruicial lengths within this file + if ($fbtype === 'pfb') { + $l1 = strpos($data, 'eexec') +6; + $l2 = strpos($data, '00000000') -$l1; + $l3 = mb_strlen($data, '8bit') -$l2-$l1; + $this->o_contents($this->numObj, 'add', array('Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3)); + } else if ($fbtype == 'ttf') { + $l1 = mb_strlen($data, '8bit'); + $this->o_contents($this->numObj, 'add', array('Length1' => $l1)); + } + + // tell the font object about all this new stuff + $tmp = array( + 'BaseFont' => $adobeFontName, + 'MissingWidth' => $missing_width, + 'Widths' => $widthid, + 'FirstChar' => $firstChar, + 'LastChar' => $lastChar, + 'FontDescriptor' => $fontDescriptorId, + ); + + if ($fbtype === 'ttf') { + $tmp['SubType'] = 'TrueType'; + } + + $this->addMessage('adding extra info to font.('.$fontObj.')'); + + foreach($tmp as $fk => $fv) { + $this->addMessage($fk." : ".$fv); + } + + $this->o_font($fontObj, 'add', $tmp); + } else { + $this->addMessage('selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts'); + } + + // also set the differences here, note that this means that these will take effect only the + //first time that a font is selected, else they are ignored + if (isset($options['differences'])) { + $this->fonts[$fontName]['differences'] = $options['differences']; + } + } + } + + if ($set && isset($this->fonts[$fontName])) { + // so if for some reason the font was not set in the last one then it will not be selected + $this->currentBaseFont = $fontName; + + // the next lines mean that if a new font is selected, then the current text state will be + // applied to it as well. + $this->currentFont = $this->currentBaseFont; + $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; + + //$this->setCurrentFont(); + } + + return $this->currentFontNum; + //return $this->numObj; + } + + /** + * sets up the current font, based on the font families, and the current text state + * note that this system is quite flexible, a bold-italic font can be completely different to a + * italic-bold font, and even bold-bold will have to be defined within the family to have meaning + * This function is to be called whenever the currentTextState is changed, it will update + * the currentFont setting to whatever the appropriatte family one is. + * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont + * This function will change the currentFont to whatever it should be, but will not change the + * currentBaseFont. + * + * @access private + */ + function setCurrentFont() { + // if (strlen($this->currentBaseFont) == 0){ + // // then assume an initial font + // $this->selectFont($this->defaultFont); + // } + // $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1); + // if (strlen($this->currentTextState) + // && isset($this->fontFamilies[$cf]) + // && isset($this->fontFamilies[$cf][$this->currentTextState])){ + // // then we are in some state or another + // // and this font has a family, and the current setting exists within it + // // select the font, then return it + // $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState]; + // $this->selectFont($nf,'',0); + // $this->currentFont = $nf; + // $this->currentFontNum = $this->fonts[$nf]['fontNum']; + // } else { + // // the this font must not have the right family member for the current state + // // simply assume the base font + $this->currentFont = $this->currentBaseFont; + $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; + // } + } + + + /** + * function for the user to find out what the ID is of the first page that was created during + * startup - useful if they wish to add something to it later. + */ + function getFirstPageId() { + return $this->firstPageId; + } + + + /** + * add content to the currently active object + * + * @access private + */ + function addContent($content) { + $this->objects[$this->currentContents]['c'].= $content; + } + + + /** + * sets the colour for fill operations + */ + function setColor($color, $force = false) { + $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null); + + if (!$force && $this->currentColour == $new_color) return; + + if (isset($new_color[3])) { + $this->currentColour = $new_color; + $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F %.3F k", $this->currentColour); + } + + elseif (isset($new_color[2])) { + $this->currentColour = $new_color; + $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F rg", $this->currentColour); + } + } + + + /** + * sets the colour for stroke operations + */ + function setStrokeColor($color, $force = false) { + $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null); + + if (!$force && $this->currentStrokeColour == $new_color) return; + + if (isset($new_color[3])) { + $this->currentStrokeColour = $new_color; + $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F %.3F K", $this->currentStrokeColour); + } + + elseif (isset($new_color[2])) { + $this->currentStrokeColour = $new_color; + $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F RG", $this->currentStrokeColour); + } + } + + + /** + * Set the graphics state for compositions + */ + function setGraphicsState($parameters) { + // Create a new graphics state object + // FIXME: should actually keep track of states that have already been created... + $this->numObj++; + $this->o_extGState($this->numObj, 'new', $parameters); + $this->objects[ $this->currentContents ]['c'].= "\n/GS$this->numStates gs"; + } + + + /** + * Set current blend mode & opacity for lines. + * + * Valid blend modes are: + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blend mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + function setLineTransparency($mode, $opacity) { + static $blend_modes = array("Normal", "Multiply", "Screen", + "Overlay", "Darken", "Lighten", + "ColorDogde", "ColorBurn", "HardLight", + "SoftLight", "Difference", "Exclusion"); + + if ( !in_array($mode, $blend_modes) ) + $mode = "Normal"; + + // Only create a new graphics state if required + if ( $mode === $this->currentLineTransparency["mode"] && + $opacity == $this->currentLineTransparency["opacity"] ) + return; + + $this->currentLineTransparency["mode"] = $mode; + $this->currentLineTransparency["opacity"] = $opacity; + + $options = array("BM" => "/$mode", + "CA" => (float)$opacity); + + $this->setGraphicsState($options); + } + + /** + * Set current blend mode & opacity for filled objects. + * + * Valid blend modes are: + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blend mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + function setFillTransparency($mode, $opacity) { + static $blend_modes = array("Normal", "Multiply", "Screen", + "Overlay", "Darken", "Lighten", + "ColorDogde", "ColorBurn", "HardLight", + "SoftLight", "Difference", "Exclusion"); + + if ( !in_array($mode, $blend_modes) ) + $mode = "Normal"; + + if ( $mode === $this->currentFillTransparency["mode"] && + $opacity == $this->currentFillTransparency["opacity"] ) + return; + + $this->currentFillTransparency["mode"] = $mode; + $this->currentFillTransparency["opacity"] = $opacity; + + $options = array("BM" => "/$mode", + "ca" => (float)$opacity); + + $this->setGraphicsState($options); + } + + /** + * draw a line from one set of coordinates to another + */ + function line($x1, $y1, $x2, $y2) { + $this->objects[$this->currentContents]['c'] .= sprintf("\n%.3F %.3F m %.3F %.3F l S", $x1, $y1, $x2, $y2); + } + + + /** + * draw a bezier curve based on 4 control points + */ + function curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) { + // in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points + // as the control points for the curve. + $this->objects[$this->currentContents]['c'] .= + sprintf("\n%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c S", $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3); + } + + + /** + * draw a part of an ellipse + */ + function partEllipse($x0, $y0, $astart, $afinish, $r1, $r2 = 0, $angle = 0, $nSeg = 8) { + $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, false); + } + + + /** + * draw a filled ellipse + */ + function filledEllipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360) { + return $this->ellipse($x0, $y0, $r1, $r2 = 0, $angle, $nSeg, $astart, $afinish, true, true); + } + + + /** + * draw an ellipse + * note that the part and filled ellipse are just special cases of this function + * + * draws an ellipse in the current line style + * centered at $x0,$y0, radii $r1,$r2 + * if $r2 is not set, then a circle is drawn + * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a + * pretty crappy shape at 2, as we are approximating with bezier curves. + */ + function ellipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360, $close = true, $fill = false) { + if ($r1 == 0) { + return; + } + + if ($r2 == 0) { + $r2 = $r1; + } + + if ($nSeg < 2) { + $nSeg = 2; + } + + $astart = deg2rad((float)$astart); + $afinish = deg2rad((float)$afinish); + $totalAngle = $afinish-$astart; + + $dt = $totalAngle/$nSeg; + $dtm = $dt/3; + + if ($angle != 0) { + $a = -1*deg2rad((float)$angle); + + $this->objects[$this->currentContents]['c'] .= + sprintf("\n q %.3F %.3F %.3F %.3F %.3F %.3F cm", cos($a), -sin($a), sin($a), cos($a), $x0, $y0); + + $x0 = 0; + $y0 = 0; + } + + $t1 = $astart; + $a0 = $x0 + $r1*cos($t1); + $b0 = $y0 + $r2*sin($t1); + $c0 = -$r1 * sin($t1); + $d0 = $r2 * cos($t1); + + $this->objects[$this->currentContents]['c'] .= sprintf("\n%.3F %.3F m ", $a0, $b0); + + for ($i = 1; $i <= $nSeg; $i++) { + // draw this bit of the total curve + $t1 = $i * $dt + $astart; + $a1 = $x0 + $r1 * cos($t1); + $b1 = $y0 + $r2 * sin($t1); + $c1 = -$r1 * sin($t1); + $d1 = $r2 * cos($t1); + + $this->objects[$this->currentContents]['c'] .= + sprintf("\n%.3F %.3F %.3F %.3F %.3F %.3F c", ($a0+$c0*$dtm), ($b0+$d0*$dtm), ($a1-$c1*$dtm), ($b1-$d1*$dtm), $a1, $b1); + + $a0 = $a1; + $b0 = $b1; + $c0 = $c1; + $d0 = $d1; + } + + if ($fill) { + $this->objects[$this->currentContents]['c'].= ' f'; + } else if ($close) { + $this->objects[$this->currentContents]['c'].= ' s'; // small 's' signifies closing the path as well + } else { + $this->objects[$this->currentContents]['c'].= ' S'; + } + + if ($angle != 0) { + $this->objects[$this->currentContents]['c'].= ' Q'; + } + } + + + /** + * this sets the line drawing style. + * width, is the thickness of the line in user units + * cap is the type of cap to put on the line, values can be 'butt','round','square' + * where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the + * end of the line. + * join can be 'miter', 'round', 'bevel' + * dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the + * on and off dashes. + * (2) represents 2 on, 2 off, 2 on , 2 off ... + * (2,1) is 2 on, 1 off, 2 on, 1 off.. etc + * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts. + */ + function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0) { + // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day + $string = ''; + + if ($width>0) { + $string.= "$width w"; + } + + $ca = array('butt' => 0, 'round' => 1, 'square' => 2); + + if (isset($ca[$cap])) { + $string.= " $ca[$cap] J"; + } + + $ja = array('miter' => 0, 'round' => 1, 'bevel' => 2); + + if (isset($ja[$join])) { + $string.= " $ja[$join] j"; + } + + if (is_array($dash)) { + $string.= ' [ ' . implode(' ', $dash) . " ] $phase d"; + } + + $this->currentLineStyle = $string; + $this->objects[$this->currentContents]['c'].= "\n$string"; + } + + + + /** + * draw a polygon, the syntax for this is similar to the GD polygon command + */ + function polygon($p, $np, $f = false) { + $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F m ", $p[0], $p[1]); + + for ($i = 2; $i < $np * 2; $i = $i + 2) { + $this->objects[$this->currentContents]['c'].= sprintf("%.3F %.3F l ", $p[$i], $p[$i+1]); + } + + if ($f) { + $this->objects[$this->currentContents]['c'].= ' f'; + } else { + $this->objects[$this->currentContents]['c'].= ' S'; + } + } + + + /** + * a filled rectangle, note that it is the width and height of the rectangle which are the secondary paramaters, not + * the coordinates of the upper-right corner + */ + function filledRectangle($x1, $y1, $width, $height) { + $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F %.3F %.3F re f", $x1, $y1, $width, $height); + } + + + /** + * draw a rectangle, note that it is the width and height of the rectangle which are the secondary paramaters, not + * the coordinates of the upper-right corner + */ + function rectangle($x1, $y1, $width, $height) { + $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F %.3F %.3F re S", $x1, $y1, $width, $height); + } + + + /** + * save the current graphic state + */ + function save() { + $this->objects[$this->currentContents]['c'].= "\nq"; + } + + /** + * restore the last graphic state + */ + function restore() { + $this->objects[$this->currentContents]['c'].= "\nQ"; + } + + /** + * draw a clipping rectangle, all the elements added after this will be clipped + */ + function clippingRectangle($x1, $y1, $width, $height) { + $this->save(); + $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F %.3F %.3F re W n", $x1, $y1, $width, $height); + } + + + /* + * ends the last clipping shape + */ + function clippingEnd() { + $this->restore(); + } + + /** + * scale + * @param float $s_x scaling factor for width as percent + * @param float $s_y scaling factor for height as percent + * @param float $x Origin abscisse + * @param float $y Origin ordinate + */ + function scale($s_x, $s_y, $x, $y) { + $y = $this->currentPageSize["height"] - $y; + + $tm = array( + $s_x, 0, + 0, $s_y, + $x*(1-$s_x), $y*(1-$s_y) + ); + + $this->transform($tm); + } + + /** + * translate + * @param float $t_x movement to the right + * @param float $t_y movement to the bottom + */ + function translate($t_x, $t_y) { + $tm = array( + 1, 0, + 0, 1, + $t_x, -$t_y + ); + + $this->transform($tm); + } + + /** + * rotate + * @param float $angle angle in degrees for counter-clockwise rotation + * @param float $x Origin abscisse + * @param float $y Origin ordinate + */ + function rotate($angle, $x, $y) { + $y = $this->currentPageSize["height"] - $y; + + $a = deg2rad($angle); + $cos_a = cos($a); + $sin_a = sin($a); + + $tm = array( + $cos_a, -$sin_a, + $sin_a, $cos_a, + $x - $sin_a*$y - $cos_a*$x, $y - $cos_a*$y + $sin_a*$x, + ); + + $this->transform($tm); + } + + /** + * skew + * @param float $angle_x + * @param float $angle_y + * @param float $x Origin abscisse + * @param float $y Origin ordinate + */ + function skew($angle_x, $angle_y, $x, $y) { + $y = $this->currentPageSize["height"] - $y; + + $tan_x = tan(deg2rad($angle_x)); + $tan_y = tan(deg2rad($angle_y)); + + $tm = array( + 1, -$tan_y, + -$tan_x, 1, + $tan_x*$y, $tan_y*$x, + ); + + $this->transform($tm); + } + + /** + * apply graphic transformations + * @param array $tm transformation matrix + */ + function transform($tm) { + $this->objects[$this->currentContents]['c'].= + vsprintf("\n %.3F %.3F %.3F %.3F %.3F %.3F cm", $tm); + } + + + /** + * add a new page to the document + * this also makes the new page the current active object + */ + function newPage($insert = 0, $id = 0, $pos = 'after') { + // if there is a state saved, then go up the stack closing them + // then on the new page, re-open them with the right setings + + if ($this->nStateStack) { + for ($i = $this->nStateStack;$i >= 1;$i--) { + $this->restoreState($i); + } + } + + $this->numObj++; + + if ($insert) { + // the id from the ezPdf class is the id of the contents of the page, not the page object itself + // query that object to find the parent + $rid = $this->objects[$id]['onPage']; + $opt = array('rid' => $rid, 'pos' => $pos); + $this->o_page($this->numObj, 'new', $opt); + } else { + $this->o_page($this->numObj, 'new'); + } + + // if there is a stack saved, then put that onto the page + if ($this->nStateStack) { + for ($i = 1;$i <= $this->nStateStack;$i++) { + $this->saveState($i); + } + } + + // and if there has been a stroke or fill colour set, then transfer them + if (isset($this->currentColour)) { + $this->setColor($this->currentColour, true); + } + + if (isset($this->currentStrokeColour)) { + $this->setStrokeColor($this->currentStrokeColour, true); + } + + // if there is a line style set, then put this in too + if (mb_strlen($this->currentLineStyle, '8bit')) { + $this->objects[$this->currentContents]['c'].= "\n$this->currentLineStyle"; + } + + // the call to the o_page object set currentContents to the present page, so this can be returned as the page id + return $this->currentContents; + } + + + /** + * output the pdf code, streaming it to the browser + * the relevant headers are set so that hopefully the browser will recognise it + */ + function stream($options = '') { + // setting the options allows the adjustment of the headers + // values at the moment are: + // 'Content-Disposition' => 'filename' - sets the filename, though not too sure how well this will + // work as in my trial the browser seems to use the filename of the php file with .pdf on the end + // 'Accept-Ranges' => 1 or 0 - if this is not set to 1, then this header is not included, off by default + // this header seems to have caused some problems despite tha fact that it is supposed to solve + // them, so I am leaving it off by default. + // 'compress' = > 1 or 0 - apply content stream compression, this is on (1) by default + // 'Attachment' => 1 or 0 - if 1, force the browser to open a download dialog + if (!is_array($options)) { + $options = array(); + } + + if ( headers_sent()) + die("Unable to stream pdf: headers already sent"); + + $debug = empty($options['compression']); + $tmp = ltrim($this->output($debug)); + + header("Cache-Control: private"); + header("Content-type: application/pdf"); + + //FIXME: I don't know that this is sufficient for determining content length (i.e. what about transport compression?) + header("Content-Length: " . mb_strlen($tmp, '8bit')); + $fileName = (isset($options['Content-Disposition']) ? $options['Content-Disposition'] : 'file.pdf'); + + if ( !isset($options["Attachment"])) + $options["Attachment"] = true; + + $attachment = $options["Attachment"] ? "attachment" : "inline"; + + header("Content-Disposition: $attachment; filename=\"$fileName\""); + + if (isset($options['Accept-Ranges']) && $options['Accept-Ranges'] == 1) { + //FIXME: Is this the correct value ... spec says 1#range-unit + header("Accept-Ranges: " . mb_strlen($tmp, '8bit')); + } + + echo $tmp; + flush(); + } + + + /** + * return the height in units of the current font in the given size + */ + function getFontHeight($size) { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $font = $this->fonts[$this->currentFont]; + + // for the current font, and the given size, what is the height of the font in user units + if ( isset($font['Ascender']) && isset($font['Descender']) ) { + $h = $font['Ascender']-$font['Descender']; + } + else { + $h = $font['FontBBox'][3]-$font['FontBBox'][1]; + } + + // have to adjust by a font offset for Windows fonts. unfortunately it looks like + // the bounding box calculations are wrong and I don't know why. + if (isset($font['FontHeightOffset'])) { + // For CourierNew from Windows this needs to be -646 to match the + // Adobe native Courier font. + // + // For FreeMono from GNU this needs to be -337 to match the + // Courier font. + // + // Both have been added manually to the .afm and .ufm files. + $h += (int)$font['FontHeightOffset']; + } + + return $size*$h/1000; + } + + + /** + * return the font descender, this will normally return a negative number + * if you add this number to the baseline, you get the level of the bottom of the font + * it is in the pdf user units + */ + function getFontDescender($size) { + // note that this will most likely return a negative value + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + //$h = $this->fonts[$this->currentFont]['FontBBox'][1]; + $h = $this->fonts[$this->currentFont]['Descender']; + + return $size*$h/1000; + } + + + /** + * filter the text, this is applied to all text just before being inserted into the pdf document + * it escapes the various things that need to be escaped, and so on + * + * @access private + */ + function filterText($text, $bom = true, $convert_encoding = true) { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + if ($convert_encoding) { + $cf = $this->currentFont; + if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) { + //$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8'); + $text = $this->utf8toUtf16BE($text, $bom); + } else { + //$text = html_entity_decode($text, ENT_QUOTES); + $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8'); + } + } + + // the chr(13) substitution fixes a bug seen in TCPDF (bug #1421290) + return strtr($text, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r')); + } + + /** + * return array containing codepoints (UTF-8 character values) for the + * string passed in. + * + * based on the excellent TCPDF code by Nicola Asuni and the + * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html + * + * @access private + * @author Orion Richardson + * @since January 5, 2008 + * @param string $text UTF-8 string to process + * @return array UTF-8 codepoints array for the string + */ + function utf8toCodePointsArray(&$text) { + $length = mb_strlen($text, '8bit'); // http://www.php.net/manual/en/function.mb-strlen.php#77040 + $unicode = array(); // array containing unicode values + $bytes = array(); // array containing single character byte sequences + $numbytes = 1; // number of octetc needed to represent the UTF-8 character + + for ($i = 0; $i < $length; $i++) { + $c = ord($text[$i]); // get one string character at time + if (count($bytes) === 0) { // get starting octect + if ($c <= 0x7F) { + $unicode[] = $c; // use the character "as is" because is ASCII + $numbytes = 1; + } elseif (($c >> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN) + $bytes[] = ($c - 0xC0) << 0x06; + $numbytes = 2; + } elseif (($c >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN) + $bytes[] = ($c - 0xE0) << 0x0C; + $numbytes = 3; + } elseif (($c >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN) + $bytes[] = ($c - 0xF0) << 0x12; + $numbytes = 4; + } else { + // use replacement character for other invalid sequences + $unicode[] = 0xFFFD; + $bytes = array(); + $numbytes = 1; + } + } elseif (($c >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN + $bytes[] = $c - 0x80; + if (count($bytes) === $numbytes) { + // compose UTF-8 bytes to a single unicode value + $c = $bytes[0]; + for ($j = 1; $j < $numbytes; $j++) { + $c += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); + } + if ((($c >= 0xD800) AND ($c <= 0xDFFF)) OR ($c >= 0x10FFFF)) { + // The definition of UTF-8 prohibits encoding character numbers between + // U+D800 and U+DFFF, which are reserved for use with the UTF-16 + // encoding form (as surrogate pairs) and do not directly represent + // characters. + $unicode[] = 0xFFFD; // use replacement character + } else { + $unicode[] = $c; // add char to array + } + // reset data for next char + $bytes = array(); + $numbytes = 1; + } + } else { + // use replacement character for other invalid sequences + $unicode[] = 0xFFFD; + $bytes = array(); + $numbytes = 1; + } + } + return $unicode; + } + + /** + * convert UTF-8 to UTF-16 with an additional byte order marker + * at the front if required. + * + * based on the excellent TCPDF code by Nicola Asuni and the + * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html + * + * @access private + * @author Orion Richardson + * @since January 5, 2008 + * @param string $text UTF-8 string to process + * @param boolean $bom whether to add the byte order marker + * @return string UTF-16 result string + */ + function utf8toUtf16BE(&$text, $bom = true) { + $cf = $this->currentFont; + if (!$this->fonts[$cf]['isUnicode']) return $text; + $out = $bom ? "\xFE\xFF" : ''; + + $unicode = $this->utf8toCodePointsArray($text); + foreach ($unicode as $c) { + if ($c === 0xFFFD) { + $out .= "\xFF\xFD"; // replacement character + } elseif ($c < 0x10000) { + $out .= chr($c >> 0x08) . chr($c & 0xFF); + } else { + $c -= 0x10000; + $w1 = 0xD800 | ($c >> 0x10); + $w2 = 0xDC00 | ($c & 0x3FF); + $out .= chr($w1 >> 0x08) . chr($w1 & 0xFF) . chr($w2 >> 0x08) . chr($w2 & 0xFF); + } + } + return $out; + } + + + /** + * given a start position and information about how text is to be laid out, calculate where + * on the page the text will end + * + * @access private + */ + function PRVTgetTextPosition($x, $y, $angle, $size, $wa, $text) { + // given this information return an array containing x and y for the end position as elements 0 and 1 + $w = $this->getTextWidth($size, $text); + + // need to adjust for the number of spaces in this text + $words = explode(' ', $text); + $nspaces = count($words) -1; + $w+= $wa*$nspaces; + $a = deg2rad((float)$angle); + + return array(cos($a) *$w+$x, -sin($a) *$w+$y); + } + + + /** + * wrapper function for PRVTcheckTextDirective1 + * + * @access private + */ + function PRVTcheckTextDirective(&$text, $i, &$f) { + return 0; + $x = 0; + $y = 0; + return $this->PRVTcheckTextDirective1($text, $i, $f, 0, $x, $y); + } + + + /** + * checks if the text stream contains a control directive + * if so then makes some changes and returns the number of characters involved in the directive + * this has been re-worked to include everything neccesary to find the current writing point, so that + * the location can be sent to the callback function if required + * if the directive does not require a font change, then $f should be set to 0 + * + * @access private + */ + function PRVTcheckTextDirective1(&$text, $i, &$f, $final, &$x, &$y, $size = 0, $angle = 0, $wordSpaceAdjust = 0) { + return 0; + $directive = 0; + $j = $i; + if ($text[$j] === '<') { + $j++; + switch ($text[$j]) { + case '/': + $j++; + if (mb_strlen($text) <= $j) { + return $directive; + } + + switch ($text[$j]) { + case 'b': + case 'i': + $j++; + if ($text[$j] === '>') { + $p = mb_strrpos($this->currentTextState, $text[$j-1]); + + if ($p !== false) { + // then there is one to remove + $this->currentTextState = mb_substr($this->currentTextState, 0, $p) .substr($this->currentTextState, $p+1); + } + + $directive = $j-$i+1; + } + break; + + case 'c': + // this this might be a callback function + $j++; + $k = mb_strpos($text, '>', $j); + + if ($k !== false && $text[$j] === ':') { + // then this will be treated as a callback directive + $directive = $k-$i+1; + $f = 0; + // split the remainder on colons to get the function name and the paramater + $tmp = mb_substr($text, $j+1, $k-$j-1); + $b1 = mb_strpos($tmp, ':'); + + if ($b1 !== false) { + $func = mb_substr($tmp, 0, $b1); + $parm = mb_substr($tmp, $b1+1); + } else { + $func = $tmp; + $parm = ''; + } + + if (!isset($func) || !mb_strlen(trim($func), '8bit')) { + $directive = 0; + } else { + // only call the function if this is the final call + if ($final) { + // need to assess the text position, calculate the text width to this point + // can use getTextWidth to find the text width I think + $tmp = $this->PRVTgetTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, mb_substr($text, 0, $i)); + + $info = array('x' => $tmp[0], 'y' => $tmp[1], 'angle' => $angle, 'status' => 'end', 'p' => $parm, 'nCallback' => $this->nCallback); + $x = $tmp[0]; + $y = $tmp[1]; + $ret = $this->$func($info); + + if (is_array($ret)) { + // then the return from the callback function could set the position, to start with, later will do font colour, and font + foreach($ret as $rk => $rv) { + switch ($rk) { + case 'x': + case 'y': + $$rk = $rv; + break; + } + } + } + + // also remove from to the stack + // for simplicity, just take from the end, fix this another day + $this->nCallback--; + if ($this->nCallback<0) { + $this->nCallBack = 0; + } + } + } + } + break; + } + break; + + case 'b': + case 'i': + $j++; + if ($text[$j] === '>') { + $this->currentTextState.= $text[$j-1]; + $directive = $j-$i+1; + } + break; + + case 'C': + $noClose = 1; + case 'c': + // this this might be a callback function + $j++; + $k = mb_strpos($text, '>', $j); + + if ($k !== false && $text[$j] === ':') { + // then this will be treated as a callback directive + $directive = $k-$i+1; + + $f = 0; + + // split the remainder on colons to get the function name and the paramater + // $bits = explode(':',substr($text,$j+1,$k-$j-1)); + $tmp = mb_substr($text, $j+1, $k-$j-1); + $b1 = mb_strpos($tmp, ':'); + + if ($b1 !== false) { + $func = mb_substr($tmp, 0, $b1); + $parm = mb_substr($tmp, $b1+1); + } else { + $func = $tmp; + $parm = ''; + } + + if (!isset($func) || !mb_strlen(trim($func), '8bit')) { + $directive = 0; + } else { + // only call the function if this is the final call, ie, the one actually doing printing, not measurement + if ($final) { + // need to assess the text position, calculate the text width to this point + // can use getTextWidth to find the text width I think + // also add the text height and descender + $tmp = $this->PRVTgetTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, mb_substr($text, 0, $i)); + + $info = array( + 'x' => $tmp[0], + 'y' => $tmp[1], + 'angle' => $angle, + 'status' => 'start', + 'p' => $parm, + 'f' => $func, + 'height' => $this->getFontHeight($size), + 'descender' => $this->getFontDescender($size) + ); + $x = $tmp[0]; + $y = $tmp[1]; + + if (!isset($noClose) || !$noClose) { + // only add to the stack if this is a small 'c', therefore is a start-stop pair + $this->nCallback++; + $info['nCallback'] = $this->nCallback; + $this->callback[$this->nCallback] = $info; + } + + $ret = $this->$func($info); + if (is_array($ret)) { + // then the return from the callback function could set the position, to start with, later will do font colour, and font + foreach($ret as $rk => $rv) { + switch ($rk) { + case 'x': + case 'y': + $$rk = $rv; + break; + } + } + } + } + } + } + break; + } + } + + return $directive; + } + + function toUpper($matches) { + return mb_strtoupper($matches[0]); + } + + + /** + * add text to the document, at a specified location, size and angle on the page + */ + function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false) { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + if ($smallCaps) { + $text = preg_replace_callback("/\p{Ll}/u", array($this, "toUpper"), $text); + } + + // if there are any open callbacks, then they should be called, to show the start of the line + if ($this->nCallback>0) { + for ($i = $this->nCallback;$i>0;$i--) { + // call each function + $info = array('x' => $x, + 'y' => $y, + 'angle' => $angle, + 'status' => 'sol', + 'p' => $this->callback[$i]['p'], + 'nCallback' => $this->callback[$i]['nCallback'], + 'height' => $this->callback[$i]['height'], + 'descender' => $this->callback[$i]['descender']); + + $func = $this->callback[$i]['f']; + $this->$func($info); + } + } + + if ($angle == 0) { + $this->objects[$this->currentContents]['c'].= sprintf("\nBT %.3F %.3F Td", $x, $y); + } else { + $a = deg2rad((float)$angle); + $this->objects[$this->currentContents]['c'].= + sprintf("\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm", cos($a), -sin($a), sin($a), cos($a), $x, $y); + } + + if ($wordSpaceAdjust != 0 || $wordSpaceAdjust != $this->wordSpaceAdjust) { + $this->wordSpaceAdjust = $wordSpaceAdjust; + $this->objects[$this->currentContents]['c'].= sprintf(" %.3F Tw", $wordSpaceAdjust); + } + + if ($charSpaceAdjust != 0 || $charSpaceAdjust != $this->charSpaceAdjust) { + $this->charSpaceAdjust = $charSpaceAdjust; + $this->objects[$this->currentContents]['c'].= sprintf(" %.3F Tc", $charSpaceAdjust); + } + + $len = mb_strlen($text); + $start = 0; + + /* + for ($i = 0;$i<$len;$i++){ + $f = 1; + $directive = 0; //$this->PRVTcheckTextDirective($text,$i,$f); + if ($directive){ + // then we should write what we need to + if ($i>$start){ + $part = mb_substr($text,$start,$i-$start); + $this->objects[$this->currentContents]['c'] .= ' /F'.$this->currentFontNum.' '.sprintf('%.1F',$size).' Tf '; + $this->objects[$this->currentContents]['c'] .= ' ('.$this->filterText($part, false).') Tj'; + } + if ($f){ + // then there was nothing drastic done here, restore the contents + $this->setCurrentFont(); + } else { + $this->objects[$this->currentContents]['c'] .= ' ET'; + $f = 1; + $xp = $x; + $yp = $y; + $directive = 0; //$this->PRVTcheckTextDirective1($text,$i,$f,1,$xp,$yp,$size,$angle,$wordSpaceAdjust); + + // restart the text object + if ($angle == 0){ + $this->objects[$this->currentContents]['c'] .= "\n".'BT '.sprintf('%.3F',$xp).' '.sprintf('%.3F',$yp).' Td'; + } else { + $a = deg2rad((float)$angle); + $tmp = "\n".'BT '; + $tmp .= sprintf('%.3F',cos($a)).' '.sprintf('%.3F',(-1.0*sin($a))).' '.sprintf('%.3F',sin($a)).' '.sprintf('%.3F',cos($a)).' '; + $tmp .= sprintf('%.3F',$xp).' '.sprintf('%.3F',$yp).' Tm'; + $this->objects[$this->currentContents]['c'] .= $tmp; + } + if ($wordSpaceAdjust != 0 || $wordSpaceAdjust != $this->wordSpaceAdjust){ + $this->wordSpaceAdjust = $wordSpaceAdjust; + $this->objects[$this->currentContents]['c'] .= ' '.sprintf('%.3F',$wordSpaceAdjust).' Tw'; + } + } + // and move the writing point to the next piece of text + $i = $i+$directive-1; + $start = $i+1; + } + + } + */ + if ($start < $len) { + $part = $text; // OAR - Don't need this anymore, given that $start always equals zero. substr($text, $start); + $place_text = $this->filterText($part, false); + // modify unicode text so that extra word spacing is manually implemented (bug #) + $cf = $this->currentFont; + if ($this->fonts[$cf]['isUnicode'] && $wordSpaceAdjust != 0) { + $space_scale = 1000 / $size; + //$place_text = str_replace(' ', ') ( ) '.($this->getTextWidth($size, chr(32), $wordSpaceAdjust)*-75).' (', $place_text); + $place_text = str_replace(' ', ' ) '.(-round($space_scale*$wordSpaceAdjust)).' (', $place_text); + } + $this->objects[$this->currentContents]['c'].= " /F$this->currentFontNum ".sprintf('%.1F Tf ', $size); + $this->objects[$this->currentContents]['c'].= " [($place_text)] TJ"; + } + + $this->objects[$this->currentContents]['c'].= ' ET'; + + // if there are any open callbacks, then they should be called, to show the end of the line + if ($this->nCallback>0) { + for ($i = $this->nCallback;$i>0;$i--) { + // call each function + $tmp = $this->PRVTgetTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text); + $info = array( + 'x' => $tmp[0], + 'y' => $tmp[1], + 'angle' => $angle, + 'status' => 'eol', + 'p' => $this->callback[$i]['p'], + 'nCallback' => $this->callback[$i]['nCallback'], + 'height' => $this->callback[$i]['height'], + 'descender' => $this->callback[$i]['descender'] + ); + $func = $this->callback[$i]['f']; + $this->$func($info); + } + } + } + + + /** + * calculate how wide a given text string will be on a page, at a given size. + * this can be called externally, but is alse used by the other class functions + */ + function getTextWidth($size, $text, $word_spacing = 0, $char_spacing = 0) { + // this function should not change any of the settings, though it will need to + // track any directives which change during calculation, so copy them at the start + // and put them back at the end. + $store_currentTextState = $this->currentTextState; + + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + // converts a number or a float to a string so it can get the width + $text = "$text"; + + // hmm, this is where it all starts to get tricky - use the font information to + // calculate the width of each character, add them up and convert to user units + $w = 0; + $cf = $this->currentFont; + $current_font = $this->fonts[$cf]; + $space_scale = 1000 / $size; + $n_spaces = 0; + + if ( $current_font['isUnicode']) { + // for Unicode, use the code points array to calculate width rather + // than just the string itself + $unicode = $this->utf8toCodePointsArray($text); + + foreach ($unicode as $char) { + // check if we have to replace character + if ( isset($current_font['differences'][$char])) { + $char = $current_font['differences'][$char]; + } + + if ( isset($current_font['C'][$char]) ) { + $char_width = $current_font['C'][$char]; + + // add the character width + $w += $char_width; + + // add additional padding for space + if ( isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space' ) { // Space + $w += $word_spacing * $space_scale; + $n_spaces++; + } + } + } + + // add additionnal char spacing + if ( $char_spacing != 0 ) { + $w += $char_spacing * $space_scale * (count($unicode) + $n_spaces); + } + + } else { + // If CPDF is in Unicode mode but the current font does not support Unicode we need to convert the character set to Windows-1252 + if ( $this->isUnicode ) { + $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8'); + } + + $len = mb_strlen($text, 'Windows-1252'); + + for ($i = 0; $i < $len; $i++) { + $char = ord($text[$i]); + + // check if we have to replace character + if ( isset($current_font['differences'][$char])) { + $char = $current_font['differences'][$char]; + } + + if ( isset($current_font['C'][$char]) ) { + $char_width = $current_font['C'][$char]; + + // add the character width + $w += $char_width; + + // add additional padding for space + if ( isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space' ) { // Space + $w += $word_spacing * $space_scale; + $n_spaces++; + } + } + } + + // add additionnal char spacing + if ( $char_spacing != 0 ) { + $w += $char_spacing * $space_scale * ($len + $n_spaces); + } + } + + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + return $w*$size/1000; + } + + + /** + * do a part of the calculation for sorting out the justification of the text + * + * @access private + */ + function PRVTadjustWrapText($text, $actual, $width, &$x, &$adjust, $justification) { + switch ($justification) { + case 'left': + return; + + case 'right': + $x+= $width-$actual; + break; + + case 'center': + case 'centre': + $x+= ($width-$actual) /2; + break; + + case 'full': + // count the number of words + $words = explode(' ', $text); + $nspaces = count($words) -1; + + if ($nspaces>0) { + $adjust = ($width-$actual) /$nspaces; + } else { + $adjust = 0; + } + break; + } + } + + + /** + * add text to the page, but ensure that it fits within a certain width + * if it does not fit then put in as much as possible, splitting at word boundaries + * and return the remainder. + * justification and angle can also be specified for the text + */ + function addTextWrap($x, $y, $width, $size, $text, $justification = 'left', $angle = 0, $test = 0) { + // TODO - need to support Unicode + $cf = $this->currentFont; + if ($this->fonts[$cf]['isUnicode']) { + die("addTextWrap does not support Unicode yet!"); + } + + // this will display the text, and if it goes beyond the width $width, will backtrack to the + // previous space or hyphen, and return the remainder of the text. + + // $justification can be set to 'left','right','center','centre','full' + + // need to store the initial text state, as this will change during the width calculation + // but will need to be re-set before printing, so that the chars work out right + $store_currentTextState = $this->currentTextState; + + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + if ($width <= 0) { + // error, pretend it printed ok, otherwise risking a loop + return ''; + } + + $w = 0; + $break = 0; + $breakWidth = 0; + $len = mb_strlen($text); + $cf = $this->currentFont; + $tw = $width/$size*1000; + + for ($i = 0;$i<$len;$i++) { + $f = 1; + $directive = 0; + //$this->PRVTcheckTextDirective($text,$i,$f); + if ($directive) { + if ($f) { + $this->setCurrentFont(); + $cf = $this->currentFont; + } + + $i = $i+$directive-1; + } else { + $cOrd = ord($text[$i]); + + if (isset($this->fonts[$cf]['differences'][$cOrd])) { + // then this character is being replaced by another + $cOrd2 = $this->fonts[$cf]['differences'][$cOrd]; + } else { + $cOrd2 = $cOrd; + } + + if (isset($this->fonts[$cf]['C'][$cOrd2])) { + $w+= $this->fonts[$cf]['C'][$cOrd2]; + } + + if ($w>$tw) { + // then we need to truncate this line + if ($break>0) { + // then we have somewhere that we can split :) + if ($text[$break] === ' ') { + $tmp = mb_substr($text, 0, $break); + } else { + $tmp = mb_substr($text, 0, $break+1); + } + + $adjust = 0; + $this->PRVTadjustWrapText($tmp, $breakWidth, $width, $x, $adjust, $justification); + + // reset the text state + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + if (!$test) { + $this->addText($x, $y, $size, $tmp, $angle, $adjust); + } + + return mb_substr($text, $break+1); + } else { + // just split before the current character + $tmp = mb_substr($text, 0, $i); + $adjust = 0; + $ctmp = ord($text[$i]); + + if (isset($this->fonts[$cf]['differences'][$ctmp])) { + $ctmp = $this->fonts[$cf]['differences'][$ctmp]; + } + + $tmpw = ($w-$this->fonts[$cf]['C'][$ctmp]) *$size/1000; + $this->PRVTadjustWrapText($tmp, $tmpw, $width, $x, $adjust, $justification); + + // reset the text state + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + if (!$test) { + $this->addText($x, $y, $size, $tmp, $angle, $adjust); + } + + return mb_substr($text, $i); + } + } + + if ($text[$i] === '-') { + $break = $i; + $breakWidth = $w*$size/1000; + } + + if ($text[$i] === ' ') { + $break = $i; + $ctmp = ord($text[$i]); + + if (isset($this->fonts[$cf]['differences'][$ctmp])) { + $ctmp = $this->fonts[$cf]['differences'][$ctmp]; + } + + $breakWidth = ($w-$this->fonts[$cf]['C'][$ctmp]) *$size/1000; + } + } + } + + // then there was no need to break this line + if ($justification === 'full') { + $justification = 'left'; + } + + $adjust = 0; + $tmpw = $w*$size/1000; + + $this->PRVTadjustWrapText($text, $tmpw, $width, $x, $adjust, $justification); + + // reset the text state + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + if (!$test) { + $this->addText($x, $y, $size, $text, $angle, $adjust); + } + + return ''; + } + + + /** + * this will be called at a new page to return the state to what it was on the + * end of the previous page, before the stack was closed down + * This is to get around not being able to have open 'q' across pages + * + */ + function saveState($pageEnd = 0) { + if ($pageEnd) { + // this will be called at a new page to return the state to what it was on the + // end of the previous page, before the stack was closed down + // This is to get around not being able to have open 'q' across pages + $opt = $this->stateStack[$pageEnd]; + // ok to use this as stack starts numbering at 1 + $this->setColor($opt['col'], true); + $this->setStrokeColor($opt['str'], true); + $this->objects[$this->currentContents]['c'].= "\n".$opt['lin']; + // $this->currentLineStyle = $opt['lin']; + } else { + $this->nStateStack++; + $this->stateStack[$this->nStateStack] = array( + 'col' => $this->currentColour, + 'str' => $this->currentStrokeColour, + 'lin' => $this->currentLineStyle + ); + } + + $this->save(); + } + + + /** + * restore a previously saved state + */ + function restoreState($pageEnd = 0) { + if (!$pageEnd) { + $n = $this->nStateStack; + $this->currentColour = $this->stateStack[$n]['col']; + $this->currentStrokeColour = $this->stateStack[$n]['str']; + $this->objects[$this->currentContents]['c'].= "\n".$this->stateStack[$n]['lin']; + $this->currentLineStyle = $this->stateStack[$n]['lin']; + $this->stateStack[$n] = null; + unset($this->stateStack[$n]); + $this->nStateStack--; + } + + $this->restore(); + } + + + /** + * make a loose object, the output will go into this object, until it is closed, then will revert to + * the current one. + * this object will not appear until it is included within a page. + * the function will return the object number + */ + function openObject() { + $this->nStack++; + $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage); + // add a new object of the content type, to hold the data flow + $this->numObj++; + $this->o_contents($this->numObj, 'new'); + $this->currentContents = $this->numObj; + $this->looseObjects[$this->numObj] = 1; + + return $this->numObj; + } + + + /** + * open an existing object for editing + */ + function reopenObject($id) { + $this->nStack++; + $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage); + $this->currentContents = $id; + + // also if this object is the primary contents for a page, then set the current page to its parent + if (isset($this->objects[$id]['onPage'])) { + $this->currentPage = $this->objects[$id]['onPage']; + } + } + + + /** + * close an object + */ + function closeObject() { + // close the object, as long as there was one open in the first place, which will be indicated by + // an objectId on the stack. + if ($this->nStack>0) { + $this->currentContents = $this->stack[$this->nStack]['c']; + $this->currentPage = $this->stack[$this->nStack]['p']; + $this->nStack--; + // easier to probably not worry about removing the old entries, they will be overwritten + // if there are new ones. + } + } + + + /** + * stop an object from appearing on pages from this point on + */ + function stopObject($id) { + // if an object has been appearing on pages up to now, then stop it, this page will + // be the last one that could contian it. + if (isset($this->addLooseObjects[$id])) { + $this->addLooseObjects[$id] = ''; + } + } + + + /** + * after an object has been created, it wil only show if it has been added, using this function. + */ + function addObject($id, $options = 'add') { + // add the specified object to the page + if (isset($this->looseObjects[$id]) && $this->currentContents != $id) { + // then it is a valid object, and it is not being added to itself + switch ($options) { + case 'all': + // then this object is to be added to this page (done in the next block) and + // all future new pages. + $this->addLooseObjects[$id] = 'all'; + + case 'add': + if (isset($this->objects[$this->currentContents]['onPage'])) { + // then the destination contents is the primary for the page + // (though this object is actually added to that page) + $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id); + } + break; + + case 'even': + $this->addLooseObjects[$id] = 'even'; + $pageObjectId = $this->objects[$this->currentContents]['onPage']; + if ($this->objects[$pageObjectId]['info']['pageNum']%2 == 0) { + $this->addObject($id); + // hacky huh :) + } + break; + + case 'odd': + $this->addLooseObjects[$id] = 'odd'; + $pageObjectId = $this->objects[$this->currentContents]['onPage']; + if ($this->objects[$pageObjectId]['info']['pageNum']%2 == 1) { + $this->addObject($id); + // hacky huh :) + } + break; + + case 'next': + $this->addLooseObjects[$id] = 'all'; + break; + + case 'nexteven': + $this->addLooseObjects[$id] = 'even'; + break; + + case 'nextodd': + $this->addLooseObjects[$id] = 'odd'; + break; + } + } + } + + + /** + * return a storable representation of a specific object + */ + function serializeObject($id) { + if ( array_key_exists($id, $this->objects)) + return var_export($this->objects[$id], true); + } + + + /** + * restore an object from its stored representation. returns its new object id. + */ + function restoreSerializedObject($obj) { + $obj_id = $this->openObject(); + eval('$this->objects[$obj_id] = ' . $obj . ';'); + $this->closeObject(); + return $obj_id; + } + + + /** + * add content to the documents info object + */ + function addInfo($label, $value = 0) { + // this will only work if the label is one of the valid ones. + // modify this so that arrays can be passed as well. + // if $label is an array then assume that it is key => value pairs + // else assume that they are both scalar, anything else will probably error + if (is_array($label)) { + foreach ($label as $l => $v) { + $this->o_info($this->infoObject, $l, $v); + } + } else { + $this->o_info($this->infoObject, $label, $value); + } + } + + + /** + * set the viewer preferences of the document, it is up to the browser to obey these. + */ + function setPreferences($label, $value = 0) { + // this will only work if the label is one of the valid ones. + if (is_array($label)) { + foreach ($label as $l => $v) { + $this->o_catalog($this->catalogId, 'viewerPreferences', array($l => $v)); + } + } else { + $this->o_catalog($this->catalogId, 'viewerPreferences', array($label => $value)); + } + } + + + /** + * extract an integer from a position in a byte stream + * + * @access private + */ + function PRVT_getBytes(&$data, $pos, $num) { + // return the integer represented by $num bytes from $pos within $data + $ret = 0; + for ($i = 0;$i<$num;$i++) { + $ret = $ret*256; + $ret+= ord($data[$pos+$i]); + } + + return $ret; + } + + + /** + * add a PNG image into the document, from a GD object + * this should work with remote files + * + * @param string $file The PNG file + * @param float $x X position + * @param float $y Y position + * @param float $w Width + * @param float $h Height + * @param resource $img A GD resource + * @param bool $is_mask true if the image is a mask + * @param bool $mask true if the image is masked + */ + function addImagePng($file, $x, $y, $w = 0, $h = 0, &$img, $is_mask = false, $mask = null) { + //if already cached, need not to read again + if ( isset($this->imagelist[$file]) ) { + $data = null; + } else { + // Example for transparency handling on new image. Retain for current image + // $tIndex = imagecolortransparent($img); + // if ($tIndex > 0) { + // $tColor = imagecolorsforindex($img, $tIndex); + // $new_tIndex = imagecolorallocate($new_img, $tColor['red'], $tColor['green'], $tColor['blue']); + // imagefill($new_img, 0, 0, $new_tIndex); + // imagecolortransparent($new_img, $new_tIndex); + // } + // blending mode (literal/blending) on drawing into current image. not relevant when not saved or not drawn + //imagealphablending($img, true); + + //default, but explicitely set to ensure pdf compatibility + imagesavealpha($img, false/*!$is_mask && !$mask*/); + + $error = 0; + //DEBUG_IMG_TEMP + //debugpng + if (DEBUGPNG) print '[addImagePng '.$file.']'; + + ob_start(); + @imagepng($img); + $data = ob_get_clean(); + + if ($data == '') { + $error = 1; + $errormsg = 'trouble writing file from GD'; + //DEBUG_IMG_TEMP + //debugpng + if (DEBUGPNG) print 'trouble writing file from GD'; + } + + if ($error) { + $this->addMessage('PNG error - ('.$file.') '.$errormsg); + return; + } + } //End isset($this->imagelist[$file]) (png Duplicate removal) + + $this->addPngFromBuf($file, $x, $y, $w, $h, $data, $is_mask, $mask); + } + + protected function addImagePngAlpha($file, $x, $y, $w, $h, $byte) { + // generate images + $img = imagecreatefrompng($file); + + if ($img === false) { + return; + } + + $wpx = imagesx($img); + $hpx = imagesy($img); + + imagesavealpha($img, false); + + $imgalpha = imagecreate($wpx, $hpx); + imagesavealpha($imgalpha, false); + + // generate gray scale palette (0 -> 255) + for ($c = 0; $c < 256; ++$c) { + imagecolorallocate($imgalpha, $c, $c, $c); + } + + // FIXME The pixel transformation doesn't work well with 8bit PNGs + $eight_bit = ($byte & 4) !== 4; + + // allocated colors cache + $allocated_colors = array(); + + // extract alpha channel + for ($xpx = 0; $xpx < $wpx; ++$xpx) { + for ($ypx = 0; $ypx < $hpx; ++$ypx) { + $color = imagecolorat($img, $xpx, $ypx); + $col = imagecolorsforindex($img, $color); + $alpha = $col['alpha']; + + if ($eight_bit) { + // with gamma correction + $gammacorr = 2.2; + $pixel = pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255; + } + + else { + // without gamma correction + $pixel = (127 - $alpha) * 2; + + $key = implode("-", array($col['red'], $col['green'], $col['blue'])); + + if (!isset($allocated_colors[$key])) { + $pixel_img = imagecolorallocate($img, $col['red'], $col['green'], $col['blue']); + $allocated_colors[$key] = $pixel_img; + } + else { + $pixel_img = $allocated_colors[$key]; + } + + imagesetpixel($img, $xpx, $ypx, $pixel_img); + } + + imagesetpixel($imgalpha, $xpx, $ypx, $pixel); + } + } + + // create temp alpha file + $tempfile_alpha = tempnam($this->tmp, "cpdf_img_").'.png'; + imagepng($imgalpha, $tempfile_alpha); + + // extract image without alpha channel + $imgplain = imagecreatetruecolor($wpx, $hpx); + imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx); + imagedestroy($img); + + // create temp image file + $tempfile_plain = tempnam($this->tmp, "cpdf_img_").'.png'; + imagepng($imgplain, $tempfile_plain); + + // embed mask image + $this->addImagePng($tempfile_alpha, $x, $y, $w, $h, $imgalpha, true); + imagedestroy($imgalpha); + + // embed image, masked with previously embedded mask + $this->addImagePng($tempfile_plain, $x, $y, $w, $h, $imgplain, false, true); + imagedestroy($imgplain); + + // remove temp files + unlink($tempfile_alpha); + unlink($tempfile_plain); + } + + + /** + * add a PNG image into the document, from a file + * this should work with remote files + */ + function addPngFromFile($file, $x, $y, $w = 0, $h = 0) { + //if already cached, need not to read again + if ( isset($this->imagelist[$file]) ) { + $img = null; + } + + else { + $byte = ord (file_get_contents ($file, false, null, 25, 1)); + $is_alpha = ($byte & 6); // 6 => 32b, 4 => 8b + + if ($is_alpha) { // exclude grayscale alpha + return $this->addImagePngAlpha($file, $x, $y, $w, $h, $byte); + } + + //png files typically contain an alpha channel. + //pdf file format or class.pdf does not support alpha blending. + //on alpha blended images, more transparent areas have a color near black. + //This appears in the result on not storing the alpha channel. + //Correct would be the box background image or its parent when transparent. + //But this would make the image dependent on the background. + //Therefore create an image with white background and copy in + //A more natural background than black is white. + //Therefore create an empty image with white background and merge the + //image in with alpha blending. + $imgtmp = @imagecreatefrompng($file); + if (!$imgtmp) { + return; + } + $sx = imagesx($imgtmp); + $sy = imagesy($imgtmp); + $img = imagecreatetruecolor($sx,$sy); + imagealphablending($img, true); + + // @todo is it still needed ?? + $ti = imagecolortransparent($imgtmp); + if ($ti >= 0) { + $tc = imagecolorsforindex($imgtmp,$ti); + $ti = imagecolorallocate($img,$tc['red'],$tc['green'],$tc['blue']); + imagefill($img,0,0,$ti); + imagecolortransparent($img, $ti); + } else { + imagefill($img,1,1,imagecolorallocate($img,255,255,255)); + } + + imagecopy($img,$imgtmp,0,0,0,0,$sx,$sy); + imagedestroy($imgtmp); + } + $this->addImagePng($file, $x, $y, $w, $h, $img); + imagedestroy($img); + } + + + /** + * add a PNG image into the document, from a memory buffer of the file + */ + function addPngFromBuf($file, $x, $y, $w = 0, $h = 0, &$data, $is_mask = false, $mask = null) { + if ( isset($this->imagelist[$file]) ) { + //debugpng + //if (DEBUGPNG) print '[addPngFromBuf Duplicate '.$file.']'; + $data = null; + $info['width'] = $this->imagelist[$file]['w']; + $info['height'] = $this->imagelist[$file]['h']; + $label = $this->imagelist[$file]['label']; + } + + else { + if ($data == null) { + $this->addMessage('addPngFromBuf error - ('.$imgname.') data not present!'); + return; + } + //debugpng + //if (DEBUGPNG) print '[addPngFromBuf file='.$file.']'; + $error = 0; + + if (!$error) { + $header = chr(137) .chr(80) .chr(78) .chr(71) .chr(13) .chr(10) .chr(26) .chr(10); + if (mb_substr($data, 0, 8, '8bit') != $header) { + $error = 1; + //debugpng + if (DEBUGPNG) print '[addPngFromFile this file does not have a valid header '.$file.']'; + + $errormsg = 'this file does not have a valid header'; + } + } + + if (!$error) { + // set pointer + $p = 8; + $len = mb_strlen($data, '8bit'); + + // cycle through the file, identifying chunks + $haveHeader = 0; + $info = array(); + $idata = ''; + $pdata = ''; + + while ($p < $len) { + $chunkLen = $this->PRVT_getBytes($data, $p, 4); + $chunkType = mb_substr($data, $p+4, 4, '8bit'); + // echo $chunkType.' - '.$chunkLen.'
'; + switch ($chunkType) { + case 'IHDR': + // this is where all the file information comes from + $info['width'] = $this->PRVT_getBytes($data, $p+8, 4); + $info['height'] = $this->PRVT_getBytes($data, $p+12, 4); + $info['bitDepth'] = ord($data[$p+16]); + $info['colorType'] = ord($data[$p+17]); + $info['compressionMethod'] = ord($data[$p+18]); + $info['filterMethod'] = ord($data[$p+19]); + $info['interlaceMethod'] = ord($data[$p+20]); + + //print_r($info); + $haveHeader = 1; + if ($info['compressionMethod'] != 0) { + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile unsupported compression method '.$file.']'; + + $errormsg = 'unsupported compression method'; + } + + if ($info['filterMethod'] != 0) { + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile unsupported filter method '.$file.']'; + + $errormsg = 'unsupported filter method'; + } + break; + + case 'PLTE': + $pdata.= mb_substr($data, $p+8, $chunkLen, '8bit'); + break; + + case 'IDAT': + $idata.= mb_substr($data, $p+8, $chunkLen, '8bit'); + break; + + case 'tRNS': + //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk + //print "tRNS found, color type = ".$info['colorType']."\n"; + $transparency = array(); + + if ($info['colorType'] == 3) { + // indexed color, rbg + /* corresponding to entries in the plte chunk + Alpha for palette index 0: 1 byte + Alpha for palette index 1: 1 byte + ...etc... + */ + // there will be one entry for each palette entry. up until the last non-opaque entry. + // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent) + $transparency['type'] = 'indexed'; + $numPalette = mb_strlen($pdata, '8bit')/3; + $trans = 0; + + for ($i = $chunkLen;$i >= 0;$i--) { + if (ord($data[$p+8+$i]) == 0) { + $trans = $i; + } + } + + $transparency['data'] = $trans; + } elseif ($info['colorType'] == 0) { + // grayscale + /* corresponding to entries in the plte chunk + Gray: 2 bytes, range 0 .. (2^bitdepth)-1 + */ + // $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale + $transparency['type'] = 'indexed'; + + $transparency['data'] = ord($data[$p+8+1]); + } elseif ($info['colorType'] == 2) { + // truecolor + /* corresponding to entries in the plte chunk + Red: 2 bytes, range 0 .. (2^bitdepth)-1 + Green: 2 bytes, range 0 .. (2^bitdepth)-1 + Blue: 2 bytes, range 0 .. (2^bitdepth)-1 + */ + $transparency['r'] = $this->PRVT_getBytes($data, $p+8, 2); + // r from truecolor + $transparency['g'] = $this->PRVT_getBytes($data, $p+10, 2); + // g from truecolor + $transparency['b'] = $this->PRVT_getBytes($data, $p+12, 2); + // b from truecolor + + $transparency['type'] = 'color-key'; + + } else { + //unsupported transparency type + //debugpng + if (DEBUGPNG) print '[addPngFromFile unsupported transparency type '.$file.']'; + } + // KS End new code + break; + + default: + break; + } + + $p+= $chunkLen+12; + } + + + if (!$haveHeader) { + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile information header is missing '.$file.']'; + + $errormsg = 'information header is missing'; + } + + if (isset($info['interlaceMethod']) && $info['interlaceMethod']) { + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile no support for interlaced images in pdf '.$file.']'; + + $errormsg = 'There appears to be no support for interlaced images in pdf.'; + } + } + + if (!$error && $info['bitDepth'] > 8) { + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile bit depth of 8 or less is supported '.$file.']'; + + $errormsg = 'only bit depth of 8 or less is supported'; + } + + if (!$error) { + switch ($info['colorType']) { + case 3: + $color = 'DeviceRGB'; + $ncolor = 1; + break; + + case 2: + $color = 'DeviceRGB'; + $ncolor = 3; + break; + + case 0: + $color = 'DeviceGray'; + $ncolor = 1; + break; + + default: + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile alpha channel not supported: '.$info['colorType'].' '.$file.']'; + + $errormsg = 'transparancey alpha channel not supported, transparency only supported for palette images.'; + } + } + + if ($error) { + $this->addMessage('PNG error - ('.$file.') '.$errormsg); + return; + } + + //print_r($info); + // so this image is ok... add it in. + $this->numImages++; + $im = $this->numImages; + $label = 'I'.$im; + $this->numObj++; + + // $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width'])); + $options = array( + 'label' => $label, + 'data' => $idata, + 'bitsPerComponent' => $info['bitDepth'], + 'pdata' => $pdata, + 'iw' => $info['width'], + 'ih' => $info['height'], + 'type' => 'png', + 'color' => $color, + 'ncolor' => $ncolor, + 'masked' => $mask, + 'isMask' => $is_mask, + ); + + if (isset($transparency)) { + $options['transparency'] = $transparency; + } + + $this->o_image($this->numObj, 'new', $options); + $this->imagelist[$file] = array('label' =>$label, 'w' => $info['width'], 'h' => $info['height']); + } + + if ($is_mask) { + return; + } + + if ($w <= 0 && $h <= 0) { + $w = $info['width']; + $h = $info['height']; + } + + if ($w <= 0) { + $w = $h/$info['height']*$info['width']; + } + + if ($h <= 0) { + $h = $w*$info['height']/$info['width']; + } + + $this->objects[$this->currentContents]['c'].= sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm", $w, $h, $x, $y); + $this->objects[$this->currentContents]['c'].= "\n/$label Do\nQ"; + } + + + /** + * add a JPEG image into the document, from a file + */ + function addJpegFromFile($img, $x, $y, $w = 0, $h = 0) { + // attempt to add a jpeg image straight from a file, using no GD commands + // note that this function is unable to operate on a remote file. + + if (!file_exists($img)) { + return; + } + + if ( isset($this->imagelist[$img]) ) { + $data = null; + $imageWidth = $this->imagelist[$img]['w']; + $imageHeight = $this->imagelist[$img]['h']; + $channels = $this->imagelist[$img]['c']; + } else { + $tmp = getimagesize($img); + $imageWidth = $tmp[0]; + $imageHeight = $tmp[1]; + + if (isset($tmp['channels'])) { + $channels = $tmp['channels']; + } else { + $channels = 3; + } + + $data = file_get_contents($img); + } + + if ($w <= 0 && $h <= 0) { + $w = $imageWidth; + } + + if ($w == 0) { + $w = $h/$imageHeight*$imageWidth; + } + + if ($h == 0) { + $h = $w*$imageHeight/$imageWidth; + } + + $this->addJpegImage_common($data, $x, $y, $w, $h, $imageWidth, $imageHeight, $channels, $img); + } + + + /** + * add an image into the document, from a GD object + * this function is not all that reliable, and I would probably encourage people to use + * the file based functions + */ + function addImage(&$img, $x, $y, $w = 0, $h = 0, $quality = 75) { + /* Todo: + * Pass in original filename as $imgname + * If already cached like image_iscached(), allow empty $img + * How to get w and h in this case? + * Then caller can check with image_iscached() whether generation of image is needed. + * + * But anyway, this function is not used! + */ + $imgname = tempnam($this->tmp, "cpdf_img_").'.jpeg'; + + // add a new image into the current location, as an external object + // add the image at $x,$y, and with width and height as defined by $w & $h + + // note that this will only work with full colour images and makes them jpg images for display + // later versions could present lossless image formats if there is interest. + + // there seems to be some problem here in that images that have quality set above 75 do not appear + // not too sure why this is, but in the meantime I have restricted this to 75. + if ($quality>75) { + $quality = 75; + } + + // if the width or height are set to zero, then set the other one based on keeping the image + // height/width ratio the same, if they are both zero, then give up :) + $imageWidth = imagesx($img); + $imageHeight = imagesy($img); + + if ($w <= 0 && $h <= 0) { + return; + } + + if ($w == 0) { + $w = $h/$imageHeight*$imageWidth; + } + + if ($h == 0) { + $h = $w*$imageHeight/$imageWidth; + } + + // gotta get the data out of the img.. + ob_start(); + imagejpeg($img, '', $quality); + $data = ob_get_clean(); + + $this->addJpegImage_common($data, $x, $y, $w, $h, $imageWidth, $imageHeight, $imgname); + } + + + /* Check if image already added to pdf image directory. + * If yes, need not to create again (pass empty data) + */ + function image_iscached($imgname) { + return isset($this->imagelist[$imgname]); + } + + + /** + * common code used by the two JPEG adding functions + * + * @access private + */ + function addJpegImage_common(&$data, $x, $y, $w = 0, $h = 0, $imageWidth, $imageHeight, $channels = 3, $imgname) { + if ( isset($this->imagelist[$imgname]) ) { + $label = $this->imagelist[$imgname]['label']; + //debugpng + //if (DEBUGPNG) print '[addJpegImage_common Duplicate '.$imgname.']'; + + } else { + if ($data == null) { + $this->addMessage('addJpegImage_common error - ('.$imgname.') data not present!'); + return; + } + + // note that this function is not to be called externally + // it is just the common code between the GD and the file options + $this->numImages++; + $im = $this->numImages; + $label = 'I'.$im; + $this->numObj++; + + $this->o_image($this->numObj, 'new', array( + 'label' => $label, + 'data' => &$data, + 'iw' => $imageWidth, + 'ih' => $imageHeight, + 'channels' => $channels + )); + $this->imagelist[$imgname] = array('label' =>$label, 'w' => $imageWidth, 'h' => $imageHeight, 'c'=> $channels ); + } + + $this->objects[$this->currentContents]['c'].= sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm", $w, $h, $x, $y); + $this->objects[$this->currentContents]['c'].= "\n/$label Do\nQ"; + } + + + /** + * specify where the document should open when it first starts + */ + function openHere($style, $a = 0, $b = 0, $c = 0) { + // this function will open the document at a specified page, in a specified style + // the values for style, and the required paramters are: + // 'XYZ' left, top, zoom + // 'Fit' + // 'FitH' top + // 'FitV' left + // 'FitR' left,bottom,right + // 'FitB' + // 'FitBH' top + // 'FitBV' left + $this->numObj++; + $this->o_destination($this->numObj, 'new', array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c)); + $id = $this->catalogId; + $this->o_catalog($id, 'openHere', $this->numObj); + } + + function addJavascript($code) { + $this->javascript .= $code; + } + + + /** + * create a labelled destination within the document + */ + function addDestination($label, $style, $a = 0, $b = 0, $c = 0) { + // associates the given label with the destination, it is done this way so that a destination can be specified after + // it has been linked to + // styles are the same as the 'openHere' function + $this->numObj++; + $this->o_destination($this->numObj, 'new', array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c)); + $id = $this->numObj; + + // store the label->idf relationship, note that this means that labels can be used only once + $this->destinations["$label"] = $id; + } + + + /** + * define font families, this is used to initialize the font families for the default fonts + * and for the user to add new ones for their fonts. The default bahavious can be overridden should + * that be desired. + */ + function setFontFamily($family, $options = '') { + if (!is_array($options)) { + if ($family === 'init') { + // set the known family groups + // these font families will be used to enable bold and italic markers to be included + // within text streams. html forms will be used... + $this->fontFamilies['Helvetica.afm'] = + array('b' => 'Helvetica-Bold.afm', + 'i' => 'Helvetica-Oblique.afm', + 'bi' => 'Helvetica-BoldOblique.afm', + 'ib' => 'Helvetica-BoldOblique.afm'); + + $this->fontFamilies['Courier.afm'] = + array('b' => 'Courier-Bold.afm', + 'i' => 'Courier-Oblique.afm', + 'bi' => 'Courier-BoldOblique.afm', + 'ib' => 'Courier-BoldOblique.afm'); + + $this->fontFamilies['Times-Roman.afm'] = + array('b' => 'Times-Bold.afm', + 'i' => 'Times-Italic.afm', + 'bi' => 'Times-BoldItalic.afm', + 'ib' => 'Times-BoldItalic.afm'); + } + } else { + + // the user is trying to set a font family + // note that this can also be used to set the base ones to something else + if (mb_strlen($family)) { + $this->fontFamilies[$family] = $options; + } + } + } + + /** + * used to add messages for use in debugging + */ + function addMessage($message) { + $this->messages.= $message."\n"; + } + + + /** + * a few functions which should allow the document to be treated transactionally. + */ + function transaction($action) { + switch ($action) { + case 'start': + // store all the data away into the checkpoint variable + $data = get_object_vars($this); + $this->checkpoint = $data; + unset($data); + break; + + case 'commit': + if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) { + $tmp = $this->checkpoint['checkpoint']; + $this->checkpoint = $tmp; + unset($tmp); + } else { + $this->checkpoint = ''; + } + break; + + case 'rewind': + // do not destroy the current checkpoint, but move us back to the state then, so that we can try again + if (is_array($this->checkpoint)) { + // can only abort if were inside a checkpoint + $tmp = $this->checkpoint; + + foreach ($tmp as $k => $v) { + if ($k !== 'checkpoint') { + $this->$k = $v; + } + } + unset($tmp); + } + break; + + case 'abort': + if (is_array($this->checkpoint)) { + // can only abort if were inside a checkpoint + $tmp = $this->checkpoint; + foreach ($tmp as $k => $v) { + $this->$k = $v; + } + unset($tmp); + } + break; + } + } +} +// end of class diff --git a/application/third_party/dompdf/lib/fonts/Courier-Bold.afm b/application/third_party/dompdf/lib/fonts/Courier-Bold.afm new file mode 100644 index 00000000..0ccfd618 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Courier-Bold.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Mon Jun 23 16:28:00 0:00:00 +Comment UniqueID 43048 +Comment VMusage 41139 52164 +FontName Courier-Bold +FullName Courier Bold +FamilyName Courier +Weight Bold +ItalicAngle 0 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -113 -250 749 801 +UnderlinePosition -100 +UnderlineThickness 50 +Version 003.000 +Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 439 +Ascender 629 +Descender -157 +StdHW 84 +StdVW 106 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ; +C 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ; +C 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ; +C 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ; +C 37 ; WX 600 ; N percent ; B 5 -15 595 616 ; +C 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ; +C 146 ; WX 600 ; N quoteright ; B 171 277 423 562 ; +C 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ; +C 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ; +C 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ; +C 43 ; WX 600 ; N plus ; B 71 39 529 478 ; +C 44 ; WX 600 ; N comma ; B 123 -111 393 174 ; +C 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ; +C 173 ; WX 600 ; N hyphen ; B 100 203 500 313 ; +C 46 ; WX 600 ; N period ; B 192 -15 408 171 ; +C 47 ; WX 600 ; N slash ; B 98 -77 502 626 ; +C 48 ; WX 600 ; N zero ; B 87 -15 513 616 ; +C 49 ; WX 600 ; N one ; B 81 0 539 616 ; +C 50 ; WX 600 ; N two ; B 61 0 499 616 ; +C 51 ; WX 600 ; N three ; B 63 -15 501 616 ; +C 52 ; WX 600 ; N four ; B 53 0 507 616 ; +C 53 ; WX 600 ; N five ; B 70 -15 521 601 ; +C 54 ; WX 600 ; N six ; B 90 -15 521 616 ; +C 55 ; WX 600 ; N seven ; B 55 0 494 601 ; +C 56 ; WX 600 ; N eight ; B 83 -15 517 616 ; +C 57 ; WX 600 ; N nine ; B 79 -15 510 616 ; +C 58 ; WX 600 ; N colon ; B 191 -15 407 425 ; +C 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ; +C 60 ; WX 600 ; N less ; B 66 15 523 501 ; +C 61 ; WX 600 ; N equal ; B 71 118 529 398 ; +C 62 ; WX 600 ; N greater ; B 77 15 534 501 ; +C 63 ; WX 600 ; N question ; B 98 -14 501 580 ; +C 64 ; WX 600 ; N at ; B 16 -15 584 616 ; +C 65 ; WX 600 ; N A ; B -9 0 609 562 ; +C 66 ; WX 600 ; N B ; B 30 0 573 562 ; +C 67 ; WX 600 ; N C ; B 22 -18 560 580 ; +C 68 ; WX 600 ; N D ; B 30 0 594 562 ; +C 69 ; WX 600 ; N E ; B 25 0 560 562 ; +C 70 ; WX 600 ; N F ; B 39 0 570 562 ; +C 71 ; WX 600 ; N G ; B 22 -18 594 580 ; +C 72 ; WX 600 ; N H ; B 20 0 580 562 ; +C 73 ; WX 600 ; N I ; B 77 0 523 562 ; +C 74 ; WX 600 ; N J ; B 37 -18 601 562 ; +C 75 ; WX 600 ; N K ; B 21 0 599 562 ; +C 76 ; WX 600 ; N L ; B 39 0 578 562 ; +C 77 ; WX 600 ; N M ; B -2 0 602 562 ; +C 78 ; WX 600 ; N N ; B 8 -12 610 562 ; +C 79 ; WX 600 ; N O ; B 22 -18 578 580 ; +C 80 ; WX 600 ; N P ; B 48 0 559 562 ; +C 81 ; WX 600 ; N Q ; B 32 -138 578 580 ; +C 82 ; WX 600 ; N R ; B 24 0 599 562 ; +C 83 ; WX 600 ; N S ; B 47 -22 553 582 ; +C 84 ; WX 600 ; N T ; B 21 0 579 562 ; +C 85 ; WX 600 ; N U ; B 4 -18 596 562 ; +C 86 ; WX 600 ; N V ; B -13 0 613 562 ; +C 87 ; WX 600 ; N W ; B -18 0 618 562 ; +C 88 ; WX 600 ; N X ; B 12 0 588 562 ; +C 89 ; WX 600 ; N Y ; B 12 0 589 562 ; +C 90 ; WX 600 ; N Z ; B 62 0 539 562 ; +C 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ; +C 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ; +C 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ; +C 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ; +C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 178 277 428 562 ; +C 97 ; WX 600 ; N a ; B 35 -15 570 454 ; +C 98 ; WX 600 ; N b ; B 0 -15 584 626 ; +C 99 ; WX 600 ; N c ; B 40 -15 545 459 ; +C 100 ; WX 600 ; N d ; B 20 -15 591 626 ; +C 101 ; WX 600 ; N e ; B 40 -15 563 454 ; +C 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 30 -146 580 454 ; +C 104 ; WX 600 ; N h ; B 5 0 592 626 ; +C 105 ; WX 600 ; N i ; B 77 0 523 658 ; +C 106 ; WX 600 ; N j ; B 63 -146 440 658 ; +C 107 ; WX 600 ; N k ; B 20 0 585 626 ; +C 108 ; WX 600 ; N l ; B 77 0 523 626 ; +C 109 ; WX 600 ; N m ; B -22 0 626 454 ; +C 110 ; WX 600 ; N n ; B 18 0 592 454 ; +C 111 ; WX 600 ; N o ; B 30 -15 570 454 ; +C 112 ; WX 600 ; N p ; B -1 -142 570 454 ; +C 113 ; WX 600 ; N q ; B 20 -142 591 454 ; +C 114 ; WX 600 ; N r ; B 47 0 580 454 ; +C 115 ; WX 600 ; N s ; B 68 -17 535 459 ; +C 116 ; WX 600 ; N t ; B 47 -15 532 562 ; +C 117 ; WX 600 ; N u ; B -1 -15 569 439 ; +C 118 ; WX 600 ; N v ; B -1 0 601 439 ; +C 119 ; WX 600 ; N w ; B -18 0 618 439 ; +C 120 ; WX 600 ; N x ; B 6 0 594 439 ; +C 121 ; WX 600 ; N y ; B -4 -142 601 439 ; +C 122 ; WX 600 ; N z ; B 81 0 520 439 ; +C 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ; +C 124 ; WX 600 ; N bar ; B 255 -250 345 750 ; +C 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ; +C 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ; +C 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ; +C 162 ; WX 600 ; N cent ; B 66 -49 518 614 ; +C 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ; +C -1 ; WX 600 ; N fraction ; B 25 -60 576 661 ; +C 165 ; WX 600 ; N yen ; B 10 0 590 562 ; +C 131 ; WX 600 ; N florin ; B -30 -131 572 616 ; +C 167 ; WX 600 ; N section ; B 83 -70 517 580 ; +C 164 ; WX 600 ; N currency ; B 54 49 546 517 ; +C 39 ; WX 600 ; N quotesingle ; B 227 277 373 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ; +C 170 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ; +C -1 ; WX 600 ; N fi ; B 12 0 593 626 ; +C -1 ; WX 600 ; N fl ; B 12 0 593 626 ; +C 150 ; WX 600 ; N endash ; B 65 203 535 313 ; +C 134 ; WX 600 ; N dagger ; B 106 -70 494 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ; +C 183 ; WX 600 ; N periodcentered ; B 196 165 404 351 ; +C 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ; +C 149 ; WX 600 ; N bullet ; B 140 132 460 430 ; +C 130 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ; +C 132 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ; +C 148 ; WX 600 ; N quotedblright ; B 61 277 525 562 ; +C 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ; +C 133 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ; +C 137 ; WX 600 ; N perthousand ; B -113 -15 713 616 ; +C 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ; +C 96 ; WX 600 ; N grave ; B 132 508 395 661 ; +C 180 ; WX 600 ; N acute ; B 205 508 468 661 ; +C 136 ; WX 600 ; N circumflex ; B 103 483 497 657 ; +C 152 ; WX 600 ; N tilde ; B 89 493 512 636 ; +C 175 ; WX 600 ; N macron ; B 88 505 512 585 ; +C -1 ; WX 600 ; N breve ; B 83 468 517 631 ; +C -1 ; WX 600 ; N dotaccent ; B 230 498 370 638 ; +C 168 ; WX 600 ; N dieresis ; B 128 498 472 638 ; +C -1 ; WX 600 ; N ring ; B 198 481 402 678 ; +C 184 ; WX 600 ; N cedilla ; B 205 -206 387 0 ; +C -1 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ; +C -1 ; WX 600 ; N ogonek ; B 169 -199 400 0 ; +C -1 ; WX 600 ; N caron ; B 103 493 497 667 ; +C 151 ; WX 600 ; N emdash ; B -10 203 610 313 ; +C 198 ; WX 600 ; N AE ; B -29 0 602 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ; +C -1 ; WX 600 ; N Lslash ; B 39 0 578 562 ; +C 216 ; WX 600 ; N Oslash ; B 22 -22 578 584 ; +C 140 ; WX 600 ; N OE ; B -25 0 595 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ; +C 230 ; WX 600 ; N ae ; B -4 -15 601 454 ; +C -1 ; WX 600 ; N dotlessi ; B 77 0 523 439 ; +C -1 ; WX 600 ; N lslash ; B 77 0 523 626 ; +C 248 ; WX 600 ; N oslash ; B 30 -24 570 463 ; +C 156 ; WX 600 ; N oe ; B -18 -15 611 454 ; +C 223 ; WX 600 ; N germandbls ; B 22 -15 596 626 ; +C 207 ; WX 600 ; N Idieresis ; B 77 0 523 761 ; +C 233 ; WX 600 ; N eacute ; B 40 -15 563 661 ; +C -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ; +C -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ; +C -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ; +C 159 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ; +C 247 ; WX 600 ; N divide ; B 71 16 529 500 ; +C 221 ; WX 600 ; N Yacute ; B 12 0 589 784 ; +C 194 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ; +C 225 ; WX 600 ; N aacute ; B 35 -15 570 661 ; +C 219 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ; +C 253 ; WX 600 ; N yacute ; B -4 -142 601 661 ; +C -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ; +C 234 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ; +C -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ; +C 220 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ; +C -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ; +C 218 ; WX 600 ; N Uacute ; B 4 -18 596 784 ; +C -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ; +C 203 ; WX 600 ; N Edieresis ; B 25 0 560 761 ; +C -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ; +C -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ; +C 169 ; WX 600 ; N copyright ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ; +C -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ; +C 229 ; WX 600 ; N aring ; B 35 -15 570 678 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ; +C -1 ; WX 600 ; N lacute ; B 77 0 523 801 ; +C 224 ; WX 600 ; N agrave ; B 35 -15 570 661 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ; +C -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ; +C 227 ; WX 600 ; N atilde ; B 35 -15 570 636 ; +C -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ; +C 154 ; WX 600 ; N scaron ; B 68 -17 535 667 ; +C -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ; +C 237 ; WX 600 ; N iacute ; B 77 0 523 661 ; +C -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ; +C -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ; +C 251 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ; +C 226 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ; +C -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ; +C -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ; +C 231 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ; +C -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ; +C 222 ; WX 600 ; N Thorn ; B 48 0 557 562 ; +C -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ; +C -1 ; WX 600 ; N Racute ; B 24 0 599 784 ; +C -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ; +C -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ; +C -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ; +C -1 ; WX 600 ; N uring ; B -1 -15 569 678 ; +C 179 ; WX 600 ; N threesuperior ; B 138 222 433 616 ; +C 210 ; WX 600 ; N Ograve ; B 22 -18 578 784 ; +C 192 ; WX 600 ; N Agrave ; B -9 0 609 784 ; +C -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ; +C 215 ; WX 600 ; N multiply ; B 81 39 520 478 ; +C 250 ; WX 600 ; N uacute ; B -1 -15 569 661 ; +C -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ; +C -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ; +C 255 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ; +C -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ; +C 238 ; WX 600 ; N icircumflex ; B 73 0 523 657 ; +C 202 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ; +C 228 ; WX 600 ; N adieresis ; B 35 -15 570 638 ; +C 235 ; WX 600 ; N edieresis ; B 40 -15 563 638 ; +C -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ; +C -1 ; WX 600 ; N nacute ; B 18 0 592 661 ; +C -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ; +C -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ; +C 205 ; WX 600 ; N Iacute ; B 77 0 523 784 ; +C 177 ; WX 600 ; N plusminus ; B 71 24 529 515 ; +C 166 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ; +C 174 ; WX 600 ; N registered ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ; +C -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ; +C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; +C 200 ; WX 600 ; N Egrave ; B 25 0 560 784 ; +C -1 ; WX 600 ; N racute ; B 47 0 580 661 ; +C -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ; +C -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ; +C 142 ; WX 600 ; N Zcaron ; B 62 0 539 790 ; +C -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ; +C 208 ; WX 600 ; N Eth ; B 30 0 594 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ; +C -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ; +C -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ; +C -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ; +C 193 ; WX 600 ; N Aacute ; B -9 0 609 784 ; +C 196 ; WX 600 ; N Adieresis ; B -9 0 609 761 ; +C 232 ; WX 600 ; N egrave ; B 40 -15 563 661 ; +C -1 ; WX 600 ; N zacute ; B 81 0 520 661 ; +C -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ; +C 211 ; WX 600 ; N Oacute ; B 22 -18 578 784 ; +C 243 ; WX 600 ; N oacute ; B 30 -15 570 661 ; +C -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ; +C -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ; +C 239 ; WX 600 ; N idieresis ; B 77 0 523 618 ; +C 212 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ; +C 217 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ; +C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; +C 254 ; WX 600 ; N thorn ; B -14 -142 570 626 ; +C 178 ; WX 600 ; N twosuperior ; B 143 230 436 616 ; +C 214 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ; +C 181 ; WX 600 ; N mu ; B -1 -142 569 439 ; +C 236 ; WX 600 ; N igrave ; B 77 0 523 661 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ; +C -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ; +C -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ; +C 190 ; WX 600 ; N threequarters ; B -47 -60 648 661 ; +C -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ; +C -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ; +C -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ; +C 153 ; WX 600 ; N trademark ; B -9 230 749 562 ; +C -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ; +C 204 ; WX 600 ; N Igrave ; B 77 0 523 784 ; +C -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ; +C -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ; +C 189 ; WX 600 ; N onehalf ; B -47 -60 648 661 ; +C -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ; +C 244 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ; +C 241 ; WX 600 ; N ntilde ; B 18 0 592 636 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ; +C 201 ; WX 600 ; N Eacute ; B 25 0 560 784 ; +C -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ; +C -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ; +C 188 ; WX 600 ; N onequarter ; B -56 -60 656 661 ; +C 138 ; WX 600 ; N Scaron ; B 47 -22 553 790 ; +C -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ; +C 176 ; WX 600 ; N degree ; B 86 243 474 616 ; +C 242 ; WX 600 ; N ograve ; B 30 -15 570 661 ; +C -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ; +C 249 ; WX 600 ; N ugrave ; B -1 -15 569 661 ; +C -1 ; WX 600 ; N radical ; B -19 -104 473 778 ; +C -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ; +C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ; +C 209 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ; +C 245 ; WX 600 ; N otilde ; B 30 -15 570 636 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ; +C 195 ; WX 600 ; N Atilde ; B -9 0 609 759 ; +C -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ; +C 197 ; WX 600 ; N Aring ; B -9 0 609 801 ; +C 213 ; WX 600 ; N Otilde ; B 22 -18 578 759 ; +C -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ; +C -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ; +C -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ; +C -1 ; WX 600 ; N minus ; B 71 203 529 313 ; +C 206 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ; +C -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ; +C -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ; +C 172 ; WX 600 ; N logicalnot ; B 71 103 529 413 ; +C 246 ; WX 600 ; N odieresis ; B 30 -15 570 638 ; +C 252 ; WX 600 ; N udieresis ; B -1 -15 569 638 ; +C -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ; +C -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ; +C 240 ; WX 600 ; N eth ; B 58 -27 543 626 ; +C 158 ; WX 600 ; N zcaron ; B 81 0 520 667 ; +C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ; +C 185 ; WX 600 ; N onesuperior ; B 153 230 447 616 ; +C -1 ; WX 600 ; N imacron ; B 77 0 523 585 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Courier-BoldOblique.afm b/application/third_party/dompdf/lib/fonts/Courier-BoldOblique.afm new file mode 100644 index 00000000..215d8be6 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Courier-BoldOblique.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Mon Jun 23 16:28:46 0:00:00 +Comment UniqueID 43049 +Comment VMusage 17529 79244 +FontName Courier-BoldOblique +FullName Courier Bold Oblique +FamilyName Courier +Weight Bold +ItalicAngle -12 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -57 -250 869 801 +UnderlinePosition -100 +UnderlineThickness 50 +Version 3 +Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 439 +Ascender 629 +Descender -157 +StdHW 84 +StdVW 106 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ; +C 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ; +C 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ; +C 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ; +C 37 ; WX 600 ; N percent ; B 101 -15 625 616 ; +C 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ; +C 146 ; WX 600 ; N quoteright ; B 229 277 543 562 ; +C 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ; +C 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ; +C 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ; +C 43 ; WX 600 ; N plus ; B 114 39 596 478 ; +C 44 ; WX 600 ; N comma ; B 99 -111 430 174 ; +C 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ; +C 173 ; WX 600 ; N hyphen ; B 143 203 567 313 ; +C 46 ; WX 600 ; N period ; B 206 -15 427 171 ; +C 47 ; WX 600 ; N slash ; B 90 -77 626 626 ; +C 48 ; WX 600 ; N zero ; B 135 -15 593 616 ; +C 49 ; WX 600 ; N one ; B 93 0 562 616 ; +C 50 ; WX 600 ; N two ; B 61 0 594 616 ; +C 51 ; WX 600 ; N three ; B 71 -15 571 616 ; +C 52 ; WX 600 ; N four ; B 81 0 559 616 ; +C 53 ; WX 600 ; N five ; B 77 -15 621 601 ; +C 54 ; WX 600 ; N six ; B 135 -15 652 616 ; +C 55 ; WX 600 ; N seven ; B 147 0 622 601 ; +C 56 ; WX 600 ; N eight ; B 115 -15 604 616 ; +C 57 ; WX 600 ; N nine ; B 75 -15 592 616 ; +C 58 ; WX 600 ; N colon ; B 205 -15 480 425 ; +C 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ; +C 60 ; WX 600 ; N less ; B 120 15 613 501 ; +C 61 ; WX 600 ; N equal ; B 96 118 614 398 ; +C 62 ; WX 600 ; N greater ; B 97 15 589 501 ; +C 63 ; WX 600 ; N question ; B 183 -14 592 580 ; +C 64 ; WX 600 ; N at ; B 65 -15 642 616 ; +C 65 ; WX 600 ; N A ; B -9 0 632 562 ; +C 66 ; WX 600 ; N B ; B 30 0 630 562 ; +C 67 ; WX 600 ; N C ; B 74 -18 675 580 ; +C 68 ; WX 600 ; N D ; B 30 0 664 562 ; +C 69 ; WX 600 ; N E ; B 25 0 670 562 ; +C 70 ; WX 600 ; N F ; B 39 0 684 562 ; +C 71 ; WX 600 ; N G ; B 74 -18 675 580 ; +C 72 ; WX 600 ; N H ; B 20 0 700 562 ; +C 73 ; WX 600 ; N I ; B 77 0 643 562 ; +C 74 ; WX 600 ; N J ; B 58 -18 721 562 ; +C 75 ; WX 600 ; N K ; B 21 0 692 562 ; +C 76 ; WX 600 ; N L ; B 39 0 636 562 ; +C 77 ; WX 600 ; N M ; B -2 0 722 562 ; +C 78 ; WX 600 ; N N ; B 8 -12 730 562 ; +C 79 ; WX 600 ; N O ; B 74 -18 645 580 ; +C 80 ; WX 600 ; N P ; B 48 0 643 562 ; +C 81 ; WX 600 ; N Q ; B 83 -138 636 580 ; +C 82 ; WX 600 ; N R ; B 24 0 617 562 ; +C 83 ; WX 600 ; N S ; B 54 -22 673 582 ; +C 84 ; WX 600 ; N T ; B 86 0 679 562 ; +C 85 ; WX 600 ; N U ; B 101 -18 716 562 ; +C 86 ; WX 600 ; N V ; B 84 0 733 562 ; +C 87 ; WX 600 ; N W ; B 79 0 738 562 ; +C 88 ; WX 600 ; N X ; B 12 0 690 562 ; +C 89 ; WX 600 ; N Y ; B 109 0 709 562 ; +C 90 ; WX 600 ; N Z ; B 62 0 637 562 ; +C 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ; +C 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ; +C 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ; +C 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ; +C 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 297 277 487 562 ; +C 97 ; WX 600 ; N a ; B 61 -15 593 454 ; +C 98 ; WX 600 ; N b ; B 13 -15 636 626 ; +C 99 ; WX 600 ; N c ; B 81 -15 631 459 ; +C 100 ; WX 600 ; N d ; B 60 -15 645 626 ; +C 101 ; WX 600 ; N e ; B 81 -15 605 454 ; +C 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 40 -146 674 454 ; +C 104 ; WX 600 ; N h ; B 18 0 615 626 ; +C 105 ; WX 600 ; N i ; B 77 0 546 658 ; +C 106 ; WX 600 ; N j ; B 36 -146 580 658 ; +C 107 ; WX 600 ; N k ; B 33 0 643 626 ; +C 108 ; WX 600 ; N l ; B 77 0 546 626 ; +C 109 ; WX 600 ; N m ; B -22 0 649 454 ; +C 110 ; WX 600 ; N n ; B 18 0 615 454 ; +C 111 ; WX 600 ; N o ; B 71 -15 622 454 ; +C 112 ; WX 600 ; N p ; B -32 -142 622 454 ; +C 113 ; WX 600 ; N q ; B 60 -142 685 454 ; +C 114 ; WX 600 ; N r ; B 47 0 655 454 ; +C 115 ; WX 600 ; N s ; B 66 -17 608 459 ; +C 116 ; WX 600 ; N t ; B 118 -15 567 562 ; +C 117 ; WX 600 ; N u ; B 70 -15 592 439 ; +C 118 ; WX 600 ; N v ; B 70 0 695 439 ; +C 119 ; WX 600 ; N w ; B 53 0 712 439 ; +C 120 ; WX 600 ; N x ; B 6 0 671 439 ; +C 121 ; WX 600 ; N y ; B -21 -142 695 439 ; +C 122 ; WX 600 ; N z ; B 81 0 614 439 ; +C 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ; +C 124 ; WX 600 ; N bar ; B 201 -250 505 750 ; +C 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ; +C 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ; +C 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ; +C 162 ; WX 600 ; N cent ; B 121 -49 605 614 ; +C 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ; +C -1 ; WX 600 ; N fraction ; B 22 -60 708 661 ; +C 165 ; WX 600 ; N yen ; B 98 0 710 562 ; +C 131 ; WX 600 ; N florin ; B -57 -131 702 616 ; +C 167 ; WX 600 ; N section ; B 74 -70 620 580 ; +C 164 ; WX 600 ; N currency ; B 77 49 644 517 ; +C 39 ; WX 600 ; N quotesingle ; B 303 277 493 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ; +C 170 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ; +C -1 ; WX 600 ; N fi ; B 12 0 644 626 ; +C -1 ; WX 600 ; N fl ; B 12 0 644 626 ; +C 150 ; WX 600 ; N endash ; B 108 203 602 313 ; +C 134 ; WX 600 ; N dagger ; B 175 -70 586 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ; +C 183 ; WX 600 ; N periodcentered ; B 248 165 461 351 ; +C 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ; +C 149 ; WX 600 ; N bullet ; B 196 132 523 430 ; +C 130 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ; +C 132 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ; +C 148 ; WX 600 ; N quotedblright ; B 119 277 645 562 ; +C 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ; +C 133 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ; +C 137 ; WX 600 ; N perthousand ; B -45 -15 743 616 ; +C 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ; +C 96 ; WX 600 ; N grave ; B 272 508 503 661 ; +C 180 ; WX 600 ; N acute ; B 312 508 609 661 ; +C 136 ; WX 600 ; N circumflex ; B 212 483 607 657 ; +C 152 ; WX 600 ; N tilde ; B 199 493 643 636 ; +C 175 ; WX 600 ; N macron ; B 195 505 637 585 ; +C -1 ; WX 600 ; N breve ; B 217 468 652 631 ; +C -1 ; WX 600 ; N dotaccent ; B 348 498 493 638 ; +C 168 ; WX 600 ; N dieresis ; B 246 498 595 638 ; +C -1 ; WX 600 ; N ring ; B 319 481 528 678 ; +C 184 ; WX 600 ; N cedilla ; B 168 -206 368 0 ; +C -1 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ; +C -1 ; WX 600 ; N ogonek ; B 143 -199 367 0 ; +C -1 ; WX 600 ; N caron ; B 238 493 633 667 ; +C 151 ; WX 600 ; N emdash ; B 33 203 677 313 ; +C 198 ; WX 600 ; N AE ; B -29 0 708 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ; +C -1 ; WX 600 ; N Lslash ; B 39 0 636 562 ; +C 216 ; WX 600 ; N Oslash ; B 48 -22 673 584 ; +C 140 ; WX 600 ; N OE ; B 26 0 701 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ; +C 230 ; WX 600 ; N ae ; B 21 -15 652 454 ; +C -1 ; WX 600 ; N dotlessi ; B 77 0 546 439 ; +C -1 ; WX 600 ; N lslash ; B 77 0 587 626 ; +C 248 ; WX 600 ; N oslash ; B 54 -24 638 463 ; +C 156 ; WX 600 ; N oe ; B 18 -15 662 454 ; +C 223 ; WX 600 ; N germandbls ; B 22 -15 629 626 ; +C 207 ; WX 600 ; N Idieresis ; B 77 0 643 761 ; +C 233 ; WX 600 ; N eacute ; B 81 -15 609 661 ; +C -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ; +C -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ; +C 159 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ; +C 247 ; WX 600 ; N divide ; B 114 16 596 500 ; +C 221 ; WX 600 ; N Yacute ; B 109 0 709 784 ; +C 194 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ; +C 225 ; WX 600 ; N aacute ; B 61 -15 609 661 ; +C 219 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ; +C 253 ; WX 600 ; N yacute ; B -21 -142 695 661 ; +C -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ; +C 234 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ; +C -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ; +C 220 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ; +C -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ; +C 218 ; WX 600 ; N Uacute ; B 101 -18 716 784 ; +C -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ; +C 203 ; WX 600 ; N Edieresis ; B 25 0 670 761 ; +C -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ; +C -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ; +C 169 ; WX 600 ; N copyright ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ; +C -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ; +C 229 ; WX 600 ; N aring ; B 61 -15 593 678 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ; +C -1 ; WX 600 ; N lacute ; B 77 0 639 801 ; +C 224 ; WX 600 ; N agrave ; B 61 -15 593 661 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ; +C -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ; +C 227 ; WX 600 ; N atilde ; B 61 -15 643 636 ; +C -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ; +C 154 ; WX 600 ; N scaron ; B 66 -17 633 667 ; +C -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ; +C 237 ; WX 600 ; N iacute ; B 77 0 609 661 ; +C -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ; +C -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ; +C 251 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ; +C 226 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ; +C -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ; +C -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ; +C 231 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ; +C -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ; +C 222 ; WX 600 ; N Thorn ; B 48 0 620 562 ; +C -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ; +C -1 ; WX 600 ; N Racute ; B 24 0 665 784 ; +C -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ; +C -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ; +C -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ; +C -1 ; WX 600 ; N uring ; B 70 -15 592 678 ; +C 179 ; WX 600 ; N threesuperior ; B 193 222 526 616 ; +C 210 ; WX 600 ; N Ograve ; B 74 -18 645 784 ; +C 192 ; WX 600 ; N Agrave ; B -9 0 632 784 ; +C -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ; +C 215 ; WX 600 ; N multiply ; B 104 39 606 478 ; +C 250 ; WX 600 ; N uacute ; B 70 -15 599 661 ; +C -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ; +C -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ; +C 255 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ; +C -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ; +C 238 ; WX 600 ; N icircumflex ; B 77 0 577 657 ; +C 202 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ; +C 228 ; WX 600 ; N adieresis ; B 61 -15 595 638 ; +C 235 ; WX 600 ; N edieresis ; B 81 -15 605 638 ; +C -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ; +C -1 ; WX 600 ; N nacute ; B 18 0 639 661 ; +C -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ; +C -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ; +C 205 ; WX 600 ; N Iacute ; B 77 0 643 784 ; +C 177 ; WX 600 ; N plusminus ; B 76 24 614 515 ; +C 166 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ; +C 174 ; WX 600 ; N registered ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ; +C -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ; +C -1 ; WX 600 ; N summation ; B 15 -10 672 706 ; +C 200 ; WX 600 ; N Egrave ; B 25 0 670 784 ; +C -1 ; WX 600 ; N racute ; B 47 0 655 661 ; +C -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ; +C -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ; +C 142 ; WX 600 ; N Zcaron ; B 62 0 659 790 ; +C -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ; +C 208 ; WX 600 ; N Eth ; B 30 0 664 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ; +C -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ; +C -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ; +C -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ; +C 193 ; WX 600 ; N Aacute ; B -9 0 655 784 ; +C 196 ; WX 600 ; N Adieresis ; B -9 0 632 761 ; +C 232 ; WX 600 ; N egrave ; B 81 -15 605 661 ; +C -1 ; WX 600 ; N zacute ; B 81 0 614 661 ; +C -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ; +C 211 ; WX 600 ; N Oacute ; B 74 -18 645 784 ; +C 243 ; WX 600 ; N oacute ; B 71 -15 649 661 ; +C -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ; +C -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ; +C 239 ; WX 600 ; N idieresis ; B 77 0 561 618 ; +C 212 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ; +C 217 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ; +C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; +C 254 ; WX 600 ; N thorn ; B -32 -142 622 626 ; +C 178 ; WX 600 ; N twosuperior ; B 191 230 542 616 ; +C 214 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ; +C 181 ; WX 600 ; N mu ; B 49 -142 592 439 ; +C 236 ; WX 600 ; N igrave ; B 77 0 546 661 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ; +C -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ; +C -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ; +C 190 ; WX 600 ; N threequarters ; B 8 -60 699 661 ; +C -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ; +C -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ; +C -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ; +C 153 ; WX 600 ; N trademark ; B 86 230 869 562 ; +C -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ; +C 204 ; WX 600 ; N Igrave ; B 77 0 643 784 ; +C -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ; +C -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ; +C 189 ; WX 600 ; N onehalf ; B 22 -60 716 661 ; +C -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ; +C 244 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ; +C 241 ; WX 600 ; N ntilde ; B 18 0 643 636 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ; +C 201 ; WX 600 ; N Eacute ; B 25 0 670 784 ; +C -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ; +C -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ; +C 188 ; WX 600 ; N onequarter ; B 13 -60 707 661 ; +C 138 ; WX 600 ; N Scaron ; B 54 -22 689 790 ; +C -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ; +C 176 ; WX 600 ; N degree ; B 173 243 570 616 ; +C 242 ; WX 600 ; N ograve ; B 71 -15 622 661 ; +C -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ; +C 249 ; WX 600 ; N ugrave ; B 70 -15 592 661 ; +C -1 ; WX 600 ; N radical ; B 67 -104 635 778 ; +C -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ; +C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ; +C 209 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ; +C 245 ; WX 600 ; N otilde ; B 71 -15 643 636 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ; +C 195 ; WX 600 ; N Atilde ; B -9 0 669 759 ; +C -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ; +C 197 ; WX 600 ; N Aring ; B -9 0 632 801 ; +C 213 ; WX 600 ; N Otilde ; B 74 -18 669 759 ; +C -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ; +C -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ; +C -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ; +C -1 ; WX 600 ; N minus ; B 114 203 596 313 ; +C 206 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ; +C -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ; +C -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ; +C 172 ; WX 600 ; N logicalnot ; B 135 103 617 413 ; +C 246 ; WX 600 ; N odieresis ; B 71 -15 622 638 ; +C 252 ; WX 600 ; N udieresis ; B 70 -15 595 638 ; +C -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ; +C -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ; +C 240 ; WX 600 ; N eth ; B 93 -27 661 626 ; +C 158 ; WX 600 ; N zcaron ; B 81 0 643 667 ; +C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ; +C 185 ; WX 600 ; N onesuperior ; B 212 230 514 616 ; +C -1 ; WX 600 ; N imacron ; B 77 0 575 585 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Courier-Oblique.afm b/application/third_party/dompdf/lib/fonts/Courier-Oblique.afm new file mode 100644 index 00000000..271aa192 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Courier-Oblique.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 0:00:00 17:37:52 1997 +Comment UniqueID 43051 +Comment VMusage 16248 75829 +FontName Courier-Oblique +FullName Courier Oblique +FamilyName Courier +Weight Medium +ItalicAngle -12 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -27 -250 849 805 +UnderlinePosition -100 +UnderlineThickness 50 +Version 003.000 +Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 426 +Ascender 629 +Descender -157 +StdHW 51 +StdVW 51 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ; +C 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ; +C 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ; +C 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ; +C 37 ; WX 600 ; N percent ; B 134 -15 599 622 ; +C 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ; +C 146 ; WX 600 ; N quoteright ; B 283 328 495 562 ; +C 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ; +C 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ; +C 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ; +C 43 ; WX 600 ; N plus ; B 129 44 580 470 ; +C 44 ; WX 600 ; N comma ; B 157 -112 370 122 ; +C 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ; +C 173 ; WX 600 ; N hyphen ; B 152 231 558 285 ; +C 46 ; WX 600 ; N period ; B 238 -15 382 109 ; +C 47 ; WX 600 ; N slash ; B 112 -80 604 629 ; +C 48 ; WX 600 ; N zero ; B 154 -15 575 622 ; +C 49 ; WX 600 ; N one ; B 98 0 515 622 ; +C 50 ; WX 600 ; N two ; B 70 0 568 622 ; +C 51 ; WX 600 ; N three ; B 82 -15 538 622 ; +C 52 ; WX 600 ; N four ; B 108 0 541 622 ; +C 53 ; WX 600 ; N five ; B 99 -15 589 607 ; +C 54 ; WX 600 ; N six ; B 155 -15 629 622 ; +C 55 ; WX 600 ; N seven ; B 182 0 612 607 ; +C 56 ; WX 600 ; N eight ; B 132 -15 588 622 ; +C 57 ; WX 600 ; N nine ; B 93 -15 574 622 ; +C 58 ; WX 600 ; N colon ; B 238 -15 441 385 ; +C 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ; +C 60 ; WX 600 ; N less ; B 96 42 610 472 ; +C 61 ; WX 600 ; N equal ; B 109 138 600 376 ; +C 62 ; WX 600 ; N greater ; B 85 42 599 472 ; +C 63 ; WX 600 ; N question ; B 222 -15 583 572 ; +C 64 ; WX 600 ; N at ; B 127 -15 582 622 ; +C 65 ; WX 600 ; N A ; B 3 0 607 562 ; +C 66 ; WX 600 ; N B ; B 43 0 616 562 ; +C 67 ; WX 600 ; N C ; B 93 -18 655 580 ; +C 68 ; WX 600 ; N D ; B 43 0 645 562 ; +C 69 ; WX 600 ; N E ; B 53 0 660 562 ; +C 70 ; WX 600 ; N F ; B 53 0 660 562 ; +C 71 ; WX 600 ; N G ; B 83 -18 645 580 ; +C 72 ; WX 600 ; N H ; B 32 0 687 562 ; +C 73 ; WX 600 ; N I ; B 96 0 623 562 ; +C 74 ; WX 600 ; N J ; B 52 -18 685 562 ; +C 75 ; WX 600 ; N K ; B 38 0 671 562 ; +C 76 ; WX 600 ; N L ; B 47 0 607 562 ; +C 77 ; WX 600 ; N M ; B 4 0 715 562 ; +C 78 ; WX 600 ; N N ; B 7 -13 712 562 ; +C 79 ; WX 600 ; N O ; B 94 -18 625 580 ; +C 80 ; WX 600 ; N P ; B 79 0 644 562 ; +C 81 ; WX 600 ; N Q ; B 95 -138 625 580 ; +C 82 ; WX 600 ; N R ; B 38 0 598 562 ; +C 83 ; WX 600 ; N S ; B 76 -20 650 580 ; +C 84 ; WX 600 ; N T ; B 108 0 665 562 ; +C 85 ; WX 600 ; N U ; B 125 -18 702 562 ; +C 86 ; WX 600 ; N V ; B 105 -13 723 562 ; +C 87 ; WX 600 ; N W ; B 106 -13 722 562 ; +C 88 ; WX 600 ; N X ; B 23 0 675 562 ; +C 89 ; WX 600 ; N Y ; B 133 0 695 562 ; +C 90 ; WX 600 ; N Z ; B 86 0 610 562 ; +C 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ; +C 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ; +C 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ; +C 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ; +C 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 343 328 457 562 ; +C 97 ; WX 600 ; N a ; B 76 -15 569 441 ; +C 98 ; WX 600 ; N b ; B 29 -15 625 629 ; +C 99 ; WX 600 ; N c ; B 106 -15 608 441 ; +C 100 ; WX 600 ; N d ; B 85 -15 640 629 ; +C 101 ; WX 600 ; N e ; B 106 -15 598 441 ; +C 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 61 -157 657 441 ; +C 104 ; WX 600 ; N h ; B 33 0 592 629 ; +C 105 ; WX 600 ; N i ; B 95 0 515 657 ; +C 106 ; WX 600 ; N j ; B 52 -157 550 657 ; +C 107 ; WX 600 ; N k ; B 58 0 633 629 ; +C 108 ; WX 600 ; N l ; B 95 0 515 629 ; +C 109 ; WX 600 ; N m ; B -5 0 615 441 ; +C 110 ; WX 600 ; N n ; B 26 0 585 441 ; +C 111 ; WX 600 ; N o ; B 102 -15 588 441 ; +C 112 ; WX 600 ; N p ; B -24 -157 605 441 ; +C 113 ; WX 600 ; N q ; B 85 -157 682 441 ; +C 114 ; WX 600 ; N r ; B 60 0 636 441 ; +C 115 ; WX 600 ; N s ; B 78 -15 584 441 ; +C 116 ; WX 600 ; N t ; B 167 -15 561 561 ; +C 117 ; WX 600 ; N u ; B 101 -15 572 426 ; +C 118 ; WX 600 ; N v ; B 90 -10 681 426 ; +C 119 ; WX 600 ; N w ; B 76 -10 695 426 ; +C 120 ; WX 600 ; N x ; B 20 0 655 426 ; +C 121 ; WX 600 ; N y ; B -4 -157 683 426 ; +C 122 ; WX 600 ; N z ; B 99 0 593 426 ; +C 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ; +C 124 ; WX 600 ; N bar ; B 222 -250 485 750 ; +C 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ; +C 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ; +C 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ; +C 162 ; WX 600 ; N cent ; B 151 -49 588 614 ; +C 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ; +C -1 ; WX 600 ; N fraction ; B 84 -57 646 665 ; +C 165 ; WX 600 ; N yen ; B 120 0 693 562 ; +C 131 ; WX 600 ; N florin ; B -26 -143 671 622 ; +C 167 ; WX 600 ; N section ; B 104 -78 590 580 ; +C 164 ; WX 600 ; N currency ; B 94 58 628 506 ; +C 39 ; WX 600 ; N quotesingle ; B 345 328 460 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ; +C 170 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ; +C -1 ; WX 600 ; N fi ; B 3 0 619 629 ; +C -1 ; WX 600 ; N fl ; B 3 0 619 629 ; +C 150 ; WX 600 ; N endash ; B 124 231 586 285 ; +C 134 ; WX 600 ; N dagger ; B 217 -78 546 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ; +C 183 ; WX 600 ; N periodcentered ; B 275 189 434 327 ; +C 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ; +C 149 ; WX 600 ; N bullet ; B 224 130 485 383 ; +C 130 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ; +C 132 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ; +C 148 ; WX 600 ; N quotedblright ; B 213 328 576 562 ; +C 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ; +C 133 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ; +C 137 ; WX 600 ; N perthousand ; B 59 -15 627 622 ; +C 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ; +C 96 ; WX 600 ; N grave ; B 294 497 484 672 ; +C 180 ; WX 600 ; N acute ; B 348 497 612 672 ; +C 136 ; WX 600 ; N circumflex ; B 229 477 581 654 ; +C 152 ; WX 600 ; N tilde ; B 212 489 629 606 ; +C 175 ; WX 600 ; N macron ; B 232 525 600 565 ; +C -1 ; WX 600 ; N breve ; B 279 501 576 609 ; +C -1 ; WX 600 ; N dotaccent ; B 373 537 478 640 ; +C 168 ; WX 600 ; N dieresis ; B 272 537 579 640 ; +C -1 ; WX 600 ; N ring ; B 332 463 500 627 ; +C 184 ; WX 600 ; N cedilla ; B 197 -151 344 10 ; +C -1 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ; +C -1 ; WX 600 ; N ogonek ; B 189 -172 377 4 ; +C -1 ; WX 600 ; N caron ; B 262 492 614 669 ; +C 151 ; WX 600 ; N emdash ; B 49 231 661 285 ; +C 198 ; WX 600 ; N AE ; B 3 0 655 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ; +C -1 ; WX 600 ; N Lslash ; B 47 0 607 562 ; +C 216 ; WX 600 ; N Oslash ; B 94 -80 625 629 ; +C 140 ; WX 600 ; N OE ; B 59 0 672 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ; +C 230 ; WX 600 ; N ae ; B 41 -15 626 441 ; +C -1 ; WX 600 ; N dotlessi ; B 95 0 515 426 ; +C -1 ; WX 600 ; N lslash ; B 95 0 587 629 ; +C 248 ; WX 600 ; N oslash ; B 102 -80 588 506 ; +C 156 ; WX 600 ; N oe ; B 54 -15 615 441 ; +C 223 ; WX 600 ; N germandbls ; B 48 -15 617 629 ; +C 207 ; WX 600 ; N Idieresis ; B 96 0 623 753 ; +C 233 ; WX 600 ; N eacute ; B 106 -15 612 672 ; +C -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ; +C -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ; +C 159 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ; +C 247 ; WX 600 ; N divide ; B 136 48 573 467 ; +C 221 ; WX 600 ; N Yacute ; B 133 0 695 805 ; +C 194 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ; +C 225 ; WX 600 ; N aacute ; B 76 -15 612 672 ; +C 219 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ; +C 253 ; WX 600 ; N yacute ; B -4 -157 683 672 ; +C -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ; +C 234 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ; +C -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ; +C 220 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ; +C -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ; +C 218 ; WX 600 ; N Uacute ; B 125 -18 702 805 ; +C -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ; +C 203 ; WX 600 ; N Edieresis ; B 53 0 660 753 ; +C -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ; +C -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ; +C 169 ; WX 600 ; N copyright ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ; +C -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ; +C 229 ; WX 600 ; N aring ; B 76 -15 569 627 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ; +C -1 ; WX 600 ; N lacute ; B 95 0 640 805 ; +C 224 ; WX 600 ; N agrave ; B 76 -15 569 672 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ; +C -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ; +C 227 ; WX 600 ; N atilde ; B 76 -15 629 606 ; +C -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ; +C 154 ; WX 600 ; N scaron ; B 78 -15 614 669 ; +C -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ; +C 237 ; WX 600 ; N iacute ; B 95 0 612 672 ; +C -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ; +C -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ; +C 251 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ; +C 226 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ; +C -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ; +C -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ; +C 231 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ; +C -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ; +C 222 ; WX 600 ; N Thorn ; B 79 0 606 562 ; +C -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ; +C -1 ; WX 600 ; N Racute ; B 38 0 670 805 ; +C -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ; +C -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ; +C -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ; +C -1 ; WX 600 ; N uring ; B 101 -15 572 627 ; +C 179 ; WX 600 ; N threesuperior ; B 213 240 501 622 ; +C 210 ; WX 600 ; N Ograve ; B 94 -18 625 805 ; +C 192 ; WX 600 ; N Agrave ; B 3 0 607 805 ; +C -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ; +C 215 ; WX 600 ; N multiply ; B 103 43 607 470 ; +C 250 ; WX 600 ; N uacute ; B 101 -15 602 672 ; +C -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ; +C -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ; +C 255 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ; +C -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ; +C 238 ; WX 600 ; N icircumflex ; B 95 0 551 654 ; +C 202 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ; +C 228 ; WX 600 ; N adieresis ; B 76 -15 575 620 ; +C 235 ; WX 600 ; N edieresis ; B 106 -15 598 620 ; +C -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ; +C -1 ; WX 600 ; N nacute ; B 26 0 602 672 ; +C -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ; +C -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ; +C 205 ; WX 600 ; N Iacute ; B 96 0 640 805 ; +C 177 ; WX 600 ; N plusminus ; B 96 44 594 558 ; +C 166 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ; +C 174 ; WX 600 ; N registered ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ; +C -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ; +C -1 ; WX 600 ; N summation ; B 15 -10 670 706 ; +C 200 ; WX 600 ; N Egrave ; B 53 0 660 805 ; +C -1 ; WX 600 ; N racute ; B 60 0 636 672 ; +C -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ; +C -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ; +C 142 ; WX 600 ; N Zcaron ; B 86 0 642 802 ; +C -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ; +C 208 ; WX 600 ; N Eth ; B 43 0 645 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ; +C -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ; +C -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ; +C -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ; +C 193 ; WX 600 ; N Aacute ; B 3 0 660 805 ; +C 196 ; WX 600 ; N Adieresis ; B 3 0 607 753 ; +C 232 ; WX 600 ; N egrave ; B 106 -15 598 672 ; +C -1 ; WX 600 ; N zacute ; B 99 0 612 672 ; +C -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ; +C 211 ; WX 600 ; N Oacute ; B 94 -18 640 805 ; +C 243 ; WX 600 ; N oacute ; B 102 -15 612 672 ; +C -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ; +C -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ; +C 239 ; WX 600 ; N idieresis ; B 95 0 545 620 ; +C 212 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ; +C 217 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ; +C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; +C 254 ; WX 600 ; N thorn ; B -24 -157 605 629 ; +C 178 ; WX 600 ; N twosuperior ; B 230 249 535 622 ; +C 214 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ; +C 181 ; WX 600 ; N mu ; B 72 -157 572 426 ; +C 236 ; WX 600 ; N igrave ; B 95 0 515 672 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ; +C -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ; +C -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ; +C 190 ; WX 600 ; N threequarters ; B 73 -56 659 666 ; +C -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ; +C -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ; +C -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ; +C 153 ; WX 600 ; N trademark ; B 75 263 742 562 ; +C -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ; +C 204 ; WX 600 ; N Igrave ; B 96 0 623 805 ; +C -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ; +C -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ; +C 189 ; WX 600 ; N onehalf ; B 65 -57 669 665 ; +C -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ; +C 244 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ; +C 241 ; WX 600 ; N ntilde ; B 26 0 629 606 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ; +C 201 ; WX 600 ; N Eacute ; B 53 0 670 805 ; +C -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ; +C -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ; +C 188 ; WX 600 ; N onequarter ; B 65 -57 674 665 ; +C 138 ; WX 600 ; N Scaron ; B 76 -20 672 802 ; +C -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ; +C 176 ; WX 600 ; N degree ; B 214 269 576 622 ; +C 242 ; WX 600 ; N ograve ; B 102 -15 588 672 ; +C -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ; +C 249 ; WX 600 ; N ugrave ; B 101 -15 572 672 ; +C -1 ; WX 600 ; N radical ; B 85 -15 765 792 ; +C -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ; +C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ; +C 209 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ; +C 245 ; WX 600 ; N otilde ; B 102 -15 629 606 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ; +C 195 ; WX 600 ; N Atilde ; B 3 0 655 729 ; +C -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ; +C 197 ; WX 600 ; N Aring ; B 3 0 607 750 ; +C 213 ; WX 600 ; N Otilde ; B 94 -18 655 729 ; +C -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ; +C -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ; +C -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ; +C -1 ; WX 600 ; N minus ; B 129 232 580 283 ; +C 206 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ; +C -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ; +C -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ; +C 172 ; WX 600 ; N logicalnot ; B 155 108 591 369 ; +C 246 ; WX 600 ; N odieresis ; B 102 -15 588 620 ; +C 252 ; WX 600 ; N udieresis ; B 101 -15 575 620 ; +C -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ; +C -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ; +C 240 ; WX 600 ; N eth ; B 102 -15 639 629 ; +C 158 ; WX 600 ; N zcaron ; B 99 0 624 669 ; +C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ; +C 185 ; WX 600 ; N onesuperior ; B 231 249 491 622 ; +C -1 ; WX 600 ; N imacron ; B 95 0 543 565 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Courier.afm b/application/third_party/dompdf/lib/fonts/Courier.afm new file mode 100644 index 00000000..530d5f8f --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Courier.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 17:27:09 1997 +Comment UniqueID 43050 +Comment VMusage 39754 50779 +FontName Courier +FullName Courier +FamilyName Courier +Weight Medium +ItalicAngle 0 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -23 -250 715 805 +UnderlinePosition -100 +UnderlineThickness 50 +Version 003.000 +Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 426 +Ascender 629 +Descender -157 +StdHW 51 +StdVW 51 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ; +C 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ; +C 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ; +C 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ; +C 37 ; WX 600 ; N percent ; B 81 -15 518 622 ; +C 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ; +C 146 ; WX 600 ; N quoteright ; B 213 328 376 562 ; +C 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ; +C 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ; +C 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ; +C 43 ; WX 600 ; N plus ; B 80 44 520 470 ; +C 44 ; WX 600 ; N comma ; B 181 -112 344 122 ; +C 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ; +C 173 ; WX 600 ; N hyphen ; B 103 231 497 285 ; +C 46 ; WX 600 ; N period ; B 229 -15 371 109 ; +C 47 ; WX 600 ; N slash ; B 125 -80 475 629 ; +C 48 ; WX 600 ; N zero ; B 106 -15 494 622 ; +C 49 ; WX 600 ; N one ; B 96 0 505 622 ; +C 50 ; WX 600 ; N two ; B 70 0 471 622 ; +C 51 ; WX 600 ; N three ; B 75 -15 466 622 ; +C 52 ; WX 600 ; N four ; B 78 0 500 622 ; +C 53 ; WX 600 ; N five ; B 92 -15 497 607 ; +C 54 ; WX 600 ; N six ; B 111 -15 497 622 ; +C 55 ; WX 600 ; N seven ; B 82 0 483 607 ; +C 56 ; WX 600 ; N eight ; B 102 -15 498 622 ; +C 57 ; WX 600 ; N nine ; B 96 -15 489 622 ; +C 58 ; WX 600 ; N colon ; B 229 -15 371 385 ; +C 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ; +C 60 ; WX 600 ; N less ; B 41 42 519 472 ; +C 61 ; WX 600 ; N equal ; B 80 138 520 376 ; +C 62 ; WX 600 ; N greater ; B 66 42 544 472 ; +C 63 ; WX 600 ; N question ; B 129 -15 492 572 ; +C 64 ; WX 600 ; N at ; B 77 -15 533 622 ; +C 65 ; WX 600 ; N A ; B 3 0 597 562 ; +C 66 ; WX 600 ; N B ; B 43 0 559 562 ; +C 67 ; WX 600 ; N C ; B 41 -18 540 580 ; +C 68 ; WX 600 ; N D ; B 43 0 574 562 ; +C 69 ; WX 600 ; N E ; B 53 0 550 562 ; +C 70 ; WX 600 ; N F ; B 53 0 545 562 ; +C 71 ; WX 600 ; N G ; B 31 -18 575 580 ; +C 72 ; WX 600 ; N H ; B 32 0 568 562 ; +C 73 ; WX 600 ; N I ; B 96 0 504 562 ; +C 74 ; WX 600 ; N J ; B 34 -18 566 562 ; +C 75 ; WX 600 ; N K ; B 38 0 582 562 ; +C 76 ; WX 600 ; N L ; B 47 0 554 562 ; +C 77 ; WX 600 ; N M ; B 4 0 596 562 ; +C 78 ; WX 600 ; N N ; B 7 -13 593 562 ; +C 79 ; WX 600 ; N O ; B 43 -18 557 580 ; +C 80 ; WX 600 ; N P ; B 79 0 558 562 ; +C 81 ; WX 600 ; N Q ; B 43 -138 557 580 ; +C 82 ; WX 600 ; N R ; B 38 0 588 562 ; +C 83 ; WX 600 ; N S ; B 72 -20 529 580 ; +C 84 ; WX 600 ; N T ; B 38 0 563 562 ; +C 85 ; WX 600 ; N U ; B 17 -18 583 562 ; +C 86 ; WX 600 ; N V ; B -4 -13 604 562 ; +C 87 ; WX 600 ; N W ; B -3 -13 603 562 ; +C 88 ; WX 600 ; N X ; B 23 0 577 562 ; +C 89 ; WX 600 ; N Y ; B 24 0 576 562 ; +C 90 ; WX 600 ; N Z ; B 86 0 514 562 ; +C 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ; +C 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ; +C 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ; +C 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ; +C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 224 328 387 562 ; +C 97 ; WX 600 ; N a ; B 53 -15 559 441 ; +C 98 ; WX 600 ; N b ; B 14 -15 575 629 ; +C 99 ; WX 600 ; N c ; B 66 -15 529 441 ; +C 100 ; WX 600 ; N d ; B 45 -15 591 629 ; +C 101 ; WX 600 ; N e ; B 66 -15 548 441 ; +C 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 45 -157 566 441 ; +C 104 ; WX 600 ; N h ; B 18 0 582 629 ; +C 105 ; WX 600 ; N i ; B 95 0 505 657 ; +C 106 ; WX 600 ; N j ; B 82 -157 410 657 ; +C 107 ; WX 600 ; N k ; B 43 0 580 629 ; +C 108 ; WX 600 ; N l ; B 95 0 505 629 ; +C 109 ; WX 600 ; N m ; B -5 0 605 441 ; +C 110 ; WX 600 ; N n ; B 26 0 575 441 ; +C 111 ; WX 600 ; N o ; B 62 -15 538 441 ; +C 112 ; WX 600 ; N p ; B 9 -157 555 441 ; +C 113 ; WX 600 ; N q ; B 45 -157 591 441 ; +C 114 ; WX 600 ; N r ; B 60 0 559 441 ; +C 115 ; WX 600 ; N s ; B 80 -15 513 441 ; +C 116 ; WX 600 ; N t ; B 87 -15 530 561 ; +C 117 ; WX 600 ; N u ; B 21 -15 562 426 ; +C 118 ; WX 600 ; N v ; B 10 -10 590 426 ; +C 119 ; WX 600 ; N w ; B -4 -10 604 426 ; +C 120 ; WX 600 ; N x ; B 20 0 580 426 ; +C 121 ; WX 600 ; N y ; B 7 -157 592 426 ; +C 122 ; WX 600 ; N z ; B 99 0 502 426 ; +C 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ; +C 124 ; WX 600 ; N bar ; B 275 -250 326 750 ; +C 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ; +C 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ; +C 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ; +C 162 ; WX 600 ; N cent ; B 96 -49 500 614 ; +C 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ; +C -1 ; WX 600 ; N fraction ; B 92 -57 509 665 ; +C 165 ; WX 600 ; N yen ; B 26 0 574 562 ; +C 131 ; WX 600 ; N florin ; B 4 -143 539 622 ; +C 167 ; WX 600 ; N section ; B 113 -78 488 580 ; +C 164 ; WX 600 ; N currency ; B 73 58 527 506 ; +C 39 ; WX 600 ; N quotesingle ; B 259 328 341 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ; +C 170 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ; +C -1 ; WX 600 ; N fi ; B 3 0 597 629 ; +C -1 ; WX 600 ; N fl ; B 3 0 597 629 ; +C 150 ; WX 600 ; N endash ; B 75 231 525 285 ; +C 134 ; WX 600 ; N dagger ; B 141 -78 459 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ; +C 183 ; WX 600 ; N periodcentered ; B 222 189 378 327 ; +C 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ; +C 149 ; WX 600 ; N bullet ; B 172 130 428 383 ; +C 130 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ; +C 132 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ; +C 148 ; WX 600 ; N quotedblright ; B 143 328 457 562 ; +C 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ; +C 133 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ; +C 137 ; WX 600 ; N perthousand ; B 3 -15 600 622 ; +C 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ; +C 96 ; WX 600 ; N grave ; B 151 497 378 672 ; +C 180 ; WX 600 ; N acute ; B 242 497 469 672 ; +C 136 ; WX 600 ; N circumflex ; B 124 477 476 654 ; +C 152 ; WX 600 ; N tilde ; B 105 489 503 606 ; +C 175 ; WX 600 ; N macron ; B 120 525 480 565 ; +C -1 ; WX 600 ; N breve ; B 153 501 447 609 ; +C -1 ; WX 600 ; N dotaccent ; B 249 537 352 640 ; +C 168 ; WX 600 ; N dieresis ; B 148 537 453 640 ; +C -1 ; WX 600 ; N ring ; B 218 463 382 627 ; +C 184 ; WX 600 ; N cedilla ; B 224 -151 362 10 ; +C -1 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ; +C -1 ; WX 600 ; N ogonek ; B 211 -172 407 4 ; +C -1 ; WX 600 ; N caron ; B 124 492 476 669 ; +C 151 ; WX 600 ; N emdash ; B 0 231 600 285 ; +C 198 ; WX 600 ; N AE ; B 3 0 550 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ; +C -1 ; WX 600 ; N Lslash ; B 47 0 554 562 ; +C 216 ; WX 600 ; N Oslash ; B 43 -80 557 629 ; +C 140 ; WX 600 ; N OE ; B 7 0 567 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ; +C 230 ; WX 600 ; N ae ; B 19 -15 570 441 ; +C -1 ; WX 600 ; N dotlessi ; B 95 0 505 426 ; +C -1 ; WX 600 ; N lslash ; B 95 0 505 629 ; +C 248 ; WX 600 ; N oslash ; B 62 -80 538 506 ; +C 156 ; WX 600 ; N oe ; B 19 -15 559 441 ; +C 223 ; WX 600 ; N germandbls ; B 48 -15 588 629 ; +C 207 ; WX 600 ; N Idieresis ; B 96 0 504 753 ; +C 233 ; WX 600 ; N eacute ; B 66 -15 548 672 ; +C -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ; +C -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ; +C 159 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ; +C 247 ; WX 600 ; N divide ; B 87 48 513 467 ; +C 221 ; WX 600 ; N Yacute ; B 24 0 576 805 ; +C 194 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ; +C 225 ; WX 600 ; N aacute ; B 53 -15 559 672 ; +C 219 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ; +C 253 ; WX 600 ; N yacute ; B 7 -157 592 672 ; +C -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ; +C 234 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ; +C -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ; +C 220 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ; +C -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ; +C 218 ; WX 600 ; N Uacute ; B 17 -18 583 805 ; +C -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ; +C 203 ; WX 600 ; N Edieresis ; B 53 0 550 753 ; +C -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ; +C -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ; +C 169 ; WX 600 ; N copyright ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ; +C -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ; +C 229 ; WX 600 ; N aring ; B 53 -15 559 627 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ; +C -1 ; WX 600 ; N lacute ; B 95 0 505 805 ; +C 224 ; WX 600 ; N agrave ; B 53 -15 559 672 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ; +C -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ; +C 227 ; WX 600 ; N atilde ; B 53 -15 559 606 ; +C -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ; +C 154 ; WX 600 ; N scaron ; B 80 -15 513 669 ; +C -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ; +C 237 ; WX 600 ; N iacute ; B 95 0 505 672 ; +C -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ; +C -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ; +C 251 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ; +C 226 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ; +C -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ; +C -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ; +C 231 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ; +C -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ; +C 222 ; WX 600 ; N Thorn ; B 79 0 538 562 ; +C -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ; +C -1 ; WX 600 ; N Racute ; B 38 0 588 805 ; +C -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ; +C -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ; +C -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ; +C -1 ; WX 600 ; N uring ; B 21 -15 562 627 ; +C 179 ; WX 600 ; N threesuperior ; B 155 240 406 622 ; +C 210 ; WX 600 ; N Ograve ; B 43 -18 557 805 ; +C 192 ; WX 600 ; N Agrave ; B 3 0 597 805 ; +C -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ; +C 215 ; WX 600 ; N multiply ; B 87 43 515 470 ; +C 250 ; WX 600 ; N uacute ; B 21 -15 562 672 ; +C -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ; +C -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ; +C 255 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ; +C -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ; +C 238 ; WX 600 ; N icircumflex ; B 94 0 505 654 ; +C 202 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ; +C 228 ; WX 600 ; N adieresis ; B 53 -15 559 620 ; +C 235 ; WX 600 ; N edieresis ; B 66 -15 548 620 ; +C -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ; +C -1 ; WX 600 ; N nacute ; B 26 0 575 672 ; +C -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ; +C -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ; +C 205 ; WX 600 ; N Iacute ; B 96 0 504 805 ; +C 177 ; WX 600 ; N plusminus ; B 87 44 513 558 ; +C 166 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ; +C 174 ; WX 600 ; N registered ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ; +C -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ; +C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; +C 200 ; WX 600 ; N Egrave ; B 53 0 550 805 ; +C -1 ; WX 600 ; N racute ; B 60 0 559 672 ; +C -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ; +C -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ; +C 142 ; WX 600 ; N Zcaron ; B 86 0 514 802 ; +C -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ; +C 208 ; WX 600 ; N Eth ; B 30 0 574 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ; +C -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ; +C -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ; +C -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ; +C 193 ; WX 600 ; N Aacute ; B 3 0 597 805 ; +C 196 ; WX 600 ; N Adieresis ; B 3 0 597 753 ; +C 232 ; WX 600 ; N egrave ; B 66 -15 548 672 ; +C -1 ; WX 600 ; N zacute ; B 99 0 502 672 ; +C -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ; +C 211 ; WX 600 ; N Oacute ; B 43 -18 557 805 ; +C 243 ; WX 600 ; N oacute ; B 62 -15 538 672 ; +C -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ; +C -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ; +C 239 ; WX 600 ; N idieresis ; B 95 0 505 620 ; +C 212 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ; +C 217 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ; +C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; +C 254 ; WX 600 ; N thorn ; B -6 -157 555 629 ; +C 178 ; WX 600 ; N twosuperior ; B 177 249 424 622 ; +C 214 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ; +C 181 ; WX 600 ; N mu ; B 21 -157 562 426 ; +C 236 ; WX 600 ; N igrave ; B 95 0 505 672 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ; +C -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ; +C -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ; +C 190 ; WX 600 ; N threequarters ; B 8 -56 593 666 ; +C -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ; +C -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ; +C -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ; +C 153 ; WX 600 ; N trademark ; B -23 263 623 562 ; +C -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ; +C 204 ; WX 600 ; N Igrave ; B 96 0 504 805 ; +C -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ; +C -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ; +C 189 ; WX 600 ; N onehalf ; B 0 -57 611 665 ; +C -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ; +C 244 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ; +C 241 ; WX 600 ; N ntilde ; B 26 0 575 606 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ; +C 201 ; WX 600 ; N Eacute ; B 53 0 550 805 ; +C -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ; +C -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ; +C 188 ; WX 600 ; N onequarter ; B 0 -57 600 665 ; +C 138 ; WX 600 ; N Scaron ; B 72 -20 529 802 ; +C -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ; +C 176 ; WX 600 ; N degree ; B 123 269 477 622 ; +C 242 ; WX 600 ; N ograve ; B 62 -15 538 672 ; +C -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ; +C 249 ; WX 600 ; N ugrave ; B 21 -15 562 672 ; +C -1 ; WX 600 ; N radical ; B 3 -15 597 792 ; +C -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ; +C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ; +C 209 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ; +C 245 ; WX 600 ; N otilde ; B 62 -15 538 606 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ; +C 195 ; WX 600 ; N Atilde ; B 3 0 597 729 ; +C -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ; +C 197 ; WX 600 ; N Aring ; B 3 0 597 750 ; +C 213 ; WX 600 ; N Otilde ; B 43 -18 557 729 ; +C -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ; +C -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ; +C -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ; +C -1 ; WX 600 ; N minus ; B 80 232 520 283 ; +C 206 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ; +C -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ; +C -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ; +C 172 ; WX 600 ; N logicalnot ; B 87 108 513 369 ; +C 246 ; WX 600 ; N odieresis ; B 62 -15 538 620 ; +C 252 ; WX 600 ; N udieresis ; B 21 -15 562 620 ; +C -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ; +C -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ; +C 240 ; WX 600 ; N eth ; B 62 -15 538 629 ; +C 158 ; WX 600 ; N zcaron ; B 99 0 502 669 ; +C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ; +C 185 ; WX 600 ; N onesuperior ; B 172 249 428 622 ; +C -1 ; WX 600 ; N imacron ; B 95 0 505 565 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm b/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm new file mode 100644 index 00000000..a9298483 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm @@ -0,0 +1,2829 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:43:52 1997 +Comment UniqueID 43052 +Comment VMusage 37169 48194 +FontName Helvetica-Bold +FullName Helvetica Bold +FamilyName Helvetica +Weight Bold +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -170 -228 1003 962 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 532 +Ascender 718 +Descender -207 +StdHW 118 +StdVW 140 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ; +C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ; +C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ; +C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ; +C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ; +C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ; +C 146 ; WX 278 ; N quoteright ; B 69 445 209 718 ; +C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ; +C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ; +C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ; +C 43 ; WX 584 ; N plus ; B 40 0 544 506 ; +C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ; +C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 64 0 214 146 ; +C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ; +C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ; +C 49 ; WX 556 ; N one ; B 69 0 378 710 ; +C 50 ; WX 556 ; N two ; B 26 0 511 710 ; +C 51 ; WX 556 ; N three ; B 27 -19 516 710 ; +C 52 ; WX 556 ; N four ; B 27 0 526 710 ; +C 53 ; WX 556 ; N five ; B 27 -19 516 698 ; +C 54 ; WX 556 ; N six ; B 31 -19 520 710 ; +C 55 ; WX 556 ; N seven ; B 25 0 528 698 ; +C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ; +C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ; +C 58 ; WX 333 ; N colon ; B 92 0 242 512 ; +C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ; +C 60 ; WX 584 ; N less ; B 38 -8 546 514 ; +C 61 ; WX 584 ; N equal ; B 40 87 544 419 ; +C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ; +C 63 ; WX 611 ; N question ; B 60 0 556 727 ; +C 64 ; WX 975 ; N at ; B 118 -19 856 737 ; +C 65 ; WX 722 ; N A ; B 20 0 702 718 ; +C 66 ; WX 722 ; N B ; B 76 0 669 718 ; +C 67 ; WX 722 ; N C ; B 44 -19 684 737 ; +C 68 ; WX 722 ; N D ; B 76 0 685 718 ; +C 69 ; WX 667 ; N E ; B 76 0 621 718 ; +C 70 ; WX 611 ; N F ; B 76 0 587 718 ; +C 71 ; WX 778 ; N G ; B 44 -19 713 737 ; +C 72 ; WX 722 ; N H ; B 71 0 651 718 ; +C 73 ; WX 278 ; N I ; B 64 0 214 718 ; +C 74 ; WX 556 ; N J ; B 22 -18 484 718 ; +C 75 ; WX 722 ; N K ; B 87 0 722 718 ; +C 76 ; WX 611 ; N L ; B 76 0 583 718 ; +C 77 ; WX 833 ; N M ; B 69 0 765 718 ; +C 78 ; WX 722 ; N N ; B 69 0 654 718 ; +C 79 ; WX 778 ; N O ; B 44 -19 734 737 ; +C 80 ; WX 667 ; N P ; B 76 0 627 718 ; +C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ; +C 82 ; WX 722 ; N R ; B 76 0 677 718 ; +C 83 ; WX 667 ; N S ; B 39 -19 629 737 ; +C 84 ; WX 611 ; N T ; B 14 0 598 718 ; +C 85 ; WX 722 ; N U ; B 72 -19 651 718 ; +C 86 ; WX 667 ; N V ; B 19 0 648 718 ; +C 87 ; WX 944 ; N W ; B 16 0 929 718 ; +C 88 ; WX 667 ; N X ; B 14 0 653 718 ; +C 89 ; WX 667 ; N Y ; B 15 0 653 718 ; +C 90 ; WX 611 ; N Z ; B 25 0 586 718 ; +C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ; +C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ; +C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ; +C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ; +C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; +C 145 ; WX 278 ; N quoteleft ; B 69 454 209 727 ; +C 97 ; WX 556 ; N a ; B 29 -14 527 546 ; +C 98 ; WX 611 ; N b ; B 61 -14 578 718 ; +C 99 ; WX 556 ; N c ; B 34 -14 524 546 ; +C 100 ; WX 611 ; N d ; B 34 -14 551 718 ; +C 101 ; WX 556 ; N e ; B 23 -14 528 546 ; +C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ; +C 103 ; WX 611 ; N g ; B 40 -217 553 546 ; +C 104 ; WX 611 ; N h ; B 65 0 546 718 ; +C 105 ; WX 278 ; N i ; B 69 0 209 725 ; +C 106 ; WX 278 ; N j ; B 3 -214 209 725 ; +C 107 ; WX 556 ; N k ; B 69 0 562 718 ; +C 108 ; WX 278 ; N l ; B 69 0 209 718 ; +C 109 ; WX 889 ; N m ; B 64 0 826 546 ; +C 110 ; WX 611 ; N n ; B 65 0 546 546 ; +C 111 ; WX 611 ; N o ; B 34 -14 578 546 ; +C 112 ; WX 611 ; N p ; B 62 -207 578 546 ; +C 113 ; WX 611 ; N q ; B 34 -207 552 546 ; +C 114 ; WX 389 ; N r ; B 64 0 373 546 ; +C 115 ; WX 556 ; N s ; B 30 -14 519 546 ; +C 116 ; WX 333 ; N t ; B 10 -6 309 676 ; +C 117 ; WX 611 ; N u ; B 66 -14 545 532 ; +C 118 ; WX 556 ; N v ; B 13 0 543 532 ; +C 119 ; WX 778 ; N w ; B 10 0 769 532 ; +C 120 ; WX 556 ; N x ; B 15 0 541 532 ; +C 121 ; WX 556 ; N y ; B 10 -214 539 532 ; +C 122 ; WX 500 ; N z ; B 20 0 480 532 ; +C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ; +C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ; +C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ; +C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ; +C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ; +C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ; +C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ; +C -1 ; WX 167 ; N fraction ; B -170 -19 336 710 ; +C 165 ; WX 556 ; N yen ; B -9 0 565 698 ; +C 131 ; WX 556 ; N florin ; B -10 -210 516 737 ; +C 167 ; WX 556 ; N section ; B 34 -184 522 727 ; +C 164 ; WX 556 ; N currency ; B -3 76 559 636 ; +C 39 ; WX 238 ; N quotesingle ; B 70 447 168 718 ; +C 147 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ; +C 170 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ; +C 139 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ; +C 155 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ; +C -1 ; WX 611 ; N fi ; B 10 0 542 727 ; +C -1 ; WX 611 ; N fl ; B 10 0 542 727 ; +C 150 ; WX 556 ; N endash ; B 0 227 556 333 ; +C 134 ; WX 556 ; N dagger ; B 36 -171 520 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ; +C 183 ; WX 278 ; N periodcentered ; B 58 172 220 334 ; +C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ; +C 149 ; WX 350 ; N bullet ; B 10 194 340 524 ; +C 130 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ; +C 132 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ; +C 148 ; WX 500 ; N quotedblright ; B 64 445 436 718 ; +C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ; +C 133 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ; +C 137 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ; +C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ; +C 96 ; WX 333 ; N grave ; B -23 604 225 750 ; +C 180 ; WX 333 ; N acute ; B 108 604 356 750 ; +C 136 ; WX 333 ; N circumflex ; B -10 604 343 750 ; +C 152 ; WX 333 ; N tilde ; B -17 610 350 737 ; +C 175 ; WX 333 ; N macron ; B -6 604 339 678 ; +C -1 ; WX 333 ; N breve ; B -2 604 335 750 ; +C -1 ; WX 333 ; N dotaccent ; B 104 614 230 729 ; +C 168 ; WX 333 ; N dieresis ; B 6 614 327 729 ; +C -1 ; WX 333 ; N ring ; B 59 568 275 776 ; +C 184 ; WX 333 ; N cedilla ; B 6 -228 245 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ; +C -1 ; WX 333 ; N ogonek ; B 71 -228 304 0 ; +C -1 ; WX 333 ; N caron ; B -10 604 343 750 ; +C 151 ; WX 1000 ; N emdash ; B 0 227 1000 333 ; +C 198 ; WX 1000 ; N AE ; B 5 0 954 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ; +C -1 ; WX 611 ; N Lslash ; B -20 0 583 718 ; +C 216 ; WX 778 ; N Oslash ; B 33 -27 744 745 ; +C 140 ; WX 1000 ; N OE ; B 37 -19 961 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ; +C 230 ; WX 889 ; N ae ; B 29 -14 858 546 ; +C -1 ; WX 278 ; N dotlessi ; B 69 0 209 532 ; +C -1 ; WX 278 ; N lslash ; B -18 0 296 718 ; +C 248 ; WX 611 ; N oslash ; B 22 -29 589 560 ; +C 156 ; WX 944 ; N oe ; B 34 -14 912 546 ; +C 223 ; WX 611 ; N germandbls ; B 69 -14 579 731 ; +C 207 ; WX 278 ; N Idieresis ; B -21 0 300 915 ; +C 233 ; WX 556 ; N eacute ; B 23 -14 528 750 ; +C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ; +C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ; +C 159 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ; +C 247 ; WX 584 ; N divide ; B 40 -42 544 548 ; +C 221 ; WX 667 ; N Yacute ; B 15 0 653 936 ; +C 194 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ; +C 225 ; WX 556 ; N aacute ; B 29 -14 527 750 ; +C 219 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ; +C 253 ; WX 556 ; N yacute ; B 10 -214 539 750 ; +C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ; +C 234 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ; +C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ; +C 220 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ; +C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ; +C 218 ; WX 722 ; N Uacute ; B 72 -19 651 936 ; +C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ; +C 203 ; WX 667 ; N Edieresis ; B 76 0 621 915 ; +C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ; +C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ; +C 169 ; WX 737 ; N copyright ; B -11 -19 749 737 ; +C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ; +C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ; +C 229 ; WX 556 ; N aring ; B 29 -14 527 776 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ; +C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ; +C 224 ; WX 556 ; N agrave ; B 29 -14 527 750 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ; +C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ; +C 227 ; WX 556 ; N atilde ; B 29 -14 527 737 ; +C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ; +C 154 ; WX 556 ; N scaron ; B 30 -14 519 750 ; +C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ; +C 237 ; WX 278 ; N iacute ; B 69 0 329 750 ; +C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; +C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ; +C 251 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ; +C 226 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ; +C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ; +C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ; +C 231 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ; +C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ; +C 222 ; WX 667 ; N Thorn ; B 76 0 627 718 ; +C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ; +C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ; +C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ; +C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ; +C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ; +C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ; +C 179 ; WX 333 ; N threesuperior ; B 8 271 326 710 ; +C 210 ; WX 778 ; N Ograve ; B 44 -19 734 936 ; +C 192 ; WX 722 ; N Agrave ; B 20 0 702 936 ; +C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ; +C 215 ; WX 584 ; N multiply ; B 40 1 545 505 ; +C 250 ; WX 611 ; N uacute ; B 66 -14 545 750 ; +C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ; +C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; +C 255 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ; +C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ; +C 238 ; WX 278 ; N icircumflex ; B -37 0 316 750 ; +C 202 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ; +C 228 ; WX 556 ; N adieresis ; B 29 -14 527 729 ; +C 235 ; WX 556 ; N edieresis ; B 23 -14 528 729 ; +C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ; +C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ; +C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ; +C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ; +C 205 ; WX 278 ; N Iacute ; B 64 0 329 936 ; +C 177 ; WX 584 ; N plusminus ; B 40 0 544 506 ; +C 166 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ; +C 174 ; WX 737 ; N registered ; B -11 -19 748 737 ; +C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ; +C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; +C 200 ; WX 667 ; N Egrave ; B 76 0 621 936 ; +C -1 ; WX 389 ; N racute ; B 64 0 384 750 ; +C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ; +C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ; +C 142 ; WX 611 ; N Zcaron ; B 25 0 586 936 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; +C 208 ; WX 722 ; N Eth ; B -5 0 685 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ; +C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ; +C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ; +C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ; +C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ; +C 193 ; WX 722 ; N Aacute ; B 20 0 702 936 ; +C 196 ; WX 722 ; N Adieresis ; B 20 0 702 915 ; +C 232 ; WX 556 ; N egrave ; B 23 -14 528 750 ; +C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ; +C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ; +C 211 ; WX 778 ; N Oacute ; B 44 -19 734 936 ; +C 243 ; WX 611 ; N oacute ; B 34 -14 578 750 ; +C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ; +C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ; +C 239 ; WX 278 ; N idieresis ; B -21 0 300 729 ; +C 212 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ; +C 217 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 611 ; N thorn ; B 62 -208 578 718 ; +C 178 ; WX 333 ; N twosuperior ; B 9 283 324 710 ; +C 214 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ; +C 181 ; WX 611 ; N mu ; B 66 -207 545 532 ; +C 236 ; WX 278 ; N igrave ; B -50 0 209 750 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ; +C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ; +C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ; +C 190 ; WX 834 ; N threequarters ; B 16 -19 799 710 ; +C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ; +C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ; +C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ; +C 153 ; WX 1000 ; N trademark ; B 44 306 956 718 ; +C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ; +C 204 ; WX 278 ; N Igrave ; B -50 0 214 936 ; +C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ; +C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ; +C 189 ; WX 834 ; N onehalf ; B 26 -19 794 710 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; +C 244 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ; +C 241 ; WX 611 ; N ntilde ; B 65 0 546 737 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ; +C 201 ; WX 667 ; N Eacute ; B 76 0 621 936 ; +C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ; +C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ; +C 188 ; WX 834 ; N onequarter ; B 26 -19 766 710 ; +C 138 ; WX 667 ; N Scaron ; B 39 -19 629 936 ; +C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ; +C 176 ; WX 400 ; N degree ; B 57 426 343 712 ; +C 242 ; WX 611 ; N ograve ; B 34 -14 578 750 ; +C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ; +C 249 ; WX 611 ; N ugrave ; B 66 -14 545 750 ; +C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; +C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ; +C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ; +C 209 ; WX 722 ; N Ntilde ; B 69 0 654 923 ; +C 245 ; WX 611 ; N otilde ; B 34 -14 578 737 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ; +C 195 ; WX 722 ; N Atilde ; B 20 0 702 923 ; +C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ; +C 197 ; WX 722 ; N Aring ; B 20 0 702 962 ; +C 213 ; WX 778 ; N Otilde ; B 44 -19 734 923 ; +C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ; +C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ; +C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ; +C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ; +C -1 ; WX 584 ; N minus ; B 40 197 544 309 ; +C 206 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ; +C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ; +C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ; +C 172 ; WX 584 ; N logicalnot ; B 40 108 544 419 ; +C 246 ; WX 611 ; N odieresis ; B 34 -14 578 729 ; +C 252 ; WX 611 ; N udieresis ; B 66 -14 545 729 ; +C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; +C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ; +C 240 ; WX 611 ; N eth ; B 34 -14 578 737 ; +C 158 ; WX 500 ; N zcaron ; B 20 0 480 750 ; +C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ; +C 185 ; WX 333 ; N onesuperior ; B 26 283 237 710 ; +C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2481 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -50 +KPX A Gbreve -50 +KPX A Gcommaaccent -50 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -90 +KPX A Tcaron -90 +KPX A Tcommaaccent -90 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -80 +KPX A W -60 +KPX A Y -110 +KPX A Yacute -110 +KPX A Ydieresis -110 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -30 +KPX A y -30 +KPX A yacute -30 +KPX A ydieresis -30 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -50 +KPX Aacute Gbreve -50 +KPX Aacute Gcommaaccent -50 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -90 +KPX Aacute Tcaron -90 +KPX Aacute Tcommaaccent -90 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -80 +KPX Aacute W -60 +KPX Aacute Y -110 +KPX Aacute Yacute -110 +KPX Aacute Ydieresis -110 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -30 +KPX Aacute y -30 +KPX Aacute yacute -30 +KPX Aacute ydieresis -30 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -50 +KPX Abreve Gbreve -50 +KPX Abreve Gcommaaccent -50 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -90 +KPX Abreve Tcaron -90 +KPX Abreve Tcommaaccent -90 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -80 +KPX Abreve W -60 +KPX Abreve Y -110 +KPX Abreve Yacute -110 +KPX Abreve Ydieresis -110 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -30 +KPX Abreve y -30 +KPX Abreve yacute -30 +KPX Abreve ydieresis -30 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -50 +KPX Acircumflex Gbreve -50 +KPX Acircumflex Gcommaaccent -50 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -90 +KPX Acircumflex Tcaron -90 +KPX Acircumflex Tcommaaccent -90 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -80 +KPX Acircumflex W -60 +KPX Acircumflex Y -110 +KPX Acircumflex Yacute -110 +KPX Acircumflex Ydieresis -110 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -30 +KPX Acircumflex y -30 +KPX Acircumflex yacute -30 +KPX Acircumflex ydieresis -30 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -50 +KPX Adieresis Gbreve -50 +KPX Adieresis Gcommaaccent -50 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -90 +KPX Adieresis Tcaron -90 +KPX Adieresis Tcommaaccent -90 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -80 +KPX Adieresis W -60 +KPX Adieresis Y -110 +KPX Adieresis Yacute -110 +KPX Adieresis Ydieresis -110 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -30 +KPX Adieresis y -30 +KPX Adieresis yacute -30 +KPX Adieresis ydieresis -30 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -50 +KPX Agrave Gbreve -50 +KPX Agrave Gcommaaccent -50 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -90 +KPX Agrave Tcaron -90 +KPX Agrave Tcommaaccent -90 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -80 +KPX Agrave W -60 +KPX Agrave Y -110 +KPX Agrave Yacute -110 +KPX Agrave Ydieresis -110 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -30 +KPX Agrave y -30 +KPX Agrave yacute -30 +KPX Agrave ydieresis -30 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -50 +KPX Amacron Gbreve -50 +KPX Amacron Gcommaaccent -50 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -90 +KPX Amacron Tcaron -90 +KPX Amacron Tcommaaccent -90 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -80 +KPX Amacron W -60 +KPX Amacron Y -110 +KPX Amacron Yacute -110 +KPX Amacron Ydieresis -110 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -30 +KPX Amacron y -30 +KPX Amacron yacute -30 +KPX Amacron ydieresis -30 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -50 +KPX Aogonek Gbreve -50 +KPX Aogonek Gcommaaccent -50 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -90 +KPX Aogonek Tcaron -90 +KPX Aogonek Tcommaaccent -90 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -80 +KPX Aogonek W -60 +KPX Aogonek Y -110 +KPX Aogonek Yacute -110 +KPX Aogonek Ydieresis -110 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -30 +KPX Aogonek y -30 +KPX Aogonek yacute -30 +KPX Aogonek ydieresis -30 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -50 +KPX Aring Gbreve -50 +KPX Aring Gcommaaccent -50 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -90 +KPX Aring Tcaron -90 +KPX Aring Tcommaaccent -90 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -80 +KPX Aring W -60 +KPX Aring Y -110 +KPX Aring Yacute -110 +KPX Aring Ydieresis -110 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -30 +KPX Aring y -30 +KPX Aring yacute -30 +KPX Aring ydieresis -30 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -50 +KPX Atilde Gbreve -50 +KPX Atilde Gcommaaccent -50 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -90 +KPX Atilde Tcaron -90 +KPX Atilde Tcommaaccent -90 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -80 +KPX Atilde W -60 +KPX Atilde Y -110 +KPX Atilde Yacute -110 +KPX Atilde Ydieresis -110 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -30 +KPX Atilde y -30 +KPX Atilde yacute -30 +KPX Atilde ydieresis -30 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -40 +KPX D Y -70 +KPX D Yacute -70 +KPX D Ydieresis -70 +KPX D comma -30 +KPX D period -30 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -70 +KPX Dcaron Yacute -70 +KPX Dcaron Ydieresis -70 +KPX Dcaron comma -30 +KPX Dcaron period -30 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -70 +KPX Dcroat Yacute -70 +KPX Dcroat Ydieresis -70 +KPX Dcroat comma -30 +KPX Dcroat period -30 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -20 +KPX F aacute -20 +KPX F abreve -20 +KPX F acircumflex -20 +KPX F adieresis -20 +KPX F agrave -20 +KPX F amacron -20 +KPX F aogonek -20 +KPX F aring -20 +KPX F atilde -20 +KPX F comma -100 +KPX F period -100 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J comma -20 +KPX J period -20 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -15 +KPX K eacute -15 +KPX K ecaron -15 +KPX K ecircumflex -15 +KPX K edieresis -15 +KPX K edotaccent -15 +KPX K egrave -15 +KPX K emacron -15 +KPX K eogonek -15 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -15 +KPX Kcommaaccent eacute -15 +KPX Kcommaaccent ecaron -15 +KPX Kcommaaccent ecircumflex -15 +KPX Kcommaaccent edieresis -15 +KPX Kcommaaccent edotaccent -15 +KPX Kcommaaccent egrave -15 +KPX Kcommaaccent emacron -15 +KPX Kcommaaccent eogonek -15 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -90 +KPX L Tcaron -90 +KPX L Tcommaaccent -90 +KPX L V -110 +KPX L W -80 +KPX L Y -120 +KPX L Yacute -120 +KPX L Ydieresis -120 +KPX L quotedblright -140 +KPX L quoteright -140 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -90 +KPX Lacute Tcaron -90 +KPX Lacute Tcommaaccent -90 +KPX Lacute V -110 +KPX Lacute W -80 +KPX Lacute Y -120 +KPX Lacute Yacute -120 +KPX Lacute Ydieresis -120 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -140 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -90 +KPX Lcommaaccent Tcaron -90 +KPX Lcommaaccent Tcommaaccent -90 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -80 +KPX Lcommaaccent Y -120 +KPX Lcommaaccent Yacute -120 +KPX Lcommaaccent Ydieresis -120 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -140 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -90 +KPX Lslash Tcaron -90 +KPX Lslash Tcommaaccent -90 +KPX Lslash V -110 +KPX Lslash W -80 +KPX Lslash Y -120 +KPX Lslash Yacute -120 +KPX Lslash Ydieresis -120 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -140 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -50 +KPX O Aacute -50 +KPX O Abreve -50 +KPX O Acircumflex -50 +KPX O Adieresis -50 +KPX O Agrave -50 +KPX O Amacron -50 +KPX O Aogonek -50 +KPX O Aring -50 +KPX O Atilde -50 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -50 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -50 +KPX Oacute Aacute -50 +KPX Oacute Abreve -50 +KPX Oacute Acircumflex -50 +KPX Oacute Adieresis -50 +KPX Oacute Agrave -50 +KPX Oacute Amacron -50 +KPX Oacute Aogonek -50 +KPX Oacute Aring -50 +KPX Oacute Atilde -50 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -50 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -50 +KPX Ocircumflex Aacute -50 +KPX Ocircumflex Abreve -50 +KPX Ocircumflex Acircumflex -50 +KPX Ocircumflex Adieresis -50 +KPX Ocircumflex Agrave -50 +KPX Ocircumflex Amacron -50 +KPX Ocircumflex Aogonek -50 +KPX Ocircumflex Aring -50 +KPX Ocircumflex Atilde -50 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -50 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -50 +KPX Odieresis Aacute -50 +KPX Odieresis Abreve -50 +KPX Odieresis Acircumflex -50 +KPX Odieresis Adieresis -50 +KPX Odieresis Agrave -50 +KPX Odieresis Amacron -50 +KPX Odieresis Aogonek -50 +KPX Odieresis Aring -50 +KPX Odieresis Atilde -50 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -50 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -50 +KPX Ograve Aacute -50 +KPX Ograve Abreve -50 +KPX Ograve Acircumflex -50 +KPX Ograve Adieresis -50 +KPX Ograve Agrave -50 +KPX Ograve Amacron -50 +KPX Ograve Aogonek -50 +KPX Ograve Aring -50 +KPX Ograve Atilde -50 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -50 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -50 +KPX Ohungarumlaut Aacute -50 +KPX Ohungarumlaut Abreve -50 +KPX Ohungarumlaut Acircumflex -50 +KPX Ohungarumlaut Adieresis -50 +KPX Ohungarumlaut Agrave -50 +KPX Ohungarumlaut Amacron -50 +KPX Ohungarumlaut Aogonek -50 +KPX Ohungarumlaut Aring -50 +KPX Ohungarumlaut Atilde -50 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -50 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -50 +KPX Omacron Aacute -50 +KPX Omacron Abreve -50 +KPX Omacron Acircumflex -50 +KPX Omacron Adieresis -50 +KPX Omacron Agrave -50 +KPX Omacron Amacron -50 +KPX Omacron Aogonek -50 +KPX Omacron Aring -50 +KPX Omacron Atilde -50 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -50 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -50 +KPX Oslash Aacute -50 +KPX Oslash Abreve -50 +KPX Oslash Acircumflex -50 +KPX Oslash Adieresis -50 +KPX Oslash Agrave -50 +KPX Oslash Amacron -50 +KPX Oslash Aogonek -50 +KPX Oslash Aring -50 +KPX Oslash Atilde -50 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -50 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -50 +KPX Otilde Aacute -50 +KPX Otilde Abreve -50 +KPX Otilde Acircumflex -50 +KPX Otilde Adieresis -50 +KPX Otilde Agrave -50 +KPX Otilde Amacron -50 +KPX Otilde Aogonek -50 +KPX Otilde Aring -50 +KPX Otilde Atilde -50 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -50 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -100 +KPX P Aacute -100 +KPX P Abreve -100 +KPX P Acircumflex -100 +KPX P Adieresis -100 +KPX P Agrave -100 +KPX P Amacron -100 +KPX P Aogonek -100 +KPX P Aring -100 +KPX P Atilde -100 +KPX P a -30 +KPX P aacute -30 +KPX P abreve -30 +KPX P acircumflex -30 +KPX P adieresis -30 +KPX P agrave -30 +KPX P amacron -30 +KPX P aogonek -30 +KPX P aring -30 +KPX P atilde -30 +KPX P comma -120 +KPX P e -30 +KPX P eacute -30 +KPX P ecaron -30 +KPX P ecircumflex -30 +KPX P edieresis -30 +KPX P edotaccent -30 +KPX P egrave -30 +KPX P emacron -30 +KPX P eogonek -30 +KPX P o -40 +KPX P oacute -40 +KPX P ocircumflex -40 +KPX P odieresis -40 +KPX P ograve -40 +KPX P ohungarumlaut -40 +KPX P omacron -40 +KPX P oslash -40 +KPX P otilde -40 +KPX P period -120 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q comma 20 +KPX Q period 20 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -20 +KPX R Tcaron -20 +KPX R Tcommaaccent -20 +KPX R U -20 +KPX R Uacute -20 +KPX R Ucircumflex -20 +KPX R Udieresis -20 +KPX R Ugrave -20 +KPX R Uhungarumlaut -20 +KPX R Umacron -20 +KPX R Uogonek -20 +KPX R Uring -20 +KPX R V -50 +KPX R W -40 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -20 +KPX Racute Tcaron -20 +KPX Racute Tcommaaccent -20 +KPX Racute U -20 +KPX Racute Uacute -20 +KPX Racute Ucircumflex -20 +KPX Racute Udieresis -20 +KPX Racute Ugrave -20 +KPX Racute Uhungarumlaut -20 +KPX Racute Umacron -20 +KPX Racute Uogonek -20 +KPX Racute Uring -20 +KPX Racute V -50 +KPX Racute W -40 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -20 +KPX Rcaron Tcaron -20 +KPX Rcaron Tcommaaccent -20 +KPX Rcaron U -20 +KPX Rcaron Uacute -20 +KPX Rcaron Ucircumflex -20 +KPX Rcaron Udieresis -20 +KPX Rcaron Ugrave -20 +KPX Rcaron Uhungarumlaut -20 +KPX Rcaron Umacron -20 +KPX Rcaron Uogonek -20 +KPX Rcaron Uring -20 +KPX Rcaron V -50 +KPX Rcaron W -40 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -20 +KPX Rcommaaccent Tcaron -20 +KPX Rcommaaccent Tcommaaccent -20 +KPX Rcommaaccent U -20 +KPX Rcommaaccent Uacute -20 +KPX Rcommaaccent Ucircumflex -20 +KPX Rcommaaccent Udieresis -20 +KPX Rcommaaccent Ugrave -20 +KPX Rcommaaccent Uhungarumlaut -20 +KPX Rcommaaccent Umacron -20 +KPX Rcommaaccent Uogonek -20 +KPX Rcommaaccent Uring -20 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -40 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -80 +KPX T agrave -80 +KPX T amacron -80 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -80 +KPX T colon -40 +KPX T comma -80 +KPX T e -60 +KPX T eacute -60 +KPX T ecaron -60 +KPX T ecircumflex -60 +KPX T edieresis -60 +KPX T edotaccent -60 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -60 +KPX T hyphen -120 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -80 +KPX T r -80 +KPX T racute -80 +KPX T rcommaaccent -80 +KPX T semicolon -40 +KPX T u -90 +KPX T uacute -90 +KPX T ucircumflex -90 +KPX T udieresis -90 +KPX T ugrave -90 +KPX T uhungarumlaut -90 +KPX T umacron -90 +KPX T uogonek -90 +KPX T uring -90 +KPX T w -60 +KPX T y -60 +KPX T yacute -60 +KPX T ydieresis -60 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -80 +KPX Tcaron agrave -80 +KPX Tcaron amacron -80 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -80 +KPX Tcaron colon -40 +KPX Tcaron comma -80 +KPX Tcaron e -60 +KPX Tcaron eacute -60 +KPX Tcaron ecaron -60 +KPX Tcaron ecircumflex -60 +KPX Tcaron edieresis -60 +KPX Tcaron edotaccent -60 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -60 +KPX Tcaron hyphen -120 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -80 +KPX Tcaron r -80 +KPX Tcaron racute -80 +KPX Tcaron rcommaaccent -80 +KPX Tcaron semicolon -40 +KPX Tcaron u -90 +KPX Tcaron uacute -90 +KPX Tcaron ucircumflex -90 +KPX Tcaron udieresis -90 +KPX Tcaron ugrave -90 +KPX Tcaron uhungarumlaut -90 +KPX Tcaron umacron -90 +KPX Tcaron uogonek -90 +KPX Tcaron uring -90 +KPX Tcaron w -60 +KPX Tcaron y -60 +KPX Tcaron yacute -60 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -80 +KPX Tcommaaccent agrave -80 +KPX Tcommaaccent amacron -80 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -80 +KPX Tcommaaccent colon -40 +KPX Tcommaaccent comma -80 +KPX Tcommaaccent e -60 +KPX Tcommaaccent eacute -60 +KPX Tcommaaccent ecaron -60 +KPX Tcommaaccent ecircumflex -60 +KPX Tcommaaccent edieresis -60 +KPX Tcommaaccent edotaccent -60 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -60 +KPX Tcommaaccent hyphen -120 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -80 +KPX Tcommaaccent r -80 +KPX Tcommaaccent racute -80 +KPX Tcommaaccent rcommaaccent -80 +KPX Tcommaaccent semicolon -40 +KPX Tcommaaccent u -90 +KPX Tcommaaccent uacute -90 +KPX Tcommaaccent ucircumflex -90 +KPX Tcommaaccent udieresis -90 +KPX Tcommaaccent ugrave -90 +KPX Tcommaaccent uhungarumlaut -90 +KPX Tcommaaccent umacron -90 +KPX Tcommaaccent uogonek -90 +KPX Tcommaaccent uring -90 +KPX Tcommaaccent w -60 +KPX Tcommaaccent y -60 +KPX Tcommaaccent yacute -60 +KPX Tcommaaccent ydieresis -60 +KPX U A -50 +KPX U Aacute -50 +KPX U Abreve -50 +KPX U Acircumflex -50 +KPX U Adieresis -50 +KPX U Agrave -50 +KPX U Amacron -50 +KPX U Aogonek -50 +KPX U Aring -50 +KPX U Atilde -50 +KPX U comma -30 +KPX U period -30 +KPX Uacute A -50 +KPX Uacute Aacute -50 +KPX Uacute Abreve -50 +KPX Uacute Acircumflex -50 +KPX Uacute Adieresis -50 +KPX Uacute Agrave -50 +KPX Uacute Amacron -50 +KPX Uacute Aogonek -50 +KPX Uacute Aring -50 +KPX Uacute Atilde -50 +KPX Uacute comma -30 +KPX Uacute period -30 +KPX Ucircumflex A -50 +KPX Ucircumflex Aacute -50 +KPX Ucircumflex Abreve -50 +KPX Ucircumflex Acircumflex -50 +KPX Ucircumflex Adieresis -50 +KPX Ucircumflex Agrave -50 +KPX Ucircumflex Amacron -50 +KPX Ucircumflex Aogonek -50 +KPX Ucircumflex Aring -50 +KPX Ucircumflex Atilde -50 +KPX Ucircumflex comma -30 +KPX Ucircumflex period -30 +KPX Udieresis A -50 +KPX Udieresis Aacute -50 +KPX Udieresis Abreve -50 +KPX Udieresis Acircumflex -50 +KPX Udieresis Adieresis -50 +KPX Udieresis Agrave -50 +KPX Udieresis Amacron -50 +KPX Udieresis Aogonek -50 +KPX Udieresis Aring -50 +KPX Udieresis Atilde -50 +KPX Udieresis comma -30 +KPX Udieresis period -30 +KPX Ugrave A -50 +KPX Ugrave Aacute -50 +KPX Ugrave Abreve -50 +KPX Ugrave Acircumflex -50 +KPX Ugrave Adieresis -50 +KPX Ugrave Agrave -50 +KPX Ugrave Amacron -50 +KPX Ugrave Aogonek -50 +KPX Ugrave Aring -50 +KPX Ugrave Atilde -50 +KPX Ugrave comma -30 +KPX Ugrave period -30 +KPX Uhungarumlaut A -50 +KPX Uhungarumlaut Aacute -50 +KPX Uhungarumlaut Abreve -50 +KPX Uhungarumlaut Acircumflex -50 +KPX Uhungarumlaut Adieresis -50 +KPX Uhungarumlaut Agrave -50 +KPX Uhungarumlaut Amacron -50 +KPX Uhungarumlaut Aogonek -50 +KPX Uhungarumlaut Aring -50 +KPX Uhungarumlaut Atilde -50 +KPX Uhungarumlaut comma -30 +KPX Uhungarumlaut period -30 +KPX Umacron A -50 +KPX Umacron Aacute -50 +KPX Umacron Abreve -50 +KPX Umacron Acircumflex -50 +KPX Umacron Adieresis -50 +KPX Umacron Agrave -50 +KPX Umacron Amacron -50 +KPX Umacron Aogonek -50 +KPX Umacron Aring -50 +KPX Umacron Atilde -50 +KPX Umacron comma -30 +KPX Umacron period -30 +KPX Uogonek A -50 +KPX Uogonek Aacute -50 +KPX Uogonek Abreve -50 +KPX Uogonek Acircumflex -50 +KPX Uogonek Adieresis -50 +KPX Uogonek Agrave -50 +KPX Uogonek Amacron -50 +KPX Uogonek Aogonek -50 +KPX Uogonek Aring -50 +KPX Uogonek Atilde -50 +KPX Uogonek comma -30 +KPX Uogonek period -30 +KPX Uring A -50 +KPX Uring Aacute -50 +KPX Uring Abreve -50 +KPX Uring Acircumflex -50 +KPX Uring Adieresis -50 +KPX Uring Agrave -50 +KPX Uring Amacron -50 +KPX Uring Aogonek -50 +KPX Uring Aring -50 +KPX Uring Atilde -50 +KPX Uring comma -30 +KPX Uring period -30 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -50 +KPX V Gbreve -50 +KPX V Gcommaaccent -50 +KPX V O -50 +KPX V Oacute -50 +KPX V Ocircumflex -50 +KPX V Odieresis -50 +KPX V Ograve -50 +KPX V Ohungarumlaut -50 +KPX V Omacron -50 +KPX V Oslash -50 +KPX V Otilde -50 +KPX V a -60 +KPX V aacute -60 +KPX V abreve -60 +KPX V acircumflex -60 +KPX V adieresis -60 +KPX V agrave -60 +KPX V amacron -60 +KPX V aogonek -60 +KPX V aring -60 +KPX V atilde -60 +KPX V colon -40 +KPX V comma -120 +KPX V e -50 +KPX V eacute -50 +KPX V ecaron -50 +KPX V ecircumflex -50 +KPX V edieresis -50 +KPX V edotaccent -50 +KPX V egrave -50 +KPX V emacron -50 +KPX V eogonek -50 +KPX V hyphen -80 +KPX V o -90 +KPX V oacute -90 +KPX V ocircumflex -90 +KPX V odieresis -90 +KPX V ograve -90 +KPX V ohungarumlaut -90 +KPX V omacron -90 +KPX V oslash -90 +KPX V otilde -90 +KPX V period -120 +KPX V semicolon -40 +KPX V u -60 +KPX V uacute -60 +KPX V ucircumflex -60 +KPX V udieresis -60 +KPX V ugrave -60 +KPX V uhungarumlaut -60 +KPX V umacron -60 +KPX V uogonek -60 +KPX V uring -60 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W colon -10 +KPX W comma -80 +KPX W e -35 +KPX W eacute -35 +KPX W ecaron -35 +KPX W ecircumflex -35 +KPX W edieresis -35 +KPX W edotaccent -35 +KPX W egrave -35 +KPX W emacron -35 +KPX W eogonek -35 +KPX W hyphen -40 +KPX W o -60 +KPX W oacute -60 +KPX W ocircumflex -60 +KPX W odieresis -60 +KPX W ograve -60 +KPX W ohungarumlaut -60 +KPX W omacron -60 +KPX W oslash -60 +KPX W otilde -60 +KPX W period -80 +KPX W semicolon -10 +KPX W u -45 +KPX W uacute -45 +KPX W ucircumflex -45 +KPX W udieresis -45 +KPX W ugrave -45 +KPX W uhungarumlaut -45 +KPX W umacron -45 +KPX W uogonek -45 +KPX W uring -45 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -70 +KPX Y Oacute -70 +KPX Y Ocircumflex -70 +KPX Y Odieresis -70 +KPX Y Ograve -70 +KPX Y Ohungarumlaut -70 +KPX Y Omacron -70 +KPX Y Oslash -70 +KPX Y Otilde -70 +KPX Y a -90 +KPX Y aacute -90 +KPX Y abreve -90 +KPX Y acircumflex -90 +KPX Y adieresis -90 +KPX Y agrave -90 +KPX Y amacron -90 +KPX Y aogonek -90 +KPX Y aring -90 +KPX Y atilde -90 +KPX Y colon -50 +KPX Y comma -100 +KPX Y e -80 +KPX Y eacute -80 +KPX Y ecaron -80 +KPX Y ecircumflex -80 +KPX Y edieresis -80 +KPX Y edotaccent -80 +KPX Y egrave -80 +KPX Y emacron -80 +KPX Y eogonek -80 +KPX Y o -100 +KPX Y oacute -100 +KPX Y ocircumflex -100 +KPX Y odieresis -100 +KPX Y ograve -100 +KPX Y ohungarumlaut -100 +KPX Y omacron -100 +KPX Y oslash -100 +KPX Y otilde -100 +KPX Y period -100 +KPX Y semicolon -50 +KPX Y u -100 +KPX Y uacute -100 +KPX Y ucircumflex -100 +KPX Y udieresis -100 +KPX Y ugrave -100 +KPX Y uhungarumlaut -100 +KPX Y umacron -100 +KPX Y uogonek -100 +KPX Y uring -100 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -70 +KPX Yacute Oacute -70 +KPX Yacute Ocircumflex -70 +KPX Yacute Odieresis -70 +KPX Yacute Ograve -70 +KPX Yacute Ohungarumlaut -70 +KPX Yacute Omacron -70 +KPX Yacute Oslash -70 +KPX Yacute Otilde -70 +KPX Yacute a -90 +KPX Yacute aacute -90 +KPX Yacute abreve -90 +KPX Yacute acircumflex -90 +KPX Yacute adieresis -90 +KPX Yacute agrave -90 +KPX Yacute amacron -90 +KPX Yacute aogonek -90 +KPX Yacute aring -90 +KPX Yacute atilde -90 +KPX Yacute colon -50 +KPX Yacute comma -100 +KPX Yacute e -80 +KPX Yacute eacute -80 +KPX Yacute ecaron -80 +KPX Yacute ecircumflex -80 +KPX Yacute edieresis -80 +KPX Yacute edotaccent -80 +KPX Yacute egrave -80 +KPX Yacute emacron -80 +KPX Yacute eogonek -80 +KPX Yacute o -100 +KPX Yacute oacute -100 +KPX Yacute ocircumflex -100 +KPX Yacute odieresis -100 +KPX Yacute ograve -100 +KPX Yacute ohungarumlaut -100 +KPX Yacute omacron -100 +KPX Yacute oslash -100 +KPX Yacute otilde -100 +KPX Yacute period -100 +KPX Yacute semicolon -50 +KPX Yacute u -100 +KPX Yacute uacute -100 +KPX Yacute ucircumflex -100 +KPX Yacute udieresis -100 +KPX Yacute ugrave -100 +KPX Yacute uhungarumlaut -100 +KPX Yacute umacron -100 +KPX Yacute uogonek -100 +KPX Yacute uring -100 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -70 +KPX Ydieresis Oacute -70 +KPX Ydieresis Ocircumflex -70 +KPX Ydieresis Odieresis -70 +KPX Ydieresis Ograve -70 +KPX Ydieresis Ohungarumlaut -70 +KPX Ydieresis Omacron -70 +KPX Ydieresis Oslash -70 +KPX Ydieresis Otilde -70 +KPX Ydieresis a -90 +KPX Ydieresis aacute -90 +KPX Ydieresis abreve -90 +KPX Ydieresis acircumflex -90 +KPX Ydieresis adieresis -90 +KPX Ydieresis agrave -90 +KPX Ydieresis amacron -90 +KPX Ydieresis aogonek -90 +KPX Ydieresis aring -90 +KPX Ydieresis atilde -90 +KPX Ydieresis colon -50 +KPX Ydieresis comma -100 +KPX Ydieresis e -80 +KPX Ydieresis eacute -80 +KPX Ydieresis ecaron -80 +KPX Ydieresis ecircumflex -80 +KPX Ydieresis edieresis -80 +KPX Ydieresis edotaccent -80 +KPX Ydieresis egrave -80 +KPX Ydieresis emacron -80 +KPX Ydieresis eogonek -80 +KPX Ydieresis o -100 +KPX Ydieresis oacute -100 +KPX Ydieresis ocircumflex -100 +KPX Ydieresis odieresis -100 +KPX Ydieresis ograve -100 +KPX Ydieresis ohungarumlaut -100 +KPX Ydieresis omacron -100 +KPX Ydieresis oslash -100 +KPX Ydieresis otilde -100 +KPX Ydieresis period -100 +KPX Ydieresis semicolon -50 +KPX Ydieresis u -100 +KPX Ydieresis uacute -100 +KPX Ydieresis ucircumflex -100 +KPX Ydieresis udieresis -100 +KPX Ydieresis ugrave -100 +KPX Ydieresis uhungarumlaut -100 +KPX Ydieresis umacron -100 +KPX Ydieresis uogonek -100 +KPX Ydieresis uring -100 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX a v -15 +KPX a w -15 +KPX a y -20 +KPX a yacute -20 +KPX a ydieresis -20 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX aacute v -15 +KPX aacute w -15 +KPX aacute y -20 +KPX aacute yacute -20 +KPX aacute ydieresis -20 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX abreve v -15 +KPX abreve w -15 +KPX abreve y -20 +KPX abreve yacute -20 +KPX abreve ydieresis -20 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX acircumflex v -15 +KPX acircumflex w -15 +KPX acircumflex y -20 +KPX acircumflex yacute -20 +KPX acircumflex ydieresis -20 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX adieresis v -15 +KPX adieresis w -15 +KPX adieresis y -20 +KPX adieresis yacute -20 +KPX adieresis ydieresis -20 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX agrave v -15 +KPX agrave w -15 +KPX agrave y -20 +KPX agrave yacute -20 +KPX agrave ydieresis -20 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX amacron v -15 +KPX amacron w -15 +KPX amacron y -20 +KPX amacron yacute -20 +KPX amacron ydieresis -20 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aogonek v -15 +KPX aogonek w -15 +KPX aogonek y -20 +KPX aogonek yacute -20 +KPX aogonek ydieresis -20 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX aring v -15 +KPX aring w -15 +KPX aring y -20 +KPX aring yacute -20 +KPX aring ydieresis -20 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX atilde v -15 +KPX atilde w -15 +KPX atilde y -20 +KPX atilde yacute -20 +KPX atilde ydieresis -20 +KPX b l -10 +KPX b lacute -10 +KPX b lcommaaccent -10 +KPX b lslash -10 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c h -10 +KPX c k -20 +KPX c kcommaaccent -20 +KPX c l -20 +KPX c lacute -20 +KPX c lcommaaccent -20 +KPX c lslash -20 +KPX c y -10 +KPX c yacute -10 +KPX c ydieresis -10 +KPX cacute h -10 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX cacute l -20 +KPX cacute lacute -20 +KPX cacute lcommaaccent -20 +KPX cacute lslash -20 +KPX cacute y -10 +KPX cacute yacute -10 +KPX cacute ydieresis -10 +KPX ccaron h -10 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccaron l -20 +KPX ccaron lacute -20 +KPX ccaron lcommaaccent -20 +KPX ccaron lslash -20 +KPX ccaron y -10 +KPX ccaron yacute -10 +KPX ccaron ydieresis -10 +KPX ccedilla h -10 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX ccedilla l -20 +KPX ccedilla lacute -20 +KPX ccedilla lcommaaccent -20 +KPX ccedilla lslash -20 +KPX ccedilla y -10 +KPX ccedilla yacute -10 +KPX ccedilla ydieresis -10 +KPX colon space -40 +KPX comma quotedblright -120 +KPX comma quoteright -120 +KPX comma space -40 +KPX d d -10 +KPX d dcroat -10 +KPX d v -15 +KPX d w -15 +KPX d y -15 +KPX d yacute -15 +KPX d ydieresis -15 +KPX dcroat d -10 +KPX dcroat dcroat -10 +KPX dcroat v -15 +KPX dcroat w -15 +KPX dcroat y -15 +KPX dcroat yacute -15 +KPX dcroat ydieresis -15 +KPX e comma 10 +KPX e period 20 +KPX e v -15 +KPX e w -15 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute comma 10 +KPX eacute period 20 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron comma 10 +KPX ecaron period 20 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex comma 10 +KPX ecircumflex period 20 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis comma 10 +KPX edieresis period 20 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent comma 10 +KPX edotaccent period 20 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave comma 10 +KPX egrave period 20 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron comma 10 +KPX emacron period 20 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek comma 10 +KPX eogonek period 20 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f comma -10 +KPX f e -10 +KPX f eacute -10 +KPX f ecaron -10 +KPX f ecircumflex -10 +KPX f edieresis -10 +KPX f edotaccent -10 +KPX f egrave -10 +KPX f emacron -10 +KPX f eogonek -10 +KPX f o -20 +KPX f oacute -20 +KPX f ocircumflex -20 +KPX f odieresis -20 +KPX f ograve -20 +KPX f ohungarumlaut -20 +KPX f omacron -20 +KPX f oslash -20 +KPX f otilde -20 +KPX f period -10 +KPX f quotedblright 30 +KPX f quoteright 30 +KPX g e 10 +KPX g eacute 10 +KPX g ecaron 10 +KPX g ecircumflex 10 +KPX g edieresis 10 +KPX g edotaccent 10 +KPX g egrave 10 +KPX g emacron 10 +KPX g eogonek 10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX gbreve e 10 +KPX gbreve eacute 10 +KPX gbreve ecaron 10 +KPX gbreve ecircumflex 10 +KPX gbreve edieresis 10 +KPX gbreve edotaccent 10 +KPX gbreve egrave 10 +KPX gbreve emacron 10 +KPX gbreve eogonek 10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gcommaaccent e 10 +KPX gcommaaccent eacute 10 +KPX gcommaaccent ecaron 10 +KPX gcommaaccent ecircumflex 10 +KPX gcommaaccent edieresis 10 +KPX gcommaaccent edotaccent 10 +KPX gcommaaccent egrave 10 +KPX gcommaaccent emacron 10 +KPX gcommaaccent eogonek 10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX h y -20 +KPX h yacute -20 +KPX h ydieresis -20 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX l w -15 +KPX l y -15 +KPX l yacute -15 +KPX l ydieresis -15 +KPX lacute w -15 +KPX lacute y -15 +KPX lacute yacute -15 +KPX lacute ydieresis -15 +KPX lcommaaccent w -15 +KPX lcommaaccent y -15 +KPX lcommaaccent yacute -15 +KPX lcommaaccent ydieresis -15 +KPX lslash w -15 +KPX lslash y -15 +KPX lslash yacute -15 +KPX lslash ydieresis -15 +KPX m u -20 +KPX m uacute -20 +KPX m ucircumflex -20 +KPX m udieresis -20 +KPX m ugrave -20 +KPX m uhungarumlaut -20 +KPX m umacron -20 +KPX m uogonek -20 +KPX m uring -20 +KPX m y -30 +KPX m yacute -30 +KPX m ydieresis -30 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -40 +KPX n y -20 +KPX n yacute -20 +KPX n ydieresis -20 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -40 +KPX nacute y -20 +KPX nacute yacute -20 +KPX nacute ydieresis -20 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -40 +KPX ncaron y -20 +KPX ncaron yacute -20 +KPX ncaron ydieresis -20 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -40 +KPX ncommaaccent y -20 +KPX ncommaaccent yacute -20 +KPX ncommaaccent ydieresis -20 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -40 +KPX ntilde y -20 +KPX ntilde yacute -20 +KPX ntilde ydieresis -20 +KPX o v -20 +KPX o w -15 +KPX o x -30 +KPX o y -20 +KPX o yacute -20 +KPX o ydieresis -20 +KPX oacute v -20 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -20 +KPX oacute yacute -20 +KPX oacute ydieresis -20 +KPX ocircumflex v -20 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -20 +KPX ocircumflex yacute -20 +KPX ocircumflex ydieresis -20 +KPX odieresis v -20 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -20 +KPX odieresis yacute -20 +KPX odieresis ydieresis -20 +KPX ograve v -20 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -20 +KPX ograve yacute -20 +KPX ograve ydieresis -20 +KPX ohungarumlaut v -20 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -20 +KPX ohungarumlaut yacute -20 +KPX ohungarumlaut ydieresis -20 +KPX omacron v -20 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -20 +KPX omacron yacute -20 +KPX omacron ydieresis -20 +KPX oslash v -20 +KPX oslash w -15 +KPX oslash x -30 +KPX oslash y -20 +KPX oslash yacute -20 +KPX oslash ydieresis -20 +KPX otilde v -20 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -20 +KPX otilde yacute -20 +KPX otilde ydieresis -20 +KPX p y -15 +KPX p yacute -15 +KPX p ydieresis -15 +KPX period quotedblright -120 +KPX period quoteright -120 +KPX period space -40 +KPX quotedblright space -80 +KPX quoteleft quoteleft -46 +KPX quoteright d -80 +KPX quoteright dcroat -80 +KPX quoteright l -20 +KPX quoteright lacute -20 +KPX quoteright lcommaaccent -20 +KPX quoteright lslash -20 +KPX quoteright quoteright -46 +KPX quoteright r -40 +KPX quoteright racute -40 +KPX quoteright rcaron -40 +KPX quoteright rcommaaccent -40 +KPX quoteright s -60 +KPX quoteright sacute -60 +KPX quoteright scaron -60 +KPX quoteright scedilla -60 +KPX quoteright scommaaccent -60 +KPX quoteright space -80 +KPX quoteright v -20 +KPX r c -20 +KPX r cacute -20 +KPX r ccaron -20 +KPX r ccedilla -20 +KPX r comma -60 +KPX r d -20 +KPX r dcroat -20 +KPX r g -15 +KPX r gbreve -15 +KPX r gcommaaccent -15 +KPX r hyphen -20 +KPX r o -20 +KPX r oacute -20 +KPX r ocircumflex -20 +KPX r odieresis -20 +KPX r ograve -20 +KPX r ohungarumlaut -20 +KPX r omacron -20 +KPX r oslash -20 +KPX r otilde -20 +KPX r period -60 +KPX r q -20 +KPX r s -15 +KPX r sacute -15 +KPX r scaron -15 +KPX r scedilla -15 +KPX r scommaaccent -15 +KPX r t 20 +KPX r tcommaaccent 20 +KPX r v 10 +KPX r y 10 +KPX r yacute 10 +KPX r ydieresis 10 +KPX racute c -20 +KPX racute cacute -20 +KPX racute ccaron -20 +KPX racute ccedilla -20 +KPX racute comma -60 +KPX racute d -20 +KPX racute dcroat -20 +KPX racute g -15 +KPX racute gbreve -15 +KPX racute gcommaaccent -15 +KPX racute hyphen -20 +KPX racute o -20 +KPX racute oacute -20 +KPX racute ocircumflex -20 +KPX racute odieresis -20 +KPX racute ograve -20 +KPX racute ohungarumlaut -20 +KPX racute omacron -20 +KPX racute oslash -20 +KPX racute otilde -20 +KPX racute period -60 +KPX racute q -20 +KPX racute s -15 +KPX racute sacute -15 +KPX racute scaron -15 +KPX racute scedilla -15 +KPX racute scommaaccent -15 +KPX racute t 20 +KPX racute tcommaaccent 20 +KPX racute v 10 +KPX racute y 10 +KPX racute yacute 10 +KPX racute ydieresis 10 +KPX rcaron c -20 +KPX rcaron cacute -20 +KPX rcaron ccaron -20 +KPX rcaron ccedilla -20 +KPX rcaron comma -60 +KPX rcaron d -20 +KPX rcaron dcroat -20 +KPX rcaron g -15 +KPX rcaron gbreve -15 +KPX rcaron gcommaaccent -15 +KPX rcaron hyphen -20 +KPX rcaron o -20 +KPX rcaron oacute -20 +KPX rcaron ocircumflex -20 +KPX rcaron odieresis -20 +KPX rcaron ograve -20 +KPX rcaron ohungarumlaut -20 +KPX rcaron omacron -20 +KPX rcaron oslash -20 +KPX rcaron otilde -20 +KPX rcaron period -60 +KPX rcaron q -20 +KPX rcaron s -15 +KPX rcaron sacute -15 +KPX rcaron scaron -15 +KPX rcaron scedilla -15 +KPX rcaron scommaaccent -15 +KPX rcaron t 20 +KPX rcaron tcommaaccent 20 +KPX rcaron v 10 +KPX rcaron y 10 +KPX rcaron yacute 10 +KPX rcaron ydieresis 10 +KPX rcommaaccent c -20 +KPX rcommaaccent cacute -20 +KPX rcommaaccent ccaron -20 +KPX rcommaaccent ccedilla -20 +KPX rcommaaccent comma -60 +KPX rcommaaccent d -20 +KPX rcommaaccent dcroat -20 +KPX rcommaaccent g -15 +KPX rcommaaccent gbreve -15 +KPX rcommaaccent gcommaaccent -15 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -20 +KPX rcommaaccent oacute -20 +KPX rcommaaccent ocircumflex -20 +KPX rcommaaccent odieresis -20 +KPX rcommaaccent ograve -20 +KPX rcommaaccent ohungarumlaut -20 +KPX rcommaaccent omacron -20 +KPX rcommaaccent oslash -20 +KPX rcommaaccent otilde -20 +KPX rcommaaccent period -60 +KPX rcommaaccent q -20 +KPX rcommaaccent s -15 +KPX rcommaaccent sacute -15 +KPX rcommaaccent scaron -15 +KPX rcommaaccent scedilla -15 +KPX rcommaaccent scommaaccent -15 +KPX rcommaaccent t 20 +KPX rcommaaccent tcommaaccent 20 +KPX rcommaaccent v 10 +KPX rcommaaccent y 10 +KPX rcommaaccent yacute 10 +KPX rcommaaccent ydieresis 10 +KPX s w -15 +KPX sacute w -15 +KPX scaron w -15 +KPX scedilla w -15 +KPX scommaaccent w -15 +KPX semicolon space -40 +KPX space T -100 +KPX space Tcaron -100 +KPX space Tcommaaccent -100 +KPX space V -80 +KPX space W -80 +KPX space Y -120 +KPX space Yacute -120 +KPX space Ydieresis -120 +KPX space quotedblleft -80 +KPX space quoteleft -60 +KPX v a -20 +KPX v aacute -20 +KPX v abreve -20 +KPX v acircumflex -20 +KPX v adieresis -20 +KPX v agrave -20 +KPX v amacron -20 +KPX v aogonek -20 +KPX v aring -20 +KPX v atilde -20 +KPX v comma -80 +KPX v o -30 +KPX v oacute -30 +KPX v ocircumflex -30 +KPX v odieresis -30 +KPX v ograve -30 +KPX v ohungarumlaut -30 +KPX v omacron -30 +KPX v oslash -30 +KPX v otilde -30 +KPX v period -80 +KPX w comma -40 +KPX w o -20 +KPX w oacute -20 +KPX w ocircumflex -20 +KPX w odieresis -20 +KPX w ograve -20 +KPX w ohungarumlaut -20 +KPX w omacron -20 +KPX w oslash -20 +KPX w otilde -20 +KPX w period -40 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y a -30 +KPX y aacute -30 +KPX y abreve -30 +KPX y acircumflex -30 +KPX y adieresis -30 +KPX y agrave -30 +KPX y amacron -30 +KPX y aogonek -30 +KPX y aring -30 +KPX y atilde -30 +KPX y comma -80 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -80 +KPX yacute a -30 +KPX yacute aacute -30 +KPX yacute abreve -30 +KPX yacute acircumflex -30 +KPX yacute adieresis -30 +KPX yacute agrave -30 +KPX yacute amacron -30 +KPX yacute aogonek -30 +KPX yacute aring -30 +KPX yacute atilde -30 +KPX yacute comma -80 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -80 +KPX ydieresis a -30 +KPX ydieresis aacute -30 +KPX ydieresis abreve -30 +KPX ydieresis acircumflex -30 +KPX ydieresis adieresis -30 +KPX ydieresis agrave -30 +KPX ydieresis amacron -30 +KPX ydieresis aogonek -30 +KPX ydieresis aring -30 +KPX ydieresis atilde -30 +KPX ydieresis comma -80 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -80 +KPX z e 10 +KPX z eacute 10 +KPX z ecaron 10 +KPX z ecircumflex 10 +KPX z edieresis 10 +KPX z edotaccent 10 +KPX z egrave 10 +KPX z emacron 10 +KPX z eogonek 10 +KPX zacute e 10 +KPX zacute eacute 10 +KPX zacute ecaron 10 +KPX zacute ecircumflex 10 +KPX zacute edieresis 10 +KPX zacute edotaccent 10 +KPX zacute egrave 10 +KPX zacute emacron 10 +KPX zacute eogonek 10 +KPX zcaron e 10 +KPX zcaron eacute 10 +KPX zcaron ecaron 10 +KPX zcaron ecircumflex 10 +KPX zcaron edieresis 10 +KPX zcaron edotaccent 10 +KPX zcaron egrave 10 +KPX zcaron emacron 10 +KPX zcaron eogonek 10 +KPX zdotaccent e 10 +KPX zdotaccent eacute 10 +KPX zdotaccent ecaron 10 +KPX zdotaccent ecircumflex 10 +KPX zdotaccent edieresis 10 +KPX zdotaccent edotaccent 10 +KPX zdotaccent egrave 10 +KPX zdotaccent emacron 10 +KPX zdotaccent eogonek 10 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm.php b/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm.php new file mode 100644 index 00000000..c783fb3f --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm.php @@ -0,0 +1,570 @@ + + array ( + 32 => 'space', + 160 => 'space', + 33 => 'exclam', + 34 => 'quotedbl', + 35 => 'numbersign', + 36 => 'dollar', + 37 => 'percent', + 38 => 'ampersand', + 146 => 'quoteright', + 40 => 'parenleft', + 41 => 'parenright', + 42 => 'asterisk', + 43 => 'plus', + 44 => 'comma', + 45 => 'hyphen', + 173 => 'hyphen', + 46 => 'period', + 47 => 'slash', + 48 => 'zero', + 49 => 'one', + 50 => 'two', + 51 => 'three', + 52 => 'four', + 53 => 'five', + 54 => 'six', + 55 => 'seven', + 56 => 'eight', + 57 => 'nine', + 58 => 'colon', + 59 => 'semicolon', + 60 => 'less', + 61 => 'equal', + 62 => 'greater', + 63 => 'question', + 64 => 'at', + 65 => 'A', + 66 => 'B', + 67 => 'C', + 68 => 'D', + 69 => 'E', + 70 => 'F', + 71 => 'G', + 72 => 'H', + 73 => 'I', + 74 => 'J', + 75 => 'K', + 76 => 'L', + 77 => 'M', + 78 => 'N', + 79 => 'O', + 80 => 'P', + 81 => 'Q', + 82 => 'R', + 83 => 'S', + 84 => 'T', + 85 => 'U', + 86 => 'V', + 87 => 'W', + 88 => 'X', + 89 => 'Y', + 90 => 'Z', + 91 => 'bracketleft', + 92 => 'backslash', + 93 => 'bracketright', + 94 => 'asciicircum', + 95 => 'underscore', + 145 => 'quoteleft', + 97 => 'a', + 98 => 'b', + 99 => 'c', + 100 => 'd', + 101 => 'e', + 102 => 'f', + 103 => 'g', + 104 => 'h', + 105 => 'i', + 106 => 'j', + 107 => 'k', + 108 => 'l', + 109 => 'm', + 110 => 'n', + 111 => 'o', + 112 => 'p', + 113 => 'q', + 114 => 'r', + 115 => 's', + 116 => 't', + 117 => 'u', + 118 => 'v', + 119 => 'w', + 120 => 'x', + 121 => 'y', + 122 => 'z', + 123 => 'braceleft', + 124 => 'bar', + 125 => 'braceright', + 126 => 'asciitilde', + 161 => 'exclamdown', + 162 => 'cent', + 163 => 'sterling', + 165 => 'yen', + 131 => 'florin', + 167 => 'section', + 164 => 'currency', + 39 => 'quotesingle', + 147 => 'quotedblleft', + 170 => 'ordfeminine', + 139 => 'guilsinglleft', + 155 => 'guilsinglright', + 150 => 'endash', + 134 => 'dagger', + 135 => 'daggerdbl', + 183 => 'periodcentered', + 182 => 'paragraph', + 149 => 'bullet', + 130 => 'quotesinglbase', + 132 => 'quotedblbase', + 148 => 'quotedblright', + 187 => 'guillemotright', + 133 => 'ellipsis', + 137 => 'perthousand', + 191 => 'questiondown', + 96 => 'grave', + 180 => 'acute', + 136 => 'circumflex', + 152 => 'tilde', + 175 => 'macron', + 168 => 'dieresis', + 184 => 'cedilla', + 151 => 'emdash', + 198 => 'AE', + 216 => 'Oslash', + 140 => 'OE', + 186 => 'ordmasculine', + 230 => 'ae', + 248 => 'oslash', + 156 => 'oe', + 223 => 'germandbls', + 207 => 'Idieresis', + 233 => 'eacute', + 159 => 'Ydieresis', + 247 => 'divide', + 221 => 'Yacute', + 194 => 'Acircumflex', + 225 => 'aacute', + 219 => 'Ucircumflex', + 253 => 'yacute', + 234 => 'ecircumflex', + 220 => 'Udieresis', + 218 => 'Uacute', + 203 => 'Edieresis', + 169 => 'copyright', + 229 => 'aring', + 224 => 'agrave', + 227 => 'atilde', + 154 => 'scaron', + 237 => 'iacute', + 251 => 'ucircumflex', + 226 => 'acircumflex', + 231 => 'ccedilla', + 222 => 'Thorn', + 179 => 'threesuperior', + 210 => 'Ograve', + 192 => 'Agrave', + 215 => 'multiply', + 250 => 'uacute', + 255 => 'ydieresis', + 238 => 'icircumflex', + 202 => 'Ecircumflex', + 228 => 'adieresis', + 235 => 'edieresis', + 205 => 'Iacute', + 177 => 'plusminus', + 166 => 'brokenbar', + 174 => 'registered', + 200 => 'Egrave', + 142 => 'Zcaron', + 208 => 'Eth', + 199 => 'Ccedilla', + 193 => 'Aacute', + 196 => 'Adieresis', + 232 => 'egrave', + 211 => 'Oacute', + 243 => 'oacute', + 239 => 'idieresis', + 212 => 'Ocircumflex', + 217 => 'Ugrave', + 254 => 'thorn', + 178 => 'twosuperior', + 214 => 'Odieresis', + 181 => 'mu', + 236 => 'igrave', + 190 => 'threequarters', + 153 => 'trademark', + 204 => 'Igrave', + 189 => 'onehalf', + 244 => 'ocircumflex', + 241 => 'ntilde', + 201 => 'Eacute', + 188 => 'onequarter', + 138 => 'Scaron', + 176 => 'degree', + 242 => 'ograve', + 249 => 'ugrave', + 209 => 'Ntilde', + 245 => 'otilde', + 195 => 'Atilde', + 197 => 'Aring', + 213 => 'Otilde', + 206 => 'Icircumflex', + 172 => 'logicalnot', + 246 => 'odieresis', + 252 => 'udieresis', + 240 => 'eth', + 158 => 'zcaron', + 185 => 'onesuperior', + 128 => 'Euro', + ), + 'isUnicode' => false, + 'FontName' => 'Helvetica-Bold', + 'FullName' => 'Helvetica Bold', + 'FamilyName' => 'Helvetica', + 'Weight' => 'Bold', + 'ItalicAngle' => '0', + 'IsFixedPitch' => 'false', + 'CharacterSet' => 'ExtendedRoman', + 'FontBBox' => + array ( + 0 => '-170', + 1 => '-228', + 2 => '1003', + 3 => '962', + ), + 'UnderlinePosition' => '-100', + 'UnderlineThickness' => '50', + 'Version' => '002.000', + 'EncodingScheme' => 'WinAnsiEncoding', + 'CapHeight' => '718', + 'XHeight' => '532', + 'Ascender' => '718', + 'Descender' => '-207', + 'StdHW' => '118', + 'StdVW' => '140', + 'StartCharMetrics' => '317', + 'C' => + array ( + 32 => 278.0, + 160 => 278.0, + 33 => 333.0, + 34 => 474.0, + 35 => 556.0, + 36 => 556.0, + 37 => 889.0, + 38 => 722.0, + 146 => 278.0, + 40 => 333.0, + 41 => 333.0, + 42 => 389.0, + 43 => 584.0, + 44 => 278.0, + 45 => 333.0, + 173 => 333.0, + 46 => 278.0, + 47 => 278.0, + 48 => 556.0, + 49 => 556.0, + 50 => 556.0, + 51 => 556.0, + 52 => 556.0, + 53 => 556.0, + 54 => 556.0, + 55 => 556.0, + 56 => 556.0, + 57 => 556.0, + 58 => 333.0, + 59 => 333.0, + 60 => 584.0, + 61 => 584.0, + 62 => 584.0, + 63 => 611.0, + 64 => 975.0, + 65 => 722.0, + 66 => 722.0, + 67 => 722.0, + 68 => 722.0, + 69 => 667.0, + 70 => 611.0, + 71 => 778.0, + 72 => 722.0, + 73 => 278.0, + 74 => 556.0, + 75 => 722.0, + 76 => 611.0, + 77 => 833.0, + 78 => 722.0, + 79 => 778.0, + 80 => 667.0, + 81 => 778.0, + 82 => 722.0, + 83 => 667.0, + 84 => 611.0, + 85 => 722.0, + 86 => 667.0, + 87 => 944.0, + 88 => 667.0, + 89 => 667.0, + 90 => 611.0, + 91 => 333.0, + 92 => 278.0, + 93 => 333.0, + 94 => 584.0, + 95 => 556.0, + 145 => 278.0, + 97 => 556.0, + 98 => 611.0, + 99 => 556.0, + 100 => 611.0, + 101 => 556.0, + 102 => 333.0, + 103 => 611.0, + 104 => 611.0, + 105 => 278.0, + 106 => 278.0, + 107 => 556.0, + 108 => 278.0, + 109 => 889.0, + 110 => 611.0, + 111 => 611.0, + 112 => 611.0, + 113 => 611.0, + 114 => 389.0, + 115 => 556.0, + 116 => 333.0, + 117 => 611.0, + 118 => 556.0, + 119 => 778.0, + 120 => 556.0, + 121 => 556.0, + 122 => 500.0, + 123 => 389.0, + 124 => 280.0, + 125 => 389.0, + 126 => 584.0, + 161 => 333.0, + 162 => 556.0, + 163 => 556.0, + 'fraction' => 167.0, + 165 => 556.0, + 131 => 556.0, + 167 => 556.0, + 164 => 556.0, + 39 => 238.0, + 147 => 500.0, + 170 => 370.0, + 139 => 333.0, + 155 => 333.0, + 'fi' => 611.0, + 'fl' => 611.0, + 150 => 556.0, + 134 => 556.0, + 135 => 556.0, + 183 => 278.0, + 182 => 556.0, + 149 => 350.0, + 130 => 278.0, + 132 => 500.0, + 148 => 500.0, + 187 => 556.0, + 133 => 1000.0, + 137 => 1000.0, + 191 => 611.0, + 96 => 333.0, + 180 => 333.0, + 136 => 333.0, + 152 => 333.0, + 175 => 333.0, + 'breve' => 333.0, + 'dotaccent' => 333.0, + 168 => 333.0, + 'ring' => 333.0, + 184 => 333.0, + 'hungarumlaut' => 333.0, + 'ogonek' => 333.0, + 'caron' => 333.0, + 151 => 1000.0, + 198 => 1000.0, + 'Lslash' => 611.0, + 216 => 778.0, + 140 => 1000.0, + 186 => 365.0, + 230 => 889.0, + 'dotlessi' => 278.0, + 'lslash' => 278.0, + 248 => 611.0, + 156 => 944.0, + 223 => 611.0, + 207 => 278.0, + 233 => 556.0, + 'abreve' => 556.0, + 'uhungarumlaut' => 611.0, + 'ecaron' => 556.0, + 159 => 667.0, + 247 => 584.0, + 221 => 667.0, + 194 => 722.0, + 225 => 556.0, + 219 => 722.0, + 253 => 556.0, + 'scommaaccent' => 556.0, + 234 => 556.0, + 'Uring' => 722.0, + 220 => 722.0, + 'aogonek' => 556.0, + 218 => 722.0, + 'uogonek' => 611.0, + 203 => 667.0, + 'Dcroat' => 722.0, + 'commaaccent' => 250.0, + 169 => 737.0, + 'Emacron' => 667.0, + 'ccaron' => 556.0, + 229 => 556.0, + 'Ncommaaccent' => 722.0, + 'lacute' => 278.0, + 224 => 556.0, + 'Tcommaaccent' => 611.0, + 'Cacute' => 722.0, + 227 => 556.0, + 'Edotaccent' => 667.0, + 154 => 556.0, + 'scedilla' => 556.0, + 237 => 278.0, + 'lozenge' => 494.0, + 'Rcaron' => 722.0, + 'Gcommaaccent' => 778.0, + 251 => 611.0, + 226 => 556.0, + 'Amacron' => 722.0, + 'rcaron' => 389.0, + 231 => 556.0, + 'Zdotaccent' => 611.0, + 222 => 667.0, + 'Omacron' => 778.0, + 'Racute' => 722.0, + 'Sacute' => 667.0, + 'dcaron' => 743.0, + 'Umacron' => 722.0, + 'uring' => 611.0, + 179 => 333.0, + 210 => 778.0, + 192 => 722.0, + 'Abreve' => 722.0, + 215 => 584.0, + 250 => 611.0, + 'Tcaron' => 611.0, + 'partialdiff' => 494.0, + 255 => 556.0, + 'Nacute' => 722.0, + 238 => 278.0, + 202 => 667.0, + 228 => 556.0, + 235 => 556.0, + 'cacute' => 556.0, + 'nacute' => 611.0, + 'umacron' => 611.0, + 'Ncaron' => 722.0, + 205 => 278.0, + 177 => 584.0, + 166 => 280.0, + 174 => 737.0, + 'Gbreve' => 778.0, + 'Idotaccent' => 278.0, + 'summation' => 600.0, + 200 => 667.0, + 'racute' => 389.0, + 'omacron' => 611.0, + 'Zacute' => 611.0, + 142 => 611.0, + 'greaterequal' => 549.0, + 208 => 722.0, + 199 => 722.0, + 'lcommaaccent' => 278.0, + 'tcaron' => 389.0, + 'eogonek' => 556.0, + 'Uogonek' => 722.0, + 193 => 722.0, + 196 => 722.0, + 232 => 556.0, + 'zacute' => 500.0, + 'iogonek' => 278.0, + 211 => 778.0, + 243 => 611.0, + 'amacron' => 556.0, + 'sacute' => 556.0, + 239 => 278.0, + 212 => 778.0, + 217 => 722.0, + 'Delta' => 612.0, + 254 => 611.0, + 178 => 333.0, + 214 => 778.0, + 181 => 611.0, + 236 => 278.0, + 'ohungarumlaut' => 611.0, + 'Eogonek' => 667.0, + 'dcroat' => 611.0, + 190 => 834.0, + 'Scedilla' => 667.0, + 'lcaron' => 400.0, + 'Kcommaaccent' => 722.0, + 'Lacute' => 611.0, + 153 => 1000.0, + 'edotaccent' => 556.0, + 204 => 278.0, + 'Imacron' => 278.0, + 'Lcaron' => 611.0, + 189 => 834.0, + 'lessequal' => 549.0, + 244 => 611.0, + 241 => 611.0, + 'Uhungarumlaut' => 722.0, + 201 => 667.0, + 'emacron' => 556.0, + 'gbreve' => 611.0, + 188 => 834.0, + 138 => 667.0, + 'Scommaaccent' => 667.0, + 'Ohungarumlaut' => 778.0, + 176 => 400.0, + 242 => 611.0, + 'Ccaron' => 722.0, + 249 => 611.0, + 'radical' => 549.0, + 'Dcaron' => 722.0, + 'rcommaaccent' => 389.0, + 209 => 722.0, + 245 => 611.0, + 'Rcommaaccent' => 722.0, + 'Lcommaaccent' => 611.0, + 195 => 722.0, + 'Aogonek' => 722.0, + 197 => 722.0, + 213 => 778.0, + 'zdotaccent' => 500.0, + 'Ecaron' => 667.0, + 'Iogonek' => 278.0, + 'kcommaaccent' => 556.0, + 'minus' => 584.0, + 206 => 278.0, + 'ncaron' => 611.0, + 'tcommaaccent' => 333.0, + 172 => 584.0, + 246 => 611.0, + 252 => 611.0, + 'notequal' => 549.0, + 'gcommaaccent' => 611.0, + 240 => 611.0, + 158 => 500.0, + 'ncommaaccent' => 611.0, + 185 => 333.0, + 'imacron' => 278.0, + 128 => 556.0, + ), + 'CIDtoGID_Compressed' => true, + 'CIDtoGID' => 'eJwDAAAAAAE=', + '_version_' => 4, +); \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/Helvetica-BoldOblique.afm b/application/third_party/dompdf/lib/fonts/Helvetica-BoldOblique.afm new file mode 100644 index 00000000..76b19e45 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica-BoldOblique.afm @@ -0,0 +1,2829 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:45:12 1997 +Comment UniqueID 43053 +Comment VMusage 14482 68586 +FontName Helvetica-BoldOblique +FullName Helvetica Bold Oblique +FamilyName Helvetica +Weight Bold +ItalicAngle -12 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -174 -228 1114 962 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 532 +Ascender 718 +Descender -207 +StdHW 118 +StdVW 140 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 94 0 397 718 ; +C 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ; +C 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ; +C 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ; +C 37 ; WX 889 ; N percent ; B 136 -19 901 710 ; +C 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ; +C 146 ; WX 278 ; N quoteright ; B 167 445 362 718 ; +C 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ; +C 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ; +C 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ; +C 43 ; WX 584 ; N plus ; B 82 0 610 506 ; +C 44 ; WX 278 ; N comma ; B 28 -168 245 146 ; +C 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 64 0 245 146 ; +C 47 ; WX 278 ; N slash ; B -37 -19 468 737 ; +C 48 ; WX 556 ; N zero ; B 86 -19 617 710 ; +C 49 ; WX 556 ; N one ; B 173 0 529 710 ; +C 50 ; WX 556 ; N two ; B 26 0 619 710 ; +C 51 ; WX 556 ; N three ; B 65 -19 608 710 ; +C 52 ; WX 556 ; N four ; B 60 0 598 710 ; +C 53 ; WX 556 ; N five ; B 64 -19 636 698 ; +C 54 ; WX 556 ; N six ; B 85 -19 619 710 ; +C 55 ; WX 556 ; N seven ; B 125 0 676 698 ; +C 56 ; WX 556 ; N eight ; B 69 -19 616 710 ; +C 57 ; WX 556 ; N nine ; B 78 -19 615 710 ; +C 58 ; WX 333 ; N colon ; B 92 0 351 512 ; +C 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ; +C 60 ; WX 584 ; N less ; B 82 -8 655 514 ; +C 61 ; WX 584 ; N equal ; B 58 87 633 419 ; +C 62 ; WX 584 ; N greater ; B 36 -8 609 514 ; +C 63 ; WX 611 ; N question ; B 165 0 671 727 ; +C 64 ; WX 975 ; N at ; B 186 -19 954 737 ; +C 65 ; WX 722 ; N A ; B 20 0 702 718 ; +C 66 ; WX 722 ; N B ; B 76 0 764 718 ; +C 67 ; WX 722 ; N C ; B 107 -19 789 737 ; +C 68 ; WX 722 ; N D ; B 76 0 777 718 ; +C 69 ; WX 667 ; N E ; B 76 0 757 718 ; +C 70 ; WX 611 ; N F ; B 76 0 740 718 ; +C 71 ; WX 778 ; N G ; B 108 -19 817 737 ; +C 72 ; WX 722 ; N H ; B 71 0 804 718 ; +C 73 ; WX 278 ; N I ; B 64 0 367 718 ; +C 74 ; WX 556 ; N J ; B 60 -18 637 718 ; +C 75 ; WX 722 ; N K ; B 87 0 858 718 ; +C 76 ; WX 611 ; N L ; B 76 0 611 718 ; +C 77 ; WX 833 ; N M ; B 69 0 918 718 ; +C 78 ; WX 722 ; N N ; B 69 0 807 718 ; +C 79 ; WX 778 ; N O ; B 107 -19 823 737 ; +C 80 ; WX 667 ; N P ; B 76 0 738 718 ; +C 81 ; WX 778 ; N Q ; B 107 -52 823 737 ; +C 82 ; WX 722 ; N R ; B 76 0 778 718 ; +C 83 ; WX 667 ; N S ; B 81 -19 718 737 ; +C 84 ; WX 611 ; N T ; B 140 0 751 718 ; +C 85 ; WX 722 ; N U ; B 116 -19 804 718 ; +C 86 ; WX 667 ; N V ; B 172 0 801 718 ; +C 87 ; WX 944 ; N W ; B 169 0 1082 718 ; +C 88 ; WX 667 ; N X ; B 14 0 791 718 ; +C 89 ; WX 667 ; N Y ; B 168 0 806 718 ; +C 90 ; WX 611 ; N Z ; B 25 0 737 718 ; +C 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ; +C 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ; +C 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ; +C 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ; +C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; +C 145 ; WX 278 ; N quoteleft ; B 165 454 361 727 ; +C 97 ; WX 556 ; N a ; B 55 -14 583 546 ; +C 98 ; WX 611 ; N b ; B 61 -14 645 718 ; +C 99 ; WX 556 ; N c ; B 79 -14 599 546 ; +C 100 ; WX 611 ; N d ; B 82 -14 704 718 ; +C 101 ; WX 556 ; N e ; B 70 -14 593 546 ; +C 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ; +C 103 ; WX 611 ; N g ; B 38 -217 666 546 ; +C 104 ; WX 611 ; N h ; B 65 0 629 718 ; +C 105 ; WX 278 ; N i ; B 69 0 363 725 ; +C 106 ; WX 278 ; N j ; B -42 -214 363 725 ; +C 107 ; WX 556 ; N k ; B 69 0 670 718 ; +C 108 ; WX 278 ; N l ; B 69 0 362 718 ; +C 109 ; WX 889 ; N m ; B 64 0 909 546 ; +C 110 ; WX 611 ; N n ; B 65 0 629 546 ; +C 111 ; WX 611 ; N o ; B 82 -14 643 546 ; +C 112 ; WX 611 ; N p ; B 18 -207 645 546 ; +C 113 ; WX 611 ; N q ; B 80 -207 665 546 ; +C 114 ; WX 389 ; N r ; B 64 0 489 546 ; +C 115 ; WX 556 ; N s ; B 63 -14 584 546 ; +C 116 ; WX 333 ; N t ; B 100 -6 422 676 ; +C 117 ; WX 611 ; N u ; B 98 -14 658 532 ; +C 118 ; WX 556 ; N v ; B 126 0 656 532 ; +C 119 ; WX 778 ; N w ; B 123 0 882 532 ; +C 120 ; WX 556 ; N x ; B 15 0 648 532 ; +C 121 ; WX 556 ; N y ; B 42 -214 652 532 ; +C 122 ; WX 500 ; N z ; B 20 0 583 532 ; +C 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ; +C 124 ; WX 280 ; N bar ; B 36 -225 361 775 ; +C 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ; +C 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ; +C 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ; +C 162 ; WX 556 ; N cent ; B 79 -118 599 628 ; +C 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ; +C -1 ; WX 167 ; N fraction ; B -174 -19 487 710 ; +C 165 ; WX 556 ; N yen ; B 60 0 713 698 ; +C 131 ; WX 556 ; N florin ; B -50 -210 669 737 ; +C 167 ; WX 556 ; N section ; B 61 -184 598 727 ; +C 164 ; WX 556 ; N currency ; B 27 76 680 636 ; +C 39 ; WX 238 ; N quotesingle ; B 165 447 321 718 ; +C 147 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ; +C 170 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ; +C 139 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ; +C 155 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ; +C -1 ; WX 611 ; N fi ; B 87 0 696 727 ; +C -1 ; WX 611 ; N fl ; B 87 0 695 727 ; +C 150 ; WX 556 ; N endash ; B 48 227 627 333 ; +C 134 ; WX 556 ; N dagger ; B 118 -171 626 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ; +C 183 ; WX 278 ; N periodcentered ; B 110 172 276 334 ; +C 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ; +C 149 ; WX 350 ; N bullet ; B 83 194 420 524 ; +C 130 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ; +C 132 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ; +C 148 ; WX 500 ; N quotedblright ; B 162 445 589 718 ; +C 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ; +C 133 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ; +C 137 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ; +C 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ; +C 96 ; WX 333 ; N grave ; B 136 604 353 750 ; +C 180 ; WX 333 ; N acute ; B 236 604 515 750 ; +C 136 ; WX 333 ; N circumflex ; B 118 604 471 750 ; +C 152 ; WX 333 ; N tilde ; B 113 610 507 737 ; +C 175 ; WX 333 ; N macron ; B 122 604 483 678 ; +C -1 ; WX 333 ; N breve ; B 156 604 494 750 ; +C -1 ; WX 333 ; N dotaccent ; B 235 614 385 729 ; +C 168 ; WX 333 ; N dieresis ; B 137 614 482 729 ; +C -1 ; WX 333 ; N ring ; B 200 568 420 776 ; +C 184 ; WX 333 ; N cedilla ; B -37 -228 220 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ; +C -1 ; WX 333 ; N ogonek ; B 41 -228 264 0 ; +C -1 ; WX 333 ; N caron ; B 149 604 502 750 ; +C 151 ; WX 1000 ; N emdash ; B 48 227 1071 333 ; +C 198 ; WX 1000 ; N AE ; B 5 0 1100 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ; +C -1 ; WX 611 ; N Lslash ; B 34 0 611 718 ; +C 216 ; WX 778 ; N Oslash ; B 35 -27 894 745 ; +C 140 ; WX 1000 ; N OE ; B 99 -19 1114 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ; +C 230 ; WX 889 ; N ae ; B 56 -14 923 546 ; +C -1 ; WX 278 ; N dotlessi ; B 69 0 322 532 ; +C -1 ; WX 278 ; N lslash ; B 40 0 407 718 ; +C 248 ; WX 611 ; N oslash ; B 22 -29 701 560 ; +C 156 ; WX 944 ; N oe ; B 82 -14 977 546 ; +C 223 ; WX 611 ; N germandbls ; B 69 -14 657 731 ; +C 207 ; WX 278 ; N Idieresis ; B 64 0 494 915 ; +C 233 ; WX 556 ; N eacute ; B 70 -14 627 750 ; +C -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ; +C -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ; +C 159 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ; +C 247 ; WX 584 ; N divide ; B 82 -42 610 548 ; +C 221 ; WX 667 ; N Yacute ; B 168 0 806 936 ; +C 194 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ; +C 225 ; WX 556 ; N aacute ; B 55 -14 627 750 ; +C 219 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ; +C 253 ; WX 556 ; N yacute ; B 42 -214 652 750 ; +C -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ; +C 234 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ; +C -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ; +C 220 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ; +C -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ; +C 218 ; WX 722 ; N Uacute ; B 116 -19 804 936 ; +C -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ; +C 203 ; WX 667 ; N Edieresis ; B 76 0 757 915 ; +C -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ; +C -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ; +C 169 ; WX 737 ; N copyright ; B 56 -19 835 737 ; +C -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ; +C -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ; +C 229 ; WX 556 ; N aring ; B 55 -14 583 776 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ; +C -1 ; WX 278 ; N lacute ; B 69 0 528 936 ; +C 224 ; WX 556 ; N agrave ; B 55 -14 583 750 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ; +C -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ; +C 227 ; WX 556 ; N atilde ; B 55 -14 619 737 ; +C -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ; +C 154 ; WX 556 ; N scaron ; B 63 -14 614 750 ; +C -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ; +C 237 ; WX 278 ; N iacute ; B 69 0 488 750 ; +C -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ; +C -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ; +C 251 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ; +C 226 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ; +C -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ; +C -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ; +C 231 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ; +C -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ; +C 222 ; WX 667 ; N Thorn ; B 76 0 716 718 ; +C -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ; +C -1 ; WX 722 ; N Racute ; B 76 0 778 936 ; +C -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ; +C -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ; +C -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ; +C -1 ; WX 611 ; N uring ; B 98 -14 658 776 ; +C 179 ; WX 333 ; N threesuperior ; B 91 271 441 710 ; +C 210 ; WX 778 ; N Ograve ; B 107 -19 823 936 ; +C 192 ; WX 722 ; N Agrave ; B 20 0 702 936 ; +C -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ; +C 215 ; WX 584 ; N multiply ; B 57 1 635 505 ; +C 250 ; WX 611 ; N uacute ; B 98 -14 658 750 ; +C -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ; +C -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ; +C 255 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ; +C -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ; +C 238 ; WX 278 ; N icircumflex ; B 69 0 444 750 ; +C 202 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ; +C 228 ; WX 556 ; N adieresis ; B 55 -14 594 729 ; +C 235 ; WX 556 ; N edieresis ; B 70 -14 594 729 ; +C -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ; +C -1 ; WX 611 ; N nacute ; B 65 0 654 750 ; +C -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ; +C -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ; +C 205 ; WX 278 ; N Iacute ; B 64 0 528 936 ; +C 177 ; WX 584 ; N plusminus ; B 40 0 625 506 ; +C 166 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ; +C 174 ; WX 737 ; N registered ; B 55 -19 834 737 ; +C -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ; +C -1 ; WX 600 ; N summation ; B 14 -10 670 706 ; +C 200 ; WX 667 ; N Egrave ; B 76 0 757 936 ; +C -1 ; WX 389 ; N racute ; B 64 0 543 750 ; +C -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ; +C -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ; +C 142 ; WX 611 ; N Zcaron ; B 25 0 737 936 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ; +C 208 ; WX 722 ; N Eth ; B 62 0 777 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ; +C -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ; +C -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ; +C -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ; +C -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ; +C 193 ; WX 722 ; N Aacute ; B 20 0 750 936 ; +C 196 ; WX 722 ; N Adieresis ; B 20 0 716 915 ; +C 232 ; WX 556 ; N egrave ; B 70 -14 593 750 ; +C -1 ; WX 500 ; N zacute ; B 20 0 599 750 ; +C -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ; +C 211 ; WX 778 ; N Oacute ; B 107 -19 823 936 ; +C 243 ; WX 611 ; N oacute ; B 82 -14 654 750 ; +C -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ; +C -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ; +C 239 ; WX 278 ; N idieresis ; B 69 0 455 729 ; +C 212 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ; +C 217 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 611 ; N thorn ; B 18 -208 645 718 ; +C 178 ; WX 333 ; N twosuperior ; B 69 283 449 710 ; +C 214 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ; +C 181 ; WX 611 ; N mu ; B 22 -207 658 532 ; +C 236 ; WX 278 ; N igrave ; B 69 0 326 750 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ; +C -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ; +C -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ; +C 190 ; WX 834 ; N threequarters ; B 99 -19 839 710 ; +C -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ; +C -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ; +C -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ; +C 153 ; WX 1000 ; N trademark ; B 179 306 1109 718 ; +C -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ; +C 204 ; WX 278 ; N Igrave ; B 64 0 367 936 ; +C -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ; +C -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ; +C 189 ; WX 834 ; N onehalf ; B 132 -19 858 710 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ; +C 244 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ; +C 241 ; WX 611 ; N ntilde ; B 65 0 646 737 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ; +C 201 ; WX 667 ; N Eacute ; B 76 0 757 936 ; +C -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ; +C -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ; +C 188 ; WX 834 ; N onequarter ; B 132 -19 806 710 ; +C 138 ; WX 667 ; N Scaron ; B 81 -19 718 936 ; +C -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ; +C 176 ; WX 400 ; N degree ; B 175 426 467 712 ; +C 242 ; WX 611 ; N ograve ; B 82 -14 643 750 ; +C -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ; +C 249 ; WX 611 ; N ugrave ; B 98 -14 658 750 ; +C -1 ; WX 549 ; N radical ; B 112 -46 689 850 ; +C -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ; +C -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ; +C 209 ; WX 722 ; N Ntilde ; B 69 0 807 923 ; +C 245 ; WX 611 ; N otilde ; B 82 -14 646 737 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ; +C 195 ; WX 722 ; N Atilde ; B 20 0 741 923 ; +C -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ; +C 197 ; WX 722 ; N Aring ; B 20 0 702 962 ; +C 213 ; WX 778 ; N Otilde ; B 107 -19 823 923 ; +C -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ; +C -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ; +C -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ; +C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ; +C -1 ; WX 584 ; N minus ; B 82 197 610 309 ; +C 206 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ; +C -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ; +C -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ; +C 172 ; WX 584 ; N logicalnot ; B 105 108 633 419 ; +C 246 ; WX 611 ; N odieresis ; B 82 -14 643 729 ; +C 252 ; WX 611 ; N udieresis ; B 98 -14 658 729 ; +C -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ; +C -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ; +C 240 ; WX 611 ; N eth ; B 82 -14 670 737 ; +C 158 ; WX 500 ; N zcaron ; B 20 0 586 750 ; +C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ; +C 185 ; WX 333 ; N onesuperior ; B 148 283 388 710 ; +C -1 ; WX 278 ; N imacron ; B 69 0 429 678 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2481 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -50 +KPX A Gbreve -50 +KPX A Gcommaaccent -50 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -90 +KPX A Tcaron -90 +KPX A Tcommaaccent -90 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -80 +KPX A W -60 +KPX A Y -110 +KPX A Yacute -110 +KPX A Ydieresis -110 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -30 +KPX A y -30 +KPX A yacute -30 +KPX A ydieresis -30 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -50 +KPX Aacute Gbreve -50 +KPX Aacute Gcommaaccent -50 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -90 +KPX Aacute Tcaron -90 +KPX Aacute Tcommaaccent -90 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -80 +KPX Aacute W -60 +KPX Aacute Y -110 +KPX Aacute Yacute -110 +KPX Aacute Ydieresis -110 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -30 +KPX Aacute y -30 +KPX Aacute yacute -30 +KPX Aacute ydieresis -30 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -50 +KPX Abreve Gbreve -50 +KPX Abreve Gcommaaccent -50 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -90 +KPX Abreve Tcaron -90 +KPX Abreve Tcommaaccent -90 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -80 +KPX Abreve W -60 +KPX Abreve Y -110 +KPX Abreve Yacute -110 +KPX Abreve Ydieresis -110 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -30 +KPX Abreve y -30 +KPX Abreve yacute -30 +KPX Abreve ydieresis -30 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -50 +KPX Acircumflex Gbreve -50 +KPX Acircumflex Gcommaaccent -50 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -90 +KPX Acircumflex Tcaron -90 +KPX Acircumflex Tcommaaccent -90 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -80 +KPX Acircumflex W -60 +KPX Acircumflex Y -110 +KPX Acircumflex Yacute -110 +KPX Acircumflex Ydieresis -110 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -30 +KPX Acircumflex y -30 +KPX Acircumflex yacute -30 +KPX Acircumflex ydieresis -30 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -50 +KPX Adieresis Gbreve -50 +KPX Adieresis Gcommaaccent -50 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -90 +KPX Adieresis Tcaron -90 +KPX Adieresis Tcommaaccent -90 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -80 +KPX Adieresis W -60 +KPX Adieresis Y -110 +KPX Adieresis Yacute -110 +KPX Adieresis Ydieresis -110 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -30 +KPX Adieresis y -30 +KPX Adieresis yacute -30 +KPX Adieresis ydieresis -30 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -50 +KPX Agrave Gbreve -50 +KPX Agrave Gcommaaccent -50 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -90 +KPX Agrave Tcaron -90 +KPX Agrave Tcommaaccent -90 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -80 +KPX Agrave W -60 +KPX Agrave Y -110 +KPX Agrave Yacute -110 +KPX Agrave Ydieresis -110 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -30 +KPX Agrave y -30 +KPX Agrave yacute -30 +KPX Agrave ydieresis -30 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -50 +KPX Amacron Gbreve -50 +KPX Amacron Gcommaaccent -50 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -90 +KPX Amacron Tcaron -90 +KPX Amacron Tcommaaccent -90 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -80 +KPX Amacron W -60 +KPX Amacron Y -110 +KPX Amacron Yacute -110 +KPX Amacron Ydieresis -110 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -30 +KPX Amacron y -30 +KPX Amacron yacute -30 +KPX Amacron ydieresis -30 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -50 +KPX Aogonek Gbreve -50 +KPX Aogonek Gcommaaccent -50 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -90 +KPX Aogonek Tcaron -90 +KPX Aogonek Tcommaaccent -90 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -80 +KPX Aogonek W -60 +KPX Aogonek Y -110 +KPX Aogonek Yacute -110 +KPX Aogonek Ydieresis -110 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -30 +KPX Aogonek y -30 +KPX Aogonek yacute -30 +KPX Aogonek ydieresis -30 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -50 +KPX Aring Gbreve -50 +KPX Aring Gcommaaccent -50 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -90 +KPX Aring Tcaron -90 +KPX Aring Tcommaaccent -90 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -80 +KPX Aring W -60 +KPX Aring Y -110 +KPX Aring Yacute -110 +KPX Aring Ydieresis -110 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -30 +KPX Aring y -30 +KPX Aring yacute -30 +KPX Aring ydieresis -30 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -50 +KPX Atilde Gbreve -50 +KPX Atilde Gcommaaccent -50 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -90 +KPX Atilde Tcaron -90 +KPX Atilde Tcommaaccent -90 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -80 +KPX Atilde W -60 +KPX Atilde Y -110 +KPX Atilde Yacute -110 +KPX Atilde Ydieresis -110 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -30 +KPX Atilde y -30 +KPX Atilde yacute -30 +KPX Atilde ydieresis -30 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -40 +KPX D Y -70 +KPX D Yacute -70 +KPX D Ydieresis -70 +KPX D comma -30 +KPX D period -30 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -70 +KPX Dcaron Yacute -70 +KPX Dcaron Ydieresis -70 +KPX Dcaron comma -30 +KPX Dcaron period -30 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -70 +KPX Dcroat Yacute -70 +KPX Dcroat Ydieresis -70 +KPX Dcroat comma -30 +KPX Dcroat period -30 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -20 +KPX F aacute -20 +KPX F abreve -20 +KPX F acircumflex -20 +KPX F adieresis -20 +KPX F agrave -20 +KPX F amacron -20 +KPX F aogonek -20 +KPX F aring -20 +KPX F atilde -20 +KPX F comma -100 +KPX F period -100 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J comma -20 +KPX J period -20 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -15 +KPX K eacute -15 +KPX K ecaron -15 +KPX K ecircumflex -15 +KPX K edieresis -15 +KPX K edotaccent -15 +KPX K egrave -15 +KPX K emacron -15 +KPX K eogonek -15 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -15 +KPX Kcommaaccent eacute -15 +KPX Kcommaaccent ecaron -15 +KPX Kcommaaccent ecircumflex -15 +KPX Kcommaaccent edieresis -15 +KPX Kcommaaccent edotaccent -15 +KPX Kcommaaccent egrave -15 +KPX Kcommaaccent emacron -15 +KPX Kcommaaccent eogonek -15 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -90 +KPX L Tcaron -90 +KPX L Tcommaaccent -90 +KPX L V -110 +KPX L W -80 +KPX L Y -120 +KPX L Yacute -120 +KPX L Ydieresis -120 +KPX L quotedblright -140 +KPX L quoteright -140 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -90 +KPX Lacute Tcaron -90 +KPX Lacute Tcommaaccent -90 +KPX Lacute V -110 +KPX Lacute W -80 +KPX Lacute Y -120 +KPX Lacute Yacute -120 +KPX Lacute Ydieresis -120 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -140 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -90 +KPX Lcommaaccent Tcaron -90 +KPX Lcommaaccent Tcommaaccent -90 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -80 +KPX Lcommaaccent Y -120 +KPX Lcommaaccent Yacute -120 +KPX Lcommaaccent Ydieresis -120 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -140 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -90 +KPX Lslash Tcaron -90 +KPX Lslash Tcommaaccent -90 +KPX Lslash V -110 +KPX Lslash W -80 +KPX Lslash Y -120 +KPX Lslash Yacute -120 +KPX Lslash Ydieresis -120 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -140 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -50 +KPX O Aacute -50 +KPX O Abreve -50 +KPX O Acircumflex -50 +KPX O Adieresis -50 +KPX O Agrave -50 +KPX O Amacron -50 +KPX O Aogonek -50 +KPX O Aring -50 +KPX O Atilde -50 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -50 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -50 +KPX Oacute Aacute -50 +KPX Oacute Abreve -50 +KPX Oacute Acircumflex -50 +KPX Oacute Adieresis -50 +KPX Oacute Agrave -50 +KPX Oacute Amacron -50 +KPX Oacute Aogonek -50 +KPX Oacute Aring -50 +KPX Oacute Atilde -50 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -50 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -50 +KPX Ocircumflex Aacute -50 +KPX Ocircumflex Abreve -50 +KPX Ocircumflex Acircumflex -50 +KPX Ocircumflex Adieresis -50 +KPX Ocircumflex Agrave -50 +KPX Ocircumflex Amacron -50 +KPX Ocircumflex Aogonek -50 +KPX Ocircumflex Aring -50 +KPX Ocircumflex Atilde -50 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -50 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -50 +KPX Odieresis Aacute -50 +KPX Odieresis Abreve -50 +KPX Odieresis Acircumflex -50 +KPX Odieresis Adieresis -50 +KPX Odieresis Agrave -50 +KPX Odieresis Amacron -50 +KPX Odieresis Aogonek -50 +KPX Odieresis Aring -50 +KPX Odieresis Atilde -50 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -50 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -50 +KPX Ograve Aacute -50 +KPX Ograve Abreve -50 +KPX Ograve Acircumflex -50 +KPX Ograve Adieresis -50 +KPX Ograve Agrave -50 +KPX Ograve Amacron -50 +KPX Ograve Aogonek -50 +KPX Ograve Aring -50 +KPX Ograve Atilde -50 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -50 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -50 +KPX Ohungarumlaut Aacute -50 +KPX Ohungarumlaut Abreve -50 +KPX Ohungarumlaut Acircumflex -50 +KPX Ohungarumlaut Adieresis -50 +KPX Ohungarumlaut Agrave -50 +KPX Ohungarumlaut Amacron -50 +KPX Ohungarumlaut Aogonek -50 +KPX Ohungarumlaut Aring -50 +KPX Ohungarumlaut Atilde -50 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -50 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -50 +KPX Omacron Aacute -50 +KPX Omacron Abreve -50 +KPX Omacron Acircumflex -50 +KPX Omacron Adieresis -50 +KPX Omacron Agrave -50 +KPX Omacron Amacron -50 +KPX Omacron Aogonek -50 +KPX Omacron Aring -50 +KPX Omacron Atilde -50 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -50 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -50 +KPX Oslash Aacute -50 +KPX Oslash Abreve -50 +KPX Oslash Acircumflex -50 +KPX Oslash Adieresis -50 +KPX Oslash Agrave -50 +KPX Oslash Amacron -50 +KPX Oslash Aogonek -50 +KPX Oslash Aring -50 +KPX Oslash Atilde -50 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -50 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -50 +KPX Otilde Aacute -50 +KPX Otilde Abreve -50 +KPX Otilde Acircumflex -50 +KPX Otilde Adieresis -50 +KPX Otilde Agrave -50 +KPX Otilde Amacron -50 +KPX Otilde Aogonek -50 +KPX Otilde Aring -50 +KPX Otilde Atilde -50 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -50 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -100 +KPX P Aacute -100 +KPX P Abreve -100 +KPX P Acircumflex -100 +KPX P Adieresis -100 +KPX P Agrave -100 +KPX P Amacron -100 +KPX P Aogonek -100 +KPX P Aring -100 +KPX P Atilde -100 +KPX P a -30 +KPX P aacute -30 +KPX P abreve -30 +KPX P acircumflex -30 +KPX P adieresis -30 +KPX P agrave -30 +KPX P amacron -30 +KPX P aogonek -30 +KPX P aring -30 +KPX P atilde -30 +KPX P comma -120 +KPX P e -30 +KPX P eacute -30 +KPX P ecaron -30 +KPX P ecircumflex -30 +KPX P edieresis -30 +KPX P edotaccent -30 +KPX P egrave -30 +KPX P emacron -30 +KPX P eogonek -30 +KPX P o -40 +KPX P oacute -40 +KPX P ocircumflex -40 +KPX P odieresis -40 +KPX P ograve -40 +KPX P ohungarumlaut -40 +KPX P omacron -40 +KPX P oslash -40 +KPX P otilde -40 +KPX P period -120 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q comma 20 +KPX Q period 20 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -20 +KPX R Tcaron -20 +KPX R Tcommaaccent -20 +KPX R U -20 +KPX R Uacute -20 +KPX R Ucircumflex -20 +KPX R Udieresis -20 +KPX R Ugrave -20 +KPX R Uhungarumlaut -20 +KPX R Umacron -20 +KPX R Uogonek -20 +KPX R Uring -20 +KPX R V -50 +KPX R W -40 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -20 +KPX Racute Tcaron -20 +KPX Racute Tcommaaccent -20 +KPX Racute U -20 +KPX Racute Uacute -20 +KPX Racute Ucircumflex -20 +KPX Racute Udieresis -20 +KPX Racute Ugrave -20 +KPX Racute Uhungarumlaut -20 +KPX Racute Umacron -20 +KPX Racute Uogonek -20 +KPX Racute Uring -20 +KPX Racute V -50 +KPX Racute W -40 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -20 +KPX Rcaron Tcaron -20 +KPX Rcaron Tcommaaccent -20 +KPX Rcaron U -20 +KPX Rcaron Uacute -20 +KPX Rcaron Ucircumflex -20 +KPX Rcaron Udieresis -20 +KPX Rcaron Ugrave -20 +KPX Rcaron Uhungarumlaut -20 +KPX Rcaron Umacron -20 +KPX Rcaron Uogonek -20 +KPX Rcaron Uring -20 +KPX Rcaron V -50 +KPX Rcaron W -40 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -20 +KPX Rcommaaccent Tcaron -20 +KPX Rcommaaccent Tcommaaccent -20 +KPX Rcommaaccent U -20 +KPX Rcommaaccent Uacute -20 +KPX Rcommaaccent Ucircumflex -20 +KPX Rcommaaccent Udieresis -20 +KPX Rcommaaccent Ugrave -20 +KPX Rcommaaccent Uhungarumlaut -20 +KPX Rcommaaccent Umacron -20 +KPX Rcommaaccent Uogonek -20 +KPX Rcommaaccent Uring -20 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -40 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -80 +KPX T agrave -80 +KPX T amacron -80 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -80 +KPX T colon -40 +KPX T comma -80 +KPX T e -60 +KPX T eacute -60 +KPX T ecaron -60 +KPX T ecircumflex -60 +KPX T edieresis -60 +KPX T edotaccent -60 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -60 +KPX T hyphen -120 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -80 +KPX T r -80 +KPX T racute -80 +KPX T rcommaaccent -80 +KPX T semicolon -40 +KPX T u -90 +KPX T uacute -90 +KPX T ucircumflex -90 +KPX T udieresis -90 +KPX T ugrave -90 +KPX T uhungarumlaut -90 +KPX T umacron -90 +KPX T uogonek -90 +KPX T uring -90 +KPX T w -60 +KPX T y -60 +KPX T yacute -60 +KPX T ydieresis -60 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -80 +KPX Tcaron agrave -80 +KPX Tcaron amacron -80 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -80 +KPX Tcaron colon -40 +KPX Tcaron comma -80 +KPX Tcaron e -60 +KPX Tcaron eacute -60 +KPX Tcaron ecaron -60 +KPX Tcaron ecircumflex -60 +KPX Tcaron edieresis -60 +KPX Tcaron edotaccent -60 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -60 +KPX Tcaron hyphen -120 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -80 +KPX Tcaron r -80 +KPX Tcaron racute -80 +KPX Tcaron rcommaaccent -80 +KPX Tcaron semicolon -40 +KPX Tcaron u -90 +KPX Tcaron uacute -90 +KPX Tcaron ucircumflex -90 +KPX Tcaron udieresis -90 +KPX Tcaron ugrave -90 +KPX Tcaron uhungarumlaut -90 +KPX Tcaron umacron -90 +KPX Tcaron uogonek -90 +KPX Tcaron uring -90 +KPX Tcaron w -60 +KPX Tcaron y -60 +KPX Tcaron yacute -60 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -80 +KPX Tcommaaccent agrave -80 +KPX Tcommaaccent amacron -80 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -80 +KPX Tcommaaccent colon -40 +KPX Tcommaaccent comma -80 +KPX Tcommaaccent e -60 +KPX Tcommaaccent eacute -60 +KPX Tcommaaccent ecaron -60 +KPX Tcommaaccent ecircumflex -60 +KPX Tcommaaccent edieresis -60 +KPX Tcommaaccent edotaccent -60 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -60 +KPX Tcommaaccent hyphen -120 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -80 +KPX Tcommaaccent r -80 +KPX Tcommaaccent racute -80 +KPX Tcommaaccent rcommaaccent -80 +KPX Tcommaaccent semicolon -40 +KPX Tcommaaccent u -90 +KPX Tcommaaccent uacute -90 +KPX Tcommaaccent ucircumflex -90 +KPX Tcommaaccent udieresis -90 +KPX Tcommaaccent ugrave -90 +KPX Tcommaaccent uhungarumlaut -90 +KPX Tcommaaccent umacron -90 +KPX Tcommaaccent uogonek -90 +KPX Tcommaaccent uring -90 +KPX Tcommaaccent w -60 +KPX Tcommaaccent y -60 +KPX Tcommaaccent yacute -60 +KPX Tcommaaccent ydieresis -60 +KPX U A -50 +KPX U Aacute -50 +KPX U Abreve -50 +KPX U Acircumflex -50 +KPX U Adieresis -50 +KPX U Agrave -50 +KPX U Amacron -50 +KPX U Aogonek -50 +KPX U Aring -50 +KPX U Atilde -50 +KPX U comma -30 +KPX U period -30 +KPX Uacute A -50 +KPX Uacute Aacute -50 +KPX Uacute Abreve -50 +KPX Uacute Acircumflex -50 +KPX Uacute Adieresis -50 +KPX Uacute Agrave -50 +KPX Uacute Amacron -50 +KPX Uacute Aogonek -50 +KPX Uacute Aring -50 +KPX Uacute Atilde -50 +KPX Uacute comma -30 +KPX Uacute period -30 +KPX Ucircumflex A -50 +KPX Ucircumflex Aacute -50 +KPX Ucircumflex Abreve -50 +KPX Ucircumflex Acircumflex -50 +KPX Ucircumflex Adieresis -50 +KPX Ucircumflex Agrave -50 +KPX Ucircumflex Amacron -50 +KPX Ucircumflex Aogonek -50 +KPX Ucircumflex Aring -50 +KPX Ucircumflex Atilde -50 +KPX Ucircumflex comma -30 +KPX Ucircumflex period -30 +KPX Udieresis A -50 +KPX Udieresis Aacute -50 +KPX Udieresis Abreve -50 +KPX Udieresis Acircumflex -50 +KPX Udieresis Adieresis -50 +KPX Udieresis Agrave -50 +KPX Udieresis Amacron -50 +KPX Udieresis Aogonek -50 +KPX Udieresis Aring -50 +KPX Udieresis Atilde -50 +KPX Udieresis comma -30 +KPX Udieresis period -30 +KPX Ugrave A -50 +KPX Ugrave Aacute -50 +KPX Ugrave Abreve -50 +KPX Ugrave Acircumflex -50 +KPX Ugrave Adieresis -50 +KPX Ugrave Agrave -50 +KPX Ugrave Amacron -50 +KPX Ugrave Aogonek -50 +KPX Ugrave Aring -50 +KPX Ugrave Atilde -50 +KPX Ugrave comma -30 +KPX Ugrave period -30 +KPX Uhungarumlaut A -50 +KPX Uhungarumlaut Aacute -50 +KPX Uhungarumlaut Abreve -50 +KPX Uhungarumlaut Acircumflex -50 +KPX Uhungarumlaut Adieresis -50 +KPX Uhungarumlaut Agrave -50 +KPX Uhungarumlaut Amacron -50 +KPX Uhungarumlaut Aogonek -50 +KPX Uhungarumlaut Aring -50 +KPX Uhungarumlaut Atilde -50 +KPX Uhungarumlaut comma -30 +KPX Uhungarumlaut period -30 +KPX Umacron A -50 +KPX Umacron Aacute -50 +KPX Umacron Abreve -50 +KPX Umacron Acircumflex -50 +KPX Umacron Adieresis -50 +KPX Umacron Agrave -50 +KPX Umacron Amacron -50 +KPX Umacron Aogonek -50 +KPX Umacron Aring -50 +KPX Umacron Atilde -50 +KPX Umacron comma -30 +KPX Umacron period -30 +KPX Uogonek A -50 +KPX Uogonek Aacute -50 +KPX Uogonek Abreve -50 +KPX Uogonek Acircumflex -50 +KPX Uogonek Adieresis -50 +KPX Uogonek Agrave -50 +KPX Uogonek Amacron -50 +KPX Uogonek Aogonek -50 +KPX Uogonek Aring -50 +KPX Uogonek Atilde -50 +KPX Uogonek comma -30 +KPX Uogonek period -30 +KPX Uring A -50 +KPX Uring Aacute -50 +KPX Uring Abreve -50 +KPX Uring Acircumflex -50 +KPX Uring Adieresis -50 +KPX Uring Agrave -50 +KPX Uring Amacron -50 +KPX Uring Aogonek -50 +KPX Uring Aring -50 +KPX Uring Atilde -50 +KPX Uring comma -30 +KPX Uring period -30 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -50 +KPX V Gbreve -50 +KPX V Gcommaaccent -50 +KPX V O -50 +KPX V Oacute -50 +KPX V Ocircumflex -50 +KPX V Odieresis -50 +KPX V Ograve -50 +KPX V Ohungarumlaut -50 +KPX V Omacron -50 +KPX V Oslash -50 +KPX V Otilde -50 +KPX V a -60 +KPX V aacute -60 +KPX V abreve -60 +KPX V acircumflex -60 +KPX V adieresis -60 +KPX V agrave -60 +KPX V amacron -60 +KPX V aogonek -60 +KPX V aring -60 +KPX V atilde -60 +KPX V colon -40 +KPX V comma -120 +KPX V e -50 +KPX V eacute -50 +KPX V ecaron -50 +KPX V ecircumflex -50 +KPX V edieresis -50 +KPX V edotaccent -50 +KPX V egrave -50 +KPX V emacron -50 +KPX V eogonek -50 +KPX V hyphen -80 +KPX V o -90 +KPX V oacute -90 +KPX V ocircumflex -90 +KPX V odieresis -90 +KPX V ograve -90 +KPX V ohungarumlaut -90 +KPX V omacron -90 +KPX V oslash -90 +KPX V otilde -90 +KPX V period -120 +KPX V semicolon -40 +KPX V u -60 +KPX V uacute -60 +KPX V ucircumflex -60 +KPX V udieresis -60 +KPX V ugrave -60 +KPX V uhungarumlaut -60 +KPX V umacron -60 +KPX V uogonek -60 +KPX V uring -60 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W colon -10 +KPX W comma -80 +KPX W e -35 +KPX W eacute -35 +KPX W ecaron -35 +KPX W ecircumflex -35 +KPX W edieresis -35 +KPX W edotaccent -35 +KPX W egrave -35 +KPX W emacron -35 +KPX W eogonek -35 +KPX W hyphen -40 +KPX W o -60 +KPX W oacute -60 +KPX W ocircumflex -60 +KPX W odieresis -60 +KPX W ograve -60 +KPX W ohungarumlaut -60 +KPX W omacron -60 +KPX W oslash -60 +KPX W otilde -60 +KPX W period -80 +KPX W semicolon -10 +KPX W u -45 +KPX W uacute -45 +KPX W ucircumflex -45 +KPX W udieresis -45 +KPX W ugrave -45 +KPX W uhungarumlaut -45 +KPX W umacron -45 +KPX W uogonek -45 +KPX W uring -45 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -70 +KPX Y Oacute -70 +KPX Y Ocircumflex -70 +KPX Y Odieresis -70 +KPX Y Ograve -70 +KPX Y Ohungarumlaut -70 +KPX Y Omacron -70 +KPX Y Oslash -70 +KPX Y Otilde -70 +KPX Y a -90 +KPX Y aacute -90 +KPX Y abreve -90 +KPX Y acircumflex -90 +KPX Y adieresis -90 +KPX Y agrave -90 +KPX Y amacron -90 +KPX Y aogonek -90 +KPX Y aring -90 +KPX Y atilde -90 +KPX Y colon -50 +KPX Y comma -100 +KPX Y e -80 +KPX Y eacute -80 +KPX Y ecaron -80 +KPX Y ecircumflex -80 +KPX Y edieresis -80 +KPX Y edotaccent -80 +KPX Y egrave -80 +KPX Y emacron -80 +KPX Y eogonek -80 +KPX Y o -100 +KPX Y oacute -100 +KPX Y ocircumflex -100 +KPX Y odieresis -100 +KPX Y ograve -100 +KPX Y ohungarumlaut -100 +KPX Y omacron -100 +KPX Y oslash -100 +KPX Y otilde -100 +KPX Y period -100 +KPX Y semicolon -50 +KPX Y u -100 +KPX Y uacute -100 +KPX Y ucircumflex -100 +KPX Y udieresis -100 +KPX Y ugrave -100 +KPX Y uhungarumlaut -100 +KPX Y umacron -100 +KPX Y uogonek -100 +KPX Y uring -100 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -70 +KPX Yacute Oacute -70 +KPX Yacute Ocircumflex -70 +KPX Yacute Odieresis -70 +KPX Yacute Ograve -70 +KPX Yacute Ohungarumlaut -70 +KPX Yacute Omacron -70 +KPX Yacute Oslash -70 +KPX Yacute Otilde -70 +KPX Yacute a -90 +KPX Yacute aacute -90 +KPX Yacute abreve -90 +KPX Yacute acircumflex -90 +KPX Yacute adieresis -90 +KPX Yacute agrave -90 +KPX Yacute amacron -90 +KPX Yacute aogonek -90 +KPX Yacute aring -90 +KPX Yacute atilde -90 +KPX Yacute colon -50 +KPX Yacute comma -100 +KPX Yacute e -80 +KPX Yacute eacute -80 +KPX Yacute ecaron -80 +KPX Yacute ecircumflex -80 +KPX Yacute edieresis -80 +KPX Yacute edotaccent -80 +KPX Yacute egrave -80 +KPX Yacute emacron -80 +KPX Yacute eogonek -80 +KPX Yacute o -100 +KPX Yacute oacute -100 +KPX Yacute ocircumflex -100 +KPX Yacute odieresis -100 +KPX Yacute ograve -100 +KPX Yacute ohungarumlaut -100 +KPX Yacute omacron -100 +KPX Yacute oslash -100 +KPX Yacute otilde -100 +KPX Yacute period -100 +KPX Yacute semicolon -50 +KPX Yacute u -100 +KPX Yacute uacute -100 +KPX Yacute ucircumflex -100 +KPX Yacute udieresis -100 +KPX Yacute ugrave -100 +KPX Yacute uhungarumlaut -100 +KPX Yacute umacron -100 +KPX Yacute uogonek -100 +KPX Yacute uring -100 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -70 +KPX Ydieresis Oacute -70 +KPX Ydieresis Ocircumflex -70 +KPX Ydieresis Odieresis -70 +KPX Ydieresis Ograve -70 +KPX Ydieresis Ohungarumlaut -70 +KPX Ydieresis Omacron -70 +KPX Ydieresis Oslash -70 +KPX Ydieresis Otilde -70 +KPX Ydieresis a -90 +KPX Ydieresis aacute -90 +KPX Ydieresis abreve -90 +KPX Ydieresis acircumflex -90 +KPX Ydieresis adieresis -90 +KPX Ydieresis agrave -90 +KPX Ydieresis amacron -90 +KPX Ydieresis aogonek -90 +KPX Ydieresis aring -90 +KPX Ydieresis atilde -90 +KPX Ydieresis colon -50 +KPX Ydieresis comma -100 +KPX Ydieresis e -80 +KPX Ydieresis eacute -80 +KPX Ydieresis ecaron -80 +KPX Ydieresis ecircumflex -80 +KPX Ydieresis edieresis -80 +KPX Ydieresis edotaccent -80 +KPX Ydieresis egrave -80 +KPX Ydieresis emacron -80 +KPX Ydieresis eogonek -80 +KPX Ydieresis o -100 +KPX Ydieresis oacute -100 +KPX Ydieresis ocircumflex -100 +KPX Ydieresis odieresis -100 +KPX Ydieresis ograve -100 +KPX Ydieresis ohungarumlaut -100 +KPX Ydieresis omacron -100 +KPX Ydieresis oslash -100 +KPX Ydieresis otilde -100 +KPX Ydieresis period -100 +KPX Ydieresis semicolon -50 +KPX Ydieresis u -100 +KPX Ydieresis uacute -100 +KPX Ydieresis ucircumflex -100 +KPX Ydieresis udieresis -100 +KPX Ydieresis ugrave -100 +KPX Ydieresis uhungarumlaut -100 +KPX Ydieresis umacron -100 +KPX Ydieresis uogonek -100 +KPX Ydieresis uring -100 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX a v -15 +KPX a w -15 +KPX a y -20 +KPX a yacute -20 +KPX a ydieresis -20 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX aacute v -15 +KPX aacute w -15 +KPX aacute y -20 +KPX aacute yacute -20 +KPX aacute ydieresis -20 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX abreve v -15 +KPX abreve w -15 +KPX abreve y -20 +KPX abreve yacute -20 +KPX abreve ydieresis -20 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX acircumflex v -15 +KPX acircumflex w -15 +KPX acircumflex y -20 +KPX acircumflex yacute -20 +KPX acircumflex ydieresis -20 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX adieresis v -15 +KPX adieresis w -15 +KPX adieresis y -20 +KPX adieresis yacute -20 +KPX adieresis ydieresis -20 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX agrave v -15 +KPX agrave w -15 +KPX agrave y -20 +KPX agrave yacute -20 +KPX agrave ydieresis -20 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX amacron v -15 +KPX amacron w -15 +KPX amacron y -20 +KPX amacron yacute -20 +KPX amacron ydieresis -20 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aogonek v -15 +KPX aogonek w -15 +KPX aogonek y -20 +KPX aogonek yacute -20 +KPX aogonek ydieresis -20 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX aring v -15 +KPX aring w -15 +KPX aring y -20 +KPX aring yacute -20 +KPX aring ydieresis -20 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX atilde v -15 +KPX atilde w -15 +KPX atilde y -20 +KPX atilde yacute -20 +KPX atilde ydieresis -20 +KPX b l -10 +KPX b lacute -10 +KPX b lcommaaccent -10 +KPX b lslash -10 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c h -10 +KPX c k -20 +KPX c kcommaaccent -20 +KPX c l -20 +KPX c lacute -20 +KPX c lcommaaccent -20 +KPX c lslash -20 +KPX c y -10 +KPX c yacute -10 +KPX c ydieresis -10 +KPX cacute h -10 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX cacute l -20 +KPX cacute lacute -20 +KPX cacute lcommaaccent -20 +KPX cacute lslash -20 +KPX cacute y -10 +KPX cacute yacute -10 +KPX cacute ydieresis -10 +KPX ccaron h -10 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccaron l -20 +KPX ccaron lacute -20 +KPX ccaron lcommaaccent -20 +KPX ccaron lslash -20 +KPX ccaron y -10 +KPX ccaron yacute -10 +KPX ccaron ydieresis -10 +KPX ccedilla h -10 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX ccedilla l -20 +KPX ccedilla lacute -20 +KPX ccedilla lcommaaccent -20 +KPX ccedilla lslash -20 +KPX ccedilla y -10 +KPX ccedilla yacute -10 +KPX ccedilla ydieresis -10 +KPX colon space -40 +KPX comma quotedblright -120 +KPX comma quoteright -120 +KPX comma space -40 +KPX d d -10 +KPX d dcroat -10 +KPX d v -15 +KPX d w -15 +KPX d y -15 +KPX d yacute -15 +KPX d ydieresis -15 +KPX dcroat d -10 +KPX dcroat dcroat -10 +KPX dcroat v -15 +KPX dcroat w -15 +KPX dcroat y -15 +KPX dcroat yacute -15 +KPX dcroat ydieresis -15 +KPX e comma 10 +KPX e period 20 +KPX e v -15 +KPX e w -15 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute comma 10 +KPX eacute period 20 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron comma 10 +KPX ecaron period 20 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex comma 10 +KPX ecircumflex period 20 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis comma 10 +KPX edieresis period 20 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent comma 10 +KPX edotaccent period 20 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave comma 10 +KPX egrave period 20 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron comma 10 +KPX emacron period 20 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek comma 10 +KPX eogonek period 20 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f comma -10 +KPX f e -10 +KPX f eacute -10 +KPX f ecaron -10 +KPX f ecircumflex -10 +KPX f edieresis -10 +KPX f edotaccent -10 +KPX f egrave -10 +KPX f emacron -10 +KPX f eogonek -10 +KPX f o -20 +KPX f oacute -20 +KPX f ocircumflex -20 +KPX f odieresis -20 +KPX f ograve -20 +KPX f ohungarumlaut -20 +KPX f omacron -20 +KPX f oslash -20 +KPX f otilde -20 +KPX f period -10 +KPX f quotedblright 30 +KPX f quoteright 30 +KPX g e 10 +KPX g eacute 10 +KPX g ecaron 10 +KPX g ecircumflex 10 +KPX g edieresis 10 +KPX g edotaccent 10 +KPX g egrave 10 +KPX g emacron 10 +KPX g eogonek 10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX gbreve e 10 +KPX gbreve eacute 10 +KPX gbreve ecaron 10 +KPX gbreve ecircumflex 10 +KPX gbreve edieresis 10 +KPX gbreve edotaccent 10 +KPX gbreve egrave 10 +KPX gbreve emacron 10 +KPX gbreve eogonek 10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gcommaaccent e 10 +KPX gcommaaccent eacute 10 +KPX gcommaaccent ecaron 10 +KPX gcommaaccent ecircumflex 10 +KPX gcommaaccent edieresis 10 +KPX gcommaaccent edotaccent 10 +KPX gcommaaccent egrave 10 +KPX gcommaaccent emacron 10 +KPX gcommaaccent eogonek 10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX h y -20 +KPX h yacute -20 +KPX h ydieresis -20 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX l w -15 +KPX l y -15 +KPX l yacute -15 +KPX l ydieresis -15 +KPX lacute w -15 +KPX lacute y -15 +KPX lacute yacute -15 +KPX lacute ydieresis -15 +KPX lcommaaccent w -15 +KPX lcommaaccent y -15 +KPX lcommaaccent yacute -15 +KPX lcommaaccent ydieresis -15 +KPX lslash w -15 +KPX lslash y -15 +KPX lslash yacute -15 +KPX lslash ydieresis -15 +KPX m u -20 +KPX m uacute -20 +KPX m ucircumflex -20 +KPX m udieresis -20 +KPX m ugrave -20 +KPX m uhungarumlaut -20 +KPX m umacron -20 +KPX m uogonek -20 +KPX m uring -20 +KPX m y -30 +KPX m yacute -30 +KPX m ydieresis -30 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -40 +KPX n y -20 +KPX n yacute -20 +KPX n ydieresis -20 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -40 +KPX nacute y -20 +KPX nacute yacute -20 +KPX nacute ydieresis -20 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -40 +KPX ncaron y -20 +KPX ncaron yacute -20 +KPX ncaron ydieresis -20 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -40 +KPX ncommaaccent y -20 +KPX ncommaaccent yacute -20 +KPX ncommaaccent ydieresis -20 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -40 +KPX ntilde y -20 +KPX ntilde yacute -20 +KPX ntilde ydieresis -20 +KPX o v -20 +KPX o w -15 +KPX o x -30 +KPX o y -20 +KPX o yacute -20 +KPX o ydieresis -20 +KPX oacute v -20 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -20 +KPX oacute yacute -20 +KPX oacute ydieresis -20 +KPX ocircumflex v -20 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -20 +KPX ocircumflex yacute -20 +KPX ocircumflex ydieresis -20 +KPX odieresis v -20 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -20 +KPX odieresis yacute -20 +KPX odieresis ydieresis -20 +KPX ograve v -20 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -20 +KPX ograve yacute -20 +KPX ograve ydieresis -20 +KPX ohungarumlaut v -20 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -20 +KPX ohungarumlaut yacute -20 +KPX ohungarumlaut ydieresis -20 +KPX omacron v -20 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -20 +KPX omacron yacute -20 +KPX omacron ydieresis -20 +KPX oslash v -20 +KPX oslash w -15 +KPX oslash x -30 +KPX oslash y -20 +KPX oslash yacute -20 +KPX oslash ydieresis -20 +KPX otilde v -20 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -20 +KPX otilde yacute -20 +KPX otilde ydieresis -20 +KPX p y -15 +KPX p yacute -15 +KPX p ydieresis -15 +KPX period quotedblright -120 +KPX period quoteright -120 +KPX period space -40 +KPX quotedblright space -80 +KPX quoteleft quoteleft -46 +KPX quoteright d -80 +KPX quoteright dcroat -80 +KPX quoteright l -20 +KPX quoteright lacute -20 +KPX quoteright lcommaaccent -20 +KPX quoteright lslash -20 +KPX quoteright quoteright -46 +KPX quoteright r -40 +KPX quoteright racute -40 +KPX quoteright rcaron -40 +KPX quoteright rcommaaccent -40 +KPX quoteright s -60 +KPX quoteright sacute -60 +KPX quoteright scaron -60 +KPX quoteright scedilla -60 +KPX quoteright scommaaccent -60 +KPX quoteright space -80 +KPX quoteright v -20 +KPX r c -20 +KPX r cacute -20 +KPX r ccaron -20 +KPX r ccedilla -20 +KPX r comma -60 +KPX r d -20 +KPX r dcroat -20 +KPX r g -15 +KPX r gbreve -15 +KPX r gcommaaccent -15 +KPX r hyphen -20 +KPX r o -20 +KPX r oacute -20 +KPX r ocircumflex -20 +KPX r odieresis -20 +KPX r ograve -20 +KPX r ohungarumlaut -20 +KPX r omacron -20 +KPX r oslash -20 +KPX r otilde -20 +KPX r period -60 +KPX r q -20 +KPX r s -15 +KPX r sacute -15 +KPX r scaron -15 +KPX r scedilla -15 +KPX r scommaaccent -15 +KPX r t 20 +KPX r tcommaaccent 20 +KPX r v 10 +KPX r y 10 +KPX r yacute 10 +KPX r ydieresis 10 +KPX racute c -20 +KPX racute cacute -20 +KPX racute ccaron -20 +KPX racute ccedilla -20 +KPX racute comma -60 +KPX racute d -20 +KPX racute dcroat -20 +KPX racute g -15 +KPX racute gbreve -15 +KPX racute gcommaaccent -15 +KPX racute hyphen -20 +KPX racute o -20 +KPX racute oacute -20 +KPX racute ocircumflex -20 +KPX racute odieresis -20 +KPX racute ograve -20 +KPX racute ohungarumlaut -20 +KPX racute omacron -20 +KPX racute oslash -20 +KPX racute otilde -20 +KPX racute period -60 +KPX racute q -20 +KPX racute s -15 +KPX racute sacute -15 +KPX racute scaron -15 +KPX racute scedilla -15 +KPX racute scommaaccent -15 +KPX racute t 20 +KPX racute tcommaaccent 20 +KPX racute v 10 +KPX racute y 10 +KPX racute yacute 10 +KPX racute ydieresis 10 +KPX rcaron c -20 +KPX rcaron cacute -20 +KPX rcaron ccaron -20 +KPX rcaron ccedilla -20 +KPX rcaron comma -60 +KPX rcaron d -20 +KPX rcaron dcroat -20 +KPX rcaron g -15 +KPX rcaron gbreve -15 +KPX rcaron gcommaaccent -15 +KPX rcaron hyphen -20 +KPX rcaron o -20 +KPX rcaron oacute -20 +KPX rcaron ocircumflex -20 +KPX rcaron odieresis -20 +KPX rcaron ograve -20 +KPX rcaron ohungarumlaut -20 +KPX rcaron omacron -20 +KPX rcaron oslash -20 +KPX rcaron otilde -20 +KPX rcaron period -60 +KPX rcaron q -20 +KPX rcaron s -15 +KPX rcaron sacute -15 +KPX rcaron scaron -15 +KPX rcaron scedilla -15 +KPX rcaron scommaaccent -15 +KPX rcaron t 20 +KPX rcaron tcommaaccent 20 +KPX rcaron v 10 +KPX rcaron y 10 +KPX rcaron yacute 10 +KPX rcaron ydieresis 10 +KPX rcommaaccent c -20 +KPX rcommaaccent cacute -20 +KPX rcommaaccent ccaron -20 +KPX rcommaaccent ccedilla -20 +KPX rcommaaccent comma -60 +KPX rcommaaccent d -20 +KPX rcommaaccent dcroat -20 +KPX rcommaaccent g -15 +KPX rcommaaccent gbreve -15 +KPX rcommaaccent gcommaaccent -15 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -20 +KPX rcommaaccent oacute -20 +KPX rcommaaccent ocircumflex -20 +KPX rcommaaccent odieresis -20 +KPX rcommaaccent ograve -20 +KPX rcommaaccent ohungarumlaut -20 +KPX rcommaaccent omacron -20 +KPX rcommaaccent oslash -20 +KPX rcommaaccent otilde -20 +KPX rcommaaccent period -60 +KPX rcommaaccent q -20 +KPX rcommaaccent s -15 +KPX rcommaaccent sacute -15 +KPX rcommaaccent scaron -15 +KPX rcommaaccent scedilla -15 +KPX rcommaaccent scommaaccent -15 +KPX rcommaaccent t 20 +KPX rcommaaccent tcommaaccent 20 +KPX rcommaaccent v 10 +KPX rcommaaccent y 10 +KPX rcommaaccent yacute 10 +KPX rcommaaccent ydieresis 10 +KPX s w -15 +KPX sacute w -15 +KPX scaron w -15 +KPX scedilla w -15 +KPX scommaaccent w -15 +KPX semicolon space -40 +KPX space T -100 +KPX space Tcaron -100 +KPX space Tcommaaccent -100 +KPX space V -80 +KPX space W -80 +KPX space Y -120 +KPX space Yacute -120 +KPX space Ydieresis -120 +KPX space quotedblleft -80 +KPX space quoteleft -60 +KPX v a -20 +KPX v aacute -20 +KPX v abreve -20 +KPX v acircumflex -20 +KPX v adieresis -20 +KPX v agrave -20 +KPX v amacron -20 +KPX v aogonek -20 +KPX v aring -20 +KPX v atilde -20 +KPX v comma -80 +KPX v o -30 +KPX v oacute -30 +KPX v ocircumflex -30 +KPX v odieresis -30 +KPX v ograve -30 +KPX v ohungarumlaut -30 +KPX v omacron -30 +KPX v oslash -30 +KPX v otilde -30 +KPX v period -80 +KPX w comma -40 +KPX w o -20 +KPX w oacute -20 +KPX w ocircumflex -20 +KPX w odieresis -20 +KPX w ograve -20 +KPX w ohungarumlaut -20 +KPX w omacron -20 +KPX w oslash -20 +KPX w otilde -20 +KPX w period -40 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y a -30 +KPX y aacute -30 +KPX y abreve -30 +KPX y acircumflex -30 +KPX y adieresis -30 +KPX y agrave -30 +KPX y amacron -30 +KPX y aogonek -30 +KPX y aring -30 +KPX y atilde -30 +KPX y comma -80 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -80 +KPX yacute a -30 +KPX yacute aacute -30 +KPX yacute abreve -30 +KPX yacute acircumflex -30 +KPX yacute adieresis -30 +KPX yacute agrave -30 +KPX yacute amacron -30 +KPX yacute aogonek -30 +KPX yacute aring -30 +KPX yacute atilde -30 +KPX yacute comma -80 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -80 +KPX ydieresis a -30 +KPX ydieresis aacute -30 +KPX ydieresis abreve -30 +KPX ydieresis acircumflex -30 +KPX ydieresis adieresis -30 +KPX ydieresis agrave -30 +KPX ydieresis amacron -30 +KPX ydieresis aogonek -30 +KPX ydieresis aring -30 +KPX ydieresis atilde -30 +KPX ydieresis comma -80 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -80 +KPX z e 10 +KPX z eacute 10 +KPX z ecaron 10 +KPX z ecircumflex 10 +KPX z edieresis 10 +KPX z edotaccent 10 +KPX z egrave 10 +KPX z emacron 10 +KPX z eogonek 10 +KPX zacute e 10 +KPX zacute eacute 10 +KPX zacute ecaron 10 +KPX zacute ecircumflex 10 +KPX zacute edieresis 10 +KPX zacute edotaccent 10 +KPX zacute egrave 10 +KPX zacute emacron 10 +KPX zacute eogonek 10 +KPX zcaron e 10 +KPX zcaron eacute 10 +KPX zcaron ecaron 10 +KPX zcaron ecircumflex 10 +KPX zcaron edieresis 10 +KPX zcaron edotaccent 10 +KPX zcaron egrave 10 +KPX zcaron emacron 10 +KPX zcaron eogonek 10 +KPX zdotaccent e 10 +KPX zdotaccent eacute 10 +KPX zdotaccent ecaron 10 +KPX zdotaccent ecircumflex 10 +KPX zdotaccent edieresis 10 +KPX zdotaccent edotaccent 10 +KPX zdotaccent egrave 10 +KPX zdotaccent emacron 10 +KPX zdotaccent eogonek 10 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Helvetica-Oblique.afm b/application/third_party/dompdf/lib/fonts/Helvetica-Oblique.afm new file mode 100644 index 00000000..60f76ad3 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica-Oblique.afm @@ -0,0 +1,3053 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:44:31 1997 +Comment UniqueID 43055 +Comment VMusage 14960 69346 +FontName Helvetica-Oblique +FullName Helvetica Oblique +FamilyName Helvetica +Weight Medium +ItalicAngle -12 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -170 -225 1116 931 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 523 +Ascender 718 +Descender -207 +StdHW 76 +StdVW 88 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 278 ; N exclam ; B 90 0 340 718 ; +C 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ; +C 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ; +C 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ; +C 37 ; WX 889 ; N percent ; B 147 -19 889 703 ; +C 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ; +C 146 ; WX 222 ; N quoteright ; B 151 463 310 718 ; +C 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ; +C 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ; +C 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ; +C 43 ; WX 584 ; N plus ; B 85 0 606 505 ; +C 44 ; WX 278 ; N comma ; B 56 -147 214 106 ; +C 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 87 0 214 106 ; +C 47 ; WX 278 ; N slash ; B -21 -19 452 737 ; +C 48 ; WX 556 ; N zero ; B 93 -19 608 703 ; +C 49 ; WX 556 ; N one ; B 207 0 508 703 ; +C 50 ; WX 556 ; N two ; B 26 0 617 703 ; +C 51 ; WX 556 ; N three ; B 75 -19 610 703 ; +C 52 ; WX 556 ; N four ; B 61 0 576 703 ; +C 53 ; WX 556 ; N five ; B 68 -19 621 688 ; +C 54 ; WX 556 ; N six ; B 91 -19 615 703 ; +C 55 ; WX 556 ; N seven ; B 137 0 669 688 ; +C 56 ; WX 556 ; N eight ; B 74 -19 607 703 ; +C 57 ; WX 556 ; N nine ; B 82 -19 609 703 ; +C 58 ; WX 278 ; N colon ; B 87 0 301 516 ; +C 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ; +C 60 ; WX 584 ; N less ; B 94 11 641 495 ; +C 61 ; WX 584 ; N equal ; B 63 115 628 390 ; +C 62 ; WX 584 ; N greater ; B 50 11 597 495 ; +C 63 ; WX 556 ; N question ; B 161 0 610 727 ; +C 64 ; WX 1015 ; N at ; B 215 -19 965 737 ; +C 65 ; WX 667 ; N A ; B 14 0 654 718 ; +C 66 ; WX 667 ; N B ; B 74 0 712 718 ; +C 67 ; WX 722 ; N C ; B 108 -19 782 737 ; +C 68 ; WX 722 ; N D ; B 81 0 764 718 ; +C 69 ; WX 667 ; N E ; B 86 0 762 718 ; +C 70 ; WX 611 ; N F ; B 86 0 736 718 ; +C 71 ; WX 778 ; N G ; B 111 -19 799 737 ; +C 72 ; WX 722 ; N H ; B 77 0 799 718 ; +C 73 ; WX 278 ; N I ; B 91 0 341 718 ; +C 74 ; WX 500 ; N J ; B 47 -19 581 718 ; +C 75 ; WX 667 ; N K ; B 76 0 808 718 ; +C 76 ; WX 556 ; N L ; B 76 0 555 718 ; +C 77 ; WX 833 ; N M ; B 73 0 914 718 ; +C 78 ; WX 722 ; N N ; B 76 0 799 718 ; +C 79 ; WX 778 ; N O ; B 105 -19 826 737 ; +C 80 ; WX 667 ; N P ; B 86 0 737 718 ; +C 81 ; WX 778 ; N Q ; B 105 -56 826 737 ; +C 82 ; WX 722 ; N R ; B 88 0 773 718 ; +C 83 ; WX 667 ; N S ; B 90 -19 713 737 ; +C 84 ; WX 611 ; N T ; B 148 0 750 718 ; +C 85 ; WX 722 ; N U ; B 123 -19 797 718 ; +C 86 ; WX 667 ; N V ; B 173 0 800 718 ; +C 87 ; WX 944 ; N W ; B 169 0 1081 718 ; +C 88 ; WX 667 ; N X ; B 19 0 790 718 ; +C 89 ; WX 667 ; N Y ; B 167 0 806 718 ; +C 90 ; WX 611 ; N Z ; B 23 0 741 718 ; +C 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ; +C 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ; +C 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ; +C 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ; +C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; +C 145 ; WX 222 ; N quoteleft ; B 165 470 323 725 ; +C 97 ; WX 556 ; N a ; B 61 -15 559 538 ; +C 98 ; WX 556 ; N b ; B 58 -15 584 718 ; +C 99 ; WX 500 ; N c ; B 74 -15 553 538 ; +C 100 ; WX 556 ; N d ; B 84 -15 652 718 ; +C 101 ; WX 556 ; N e ; B 84 -15 578 538 ; +C 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ; +C 103 ; WX 556 ; N g ; B 42 -220 610 538 ; +C 104 ; WX 556 ; N h ; B 65 0 573 718 ; +C 105 ; WX 222 ; N i ; B 67 0 308 718 ; +C 106 ; WX 222 ; N j ; B -60 -210 308 718 ; +C 107 ; WX 500 ; N k ; B 67 0 600 718 ; +C 108 ; WX 222 ; N l ; B 67 0 308 718 ; +C 109 ; WX 833 ; N m ; B 65 0 852 538 ; +C 110 ; WX 556 ; N n ; B 65 0 573 538 ; +C 111 ; WX 556 ; N o ; B 83 -14 585 538 ; +C 112 ; WX 556 ; N p ; B 14 -207 584 538 ; +C 113 ; WX 556 ; N q ; B 84 -207 605 538 ; +C 114 ; WX 333 ; N r ; B 77 0 446 538 ; +C 115 ; WX 500 ; N s ; B 63 -15 529 538 ; +C 116 ; WX 278 ; N t ; B 102 -7 368 669 ; +C 117 ; WX 556 ; N u ; B 94 -15 600 523 ; +C 118 ; WX 500 ; N v ; B 119 0 603 523 ; +C 119 ; WX 722 ; N w ; B 125 0 820 523 ; +C 120 ; WX 500 ; N x ; B 11 0 594 523 ; +C 121 ; WX 500 ; N y ; B 15 -214 600 523 ; +C 122 ; WX 500 ; N z ; B 31 0 571 523 ; +C 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ; +C 124 ; WX 260 ; N bar ; B 46 -225 332 775 ; +C 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ; +C 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ; +C 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ; +C 162 ; WX 556 ; N cent ; B 95 -115 584 623 ; +C 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ; +C -1 ; WX 167 ; N fraction ; B -170 -19 482 703 ; +C 165 ; WX 556 ; N yen ; B 81 0 699 688 ; +C 131 ; WX 556 ; N florin ; B -52 -207 654 737 ; +C 167 ; WX 556 ; N section ; B 76 -191 584 737 ; +C 164 ; WX 556 ; N currency ; B 60 99 646 603 ; +C 39 ; WX 191 ; N quotesingle ; B 157 463 285 718 ; +C 147 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ; +C 170 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ; +C 139 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ; +C 155 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ; +C -1 ; WX 500 ; N fi ; B 86 0 587 728 ; +C -1 ; WX 500 ; N fl ; B 86 0 585 728 ; +C 150 ; WX 556 ; N endash ; B 51 240 623 313 ; +C 134 ; WX 556 ; N dagger ; B 135 -159 622 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ; +C 183 ; WX 278 ; N periodcentered ; B 129 190 257 315 ; +C 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ; +C 149 ; WX 350 ; N bullet ; B 91 202 413 517 ; +C 130 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ; +C 132 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ; +C 148 ; WX 333 ; N quotedblright ; B 124 463 448 718 ; +C 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ; +C 133 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ; +C 137 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ; +C 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ; +C 96 ; WX 333 ; N grave ; B 170 593 337 734 ; +C 180 ; WX 333 ; N acute ; B 248 593 475 734 ; +C 136 ; WX 333 ; N circumflex ; B 147 593 438 734 ; +C 152 ; WX 333 ; N tilde ; B 125 606 490 722 ; +C 175 ; WX 333 ; N macron ; B 143 627 468 684 ; +C -1 ; WX 333 ; N breve ; B 167 595 476 731 ; +C -1 ; WX 333 ; N dotaccent ; B 249 604 362 706 ; +C 168 ; WX 333 ; N dieresis ; B 168 604 443 706 ; +C -1 ; WX 333 ; N ring ; B 214 572 402 756 ; +C 184 ; WX 333 ; N cedilla ; B 2 -225 232 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ; +C -1 ; WX 333 ; N ogonek ; B 43 -225 249 0 ; +C -1 ; WX 333 ; N caron ; B 177 593 468 734 ; +C 151 ; WX 1000 ; N emdash ; B 51 240 1067 313 ; +C 198 ; WX 1000 ; N AE ; B 8 0 1097 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ; +C -1 ; WX 556 ; N Lslash ; B 41 0 555 718 ; +C 216 ; WX 778 ; N Oslash ; B 43 -19 890 737 ; +C 140 ; WX 1000 ; N OE ; B 98 -19 1116 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ; +C 230 ; WX 889 ; N ae ; B 61 -15 909 538 ; +C -1 ; WX 278 ; N dotlessi ; B 95 0 294 523 ; +C -1 ; WX 222 ; N lslash ; B 41 0 347 718 ; +C 248 ; WX 611 ; N oslash ; B 29 -22 647 545 ; +C 156 ; WX 944 ; N oe ; B 83 -15 964 538 ; +C 223 ; WX 611 ; N germandbls ; B 67 -15 658 728 ; +C 207 ; WX 278 ; N Idieresis ; B 91 0 458 901 ; +C 233 ; WX 556 ; N eacute ; B 84 -15 587 734 ; +C -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ; +C -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ; +C 159 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ; +C 247 ; WX 584 ; N divide ; B 85 -19 606 524 ; +C 221 ; WX 667 ; N Yacute ; B 167 0 806 929 ; +C 194 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; +C 225 ; WX 556 ; N aacute ; B 61 -15 587 734 ; +C 219 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ; +C 253 ; WX 500 ; N yacute ; B 15 -214 600 734 ; +C -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ; +C 234 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ; +C -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ; +C 220 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ; +C -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ; +C 218 ; WX 722 ; N Uacute ; B 123 -19 797 929 ; +C -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ; +C 203 ; WX 667 ; N Edieresis ; B 86 0 762 901 ; +C -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ; +C -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ; +C 169 ; WX 737 ; N copyright ; B 54 -19 837 737 ; +C -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ; +C -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ; +C 229 ; WX 556 ; N aring ; B 61 -15 559 756 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ; +C -1 ; WX 222 ; N lacute ; B 67 0 461 929 ; +C 224 ; WX 556 ; N agrave ; B 61 -15 559 734 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ; +C -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ; +C 227 ; WX 556 ; N atilde ; B 61 -15 592 722 ; +C -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ; +C 154 ; WX 500 ; N scaron ; B 63 -15 552 734 ; +C -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ; +C 237 ; WX 278 ; N iacute ; B 95 0 448 734 ; +C -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ; +C -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ; +C 251 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ; +C 226 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ; +C -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ; +C -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ; +C 231 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ; +C -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ; +C 222 ; WX 667 ; N Thorn ; B 86 0 712 718 ; +C -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ; +C -1 ; WX 722 ; N Racute ; B 88 0 773 929 ; +C -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ; +C -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ; +C -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ; +C -1 ; WX 556 ; N uring ; B 94 -15 600 756 ; +C 179 ; WX 333 ; N threesuperior ; B 90 270 436 703 ; +C 210 ; WX 778 ; N Ograve ; B 105 -19 826 929 ; +C 192 ; WX 667 ; N Agrave ; B 14 0 654 929 ; +C -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ; +C 215 ; WX 584 ; N multiply ; B 50 0 642 506 ; +C 250 ; WX 556 ; N uacute ; B 94 -15 600 734 ; +C -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ; +C -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ; +C 255 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ; +C 238 ; WX 278 ; N icircumflex ; B 95 0 411 734 ; +C 202 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ; +C 228 ; WX 556 ; N adieresis ; B 61 -15 559 706 ; +C 235 ; WX 556 ; N edieresis ; B 84 -15 578 706 ; +C -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ; +C -1 ; WX 556 ; N nacute ; B 65 0 587 734 ; +C -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ; +C 205 ; WX 278 ; N Iacute ; B 91 0 489 929 ; +C 177 ; WX 584 ; N plusminus ; B 39 0 618 506 ; +C 166 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ; +C 174 ; WX 737 ; N registered ; B 54 -19 837 737 ; +C -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ; +C -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ; +C -1 ; WX 600 ; N summation ; B 15 -10 671 706 ; +C 200 ; WX 667 ; N Egrave ; B 86 0 762 929 ; +C -1 ; WX 333 ; N racute ; B 77 0 475 734 ; +C -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ; +C -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ; +C 142 ; WX 611 ; N Zcaron ; B 23 0 741 929 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ; +C 208 ; WX 722 ; N Eth ; B 69 0 764 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ; +C -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ; +C -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ; +C -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ; +C -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ; +C 193 ; WX 667 ; N Aacute ; B 14 0 683 929 ; +C 196 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; +C 232 ; WX 556 ; N egrave ; B 84 -15 578 734 ; +C -1 ; WX 500 ; N zacute ; B 31 0 571 734 ; +C -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ; +C 211 ; WX 778 ; N Oacute ; B 105 -19 826 929 ; +C 243 ; WX 556 ; N oacute ; B 83 -14 587 734 ; +C -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ; +C -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ; +C 239 ; WX 278 ; N idieresis ; B 95 0 416 706 ; +C 212 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ; +C 217 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 556 ; N thorn ; B 14 -207 584 718 ; +C 178 ; WX 333 ; N twosuperior ; B 64 281 449 703 ; +C 214 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ; +C 181 ; WX 556 ; N mu ; B 24 -207 600 523 ; +C 236 ; WX 278 ; N igrave ; B 95 0 310 734 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ; +C -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ; +C -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ; +C 190 ; WX 834 ; N threequarters ; B 130 -19 861 703 ; +C -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ; +C -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ; +C -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ; +C 153 ; WX 1000 ; N trademark ; B 186 306 1056 718 ; +C -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ; +C 204 ; WX 278 ; N Igrave ; B 91 0 351 929 ; +C -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ; +C -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ; +C 189 ; WX 834 ; N onehalf ; B 114 -19 839 703 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ; +C 244 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ; +C 241 ; WX 556 ; N ntilde ; B 65 0 592 722 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ; +C 201 ; WX 667 ; N Eacute ; B 86 0 762 929 ; +C -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ; +C -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ; +C 188 ; WX 834 ; N onequarter ; B 150 -19 802 703 ; +C 138 ; WX 667 ; N Scaron ; B 90 -19 713 929 ; +C -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ; +C 176 ; WX 400 ; N degree ; B 169 411 468 703 ; +C 242 ; WX 556 ; N ograve ; B 83 -14 585 734 ; +C -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ; +C 249 ; WX 556 ; N ugrave ; B 94 -15 600 734 ; +C -1 ; WX 453 ; N radical ; B 79 -80 617 762 ; +C -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ; +C -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ; +C 209 ; WX 722 ; N Ntilde ; B 76 0 799 917 ; +C 245 ; WX 556 ; N otilde ; B 83 -14 602 722 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ; +C 195 ; WX 667 ; N Atilde ; B 14 0 699 917 ; +C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; +C 197 ; WX 667 ; N Aring ; B 14 0 654 931 ; +C 213 ; WX 778 ; N Otilde ; B 105 -19 826 917 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ; +C -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ; +C -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ; +C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ; +C -1 ; WX 584 ; N minus ; B 85 216 606 289 ; +C 206 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ; +C -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ; +C -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ; +C 172 ; WX 584 ; N logicalnot ; B 106 108 628 390 ; +C 246 ; WX 556 ; N odieresis ; B 83 -14 585 706 ; +C 252 ; WX 556 ; N udieresis ; B 94 -15 600 706 ; +C -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ; +C -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ; +C 240 ; WX 556 ; N eth ; B 81 -15 617 737 ; +C 158 ; WX 500 ; N zcaron ; B 31 0 571 734 ; +C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ; +C 185 ; WX 333 ; N onesuperior ; B 166 281 371 703 ; +C -1 ; WX 278 ; N imacron ; B 95 0 417 684 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2705 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -30 +KPX A Gbreve -30 +KPX A Gcommaaccent -30 +KPX A O -30 +KPX A Oacute -30 +KPX A Ocircumflex -30 +KPX A Odieresis -30 +KPX A Ograve -30 +KPX A Ohungarumlaut -30 +KPX A Omacron -30 +KPX A Oslash -30 +KPX A Otilde -30 +KPX A Q -30 +KPX A T -120 +KPX A Tcaron -120 +KPX A Tcommaaccent -120 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -70 +KPX A W -50 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -40 +KPX A y -40 +KPX A yacute -40 +KPX A ydieresis -40 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -30 +KPX Aacute Gbreve -30 +KPX Aacute Gcommaaccent -30 +KPX Aacute O -30 +KPX Aacute Oacute -30 +KPX Aacute Ocircumflex -30 +KPX Aacute Odieresis -30 +KPX Aacute Ograve -30 +KPX Aacute Ohungarumlaut -30 +KPX Aacute Omacron -30 +KPX Aacute Oslash -30 +KPX Aacute Otilde -30 +KPX Aacute Q -30 +KPX Aacute T -120 +KPX Aacute Tcaron -120 +KPX Aacute Tcommaaccent -120 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -70 +KPX Aacute W -50 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -40 +KPX Aacute y -40 +KPX Aacute yacute -40 +KPX Aacute ydieresis -40 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -30 +KPX Abreve Gbreve -30 +KPX Abreve Gcommaaccent -30 +KPX Abreve O -30 +KPX Abreve Oacute -30 +KPX Abreve Ocircumflex -30 +KPX Abreve Odieresis -30 +KPX Abreve Ograve -30 +KPX Abreve Ohungarumlaut -30 +KPX Abreve Omacron -30 +KPX Abreve Oslash -30 +KPX Abreve Otilde -30 +KPX Abreve Q -30 +KPX Abreve T -120 +KPX Abreve Tcaron -120 +KPX Abreve Tcommaaccent -120 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -70 +KPX Abreve W -50 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -40 +KPX Abreve y -40 +KPX Abreve yacute -40 +KPX Abreve ydieresis -40 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -30 +KPX Acircumflex Gbreve -30 +KPX Acircumflex Gcommaaccent -30 +KPX Acircumflex O -30 +KPX Acircumflex Oacute -30 +KPX Acircumflex Ocircumflex -30 +KPX Acircumflex Odieresis -30 +KPX Acircumflex Ograve -30 +KPX Acircumflex Ohungarumlaut -30 +KPX Acircumflex Omacron -30 +KPX Acircumflex Oslash -30 +KPX Acircumflex Otilde -30 +KPX Acircumflex Q -30 +KPX Acircumflex T -120 +KPX Acircumflex Tcaron -120 +KPX Acircumflex Tcommaaccent -120 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -70 +KPX Acircumflex W -50 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -40 +KPX Acircumflex y -40 +KPX Acircumflex yacute -40 +KPX Acircumflex ydieresis -40 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -30 +KPX Adieresis Gbreve -30 +KPX Adieresis Gcommaaccent -30 +KPX Adieresis O -30 +KPX Adieresis Oacute -30 +KPX Adieresis Ocircumflex -30 +KPX Adieresis Odieresis -30 +KPX Adieresis Ograve -30 +KPX Adieresis Ohungarumlaut -30 +KPX Adieresis Omacron -30 +KPX Adieresis Oslash -30 +KPX Adieresis Otilde -30 +KPX Adieresis Q -30 +KPX Adieresis T -120 +KPX Adieresis Tcaron -120 +KPX Adieresis Tcommaaccent -120 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -70 +KPX Adieresis W -50 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -40 +KPX Adieresis y -40 +KPX Adieresis yacute -40 +KPX Adieresis ydieresis -40 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -30 +KPX Agrave Gbreve -30 +KPX Agrave Gcommaaccent -30 +KPX Agrave O -30 +KPX Agrave Oacute -30 +KPX Agrave Ocircumflex -30 +KPX Agrave Odieresis -30 +KPX Agrave Ograve -30 +KPX Agrave Ohungarumlaut -30 +KPX Agrave Omacron -30 +KPX Agrave Oslash -30 +KPX Agrave Otilde -30 +KPX Agrave Q -30 +KPX Agrave T -120 +KPX Agrave Tcaron -120 +KPX Agrave Tcommaaccent -120 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -70 +KPX Agrave W -50 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -40 +KPX Agrave y -40 +KPX Agrave yacute -40 +KPX Agrave ydieresis -40 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -30 +KPX Amacron Gbreve -30 +KPX Amacron Gcommaaccent -30 +KPX Amacron O -30 +KPX Amacron Oacute -30 +KPX Amacron Ocircumflex -30 +KPX Amacron Odieresis -30 +KPX Amacron Ograve -30 +KPX Amacron Ohungarumlaut -30 +KPX Amacron Omacron -30 +KPX Amacron Oslash -30 +KPX Amacron Otilde -30 +KPX Amacron Q -30 +KPX Amacron T -120 +KPX Amacron Tcaron -120 +KPX Amacron Tcommaaccent -120 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -70 +KPX Amacron W -50 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -40 +KPX Amacron y -40 +KPX Amacron yacute -40 +KPX Amacron ydieresis -40 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -30 +KPX Aogonek Gbreve -30 +KPX Aogonek Gcommaaccent -30 +KPX Aogonek O -30 +KPX Aogonek Oacute -30 +KPX Aogonek Ocircumflex -30 +KPX Aogonek Odieresis -30 +KPX Aogonek Ograve -30 +KPX Aogonek Ohungarumlaut -30 +KPX Aogonek Omacron -30 +KPX Aogonek Oslash -30 +KPX Aogonek Otilde -30 +KPX Aogonek Q -30 +KPX Aogonek T -120 +KPX Aogonek Tcaron -120 +KPX Aogonek Tcommaaccent -120 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -70 +KPX Aogonek W -50 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -40 +KPX Aogonek y -40 +KPX Aogonek yacute -40 +KPX Aogonek ydieresis -40 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -30 +KPX Aring Gbreve -30 +KPX Aring Gcommaaccent -30 +KPX Aring O -30 +KPX Aring Oacute -30 +KPX Aring Ocircumflex -30 +KPX Aring Odieresis -30 +KPX Aring Ograve -30 +KPX Aring Ohungarumlaut -30 +KPX Aring Omacron -30 +KPX Aring Oslash -30 +KPX Aring Otilde -30 +KPX Aring Q -30 +KPX Aring T -120 +KPX Aring Tcaron -120 +KPX Aring Tcommaaccent -120 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -70 +KPX Aring W -50 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -40 +KPX Aring y -40 +KPX Aring yacute -40 +KPX Aring ydieresis -40 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -30 +KPX Atilde Gbreve -30 +KPX Atilde Gcommaaccent -30 +KPX Atilde O -30 +KPX Atilde Oacute -30 +KPX Atilde Ocircumflex -30 +KPX Atilde Odieresis -30 +KPX Atilde Ograve -30 +KPX Atilde Ohungarumlaut -30 +KPX Atilde Omacron -30 +KPX Atilde Oslash -30 +KPX Atilde Otilde -30 +KPX Atilde Q -30 +KPX Atilde T -120 +KPX Atilde Tcaron -120 +KPX Atilde Tcommaaccent -120 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -70 +KPX Atilde W -50 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -40 +KPX Atilde y -40 +KPX Atilde yacute -40 +KPX Atilde ydieresis -40 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX B comma -20 +KPX B period -20 +KPX C comma -30 +KPX C period -30 +KPX Cacute comma -30 +KPX Cacute period -30 +KPX Ccaron comma -30 +KPX Ccaron period -30 +KPX Ccedilla comma -30 +KPX Ccedilla period -30 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -70 +KPX D W -40 +KPX D Y -90 +KPX D Yacute -90 +KPX D Ydieresis -90 +KPX D comma -70 +KPX D period -70 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -70 +KPX Dcaron W -40 +KPX Dcaron Y -90 +KPX Dcaron Yacute -90 +KPX Dcaron Ydieresis -90 +KPX Dcaron comma -70 +KPX Dcaron period -70 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -70 +KPX Dcroat W -40 +KPX Dcroat Y -90 +KPX Dcroat Yacute -90 +KPX Dcroat Ydieresis -90 +KPX Dcroat comma -70 +KPX Dcroat period -70 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -50 +KPX F aacute -50 +KPX F abreve -50 +KPX F acircumflex -50 +KPX F adieresis -50 +KPX F agrave -50 +KPX F amacron -50 +KPX F aogonek -50 +KPX F aring -50 +KPX F atilde -50 +KPX F comma -150 +KPX F e -30 +KPX F eacute -30 +KPX F ecaron -30 +KPX F ecircumflex -30 +KPX F edieresis -30 +KPX F edotaccent -30 +KPX F egrave -30 +KPX F emacron -30 +KPX F eogonek -30 +KPX F o -30 +KPX F oacute -30 +KPX F ocircumflex -30 +KPX F odieresis -30 +KPX F ograve -30 +KPX F ohungarumlaut -30 +KPX F omacron -30 +KPX F oslash -30 +KPX F otilde -30 +KPX F period -150 +KPX F r -45 +KPX F racute -45 +KPX F rcaron -45 +KPX F rcommaaccent -45 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J a -20 +KPX J aacute -20 +KPX J abreve -20 +KPX J acircumflex -20 +KPX J adieresis -20 +KPX J agrave -20 +KPX J amacron -20 +KPX J aogonek -20 +KPX J aring -20 +KPX J atilde -20 +KPX J comma -30 +KPX J period -30 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -40 +KPX K eacute -40 +KPX K ecaron -40 +KPX K ecircumflex -40 +KPX K edieresis -40 +KPX K edotaccent -40 +KPX K egrave -40 +KPX K emacron -40 +KPX K eogonek -40 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -50 +KPX K yacute -50 +KPX K ydieresis -50 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -40 +KPX Kcommaaccent eacute -40 +KPX Kcommaaccent ecaron -40 +KPX Kcommaaccent ecircumflex -40 +KPX Kcommaaccent edieresis -40 +KPX Kcommaaccent edotaccent -40 +KPX Kcommaaccent egrave -40 +KPX Kcommaaccent emacron -40 +KPX Kcommaaccent eogonek -40 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -50 +KPX Kcommaaccent yacute -50 +KPX Kcommaaccent ydieresis -50 +KPX L T -110 +KPX L Tcaron -110 +KPX L Tcommaaccent -110 +KPX L V -110 +KPX L W -70 +KPX L Y -140 +KPX L Yacute -140 +KPX L Ydieresis -140 +KPX L quotedblright -140 +KPX L quoteright -160 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -110 +KPX Lacute Tcaron -110 +KPX Lacute Tcommaaccent -110 +KPX Lacute V -110 +KPX Lacute W -70 +KPX Lacute Y -140 +KPX Lacute Yacute -140 +KPX Lacute Ydieresis -140 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -160 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcaron T -110 +KPX Lcaron Tcaron -110 +KPX Lcaron Tcommaaccent -110 +KPX Lcaron V -110 +KPX Lcaron W -70 +KPX Lcaron Y -140 +KPX Lcaron Yacute -140 +KPX Lcaron Ydieresis -140 +KPX Lcaron quotedblright -140 +KPX Lcaron quoteright -160 +KPX Lcaron y -30 +KPX Lcaron yacute -30 +KPX Lcaron ydieresis -30 +KPX Lcommaaccent T -110 +KPX Lcommaaccent Tcaron -110 +KPX Lcommaaccent Tcommaaccent -110 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -70 +KPX Lcommaaccent Y -140 +KPX Lcommaaccent Yacute -140 +KPX Lcommaaccent Ydieresis -140 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -160 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -110 +KPX Lslash Tcaron -110 +KPX Lslash Tcommaaccent -110 +KPX Lslash V -110 +KPX Lslash W -70 +KPX Lslash Y -140 +KPX Lslash Yacute -140 +KPX Lslash Ydieresis -140 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -160 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -20 +KPX O Aacute -20 +KPX O Abreve -20 +KPX O Acircumflex -20 +KPX O Adieresis -20 +KPX O Agrave -20 +KPX O Amacron -20 +KPX O Aogonek -20 +KPX O Aring -20 +KPX O Atilde -20 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -30 +KPX O X -60 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -20 +KPX Oacute Aacute -20 +KPX Oacute Abreve -20 +KPX Oacute Acircumflex -20 +KPX Oacute Adieresis -20 +KPX Oacute Agrave -20 +KPX Oacute Amacron -20 +KPX Oacute Aogonek -20 +KPX Oacute Aring -20 +KPX Oacute Atilde -20 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -30 +KPX Oacute X -60 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -20 +KPX Ocircumflex Aacute -20 +KPX Ocircumflex Abreve -20 +KPX Ocircumflex Acircumflex -20 +KPX Ocircumflex Adieresis -20 +KPX Ocircumflex Agrave -20 +KPX Ocircumflex Amacron -20 +KPX Ocircumflex Aogonek -20 +KPX Ocircumflex Aring -20 +KPX Ocircumflex Atilde -20 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -30 +KPX Ocircumflex X -60 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -20 +KPX Odieresis Aacute -20 +KPX Odieresis Abreve -20 +KPX Odieresis Acircumflex -20 +KPX Odieresis Adieresis -20 +KPX Odieresis Agrave -20 +KPX Odieresis Amacron -20 +KPX Odieresis Aogonek -20 +KPX Odieresis Aring -20 +KPX Odieresis Atilde -20 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -30 +KPX Odieresis X -60 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -20 +KPX Ograve Aacute -20 +KPX Ograve Abreve -20 +KPX Ograve Acircumflex -20 +KPX Ograve Adieresis -20 +KPX Ograve Agrave -20 +KPX Ograve Amacron -20 +KPX Ograve Aogonek -20 +KPX Ograve Aring -20 +KPX Ograve Atilde -20 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -30 +KPX Ograve X -60 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -20 +KPX Ohungarumlaut Aacute -20 +KPX Ohungarumlaut Abreve -20 +KPX Ohungarumlaut Acircumflex -20 +KPX Ohungarumlaut Adieresis -20 +KPX Ohungarumlaut Agrave -20 +KPX Ohungarumlaut Amacron -20 +KPX Ohungarumlaut Aogonek -20 +KPX Ohungarumlaut Aring -20 +KPX Ohungarumlaut Atilde -20 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -30 +KPX Ohungarumlaut X -60 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -20 +KPX Omacron Aacute -20 +KPX Omacron Abreve -20 +KPX Omacron Acircumflex -20 +KPX Omacron Adieresis -20 +KPX Omacron Agrave -20 +KPX Omacron Amacron -20 +KPX Omacron Aogonek -20 +KPX Omacron Aring -20 +KPX Omacron Atilde -20 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -30 +KPX Omacron X -60 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -20 +KPX Oslash Aacute -20 +KPX Oslash Abreve -20 +KPX Oslash Acircumflex -20 +KPX Oslash Adieresis -20 +KPX Oslash Agrave -20 +KPX Oslash Amacron -20 +KPX Oslash Aogonek -20 +KPX Oslash Aring -20 +KPX Oslash Atilde -20 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -30 +KPX Oslash X -60 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -20 +KPX Otilde Aacute -20 +KPX Otilde Abreve -20 +KPX Otilde Acircumflex -20 +KPX Otilde Adieresis -20 +KPX Otilde Agrave -20 +KPX Otilde Amacron -20 +KPX Otilde Aogonek -20 +KPX Otilde Aring -20 +KPX Otilde Atilde -20 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -30 +KPX Otilde X -60 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -120 +KPX P Aacute -120 +KPX P Abreve -120 +KPX P Acircumflex -120 +KPX P Adieresis -120 +KPX P Agrave -120 +KPX P Amacron -120 +KPX P Aogonek -120 +KPX P Aring -120 +KPX P Atilde -120 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -180 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -50 +KPX P oacute -50 +KPX P ocircumflex -50 +KPX P odieresis -50 +KPX P ograve -50 +KPX P ohungarumlaut -50 +KPX P omacron -50 +KPX P oslash -50 +KPX P otilde -50 +KPX P period -180 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -50 +KPX R W -30 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -50 +KPX Racute W -30 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -50 +KPX Rcaron W -30 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -30 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX S comma -20 +KPX S period -20 +KPX Sacute comma -20 +KPX Sacute period -20 +KPX Scaron comma -20 +KPX Scaron period -20 +KPX Scedilla comma -20 +KPX Scedilla period -20 +KPX Scommaaccent comma -20 +KPX Scommaaccent period -20 +KPX T A -120 +KPX T Aacute -120 +KPX T Abreve -120 +KPX T Acircumflex -120 +KPX T Adieresis -120 +KPX T Agrave -120 +KPX T Amacron -120 +KPX T Aogonek -120 +KPX T Aring -120 +KPX T Atilde -120 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -120 +KPX T aacute -120 +KPX T abreve -60 +KPX T acircumflex -120 +KPX T adieresis -120 +KPX T agrave -120 +KPX T amacron -60 +KPX T aogonek -120 +KPX T aring -120 +KPX T atilde -60 +KPX T colon -20 +KPX T comma -120 +KPX T e -120 +KPX T eacute -120 +KPX T ecaron -120 +KPX T ecircumflex -120 +KPX T edieresis -120 +KPX T edotaccent -120 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -120 +KPX T hyphen -140 +KPX T o -120 +KPX T oacute -120 +KPX T ocircumflex -120 +KPX T odieresis -120 +KPX T ograve -120 +KPX T ohungarumlaut -120 +KPX T omacron -60 +KPX T oslash -120 +KPX T otilde -60 +KPX T period -120 +KPX T r -120 +KPX T racute -120 +KPX T rcaron -120 +KPX T rcommaaccent -120 +KPX T semicolon -20 +KPX T u -120 +KPX T uacute -120 +KPX T ucircumflex -120 +KPX T udieresis -120 +KPX T ugrave -120 +KPX T uhungarumlaut -120 +KPX T umacron -60 +KPX T uogonek -120 +KPX T uring -120 +KPX T w -120 +KPX T y -120 +KPX T yacute -120 +KPX T ydieresis -60 +KPX Tcaron A -120 +KPX Tcaron Aacute -120 +KPX Tcaron Abreve -120 +KPX Tcaron Acircumflex -120 +KPX Tcaron Adieresis -120 +KPX Tcaron Agrave -120 +KPX Tcaron Amacron -120 +KPX Tcaron Aogonek -120 +KPX Tcaron Aring -120 +KPX Tcaron Atilde -120 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -120 +KPX Tcaron aacute -120 +KPX Tcaron abreve -60 +KPX Tcaron acircumflex -120 +KPX Tcaron adieresis -120 +KPX Tcaron agrave -120 +KPX Tcaron amacron -60 +KPX Tcaron aogonek -120 +KPX Tcaron aring -120 +KPX Tcaron atilde -60 +KPX Tcaron colon -20 +KPX Tcaron comma -120 +KPX Tcaron e -120 +KPX Tcaron eacute -120 +KPX Tcaron ecaron -120 +KPX Tcaron ecircumflex -120 +KPX Tcaron edieresis -120 +KPX Tcaron edotaccent -120 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -120 +KPX Tcaron hyphen -140 +KPX Tcaron o -120 +KPX Tcaron oacute -120 +KPX Tcaron ocircumflex -120 +KPX Tcaron odieresis -120 +KPX Tcaron ograve -120 +KPX Tcaron ohungarumlaut -120 +KPX Tcaron omacron -60 +KPX Tcaron oslash -120 +KPX Tcaron otilde -60 +KPX Tcaron period -120 +KPX Tcaron r -120 +KPX Tcaron racute -120 +KPX Tcaron rcaron -120 +KPX Tcaron rcommaaccent -120 +KPX Tcaron semicolon -20 +KPX Tcaron u -120 +KPX Tcaron uacute -120 +KPX Tcaron ucircumflex -120 +KPX Tcaron udieresis -120 +KPX Tcaron ugrave -120 +KPX Tcaron uhungarumlaut -120 +KPX Tcaron umacron -60 +KPX Tcaron uogonek -120 +KPX Tcaron uring -120 +KPX Tcaron w -120 +KPX Tcaron y -120 +KPX Tcaron yacute -120 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -120 +KPX Tcommaaccent Aacute -120 +KPX Tcommaaccent Abreve -120 +KPX Tcommaaccent Acircumflex -120 +KPX Tcommaaccent Adieresis -120 +KPX Tcommaaccent Agrave -120 +KPX Tcommaaccent Amacron -120 +KPX Tcommaaccent Aogonek -120 +KPX Tcommaaccent Aring -120 +KPX Tcommaaccent Atilde -120 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -120 +KPX Tcommaaccent aacute -120 +KPX Tcommaaccent abreve -60 +KPX Tcommaaccent acircumflex -120 +KPX Tcommaaccent adieresis -120 +KPX Tcommaaccent agrave -120 +KPX Tcommaaccent amacron -60 +KPX Tcommaaccent aogonek -120 +KPX Tcommaaccent aring -120 +KPX Tcommaaccent atilde -60 +KPX Tcommaaccent colon -20 +KPX Tcommaaccent comma -120 +KPX Tcommaaccent e -120 +KPX Tcommaaccent eacute -120 +KPX Tcommaaccent ecaron -120 +KPX Tcommaaccent ecircumflex -120 +KPX Tcommaaccent edieresis -120 +KPX Tcommaaccent edotaccent -120 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -120 +KPX Tcommaaccent hyphen -140 +KPX Tcommaaccent o -120 +KPX Tcommaaccent oacute -120 +KPX Tcommaaccent ocircumflex -120 +KPX Tcommaaccent odieresis -120 +KPX Tcommaaccent ograve -120 +KPX Tcommaaccent ohungarumlaut -120 +KPX Tcommaaccent omacron -60 +KPX Tcommaaccent oslash -120 +KPX Tcommaaccent otilde -60 +KPX Tcommaaccent period -120 +KPX Tcommaaccent r -120 +KPX Tcommaaccent racute -120 +KPX Tcommaaccent rcaron -120 +KPX Tcommaaccent rcommaaccent -120 +KPX Tcommaaccent semicolon -20 +KPX Tcommaaccent u -120 +KPX Tcommaaccent uacute -120 +KPX Tcommaaccent ucircumflex -120 +KPX Tcommaaccent udieresis -120 +KPX Tcommaaccent ugrave -120 +KPX Tcommaaccent uhungarumlaut -120 +KPX Tcommaaccent umacron -60 +KPX Tcommaaccent uogonek -120 +KPX Tcommaaccent uring -120 +KPX Tcommaaccent w -120 +KPX Tcommaaccent y -120 +KPX Tcommaaccent yacute -120 +KPX Tcommaaccent ydieresis -60 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -40 +KPX U period -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -40 +KPX Uacute period -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -40 +KPX Ucircumflex period -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -40 +KPX Udieresis period -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -40 +KPX Ugrave period -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -40 +KPX Uhungarumlaut period -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -40 +KPX Umacron period -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -40 +KPX Uogonek period -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -40 +KPX Uring period -40 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -40 +KPX V Gbreve -40 +KPX V Gcommaaccent -40 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -70 +KPX V aacute -70 +KPX V abreve -70 +KPX V acircumflex -70 +KPX V adieresis -70 +KPX V agrave -70 +KPX V amacron -70 +KPX V aogonek -70 +KPX V aring -70 +KPX V atilde -70 +KPX V colon -40 +KPX V comma -125 +KPX V e -80 +KPX V eacute -80 +KPX V ecaron -80 +KPX V ecircumflex -80 +KPX V edieresis -80 +KPX V edotaccent -80 +KPX V egrave -80 +KPX V emacron -80 +KPX V eogonek -80 +KPX V hyphen -80 +KPX V o -80 +KPX V oacute -80 +KPX V ocircumflex -80 +KPX V odieresis -80 +KPX V ograve -80 +KPX V ohungarumlaut -80 +KPX V omacron -80 +KPX V oslash -80 +KPX V otilde -80 +KPX V period -125 +KPX V semicolon -40 +KPX V u -70 +KPX V uacute -70 +KPX V ucircumflex -70 +KPX V udieresis -70 +KPX V ugrave -70 +KPX V uhungarumlaut -70 +KPX V umacron -70 +KPX V uogonek -70 +KPX V uring -70 +KPX W A -50 +KPX W Aacute -50 +KPX W Abreve -50 +KPX W Acircumflex -50 +KPX W Adieresis -50 +KPX W Agrave -50 +KPX W Amacron -50 +KPX W Aogonek -50 +KPX W Aring -50 +KPX W Atilde -50 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W comma -80 +KPX W e -30 +KPX W eacute -30 +KPX W ecaron -30 +KPX W ecircumflex -30 +KPX W edieresis -30 +KPX W edotaccent -30 +KPX W egrave -30 +KPX W emacron -30 +KPX W eogonek -30 +KPX W hyphen -40 +KPX W o -30 +KPX W oacute -30 +KPX W ocircumflex -30 +KPX W odieresis -30 +KPX W ograve -30 +KPX W ohungarumlaut -30 +KPX W omacron -30 +KPX W oslash -30 +KPX W otilde -30 +KPX W period -80 +KPX W u -30 +KPX W uacute -30 +KPX W ucircumflex -30 +KPX W udieresis -30 +KPX W ugrave -30 +KPX W uhungarumlaut -30 +KPX W umacron -30 +KPX W uogonek -30 +KPX W uring -30 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -85 +KPX Y Oacute -85 +KPX Y Ocircumflex -85 +KPX Y Odieresis -85 +KPX Y Ograve -85 +KPX Y Ohungarumlaut -85 +KPX Y Omacron -85 +KPX Y Oslash -85 +KPX Y Otilde -85 +KPX Y a -140 +KPX Y aacute -140 +KPX Y abreve -70 +KPX Y acircumflex -140 +KPX Y adieresis -140 +KPX Y agrave -140 +KPX Y amacron -70 +KPX Y aogonek -140 +KPX Y aring -140 +KPX Y atilde -140 +KPX Y colon -60 +KPX Y comma -140 +KPX Y e -140 +KPX Y eacute -140 +KPX Y ecaron -140 +KPX Y ecircumflex -140 +KPX Y edieresis -140 +KPX Y edotaccent -140 +KPX Y egrave -140 +KPX Y emacron -70 +KPX Y eogonek -140 +KPX Y hyphen -140 +KPX Y i -20 +KPX Y iacute -20 +KPX Y iogonek -20 +KPX Y o -140 +KPX Y oacute -140 +KPX Y ocircumflex -140 +KPX Y odieresis -140 +KPX Y ograve -140 +KPX Y ohungarumlaut -140 +KPX Y omacron -140 +KPX Y oslash -140 +KPX Y otilde -140 +KPX Y period -140 +KPX Y semicolon -60 +KPX Y u -110 +KPX Y uacute -110 +KPX Y ucircumflex -110 +KPX Y udieresis -110 +KPX Y ugrave -110 +KPX Y uhungarumlaut -110 +KPX Y umacron -110 +KPX Y uogonek -110 +KPX Y uring -110 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -85 +KPX Yacute Oacute -85 +KPX Yacute Ocircumflex -85 +KPX Yacute Odieresis -85 +KPX Yacute Ograve -85 +KPX Yacute Ohungarumlaut -85 +KPX Yacute Omacron -85 +KPX Yacute Oslash -85 +KPX Yacute Otilde -85 +KPX Yacute a -140 +KPX Yacute aacute -140 +KPX Yacute abreve -70 +KPX Yacute acircumflex -140 +KPX Yacute adieresis -140 +KPX Yacute agrave -140 +KPX Yacute amacron -70 +KPX Yacute aogonek -140 +KPX Yacute aring -140 +KPX Yacute atilde -70 +KPX Yacute colon -60 +KPX Yacute comma -140 +KPX Yacute e -140 +KPX Yacute eacute -140 +KPX Yacute ecaron -140 +KPX Yacute ecircumflex -140 +KPX Yacute edieresis -140 +KPX Yacute edotaccent -140 +KPX Yacute egrave -140 +KPX Yacute emacron -70 +KPX Yacute eogonek -140 +KPX Yacute hyphen -140 +KPX Yacute i -20 +KPX Yacute iacute -20 +KPX Yacute iogonek -20 +KPX Yacute o -140 +KPX Yacute oacute -140 +KPX Yacute ocircumflex -140 +KPX Yacute odieresis -140 +KPX Yacute ograve -140 +KPX Yacute ohungarumlaut -140 +KPX Yacute omacron -70 +KPX Yacute oslash -140 +KPX Yacute otilde -140 +KPX Yacute period -140 +KPX Yacute semicolon -60 +KPX Yacute u -110 +KPX Yacute uacute -110 +KPX Yacute ucircumflex -110 +KPX Yacute udieresis -110 +KPX Yacute ugrave -110 +KPX Yacute uhungarumlaut -110 +KPX Yacute umacron -110 +KPX Yacute uogonek -110 +KPX Yacute uring -110 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -85 +KPX Ydieresis Oacute -85 +KPX Ydieresis Ocircumflex -85 +KPX Ydieresis Odieresis -85 +KPX Ydieresis Ograve -85 +KPX Ydieresis Ohungarumlaut -85 +KPX Ydieresis Omacron -85 +KPX Ydieresis Oslash -85 +KPX Ydieresis Otilde -85 +KPX Ydieresis a -140 +KPX Ydieresis aacute -140 +KPX Ydieresis abreve -70 +KPX Ydieresis acircumflex -140 +KPX Ydieresis adieresis -140 +KPX Ydieresis agrave -140 +KPX Ydieresis amacron -70 +KPX Ydieresis aogonek -140 +KPX Ydieresis aring -140 +KPX Ydieresis atilde -70 +KPX Ydieresis colon -60 +KPX Ydieresis comma -140 +KPX Ydieresis e -140 +KPX Ydieresis eacute -140 +KPX Ydieresis ecaron -140 +KPX Ydieresis ecircumflex -140 +KPX Ydieresis edieresis -140 +KPX Ydieresis edotaccent -140 +KPX Ydieresis egrave -140 +KPX Ydieresis emacron -70 +KPX Ydieresis eogonek -140 +KPX Ydieresis hyphen -140 +KPX Ydieresis i -20 +KPX Ydieresis iacute -20 +KPX Ydieresis iogonek -20 +KPX Ydieresis o -140 +KPX Ydieresis oacute -140 +KPX Ydieresis ocircumflex -140 +KPX Ydieresis odieresis -140 +KPX Ydieresis ograve -140 +KPX Ydieresis ohungarumlaut -140 +KPX Ydieresis omacron -140 +KPX Ydieresis oslash -140 +KPX Ydieresis otilde -140 +KPX Ydieresis period -140 +KPX Ydieresis semicolon -60 +KPX Ydieresis u -110 +KPX Ydieresis uacute -110 +KPX Ydieresis ucircumflex -110 +KPX Ydieresis udieresis -110 +KPX Ydieresis ugrave -110 +KPX Ydieresis uhungarumlaut -110 +KPX Ydieresis umacron -110 +KPX Ydieresis uogonek -110 +KPX Ydieresis uring -110 +KPX a v -20 +KPX a w -20 +KPX a y -30 +KPX a yacute -30 +KPX a ydieresis -30 +KPX aacute v -20 +KPX aacute w -20 +KPX aacute y -30 +KPX aacute yacute -30 +KPX aacute ydieresis -30 +KPX abreve v -20 +KPX abreve w -20 +KPX abreve y -30 +KPX abreve yacute -30 +KPX abreve ydieresis -30 +KPX acircumflex v -20 +KPX acircumflex w -20 +KPX acircumflex y -30 +KPX acircumflex yacute -30 +KPX acircumflex ydieresis -30 +KPX adieresis v -20 +KPX adieresis w -20 +KPX adieresis y -30 +KPX adieresis yacute -30 +KPX adieresis ydieresis -30 +KPX agrave v -20 +KPX agrave w -20 +KPX agrave y -30 +KPX agrave yacute -30 +KPX agrave ydieresis -30 +KPX amacron v -20 +KPX amacron w -20 +KPX amacron y -30 +KPX amacron yacute -30 +KPX amacron ydieresis -30 +KPX aogonek v -20 +KPX aogonek w -20 +KPX aogonek y -30 +KPX aogonek yacute -30 +KPX aogonek ydieresis -30 +KPX aring v -20 +KPX aring w -20 +KPX aring y -30 +KPX aring yacute -30 +KPX aring ydieresis -30 +KPX atilde v -20 +KPX atilde w -20 +KPX atilde y -30 +KPX atilde yacute -30 +KPX atilde ydieresis -30 +KPX b b -10 +KPX b comma -40 +KPX b l -20 +KPX b lacute -20 +KPX b lcommaaccent -20 +KPX b lslash -20 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c comma -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute comma -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron comma -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla comma -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX colon space -50 +KPX comma quotedblright -100 +KPX comma quoteright -100 +KPX e comma -15 +KPX e period -15 +KPX e v -30 +KPX e w -20 +KPX e x -30 +KPX e y -20 +KPX e yacute -20 +KPX e ydieresis -20 +KPX eacute comma -15 +KPX eacute period -15 +KPX eacute v -30 +KPX eacute w -20 +KPX eacute x -30 +KPX eacute y -20 +KPX eacute yacute -20 +KPX eacute ydieresis -20 +KPX ecaron comma -15 +KPX ecaron period -15 +KPX ecaron v -30 +KPX ecaron w -20 +KPX ecaron x -30 +KPX ecaron y -20 +KPX ecaron yacute -20 +KPX ecaron ydieresis -20 +KPX ecircumflex comma -15 +KPX ecircumflex period -15 +KPX ecircumflex v -30 +KPX ecircumflex w -20 +KPX ecircumflex x -30 +KPX ecircumflex y -20 +KPX ecircumflex yacute -20 +KPX ecircumflex ydieresis -20 +KPX edieresis comma -15 +KPX edieresis period -15 +KPX edieresis v -30 +KPX edieresis w -20 +KPX edieresis x -30 +KPX edieresis y -20 +KPX edieresis yacute -20 +KPX edieresis ydieresis -20 +KPX edotaccent comma -15 +KPX edotaccent period -15 +KPX edotaccent v -30 +KPX edotaccent w -20 +KPX edotaccent x -30 +KPX edotaccent y -20 +KPX edotaccent yacute -20 +KPX edotaccent ydieresis -20 +KPX egrave comma -15 +KPX egrave period -15 +KPX egrave v -30 +KPX egrave w -20 +KPX egrave x -30 +KPX egrave y -20 +KPX egrave yacute -20 +KPX egrave ydieresis -20 +KPX emacron comma -15 +KPX emacron period -15 +KPX emacron v -30 +KPX emacron w -20 +KPX emacron x -30 +KPX emacron y -20 +KPX emacron yacute -20 +KPX emacron ydieresis -20 +KPX eogonek comma -15 +KPX eogonek period -15 +KPX eogonek v -30 +KPX eogonek w -20 +KPX eogonek x -30 +KPX eogonek y -20 +KPX eogonek yacute -20 +KPX eogonek ydieresis -20 +KPX f a -30 +KPX f aacute -30 +KPX f abreve -30 +KPX f acircumflex -30 +KPX f adieresis -30 +KPX f agrave -30 +KPX f amacron -30 +KPX f aogonek -30 +KPX f aring -30 +KPX f atilde -30 +KPX f comma -30 +KPX f dotlessi -28 +KPX f e -30 +KPX f eacute -30 +KPX f ecaron -30 +KPX f ecircumflex -30 +KPX f edieresis -30 +KPX f edotaccent -30 +KPX f egrave -30 +KPX f emacron -30 +KPX f eogonek -30 +KPX f o -30 +KPX f oacute -30 +KPX f ocircumflex -30 +KPX f odieresis -30 +KPX f ograve -30 +KPX f ohungarumlaut -30 +KPX f omacron -30 +KPX f oslash -30 +KPX f otilde -30 +KPX f period -30 +KPX f quotedblright 60 +KPX f quoteright 50 +KPX g r -10 +KPX g racute -10 +KPX g rcaron -10 +KPX g rcommaaccent -10 +KPX gbreve r -10 +KPX gbreve racute -10 +KPX gbreve rcaron -10 +KPX gbreve rcommaaccent -10 +KPX gcommaaccent r -10 +KPX gcommaaccent racute -10 +KPX gcommaaccent rcaron -10 +KPX gcommaaccent rcommaaccent -10 +KPX h y -30 +KPX h yacute -30 +KPX h ydieresis -30 +KPX k e -20 +KPX k eacute -20 +KPX k ecaron -20 +KPX k ecircumflex -20 +KPX k edieresis -20 +KPX k edotaccent -20 +KPX k egrave -20 +KPX k emacron -20 +KPX k eogonek -20 +KPX k o -20 +KPX k oacute -20 +KPX k ocircumflex -20 +KPX k odieresis -20 +KPX k ograve -20 +KPX k ohungarumlaut -20 +KPX k omacron -20 +KPX k oslash -20 +KPX k otilde -20 +KPX kcommaaccent e -20 +KPX kcommaaccent eacute -20 +KPX kcommaaccent ecaron -20 +KPX kcommaaccent ecircumflex -20 +KPX kcommaaccent edieresis -20 +KPX kcommaaccent edotaccent -20 +KPX kcommaaccent egrave -20 +KPX kcommaaccent emacron -20 +KPX kcommaaccent eogonek -20 +KPX kcommaaccent o -20 +KPX kcommaaccent oacute -20 +KPX kcommaaccent ocircumflex -20 +KPX kcommaaccent odieresis -20 +KPX kcommaaccent ograve -20 +KPX kcommaaccent ohungarumlaut -20 +KPX kcommaaccent omacron -20 +KPX kcommaaccent oslash -20 +KPX kcommaaccent otilde -20 +KPX m u -10 +KPX m uacute -10 +KPX m ucircumflex -10 +KPX m udieresis -10 +KPX m ugrave -10 +KPX m uhungarumlaut -10 +KPX m umacron -10 +KPX m uogonek -10 +KPX m uring -10 +KPX m y -15 +KPX m yacute -15 +KPX m ydieresis -15 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -20 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -20 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -20 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -20 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -20 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o comma -40 +KPX o period -40 +KPX o v -15 +KPX o w -15 +KPX o x -30 +KPX o y -30 +KPX o yacute -30 +KPX o ydieresis -30 +KPX oacute comma -40 +KPX oacute period -40 +KPX oacute v -15 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -30 +KPX oacute yacute -30 +KPX oacute ydieresis -30 +KPX ocircumflex comma -40 +KPX ocircumflex period -40 +KPX ocircumflex v -15 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -30 +KPX ocircumflex yacute -30 +KPX ocircumflex ydieresis -30 +KPX odieresis comma -40 +KPX odieresis period -40 +KPX odieresis v -15 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -30 +KPX odieresis yacute -30 +KPX odieresis ydieresis -30 +KPX ograve comma -40 +KPX ograve period -40 +KPX ograve v -15 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -30 +KPX ograve yacute -30 +KPX ograve ydieresis -30 +KPX ohungarumlaut comma -40 +KPX ohungarumlaut period -40 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -30 +KPX ohungarumlaut yacute -30 +KPX ohungarumlaut ydieresis -30 +KPX omacron comma -40 +KPX omacron period -40 +KPX omacron v -15 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -30 +KPX omacron yacute -30 +KPX omacron ydieresis -30 +KPX oslash a -55 +KPX oslash aacute -55 +KPX oslash abreve -55 +KPX oslash acircumflex -55 +KPX oslash adieresis -55 +KPX oslash agrave -55 +KPX oslash amacron -55 +KPX oslash aogonek -55 +KPX oslash aring -55 +KPX oslash atilde -55 +KPX oslash b -55 +KPX oslash c -55 +KPX oslash cacute -55 +KPX oslash ccaron -55 +KPX oslash ccedilla -55 +KPX oslash comma -95 +KPX oslash d -55 +KPX oslash dcroat -55 +KPX oslash e -55 +KPX oslash eacute -55 +KPX oslash ecaron -55 +KPX oslash ecircumflex -55 +KPX oslash edieresis -55 +KPX oslash edotaccent -55 +KPX oslash egrave -55 +KPX oslash emacron -55 +KPX oslash eogonek -55 +KPX oslash f -55 +KPX oslash g -55 +KPX oslash gbreve -55 +KPX oslash gcommaaccent -55 +KPX oslash h -55 +KPX oslash i -55 +KPX oslash iacute -55 +KPX oslash icircumflex -55 +KPX oslash idieresis -55 +KPX oslash igrave -55 +KPX oslash imacron -55 +KPX oslash iogonek -55 +KPX oslash j -55 +KPX oslash k -55 +KPX oslash kcommaaccent -55 +KPX oslash l -55 +KPX oslash lacute -55 +KPX oslash lcommaaccent -55 +KPX oslash lslash -55 +KPX oslash m -55 +KPX oslash n -55 +KPX oslash nacute -55 +KPX oslash ncaron -55 +KPX oslash ncommaaccent -55 +KPX oslash ntilde -55 +KPX oslash o -55 +KPX oslash oacute -55 +KPX oslash ocircumflex -55 +KPX oslash odieresis -55 +KPX oslash ograve -55 +KPX oslash ohungarumlaut -55 +KPX oslash omacron -55 +KPX oslash oslash -55 +KPX oslash otilde -55 +KPX oslash p -55 +KPX oslash period -95 +KPX oslash q -55 +KPX oslash r -55 +KPX oslash racute -55 +KPX oslash rcaron -55 +KPX oslash rcommaaccent -55 +KPX oslash s -55 +KPX oslash sacute -55 +KPX oslash scaron -55 +KPX oslash scedilla -55 +KPX oslash scommaaccent -55 +KPX oslash t -55 +KPX oslash tcommaaccent -55 +KPX oslash u -55 +KPX oslash uacute -55 +KPX oslash ucircumflex -55 +KPX oslash udieresis -55 +KPX oslash ugrave -55 +KPX oslash uhungarumlaut -55 +KPX oslash umacron -55 +KPX oslash uogonek -55 +KPX oslash uring -55 +KPX oslash v -70 +KPX oslash w -70 +KPX oslash x -85 +KPX oslash y -70 +KPX oslash yacute -70 +KPX oslash ydieresis -70 +KPX oslash z -55 +KPX oslash zacute -55 +KPX oslash zcaron -55 +KPX oslash zdotaccent -55 +KPX otilde comma -40 +KPX otilde period -40 +KPX otilde v -15 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -30 +KPX otilde yacute -30 +KPX otilde ydieresis -30 +KPX p comma -35 +KPX p period -35 +KPX p y -30 +KPX p yacute -30 +KPX p ydieresis -30 +KPX period quotedblright -100 +KPX period quoteright -100 +KPX period space -60 +KPX quotedblright space -40 +KPX quoteleft quoteleft -57 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright quoteright -57 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -50 +KPX quoteright sacute -50 +KPX quoteright scaron -50 +KPX quoteright scedilla -50 +KPX quoteright scommaaccent -50 +KPX quoteright space -70 +KPX r a -10 +KPX r aacute -10 +KPX r abreve -10 +KPX r acircumflex -10 +KPX r adieresis -10 +KPX r agrave -10 +KPX r amacron -10 +KPX r aogonek -10 +KPX r aring -10 +KPX r atilde -10 +KPX r colon 30 +KPX r comma -50 +KPX r i 15 +KPX r iacute 15 +KPX r icircumflex 15 +KPX r idieresis 15 +KPX r igrave 15 +KPX r imacron 15 +KPX r iogonek 15 +KPX r k 15 +KPX r kcommaaccent 15 +KPX r l 15 +KPX r lacute 15 +KPX r lcommaaccent 15 +KPX r lslash 15 +KPX r m 25 +KPX r n 25 +KPX r nacute 25 +KPX r ncaron 25 +KPX r ncommaaccent 25 +KPX r ntilde 25 +KPX r p 30 +KPX r period -50 +KPX r semicolon 30 +KPX r t 40 +KPX r tcommaaccent 40 +KPX r u 15 +KPX r uacute 15 +KPX r ucircumflex 15 +KPX r udieresis 15 +KPX r ugrave 15 +KPX r uhungarumlaut 15 +KPX r umacron 15 +KPX r uogonek 15 +KPX r uring 15 +KPX r v 30 +KPX r y 30 +KPX r yacute 30 +KPX r ydieresis 30 +KPX racute a -10 +KPX racute aacute -10 +KPX racute abreve -10 +KPX racute acircumflex -10 +KPX racute adieresis -10 +KPX racute agrave -10 +KPX racute amacron -10 +KPX racute aogonek -10 +KPX racute aring -10 +KPX racute atilde -10 +KPX racute colon 30 +KPX racute comma -50 +KPX racute i 15 +KPX racute iacute 15 +KPX racute icircumflex 15 +KPX racute idieresis 15 +KPX racute igrave 15 +KPX racute imacron 15 +KPX racute iogonek 15 +KPX racute k 15 +KPX racute kcommaaccent 15 +KPX racute l 15 +KPX racute lacute 15 +KPX racute lcommaaccent 15 +KPX racute lslash 15 +KPX racute m 25 +KPX racute n 25 +KPX racute nacute 25 +KPX racute ncaron 25 +KPX racute ncommaaccent 25 +KPX racute ntilde 25 +KPX racute p 30 +KPX racute period -50 +KPX racute semicolon 30 +KPX racute t 40 +KPX racute tcommaaccent 40 +KPX racute u 15 +KPX racute uacute 15 +KPX racute ucircumflex 15 +KPX racute udieresis 15 +KPX racute ugrave 15 +KPX racute uhungarumlaut 15 +KPX racute umacron 15 +KPX racute uogonek 15 +KPX racute uring 15 +KPX racute v 30 +KPX racute y 30 +KPX racute yacute 30 +KPX racute ydieresis 30 +KPX rcaron a -10 +KPX rcaron aacute -10 +KPX rcaron abreve -10 +KPX rcaron acircumflex -10 +KPX rcaron adieresis -10 +KPX rcaron agrave -10 +KPX rcaron amacron -10 +KPX rcaron aogonek -10 +KPX rcaron aring -10 +KPX rcaron atilde -10 +KPX rcaron colon 30 +KPX rcaron comma -50 +KPX rcaron i 15 +KPX rcaron iacute 15 +KPX rcaron icircumflex 15 +KPX rcaron idieresis 15 +KPX rcaron igrave 15 +KPX rcaron imacron 15 +KPX rcaron iogonek 15 +KPX rcaron k 15 +KPX rcaron kcommaaccent 15 +KPX rcaron l 15 +KPX rcaron lacute 15 +KPX rcaron lcommaaccent 15 +KPX rcaron lslash 15 +KPX rcaron m 25 +KPX rcaron n 25 +KPX rcaron nacute 25 +KPX rcaron ncaron 25 +KPX rcaron ncommaaccent 25 +KPX rcaron ntilde 25 +KPX rcaron p 30 +KPX rcaron period -50 +KPX rcaron semicolon 30 +KPX rcaron t 40 +KPX rcaron tcommaaccent 40 +KPX rcaron u 15 +KPX rcaron uacute 15 +KPX rcaron ucircumflex 15 +KPX rcaron udieresis 15 +KPX rcaron ugrave 15 +KPX rcaron uhungarumlaut 15 +KPX rcaron umacron 15 +KPX rcaron uogonek 15 +KPX rcaron uring 15 +KPX rcaron v 30 +KPX rcaron y 30 +KPX rcaron yacute 30 +KPX rcaron ydieresis 30 +KPX rcommaaccent a -10 +KPX rcommaaccent aacute -10 +KPX rcommaaccent abreve -10 +KPX rcommaaccent acircumflex -10 +KPX rcommaaccent adieresis -10 +KPX rcommaaccent agrave -10 +KPX rcommaaccent amacron -10 +KPX rcommaaccent aogonek -10 +KPX rcommaaccent aring -10 +KPX rcommaaccent atilde -10 +KPX rcommaaccent colon 30 +KPX rcommaaccent comma -50 +KPX rcommaaccent i 15 +KPX rcommaaccent iacute 15 +KPX rcommaaccent icircumflex 15 +KPX rcommaaccent idieresis 15 +KPX rcommaaccent igrave 15 +KPX rcommaaccent imacron 15 +KPX rcommaaccent iogonek 15 +KPX rcommaaccent k 15 +KPX rcommaaccent kcommaaccent 15 +KPX rcommaaccent l 15 +KPX rcommaaccent lacute 15 +KPX rcommaaccent lcommaaccent 15 +KPX rcommaaccent lslash 15 +KPX rcommaaccent m 25 +KPX rcommaaccent n 25 +KPX rcommaaccent nacute 25 +KPX rcommaaccent ncaron 25 +KPX rcommaaccent ncommaaccent 25 +KPX rcommaaccent ntilde 25 +KPX rcommaaccent p 30 +KPX rcommaaccent period -50 +KPX rcommaaccent semicolon 30 +KPX rcommaaccent t 40 +KPX rcommaaccent tcommaaccent 40 +KPX rcommaaccent u 15 +KPX rcommaaccent uacute 15 +KPX rcommaaccent ucircumflex 15 +KPX rcommaaccent udieresis 15 +KPX rcommaaccent ugrave 15 +KPX rcommaaccent uhungarumlaut 15 +KPX rcommaaccent umacron 15 +KPX rcommaaccent uogonek 15 +KPX rcommaaccent uring 15 +KPX rcommaaccent v 30 +KPX rcommaaccent y 30 +KPX rcommaaccent yacute 30 +KPX rcommaaccent ydieresis 30 +KPX s comma -15 +KPX s period -15 +KPX s w -30 +KPX sacute comma -15 +KPX sacute period -15 +KPX sacute w -30 +KPX scaron comma -15 +KPX scaron period -15 +KPX scaron w -30 +KPX scedilla comma -15 +KPX scedilla period -15 +KPX scedilla w -30 +KPX scommaaccent comma -15 +KPX scommaaccent period -15 +KPX scommaaccent w -30 +KPX semicolon space -50 +KPX space T -50 +KPX space Tcaron -50 +KPX space Tcommaaccent -50 +KPX space V -50 +KPX space W -40 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX space quotedblleft -30 +KPX space quoteleft -60 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -80 +KPX v e -25 +KPX v eacute -25 +KPX v ecaron -25 +KPX v ecircumflex -25 +KPX v edieresis -25 +KPX v edotaccent -25 +KPX v egrave -25 +KPX v emacron -25 +KPX v eogonek -25 +KPX v o -25 +KPX v oacute -25 +KPX v ocircumflex -25 +KPX v odieresis -25 +KPX v ograve -25 +KPX v ohungarumlaut -25 +KPX v omacron -25 +KPX v oslash -25 +KPX v otilde -25 +KPX v period -80 +KPX w a -15 +KPX w aacute -15 +KPX w abreve -15 +KPX w acircumflex -15 +KPX w adieresis -15 +KPX w agrave -15 +KPX w amacron -15 +KPX w aogonek -15 +KPX w aring -15 +KPX w atilde -15 +KPX w comma -60 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -60 +KPX x e -30 +KPX x eacute -30 +KPX x ecaron -30 +KPX x ecircumflex -30 +KPX x edieresis -30 +KPX x edotaccent -30 +KPX x egrave -30 +KPX x emacron -30 +KPX x eogonek -30 +KPX y a -20 +KPX y aacute -20 +KPX y abreve -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y agrave -20 +KPX y amacron -20 +KPX y aogonek -20 +KPX y aring -20 +KPX y atilde -20 +KPX y comma -100 +KPX y e -20 +KPX y eacute -20 +KPX y ecaron -20 +KPX y ecircumflex -20 +KPX y edieresis -20 +KPX y edotaccent -20 +KPX y egrave -20 +KPX y emacron -20 +KPX y eogonek -20 +KPX y o -20 +KPX y oacute -20 +KPX y ocircumflex -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y ohungarumlaut -20 +KPX y omacron -20 +KPX y oslash -20 +KPX y otilde -20 +KPX y period -100 +KPX yacute a -20 +KPX yacute aacute -20 +KPX yacute abreve -20 +KPX yacute acircumflex -20 +KPX yacute adieresis -20 +KPX yacute agrave -20 +KPX yacute amacron -20 +KPX yacute aogonek -20 +KPX yacute aring -20 +KPX yacute atilde -20 +KPX yacute comma -100 +KPX yacute e -20 +KPX yacute eacute -20 +KPX yacute ecaron -20 +KPX yacute ecircumflex -20 +KPX yacute edieresis -20 +KPX yacute edotaccent -20 +KPX yacute egrave -20 +KPX yacute emacron -20 +KPX yacute eogonek -20 +KPX yacute o -20 +KPX yacute oacute -20 +KPX yacute ocircumflex -20 +KPX yacute odieresis -20 +KPX yacute ograve -20 +KPX yacute ohungarumlaut -20 +KPX yacute omacron -20 +KPX yacute oslash -20 +KPX yacute otilde -20 +KPX yacute period -100 +KPX ydieresis a -20 +KPX ydieresis aacute -20 +KPX ydieresis abreve -20 +KPX ydieresis acircumflex -20 +KPX ydieresis adieresis -20 +KPX ydieresis agrave -20 +KPX ydieresis amacron -20 +KPX ydieresis aogonek -20 +KPX ydieresis aring -20 +KPX ydieresis atilde -20 +KPX ydieresis comma -100 +KPX ydieresis e -20 +KPX ydieresis eacute -20 +KPX ydieresis ecaron -20 +KPX ydieresis ecircumflex -20 +KPX ydieresis edieresis -20 +KPX ydieresis edotaccent -20 +KPX ydieresis egrave -20 +KPX ydieresis emacron -20 +KPX ydieresis eogonek -20 +KPX ydieresis o -20 +KPX ydieresis oacute -20 +KPX ydieresis ocircumflex -20 +KPX ydieresis odieresis -20 +KPX ydieresis ograve -20 +KPX ydieresis ohungarumlaut -20 +KPX ydieresis omacron -20 +KPX ydieresis oslash -20 +KPX ydieresis otilde -20 +KPX ydieresis period -100 +KPX z e -15 +KPX z eacute -15 +KPX z ecaron -15 +KPX z ecircumflex -15 +KPX z edieresis -15 +KPX z edotaccent -15 +KPX z egrave -15 +KPX z emacron -15 +KPX z eogonek -15 +KPX z o -15 +KPX z oacute -15 +KPX z ocircumflex -15 +KPX z odieresis -15 +KPX z ograve -15 +KPX z ohungarumlaut -15 +KPX z omacron -15 +KPX z oslash -15 +KPX z otilde -15 +KPX zacute e -15 +KPX zacute eacute -15 +KPX zacute ecaron -15 +KPX zacute ecircumflex -15 +KPX zacute edieresis -15 +KPX zacute edotaccent -15 +KPX zacute egrave -15 +KPX zacute emacron -15 +KPX zacute eogonek -15 +KPX zacute o -15 +KPX zacute oacute -15 +KPX zacute ocircumflex -15 +KPX zacute odieresis -15 +KPX zacute ograve -15 +KPX zacute ohungarumlaut -15 +KPX zacute omacron -15 +KPX zacute oslash -15 +KPX zacute otilde -15 +KPX zcaron e -15 +KPX zcaron eacute -15 +KPX zcaron ecaron -15 +KPX zcaron ecircumflex -15 +KPX zcaron edieresis -15 +KPX zcaron edotaccent -15 +KPX zcaron egrave -15 +KPX zcaron emacron -15 +KPX zcaron eogonek -15 +KPX zcaron o -15 +KPX zcaron oacute -15 +KPX zcaron ocircumflex -15 +KPX zcaron odieresis -15 +KPX zcaron ograve -15 +KPX zcaron ohungarumlaut -15 +KPX zcaron omacron -15 +KPX zcaron oslash -15 +KPX zcaron otilde -15 +KPX zdotaccent e -15 +KPX zdotaccent eacute -15 +KPX zdotaccent ecaron -15 +KPX zdotaccent ecircumflex -15 +KPX zdotaccent edieresis -15 +KPX zdotaccent edotaccent -15 +KPX zdotaccent egrave -15 +KPX zdotaccent emacron -15 +KPX zdotaccent eogonek -15 +KPX zdotaccent o -15 +KPX zdotaccent oacute -15 +KPX zdotaccent ocircumflex -15 +KPX zdotaccent odieresis -15 +KPX zdotaccent ograve -15 +KPX zdotaccent ohungarumlaut -15 +KPX zdotaccent omacron -15 +KPX zdotaccent oslash -15 +KPX zdotaccent otilde -15 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Helvetica.afm b/application/third_party/dompdf/lib/fonts/Helvetica.afm new file mode 100644 index 00000000..01379de1 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica.afm @@ -0,0 +1,3053 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:38:23 1997 +Comment UniqueID 43054 +Comment VMusage 37069 48094 +FontName Helvetica +FullName Helvetica +FamilyName Helvetica +Weight Medium +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -166 -225 1000 931 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 523 +Ascender 718 +Descender -207 +StdHW 76 +StdVW 88 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ; +C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ; +C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ; +C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ; +C 37 ; WX 889 ; N percent ; B 39 -19 850 703 ; +C 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ; +C 146 ; WX 222 ; N quoteright ; B 53 463 157 718 ; +C 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ; +C 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ; +C 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ; +C 43 ; WX 584 ; N plus ; B 39 0 545 505 ; +C 44 ; WX 278 ; N comma ; B 87 -147 191 106 ; +C 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 87 0 191 106 ; +C 47 ; WX 278 ; N slash ; B -17 -19 295 737 ; +C 48 ; WX 556 ; N zero ; B 37 -19 519 703 ; +C 49 ; WX 556 ; N one ; B 101 0 359 703 ; +C 50 ; WX 556 ; N two ; B 26 0 507 703 ; +C 51 ; WX 556 ; N three ; B 34 -19 522 703 ; +C 52 ; WX 556 ; N four ; B 25 0 523 703 ; +C 53 ; WX 556 ; N five ; B 32 -19 514 688 ; +C 54 ; WX 556 ; N six ; B 38 -19 518 703 ; +C 55 ; WX 556 ; N seven ; B 37 0 523 688 ; +C 56 ; WX 556 ; N eight ; B 38 -19 517 703 ; +C 57 ; WX 556 ; N nine ; B 42 -19 514 703 ; +C 58 ; WX 278 ; N colon ; B 87 0 191 516 ; +C 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ; +C 60 ; WX 584 ; N less ; B 48 11 536 495 ; +C 61 ; WX 584 ; N equal ; B 39 115 545 390 ; +C 62 ; WX 584 ; N greater ; B 48 11 536 495 ; +C 63 ; WX 556 ; N question ; B 56 0 492 727 ; +C 64 ; WX 1015 ; N at ; B 147 -19 868 737 ; +C 65 ; WX 667 ; N A ; B 14 0 654 718 ; +C 66 ; WX 667 ; N B ; B 74 0 627 718 ; +C 67 ; WX 722 ; N C ; B 44 -19 681 737 ; +C 68 ; WX 722 ; N D ; B 81 0 674 718 ; +C 69 ; WX 667 ; N E ; B 86 0 616 718 ; +C 70 ; WX 611 ; N F ; B 86 0 583 718 ; +C 71 ; WX 778 ; N G ; B 48 -19 704 737 ; +C 72 ; WX 722 ; N H ; B 77 0 646 718 ; +C 73 ; WX 278 ; N I ; B 91 0 188 718 ; +C 74 ; WX 500 ; N J ; B 17 -19 428 718 ; +C 75 ; WX 667 ; N K ; B 76 0 663 718 ; +C 76 ; WX 556 ; N L ; B 76 0 537 718 ; +C 77 ; WX 833 ; N M ; B 73 0 761 718 ; +C 78 ; WX 722 ; N N ; B 76 0 646 718 ; +C 79 ; WX 778 ; N O ; B 39 -19 739 737 ; +C 80 ; WX 667 ; N P ; B 86 0 622 718 ; +C 81 ; WX 778 ; N Q ; B 39 -56 739 737 ; +C 82 ; WX 722 ; N R ; B 88 0 684 718 ; +C 83 ; WX 667 ; N S ; B 49 -19 620 737 ; +C 84 ; WX 611 ; N T ; B 14 0 597 718 ; +C 85 ; WX 722 ; N U ; B 79 -19 644 718 ; +C 86 ; WX 667 ; N V ; B 20 0 647 718 ; +C 87 ; WX 944 ; N W ; B 16 0 928 718 ; +C 88 ; WX 667 ; N X ; B 19 0 648 718 ; +C 89 ; WX 667 ; N Y ; B 14 0 653 718 ; +C 90 ; WX 611 ; N Z ; B 23 0 588 718 ; +C 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ; +C 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ; +C 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ; +C 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ; +C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; +C 145 ; WX 222 ; N quoteleft ; B 65 470 169 725 ; +C 97 ; WX 556 ; N a ; B 36 -15 530 538 ; +C 98 ; WX 556 ; N b ; B 58 -15 517 718 ; +C 99 ; WX 500 ; N c ; B 30 -15 477 538 ; +C 100 ; WX 556 ; N d ; B 35 -15 499 718 ; +C 101 ; WX 556 ; N e ; B 40 -15 516 538 ; +C 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ; +C 103 ; WX 556 ; N g ; B 40 -220 499 538 ; +C 104 ; WX 556 ; N h ; B 65 0 491 718 ; +C 105 ; WX 222 ; N i ; B 67 0 155 718 ; +C 106 ; WX 222 ; N j ; B -16 -210 155 718 ; +C 107 ; WX 500 ; N k ; B 67 0 501 718 ; +C 108 ; WX 222 ; N l ; B 67 0 155 718 ; +C 109 ; WX 833 ; N m ; B 65 0 769 538 ; +C 110 ; WX 556 ; N n ; B 65 0 491 538 ; +C 111 ; WX 556 ; N o ; B 35 -14 521 538 ; +C 112 ; WX 556 ; N p ; B 58 -207 517 538 ; +C 113 ; WX 556 ; N q ; B 35 -207 494 538 ; +C 114 ; WX 333 ; N r ; B 77 0 332 538 ; +C 115 ; WX 500 ; N s ; B 32 -15 464 538 ; +C 116 ; WX 278 ; N t ; B 14 -7 257 669 ; +C 117 ; WX 556 ; N u ; B 68 -15 489 523 ; +C 118 ; WX 500 ; N v ; B 8 0 492 523 ; +C 119 ; WX 722 ; N w ; B 14 0 709 523 ; +C 120 ; WX 500 ; N x ; B 11 0 490 523 ; +C 121 ; WX 500 ; N y ; B 11 -214 489 523 ; +C 122 ; WX 500 ; N z ; B 31 0 469 523 ; +C 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ; +C 124 ; WX 260 ; N bar ; B 94 -225 167 775 ; +C 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ; +C 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ; +C 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ; +C 162 ; WX 556 ; N cent ; B 51 -115 513 623 ; +C 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ; +C -1 ; WX 167 ; N fraction ; B -166 -19 333 703 ; +C 165 ; WX 556 ; N yen ; B 3 0 553 688 ; +C 131 ; WX 556 ; N florin ; B -11 -207 501 737 ; +C 167 ; WX 556 ; N section ; B 43 -191 512 737 ; +C 164 ; WX 556 ; N currency ; B 28 99 528 603 ; +C 39 ; WX 191 ; N quotesingle ; B 59 463 132 718 ; +C 147 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ; +C 170 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ; +C 139 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ; +C 155 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ; +C -1 ; WX 500 ; N fi ; B 14 0 434 728 ; +C -1 ; WX 500 ; N fl ; B 14 0 432 728 ; +C 150 ; WX 556 ; N endash ; B 0 240 556 313 ; +C 134 ; WX 556 ; N dagger ; B 43 -159 514 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ; +C 183 ; WX 278 ; N periodcentered ; B 77 190 202 315 ; +C 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ; +C 149 ; WX 350 ; N bullet ; B 18 202 333 517 ; +C 130 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ; +C 132 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ; +C 148 ; WX 333 ; N quotedblright ; B 26 463 295 718 ; +C 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ; +C 133 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ; +C 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ; +C 96 ; WX 333 ; N grave ; B 14 593 211 734 ; +C 180 ; WX 333 ; N acute ; B 122 593 319 734 ; +C 136 ; WX 333 ; N circumflex ; B 21 593 312 734 ; +C 152 ; WX 333 ; N tilde ; B -4 606 337 722 ; +C 175 ; WX 333 ; N macron ; B 10 627 323 684 ; +C -1 ; WX 333 ; N breve ; B 13 595 321 731 ; +C -1 ; WX 333 ; N dotaccent ; B 121 604 212 706 ; +C 168 ; WX 333 ; N dieresis ; B 40 604 293 706 ; +C -1 ; WX 333 ; N ring ; B 75 572 259 756 ; +C 184 ; WX 333 ; N cedilla ; B 45 -225 259 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ; +C -1 ; WX 333 ; N ogonek ; B 73 -225 287 0 ; +C -1 ; WX 333 ; N caron ; B 21 593 312 734 ; +C 151 ; WX 1000 ; N emdash ; B 0 240 1000 313 ; +C 198 ; WX 1000 ; N AE ; B 8 0 951 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ; +C -1 ; WX 556 ; N Lslash ; B -20 0 537 718 ; +C 216 ; WX 778 ; N Oslash ; B 39 -19 740 737 ; +C 140 ; WX 1000 ; N OE ; B 36 -19 965 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ; +C 230 ; WX 889 ; N ae ; B 36 -15 847 538 ; +C -1 ; WX 278 ; N dotlessi ; B 95 0 183 523 ; +C -1 ; WX 222 ; N lslash ; B -20 0 242 718 ; +C 248 ; WX 611 ; N oslash ; B 28 -22 537 545 ; +C 156 ; WX 944 ; N oe ; B 35 -15 902 538 ; +C 223 ; WX 611 ; N germandbls ; B 67 -15 571 728 ; +C 207 ; WX 278 ; N Idieresis ; B 13 0 266 901 ; +C 233 ; WX 556 ; N eacute ; B 40 -15 516 734 ; +C -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ; +C -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ; +C 159 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ; +C 247 ; WX 584 ; N divide ; B 39 -19 545 524 ; +C 221 ; WX 667 ; N Yacute ; B 14 0 653 929 ; +C 194 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; +C 225 ; WX 556 ; N aacute ; B 36 -15 530 734 ; +C 219 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ; +C 253 ; WX 500 ; N yacute ; B 11 -214 489 734 ; +C -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ; +C 234 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ; +C -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ; +C 220 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ; +C -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ; +C 218 ; WX 722 ; N Uacute ; B 79 -19 644 929 ; +C -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ; +C 203 ; WX 667 ; N Edieresis ; B 86 0 616 901 ; +C -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ; +C -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ; +C 169 ; WX 737 ; N copyright ; B -14 -19 752 737 ; +C -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ; +C -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ; +C 229 ; WX 556 ; N aring ; B 36 -15 530 756 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ; +C -1 ; WX 222 ; N lacute ; B 67 0 264 929 ; +C 224 ; WX 556 ; N agrave ; B 36 -15 530 734 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ; +C -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ; +C 227 ; WX 556 ; N atilde ; B 36 -15 530 722 ; +C -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ; +C 154 ; WX 500 ; N scaron ; B 32 -15 464 734 ; +C -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ; +C 237 ; WX 278 ; N iacute ; B 95 0 292 734 ; +C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ; +C -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ; +C 251 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ; +C 226 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ; +C -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ; +C -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ; +C 231 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ; +C -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ; +C 222 ; WX 667 ; N Thorn ; B 86 0 622 718 ; +C -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ; +C -1 ; WX 722 ; N Racute ; B 88 0 684 929 ; +C -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ; +C -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ; +C -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ; +C -1 ; WX 556 ; N uring ; B 68 -15 489 756 ; +C 179 ; WX 333 ; N threesuperior ; B 5 270 325 703 ; +C 210 ; WX 778 ; N Ograve ; B 39 -19 739 929 ; +C 192 ; WX 667 ; N Agrave ; B 14 0 654 929 ; +C -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ; +C 215 ; WX 584 ; N multiply ; B 39 0 545 506 ; +C 250 ; WX 556 ; N uacute ; B 68 -15 489 734 ; +C -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ; +C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ; +C 255 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ; +C 238 ; WX 278 ; N icircumflex ; B -6 0 285 734 ; +C 202 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ; +C 228 ; WX 556 ; N adieresis ; B 36 -15 530 706 ; +C 235 ; WX 556 ; N edieresis ; B 40 -15 516 706 ; +C -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ; +C -1 ; WX 556 ; N nacute ; B 65 0 491 734 ; +C -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ; +C 205 ; WX 278 ; N Iacute ; B 91 0 292 929 ; +C 177 ; WX 584 ; N plusminus ; B 39 0 545 506 ; +C 166 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ; +C 174 ; WX 737 ; N registered ; B -14 -19 752 737 ; +C -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ; +C -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ; +C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; +C 200 ; WX 667 ; N Egrave ; B 86 0 616 929 ; +C -1 ; WX 333 ; N racute ; B 77 0 332 734 ; +C -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ; +C -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ; +C 142 ; WX 611 ; N Zcaron ; B 23 0 588 929 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ; +C 208 ; WX 722 ; N Eth ; B 0 0 674 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ; +C -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ; +C -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ; +C -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ; +C -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ; +C 193 ; WX 667 ; N Aacute ; B 14 0 654 929 ; +C 196 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; +C 232 ; WX 556 ; N egrave ; B 40 -15 516 734 ; +C -1 ; WX 500 ; N zacute ; B 31 0 469 734 ; +C -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ; +C 211 ; WX 778 ; N Oacute ; B 39 -19 739 929 ; +C 243 ; WX 556 ; N oacute ; B 35 -14 521 734 ; +C -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ; +C -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ; +C 239 ; WX 278 ; N idieresis ; B 13 0 266 706 ; +C 212 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ; +C 217 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 556 ; N thorn ; B 58 -207 517 718 ; +C 178 ; WX 333 ; N twosuperior ; B 4 281 323 703 ; +C 214 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ; +C 181 ; WX 556 ; N mu ; B 68 -207 489 523 ; +C 236 ; WX 278 ; N igrave ; B -13 0 184 734 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ; +C -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ; +C -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ; +C 190 ; WX 834 ; N threequarters ; B 45 -19 810 703 ; +C -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ; +C -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ; +C -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ; +C 153 ; WX 1000 ; N trademark ; B 46 306 903 718 ; +C -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ; +C 204 ; WX 278 ; N Igrave ; B -13 0 188 929 ; +C -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ; +C -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ; +C 189 ; WX 834 ; N onehalf ; B 43 -19 773 703 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ; +C 244 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ; +C 241 ; WX 556 ; N ntilde ; B 65 0 491 722 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ; +C 201 ; WX 667 ; N Eacute ; B 86 0 616 929 ; +C -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ; +C -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ; +C 188 ; WX 834 ; N onequarter ; B 73 -19 756 703 ; +C 138 ; WX 667 ; N Scaron ; B 49 -19 620 929 ; +C -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ; +C 176 ; WX 400 ; N degree ; B 54 411 346 703 ; +C 242 ; WX 556 ; N ograve ; B 35 -14 521 734 ; +C -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ; +C 249 ; WX 556 ; N ugrave ; B 68 -15 489 734 ; +C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ; +C -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ; +C -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ; +C 209 ; WX 722 ; N Ntilde ; B 76 0 646 917 ; +C 245 ; WX 556 ; N otilde ; B 35 -14 521 722 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ; +C 195 ; WX 667 ; N Atilde ; B 14 0 654 917 ; +C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; +C 197 ; WX 667 ; N Aring ; B 14 0 654 931 ; +C 213 ; WX 778 ; N Otilde ; B 39 -19 739 917 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ; +C -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ; +C -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ; +C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ; +C -1 ; WX 584 ; N minus ; B 39 216 545 289 ; +C 206 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ; +C -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ; +C -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ; +C 172 ; WX 584 ; N logicalnot ; B 39 108 545 390 ; +C 246 ; WX 556 ; N odieresis ; B 35 -14 521 706 ; +C 252 ; WX 556 ; N udieresis ; B 68 -15 489 706 ; +C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ; +C -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ; +C 240 ; WX 556 ; N eth ; B 35 -15 522 737 ; +C 158 ; WX 500 ; N zcaron ; B 31 0 469 734 ; +C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ; +C 185 ; WX 333 ; N onesuperior ; B 43 281 222 703 ; +C -1 ; WX 278 ; N imacron ; B 5 0 272 684 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2705 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -30 +KPX A Gbreve -30 +KPX A Gcommaaccent -30 +KPX A O -30 +KPX A Oacute -30 +KPX A Ocircumflex -30 +KPX A Odieresis -30 +KPX A Ograve -30 +KPX A Ohungarumlaut -30 +KPX A Omacron -30 +KPX A Oslash -30 +KPX A Otilde -30 +KPX A Q -30 +KPX A T -120 +KPX A Tcaron -120 +KPX A Tcommaaccent -120 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -70 +KPX A W -50 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -40 +KPX A y -40 +KPX A yacute -40 +KPX A ydieresis -40 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -30 +KPX Aacute Gbreve -30 +KPX Aacute Gcommaaccent -30 +KPX Aacute O -30 +KPX Aacute Oacute -30 +KPX Aacute Ocircumflex -30 +KPX Aacute Odieresis -30 +KPX Aacute Ograve -30 +KPX Aacute Ohungarumlaut -30 +KPX Aacute Omacron -30 +KPX Aacute Oslash -30 +KPX Aacute Otilde -30 +KPX Aacute Q -30 +KPX Aacute T -120 +KPX Aacute Tcaron -120 +KPX Aacute Tcommaaccent -120 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -70 +KPX Aacute W -50 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -40 +KPX Aacute y -40 +KPX Aacute yacute -40 +KPX Aacute ydieresis -40 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -30 +KPX Abreve Gbreve -30 +KPX Abreve Gcommaaccent -30 +KPX Abreve O -30 +KPX Abreve Oacute -30 +KPX Abreve Ocircumflex -30 +KPX Abreve Odieresis -30 +KPX Abreve Ograve -30 +KPX Abreve Ohungarumlaut -30 +KPX Abreve Omacron -30 +KPX Abreve Oslash -30 +KPX Abreve Otilde -30 +KPX Abreve Q -30 +KPX Abreve T -120 +KPX Abreve Tcaron -120 +KPX Abreve Tcommaaccent -120 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -70 +KPX Abreve W -50 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -40 +KPX Abreve y -40 +KPX Abreve yacute -40 +KPX Abreve ydieresis -40 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -30 +KPX Acircumflex Gbreve -30 +KPX Acircumflex Gcommaaccent -30 +KPX Acircumflex O -30 +KPX Acircumflex Oacute -30 +KPX Acircumflex Ocircumflex -30 +KPX Acircumflex Odieresis -30 +KPX Acircumflex Ograve -30 +KPX Acircumflex Ohungarumlaut -30 +KPX Acircumflex Omacron -30 +KPX Acircumflex Oslash -30 +KPX Acircumflex Otilde -30 +KPX Acircumflex Q -30 +KPX Acircumflex T -120 +KPX Acircumflex Tcaron -120 +KPX Acircumflex Tcommaaccent -120 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -70 +KPX Acircumflex W -50 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -40 +KPX Acircumflex y -40 +KPX Acircumflex yacute -40 +KPX Acircumflex ydieresis -40 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -30 +KPX Adieresis Gbreve -30 +KPX Adieresis Gcommaaccent -30 +KPX Adieresis O -30 +KPX Adieresis Oacute -30 +KPX Adieresis Ocircumflex -30 +KPX Adieresis Odieresis -30 +KPX Adieresis Ograve -30 +KPX Adieresis Ohungarumlaut -30 +KPX Adieresis Omacron -30 +KPX Adieresis Oslash -30 +KPX Adieresis Otilde -30 +KPX Adieresis Q -30 +KPX Adieresis T -120 +KPX Adieresis Tcaron -120 +KPX Adieresis Tcommaaccent -120 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -70 +KPX Adieresis W -50 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -40 +KPX Adieresis y -40 +KPX Adieresis yacute -40 +KPX Adieresis ydieresis -40 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -30 +KPX Agrave Gbreve -30 +KPX Agrave Gcommaaccent -30 +KPX Agrave O -30 +KPX Agrave Oacute -30 +KPX Agrave Ocircumflex -30 +KPX Agrave Odieresis -30 +KPX Agrave Ograve -30 +KPX Agrave Ohungarumlaut -30 +KPX Agrave Omacron -30 +KPX Agrave Oslash -30 +KPX Agrave Otilde -30 +KPX Agrave Q -30 +KPX Agrave T -120 +KPX Agrave Tcaron -120 +KPX Agrave Tcommaaccent -120 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -70 +KPX Agrave W -50 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -40 +KPX Agrave y -40 +KPX Agrave yacute -40 +KPX Agrave ydieresis -40 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -30 +KPX Amacron Gbreve -30 +KPX Amacron Gcommaaccent -30 +KPX Amacron O -30 +KPX Amacron Oacute -30 +KPX Amacron Ocircumflex -30 +KPX Amacron Odieresis -30 +KPX Amacron Ograve -30 +KPX Amacron Ohungarumlaut -30 +KPX Amacron Omacron -30 +KPX Amacron Oslash -30 +KPX Amacron Otilde -30 +KPX Amacron Q -30 +KPX Amacron T -120 +KPX Amacron Tcaron -120 +KPX Amacron Tcommaaccent -120 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -70 +KPX Amacron W -50 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -40 +KPX Amacron y -40 +KPX Amacron yacute -40 +KPX Amacron ydieresis -40 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -30 +KPX Aogonek Gbreve -30 +KPX Aogonek Gcommaaccent -30 +KPX Aogonek O -30 +KPX Aogonek Oacute -30 +KPX Aogonek Ocircumflex -30 +KPX Aogonek Odieresis -30 +KPX Aogonek Ograve -30 +KPX Aogonek Ohungarumlaut -30 +KPX Aogonek Omacron -30 +KPX Aogonek Oslash -30 +KPX Aogonek Otilde -30 +KPX Aogonek Q -30 +KPX Aogonek T -120 +KPX Aogonek Tcaron -120 +KPX Aogonek Tcommaaccent -120 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -70 +KPX Aogonek W -50 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -40 +KPX Aogonek y -40 +KPX Aogonek yacute -40 +KPX Aogonek ydieresis -40 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -30 +KPX Aring Gbreve -30 +KPX Aring Gcommaaccent -30 +KPX Aring O -30 +KPX Aring Oacute -30 +KPX Aring Ocircumflex -30 +KPX Aring Odieresis -30 +KPX Aring Ograve -30 +KPX Aring Ohungarumlaut -30 +KPX Aring Omacron -30 +KPX Aring Oslash -30 +KPX Aring Otilde -30 +KPX Aring Q -30 +KPX Aring T -120 +KPX Aring Tcaron -120 +KPX Aring Tcommaaccent -120 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -70 +KPX Aring W -50 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -40 +KPX Aring y -40 +KPX Aring yacute -40 +KPX Aring ydieresis -40 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -30 +KPX Atilde Gbreve -30 +KPX Atilde Gcommaaccent -30 +KPX Atilde O -30 +KPX Atilde Oacute -30 +KPX Atilde Ocircumflex -30 +KPX Atilde Odieresis -30 +KPX Atilde Ograve -30 +KPX Atilde Ohungarumlaut -30 +KPX Atilde Omacron -30 +KPX Atilde Oslash -30 +KPX Atilde Otilde -30 +KPX Atilde Q -30 +KPX Atilde T -120 +KPX Atilde Tcaron -120 +KPX Atilde Tcommaaccent -120 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -70 +KPX Atilde W -50 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -40 +KPX Atilde y -40 +KPX Atilde yacute -40 +KPX Atilde ydieresis -40 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX B comma -20 +KPX B period -20 +KPX C comma -30 +KPX C period -30 +KPX Cacute comma -30 +KPX Cacute period -30 +KPX Ccaron comma -30 +KPX Ccaron period -30 +KPX Ccedilla comma -30 +KPX Ccedilla period -30 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -70 +KPX D W -40 +KPX D Y -90 +KPX D Yacute -90 +KPX D Ydieresis -90 +KPX D comma -70 +KPX D period -70 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -70 +KPX Dcaron W -40 +KPX Dcaron Y -90 +KPX Dcaron Yacute -90 +KPX Dcaron Ydieresis -90 +KPX Dcaron comma -70 +KPX Dcaron period -70 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -70 +KPX Dcroat W -40 +KPX Dcroat Y -90 +KPX Dcroat Yacute -90 +KPX Dcroat Ydieresis -90 +KPX Dcroat comma -70 +KPX Dcroat period -70 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -50 +KPX F aacute -50 +KPX F abreve -50 +KPX F acircumflex -50 +KPX F adieresis -50 +KPX F agrave -50 +KPX F amacron -50 +KPX F aogonek -50 +KPX F aring -50 +KPX F atilde -50 +KPX F comma -150 +KPX F e -30 +KPX F eacute -30 +KPX F ecaron -30 +KPX F ecircumflex -30 +KPX F edieresis -30 +KPX F edotaccent -30 +KPX F egrave -30 +KPX F emacron -30 +KPX F eogonek -30 +KPX F o -30 +KPX F oacute -30 +KPX F ocircumflex -30 +KPX F odieresis -30 +KPX F ograve -30 +KPX F ohungarumlaut -30 +KPX F omacron -30 +KPX F oslash -30 +KPX F otilde -30 +KPX F period -150 +KPX F r -45 +KPX F racute -45 +KPX F rcaron -45 +KPX F rcommaaccent -45 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J a -20 +KPX J aacute -20 +KPX J abreve -20 +KPX J acircumflex -20 +KPX J adieresis -20 +KPX J agrave -20 +KPX J amacron -20 +KPX J aogonek -20 +KPX J aring -20 +KPX J atilde -20 +KPX J comma -30 +KPX J period -30 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -40 +KPX K eacute -40 +KPX K ecaron -40 +KPX K ecircumflex -40 +KPX K edieresis -40 +KPX K edotaccent -40 +KPX K egrave -40 +KPX K emacron -40 +KPX K eogonek -40 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -50 +KPX K yacute -50 +KPX K ydieresis -50 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -40 +KPX Kcommaaccent eacute -40 +KPX Kcommaaccent ecaron -40 +KPX Kcommaaccent ecircumflex -40 +KPX Kcommaaccent edieresis -40 +KPX Kcommaaccent edotaccent -40 +KPX Kcommaaccent egrave -40 +KPX Kcommaaccent emacron -40 +KPX Kcommaaccent eogonek -40 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -50 +KPX Kcommaaccent yacute -50 +KPX Kcommaaccent ydieresis -50 +KPX L T -110 +KPX L Tcaron -110 +KPX L Tcommaaccent -110 +KPX L V -110 +KPX L W -70 +KPX L Y -140 +KPX L Yacute -140 +KPX L Ydieresis -140 +KPX L quotedblright -140 +KPX L quoteright -160 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -110 +KPX Lacute Tcaron -110 +KPX Lacute Tcommaaccent -110 +KPX Lacute V -110 +KPX Lacute W -70 +KPX Lacute Y -140 +KPX Lacute Yacute -140 +KPX Lacute Ydieresis -140 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -160 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcaron T -110 +KPX Lcaron Tcaron -110 +KPX Lcaron Tcommaaccent -110 +KPX Lcaron V -110 +KPX Lcaron W -70 +KPX Lcaron Y -140 +KPX Lcaron Yacute -140 +KPX Lcaron Ydieresis -140 +KPX Lcaron quotedblright -140 +KPX Lcaron quoteright -160 +KPX Lcaron y -30 +KPX Lcaron yacute -30 +KPX Lcaron ydieresis -30 +KPX Lcommaaccent T -110 +KPX Lcommaaccent Tcaron -110 +KPX Lcommaaccent Tcommaaccent -110 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -70 +KPX Lcommaaccent Y -140 +KPX Lcommaaccent Yacute -140 +KPX Lcommaaccent Ydieresis -140 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -160 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -110 +KPX Lslash Tcaron -110 +KPX Lslash Tcommaaccent -110 +KPX Lslash V -110 +KPX Lslash W -70 +KPX Lslash Y -140 +KPX Lslash Yacute -140 +KPX Lslash Ydieresis -140 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -160 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -20 +KPX O Aacute -20 +KPX O Abreve -20 +KPX O Acircumflex -20 +KPX O Adieresis -20 +KPX O Agrave -20 +KPX O Amacron -20 +KPX O Aogonek -20 +KPX O Aring -20 +KPX O Atilde -20 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -30 +KPX O X -60 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -20 +KPX Oacute Aacute -20 +KPX Oacute Abreve -20 +KPX Oacute Acircumflex -20 +KPX Oacute Adieresis -20 +KPX Oacute Agrave -20 +KPX Oacute Amacron -20 +KPX Oacute Aogonek -20 +KPX Oacute Aring -20 +KPX Oacute Atilde -20 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -30 +KPX Oacute X -60 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -20 +KPX Ocircumflex Aacute -20 +KPX Ocircumflex Abreve -20 +KPX Ocircumflex Acircumflex -20 +KPX Ocircumflex Adieresis -20 +KPX Ocircumflex Agrave -20 +KPX Ocircumflex Amacron -20 +KPX Ocircumflex Aogonek -20 +KPX Ocircumflex Aring -20 +KPX Ocircumflex Atilde -20 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -30 +KPX Ocircumflex X -60 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -20 +KPX Odieresis Aacute -20 +KPX Odieresis Abreve -20 +KPX Odieresis Acircumflex -20 +KPX Odieresis Adieresis -20 +KPX Odieresis Agrave -20 +KPX Odieresis Amacron -20 +KPX Odieresis Aogonek -20 +KPX Odieresis Aring -20 +KPX Odieresis Atilde -20 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -30 +KPX Odieresis X -60 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -20 +KPX Ograve Aacute -20 +KPX Ograve Abreve -20 +KPX Ograve Acircumflex -20 +KPX Ograve Adieresis -20 +KPX Ograve Agrave -20 +KPX Ograve Amacron -20 +KPX Ograve Aogonek -20 +KPX Ograve Aring -20 +KPX Ograve Atilde -20 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -30 +KPX Ograve X -60 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -20 +KPX Ohungarumlaut Aacute -20 +KPX Ohungarumlaut Abreve -20 +KPX Ohungarumlaut Acircumflex -20 +KPX Ohungarumlaut Adieresis -20 +KPX Ohungarumlaut Agrave -20 +KPX Ohungarumlaut Amacron -20 +KPX Ohungarumlaut Aogonek -20 +KPX Ohungarumlaut Aring -20 +KPX Ohungarumlaut Atilde -20 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -30 +KPX Ohungarumlaut X -60 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -20 +KPX Omacron Aacute -20 +KPX Omacron Abreve -20 +KPX Omacron Acircumflex -20 +KPX Omacron Adieresis -20 +KPX Omacron Agrave -20 +KPX Omacron Amacron -20 +KPX Omacron Aogonek -20 +KPX Omacron Aring -20 +KPX Omacron Atilde -20 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -30 +KPX Omacron X -60 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -20 +KPX Oslash Aacute -20 +KPX Oslash Abreve -20 +KPX Oslash Acircumflex -20 +KPX Oslash Adieresis -20 +KPX Oslash Agrave -20 +KPX Oslash Amacron -20 +KPX Oslash Aogonek -20 +KPX Oslash Aring -20 +KPX Oslash Atilde -20 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -30 +KPX Oslash X -60 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -20 +KPX Otilde Aacute -20 +KPX Otilde Abreve -20 +KPX Otilde Acircumflex -20 +KPX Otilde Adieresis -20 +KPX Otilde Agrave -20 +KPX Otilde Amacron -20 +KPX Otilde Aogonek -20 +KPX Otilde Aring -20 +KPX Otilde Atilde -20 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -30 +KPX Otilde X -60 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -120 +KPX P Aacute -120 +KPX P Abreve -120 +KPX P Acircumflex -120 +KPX P Adieresis -120 +KPX P Agrave -120 +KPX P Amacron -120 +KPX P Aogonek -120 +KPX P Aring -120 +KPX P Atilde -120 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -180 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -50 +KPX P oacute -50 +KPX P ocircumflex -50 +KPX P odieresis -50 +KPX P ograve -50 +KPX P ohungarumlaut -50 +KPX P omacron -50 +KPX P oslash -50 +KPX P otilde -50 +KPX P period -180 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -50 +KPX R W -30 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -50 +KPX Racute W -30 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -50 +KPX Rcaron W -30 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -30 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX S comma -20 +KPX S period -20 +KPX Sacute comma -20 +KPX Sacute period -20 +KPX Scaron comma -20 +KPX Scaron period -20 +KPX Scedilla comma -20 +KPX Scedilla period -20 +KPX Scommaaccent comma -20 +KPX Scommaaccent period -20 +KPX T A -120 +KPX T Aacute -120 +KPX T Abreve -120 +KPX T Acircumflex -120 +KPX T Adieresis -120 +KPX T Agrave -120 +KPX T Amacron -120 +KPX T Aogonek -120 +KPX T Aring -120 +KPX T Atilde -120 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -120 +KPX T aacute -120 +KPX T abreve -60 +KPX T acircumflex -120 +KPX T adieresis -120 +KPX T agrave -120 +KPX T amacron -60 +KPX T aogonek -120 +KPX T aring -120 +KPX T atilde -60 +KPX T colon -20 +KPX T comma -120 +KPX T e -120 +KPX T eacute -120 +KPX T ecaron -120 +KPX T ecircumflex -120 +KPX T edieresis -120 +KPX T edotaccent -120 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -120 +KPX T hyphen -140 +KPX T o -120 +KPX T oacute -120 +KPX T ocircumflex -120 +KPX T odieresis -120 +KPX T ograve -120 +KPX T ohungarumlaut -120 +KPX T omacron -60 +KPX T oslash -120 +KPX T otilde -60 +KPX T period -120 +KPX T r -120 +KPX T racute -120 +KPX T rcaron -120 +KPX T rcommaaccent -120 +KPX T semicolon -20 +KPX T u -120 +KPX T uacute -120 +KPX T ucircumflex -120 +KPX T udieresis -120 +KPX T ugrave -120 +KPX T uhungarumlaut -120 +KPX T umacron -60 +KPX T uogonek -120 +KPX T uring -120 +KPX T w -120 +KPX T y -120 +KPX T yacute -120 +KPX T ydieresis -60 +KPX Tcaron A -120 +KPX Tcaron Aacute -120 +KPX Tcaron Abreve -120 +KPX Tcaron Acircumflex -120 +KPX Tcaron Adieresis -120 +KPX Tcaron Agrave -120 +KPX Tcaron Amacron -120 +KPX Tcaron Aogonek -120 +KPX Tcaron Aring -120 +KPX Tcaron Atilde -120 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -120 +KPX Tcaron aacute -120 +KPX Tcaron abreve -60 +KPX Tcaron acircumflex -120 +KPX Tcaron adieresis -120 +KPX Tcaron agrave -120 +KPX Tcaron amacron -60 +KPX Tcaron aogonek -120 +KPX Tcaron aring -120 +KPX Tcaron atilde -60 +KPX Tcaron colon -20 +KPX Tcaron comma -120 +KPX Tcaron e -120 +KPX Tcaron eacute -120 +KPX Tcaron ecaron -120 +KPX Tcaron ecircumflex -120 +KPX Tcaron edieresis -120 +KPX Tcaron edotaccent -120 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -120 +KPX Tcaron hyphen -140 +KPX Tcaron o -120 +KPX Tcaron oacute -120 +KPX Tcaron ocircumflex -120 +KPX Tcaron odieresis -120 +KPX Tcaron ograve -120 +KPX Tcaron ohungarumlaut -120 +KPX Tcaron omacron -60 +KPX Tcaron oslash -120 +KPX Tcaron otilde -60 +KPX Tcaron period -120 +KPX Tcaron r -120 +KPX Tcaron racute -120 +KPX Tcaron rcaron -120 +KPX Tcaron rcommaaccent -120 +KPX Tcaron semicolon -20 +KPX Tcaron u -120 +KPX Tcaron uacute -120 +KPX Tcaron ucircumflex -120 +KPX Tcaron udieresis -120 +KPX Tcaron ugrave -120 +KPX Tcaron uhungarumlaut -120 +KPX Tcaron umacron -60 +KPX Tcaron uogonek -120 +KPX Tcaron uring -120 +KPX Tcaron w -120 +KPX Tcaron y -120 +KPX Tcaron yacute -120 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -120 +KPX Tcommaaccent Aacute -120 +KPX Tcommaaccent Abreve -120 +KPX Tcommaaccent Acircumflex -120 +KPX Tcommaaccent Adieresis -120 +KPX Tcommaaccent Agrave -120 +KPX Tcommaaccent Amacron -120 +KPX Tcommaaccent Aogonek -120 +KPX Tcommaaccent Aring -120 +KPX Tcommaaccent Atilde -120 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -120 +KPX Tcommaaccent aacute -120 +KPX Tcommaaccent abreve -60 +KPX Tcommaaccent acircumflex -120 +KPX Tcommaaccent adieresis -120 +KPX Tcommaaccent agrave -120 +KPX Tcommaaccent amacron -60 +KPX Tcommaaccent aogonek -120 +KPX Tcommaaccent aring -120 +KPX Tcommaaccent atilde -60 +KPX Tcommaaccent colon -20 +KPX Tcommaaccent comma -120 +KPX Tcommaaccent e -120 +KPX Tcommaaccent eacute -120 +KPX Tcommaaccent ecaron -120 +KPX Tcommaaccent ecircumflex -120 +KPX Tcommaaccent edieresis -120 +KPX Tcommaaccent edotaccent -120 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -120 +KPX Tcommaaccent hyphen -140 +KPX Tcommaaccent o -120 +KPX Tcommaaccent oacute -120 +KPX Tcommaaccent ocircumflex -120 +KPX Tcommaaccent odieresis -120 +KPX Tcommaaccent ograve -120 +KPX Tcommaaccent ohungarumlaut -120 +KPX Tcommaaccent omacron -60 +KPX Tcommaaccent oslash -120 +KPX Tcommaaccent otilde -60 +KPX Tcommaaccent period -120 +KPX Tcommaaccent r -120 +KPX Tcommaaccent racute -120 +KPX Tcommaaccent rcaron -120 +KPX Tcommaaccent rcommaaccent -120 +KPX Tcommaaccent semicolon -20 +KPX Tcommaaccent u -120 +KPX Tcommaaccent uacute -120 +KPX Tcommaaccent ucircumflex -120 +KPX Tcommaaccent udieresis -120 +KPX Tcommaaccent ugrave -120 +KPX Tcommaaccent uhungarumlaut -120 +KPX Tcommaaccent umacron -60 +KPX Tcommaaccent uogonek -120 +KPX Tcommaaccent uring -120 +KPX Tcommaaccent w -120 +KPX Tcommaaccent y -120 +KPX Tcommaaccent yacute -120 +KPX Tcommaaccent ydieresis -60 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -40 +KPX U period -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -40 +KPX Uacute period -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -40 +KPX Ucircumflex period -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -40 +KPX Udieresis period -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -40 +KPX Ugrave period -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -40 +KPX Uhungarumlaut period -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -40 +KPX Umacron period -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -40 +KPX Uogonek period -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -40 +KPX Uring period -40 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -40 +KPX V Gbreve -40 +KPX V Gcommaaccent -40 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -70 +KPX V aacute -70 +KPX V abreve -70 +KPX V acircumflex -70 +KPX V adieresis -70 +KPX V agrave -70 +KPX V amacron -70 +KPX V aogonek -70 +KPX V aring -70 +KPX V atilde -70 +KPX V colon -40 +KPX V comma -125 +KPX V e -80 +KPX V eacute -80 +KPX V ecaron -80 +KPX V ecircumflex -80 +KPX V edieresis -80 +KPX V edotaccent -80 +KPX V egrave -80 +KPX V emacron -80 +KPX V eogonek -80 +KPX V hyphen -80 +KPX V o -80 +KPX V oacute -80 +KPX V ocircumflex -80 +KPX V odieresis -80 +KPX V ograve -80 +KPX V ohungarumlaut -80 +KPX V omacron -80 +KPX V oslash -80 +KPX V otilde -80 +KPX V period -125 +KPX V semicolon -40 +KPX V u -70 +KPX V uacute -70 +KPX V ucircumflex -70 +KPX V udieresis -70 +KPX V ugrave -70 +KPX V uhungarumlaut -70 +KPX V umacron -70 +KPX V uogonek -70 +KPX V uring -70 +KPX W A -50 +KPX W Aacute -50 +KPX W Abreve -50 +KPX W Acircumflex -50 +KPX W Adieresis -50 +KPX W Agrave -50 +KPX W Amacron -50 +KPX W Aogonek -50 +KPX W Aring -50 +KPX W Atilde -50 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W comma -80 +KPX W e -30 +KPX W eacute -30 +KPX W ecaron -30 +KPX W ecircumflex -30 +KPX W edieresis -30 +KPX W edotaccent -30 +KPX W egrave -30 +KPX W emacron -30 +KPX W eogonek -30 +KPX W hyphen -40 +KPX W o -30 +KPX W oacute -30 +KPX W ocircumflex -30 +KPX W odieresis -30 +KPX W ograve -30 +KPX W ohungarumlaut -30 +KPX W omacron -30 +KPX W oslash -30 +KPX W otilde -30 +KPX W period -80 +KPX W u -30 +KPX W uacute -30 +KPX W ucircumflex -30 +KPX W udieresis -30 +KPX W ugrave -30 +KPX W uhungarumlaut -30 +KPX W umacron -30 +KPX W uogonek -30 +KPX W uring -30 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -85 +KPX Y Oacute -85 +KPX Y Ocircumflex -85 +KPX Y Odieresis -85 +KPX Y Ograve -85 +KPX Y Ohungarumlaut -85 +KPX Y Omacron -85 +KPX Y Oslash -85 +KPX Y Otilde -85 +KPX Y a -140 +KPX Y aacute -140 +KPX Y abreve -70 +KPX Y acircumflex -140 +KPX Y adieresis -140 +KPX Y agrave -140 +KPX Y amacron -70 +KPX Y aogonek -140 +KPX Y aring -140 +KPX Y atilde -140 +KPX Y colon -60 +KPX Y comma -140 +KPX Y e -140 +KPX Y eacute -140 +KPX Y ecaron -140 +KPX Y ecircumflex -140 +KPX Y edieresis -140 +KPX Y edotaccent -140 +KPX Y egrave -140 +KPX Y emacron -70 +KPX Y eogonek -140 +KPX Y hyphen -140 +KPX Y i -20 +KPX Y iacute -20 +KPX Y iogonek -20 +KPX Y o -140 +KPX Y oacute -140 +KPX Y ocircumflex -140 +KPX Y odieresis -140 +KPX Y ograve -140 +KPX Y ohungarumlaut -140 +KPX Y omacron -140 +KPX Y oslash -140 +KPX Y otilde -140 +KPX Y period -140 +KPX Y semicolon -60 +KPX Y u -110 +KPX Y uacute -110 +KPX Y ucircumflex -110 +KPX Y udieresis -110 +KPX Y ugrave -110 +KPX Y uhungarumlaut -110 +KPX Y umacron -110 +KPX Y uogonek -110 +KPX Y uring -110 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -85 +KPX Yacute Oacute -85 +KPX Yacute Ocircumflex -85 +KPX Yacute Odieresis -85 +KPX Yacute Ograve -85 +KPX Yacute Ohungarumlaut -85 +KPX Yacute Omacron -85 +KPX Yacute Oslash -85 +KPX Yacute Otilde -85 +KPX Yacute a -140 +KPX Yacute aacute -140 +KPX Yacute abreve -70 +KPX Yacute acircumflex -140 +KPX Yacute adieresis -140 +KPX Yacute agrave -140 +KPX Yacute amacron -70 +KPX Yacute aogonek -140 +KPX Yacute aring -140 +KPX Yacute atilde -70 +KPX Yacute colon -60 +KPX Yacute comma -140 +KPX Yacute e -140 +KPX Yacute eacute -140 +KPX Yacute ecaron -140 +KPX Yacute ecircumflex -140 +KPX Yacute edieresis -140 +KPX Yacute edotaccent -140 +KPX Yacute egrave -140 +KPX Yacute emacron -70 +KPX Yacute eogonek -140 +KPX Yacute hyphen -140 +KPX Yacute i -20 +KPX Yacute iacute -20 +KPX Yacute iogonek -20 +KPX Yacute o -140 +KPX Yacute oacute -140 +KPX Yacute ocircumflex -140 +KPX Yacute odieresis -140 +KPX Yacute ograve -140 +KPX Yacute ohungarumlaut -140 +KPX Yacute omacron -70 +KPX Yacute oslash -140 +KPX Yacute otilde -140 +KPX Yacute period -140 +KPX Yacute semicolon -60 +KPX Yacute u -110 +KPX Yacute uacute -110 +KPX Yacute ucircumflex -110 +KPX Yacute udieresis -110 +KPX Yacute ugrave -110 +KPX Yacute uhungarumlaut -110 +KPX Yacute umacron -110 +KPX Yacute uogonek -110 +KPX Yacute uring -110 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -85 +KPX Ydieresis Oacute -85 +KPX Ydieresis Ocircumflex -85 +KPX Ydieresis Odieresis -85 +KPX Ydieresis Ograve -85 +KPX Ydieresis Ohungarumlaut -85 +KPX Ydieresis Omacron -85 +KPX Ydieresis Oslash -85 +KPX Ydieresis Otilde -85 +KPX Ydieresis a -140 +KPX Ydieresis aacute -140 +KPX Ydieresis abreve -70 +KPX Ydieresis acircumflex -140 +KPX Ydieresis adieresis -140 +KPX Ydieresis agrave -140 +KPX Ydieresis amacron -70 +KPX Ydieresis aogonek -140 +KPX Ydieresis aring -140 +KPX Ydieresis atilde -70 +KPX Ydieresis colon -60 +KPX Ydieresis comma -140 +KPX Ydieresis e -140 +KPX Ydieresis eacute -140 +KPX Ydieresis ecaron -140 +KPX Ydieresis ecircumflex -140 +KPX Ydieresis edieresis -140 +KPX Ydieresis edotaccent -140 +KPX Ydieresis egrave -140 +KPX Ydieresis emacron -70 +KPX Ydieresis eogonek -140 +KPX Ydieresis hyphen -140 +KPX Ydieresis i -20 +KPX Ydieresis iacute -20 +KPX Ydieresis iogonek -20 +KPX Ydieresis o -140 +KPX Ydieresis oacute -140 +KPX Ydieresis ocircumflex -140 +KPX Ydieresis odieresis -140 +KPX Ydieresis ograve -140 +KPX Ydieresis ohungarumlaut -140 +KPX Ydieresis omacron -140 +KPX Ydieresis oslash -140 +KPX Ydieresis otilde -140 +KPX Ydieresis period -140 +KPX Ydieresis semicolon -60 +KPX Ydieresis u -110 +KPX Ydieresis uacute -110 +KPX Ydieresis ucircumflex -110 +KPX Ydieresis udieresis -110 +KPX Ydieresis ugrave -110 +KPX Ydieresis uhungarumlaut -110 +KPX Ydieresis umacron -110 +KPX Ydieresis uogonek -110 +KPX Ydieresis uring -110 +KPX a v -20 +KPX a w -20 +KPX a y -30 +KPX a yacute -30 +KPX a ydieresis -30 +KPX aacute v -20 +KPX aacute w -20 +KPX aacute y -30 +KPX aacute yacute -30 +KPX aacute ydieresis -30 +KPX abreve v -20 +KPX abreve w -20 +KPX abreve y -30 +KPX abreve yacute -30 +KPX abreve ydieresis -30 +KPX acircumflex v -20 +KPX acircumflex w -20 +KPX acircumflex y -30 +KPX acircumflex yacute -30 +KPX acircumflex ydieresis -30 +KPX adieresis v -20 +KPX adieresis w -20 +KPX adieresis y -30 +KPX adieresis yacute -30 +KPX adieresis ydieresis -30 +KPX agrave v -20 +KPX agrave w -20 +KPX agrave y -30 +KPX agrave yacute -30 +KPX agrave ydieresis -30 +KPX amacron v -20 +KPX amacron w -20 +KPX amacron y -30 +KPX amacron yacute -30 +KPX amacron ydieresis -30 +KPX aogonek v -20 +KPX aogonek w -20 +KPX aogonek y -30 +KPX aogonek yacute -30 +KPX aogonek ydieresis -30 +KPX aring v -20 +KPX aring w -20 +KPX aring y -30 +KPX aring yacute -30 +KPX aring ydieresis -30 +KPX atilde v -20 +KPX atilde w -20 +KPX atilde y -30 +KPX atilde yacute -30 +KPX atilde ydieresis -30 +KPX b b -10 +KPX b comma -40 +KPX b l -20 +KPX b lacute -20 +KPX b lcommaaccent -20 +KPX b lslash -20 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c comma -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute comma -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron comma -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla comma -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX colon space -50 +KPX comma quotedblright -100 +KPX comma quoteright -100 +KPX e comma -15 +KPX e period -15 +KPX e v -30 +KPX e w -20 +KPX e x -30 +KPX e y -20 +KPX e yacute -20 +KPX e ydieresis -20 +KPX eacute comma -15 +KPX eacute period -15 +KPX eacute v -30 +KPX eacute w -20 +KPX eacute x -30 +KPX eacute y -20 +KPX eacute yacute -20 +KPX eacute ydieresis -20 +KPX ecaron comma -15 +KPX ecaron period -15 +KPX ecaron v -30 +KPX ecaron w -20 +KPX ecaron x -30 +KPX ecaron y -20 +KPX ecaron yacute -20 +KPX ecaron ydieresis -20 +KPX ecircumflex comma -15 +KPX ecircumflex period -15 +KPX ecircumflex v -30 +KPX ecircumflex w -20 +KPX ecircumflex x -30 +KPX ecircumflex y -20 +KPX ecircumflex yacute -20 +KPX ecircumflex ydieresis -20 +KPX edieresis comma -15 +KPX edieresis period -15 +KPX edieresis v -30 +KPX edieresis w -20 +KPX edieresis x -30 +KPX edieresis y -20 +KPX edieresis yacute -20 +KPX edieresis ydieresis -20 +KPX edotaccent comma -15 +KPX edotaccent period -15 +KPX edotaccent v -30 +KPX edotaccent w -20 +KPX edotaccent x -30 +KPX edotaccent y -20 +KPX edotaccent yacute -20 +KPX edotaccent ydieresis -20 +KPX egrave comma -15 +KPX egrave period -15 +KPX egrave v -30 +KPX egrave w -20 +KPX egrave x -30 +KPX egrave y -20 +KPX egrave yacute -20 +KPX egrave ydieresis -20 +KPX emacron comma -15 +KPX emacron period -15 +KPX emacron v -30 +KPX emacron w -20 +KPX emacron x -30 +KPX emacron y -20 +KPX emacron yacute -20 +KPX emacron ydieresis -20 +KPX eogonek comma -15 +KPX eogonek period -15 +KPX eogonek v -30 +KPX eogonek w -20 +KPX eogonek x -30 +KPX eogonek y -20 +KPX eogonek yacute -20 +KPX eogonek ydieresis -20 +KPX f a -30 +KPX f aacute -30 +KPX f abreve -30 +KPX f acircumflex -30 +KPX f adieresis -30 +KPX f agrave -30 +KPX f amacron -30 +KPX f aogonek -30 +KPX f aring -30 +KPX f atilde -30 +KPX f comma -30 +KPX f dotlessi -28 +KPX f e -30 +KPX f eacute -30 +KPX f ecaron -30 +KPX f ecircumflex -30 +KPX f edieresis -30 +KPX f edotaccent -30 +KPX f egrave -30 +KPX f emacron -30 +KPX f eogonek -30 +KPX f o -30 +KPX f oacute -30 +KPX f ocircumflex -30 +KPX f odieresis -30 +KPX f ograve -30 +KPX f ohungarumlaut -30 +KPX f omacron -30 +KPX f oslash -30 +KPX f otilde -30 +KPX f period -30 +KPX f quotedblright 60 +KPX f quoteright 50 +KPX g r -10 +KPX g racute -10 +KPX g rcaron -10 +KPX g rcommaaccent -10 +KPX gbreve r -10 +KPX gbreve racute -10 +KPX gbreve rcaron -10 +KPX gbreve rcommaaccent -10 +KPX gcommaaccent r -10 +KPX gcommaaccent racute -10 +KPX gcommaaccent rcaron -10 +KPX gcommaaccent rcommaaccent -10 +KPX h y -30 +KPX h yacute -30 +KPX h ydieresis -30 +KPX k e -20 +KPX k eacute -20 +KPX k ecaron -20 +KPX k ecircumflex -20 +KPX k edieresis -20 +KPX k edotaccent -20 +KPX k egrave -20 +KPX k emacron -20 +KPX k eogonek -20 +KPX k o -20 +KPX k oacute -20 +KPX k ocircumflex -20 +KPX k odieresis -20 +KPX k ograve -20 +KPX k ohungarumlaut -20 +KPX k omacron -20 +KPX k oslash -20 +KPX k otilde -20 +KPX kcommaaccent e -20 +KPX kcommaaccent eacute -20 +KPX kcommaaccent ecaron -20 +KPX kcommaaccent ecircumflex -20 +KPX kcommaaccent edieresis -20 +KPX kcommaaccent edotaccent -20 +KPX kcommaaccent egrave -20 +KPX kcommaaccent emacron -20 +KPX kcommaaccent eogonek -20 +KPX kcommaaccent o -20 +KPX kcommaaccent oacute -20 +KPX kcommaaccent ocircumflex -20 +KPX kcommaaccent odieresis -20 +KPX kcommaaccent ograve -20 +KPX kcommaaccent ohungarumlaut -20 +KPX kcommaaccent omacron -20 +KPX kcommaaccent oslash -20 +KPX kcommaaccent otilde -20 +KPX m u -10 +KPX m uacute -10 +KPX m ucircumflex -10 +KPX m udieresis -10 +KPX m ugrave -10 +KPX m uhungarumlaut -10 +KPX m umacron -10 +KPX m uogonek -10 +KPX m uring -10 +KPX m y -15 +KPX m yacute -15 +KPX m ydieresis -15 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -20 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -20 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -20 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -20 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -20 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o comma -40 +KPX o period -40 +KPX o v -15 +KPX o w -15 +KPX o x -30 +KPX o y -30 +KPX o yacute -30 +KPX o ydieresis -30 +KPX oacute comma -40 +KPX oacute period -40 +KPX oacute v -15 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -30 +KPX oacute yacute -30 +KPX oacute ydieresis -30 +KPX ocircumflex comma -40 +KPX ocircumflex period -40 +KPX ocircumflex v -15 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -30 +KPX ocircumflex yacute -30 +KPX ocircumflex ydieresis -30 +KPX odieresis comma -40 +KPX odieresis period -40 +KPX odieresis v -15 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -30 +KPX odieresis yacute -30 +KPX odieresis ydieresis -30 +KPX ograve comma -40 +KPX ograve period -40 +KPX ograve v -15 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -30 +KPX ograve yacute -30 +KPX ograve ydieresis -30 +KPX ohungarumlaut comma -40 +KPX ohungarumlaut period -40 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -30 +KPX ohungarumlaut yacute -30 +KPX ohungarumlaut ydieresis -30 +KPX omacron comma -40 +KPX omacron period -40 +KPX omacron v -15 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -30 +KPX omacron yacute -30 +KPX omacron ydieresis -30 +KPX oslash a -55 +KPX oslash aacute -55 +KPX oslash abreve -55 +KPX oslash acircumflex -55 +KPX oslash adieresis -55 +KPX oslash agrave -55 +KPX oslash amacron -55 +KPX oslash aogonek -55 +KPX oslash aring -55 +KPX oslash atilde -55 +KPX oslash b -55 +KPX oslash c -55 +KPX oslash cacute -55 +KPX oslash ccaron -55 +KPX oslash ccedilla -55 +KPX oslash comma -95 +KPX oslash d -55 +KPX oslash dcroat -55 +KPX oslash e -55 +KPX oslash eacute -55 +KPX oslash ecaron -55 +KPX oslash ecircumflex -55 +KPX oslash edieresis -55 +KPX oslash edotaccent -55 +KPX oslash egrave -55 +KPX oslash emacron -55 +KPX oslash eogonek -55 +KPX oslash f -55 +KPX oslash g -55 +KPX oslash gbreve -55 +KPX oslash gcommaaccent -55 +KPX oslash h -55 +KPX oslash i -55 +KPX oslash iacute -55 +KPX oslash icircumflex -55 +KPX oslash idieresis -55 +KPX oslash igrave -55 +KPX oslash imacron -55 +KPX oslash iogonek -55 +KPX oslash j -55 +KPX oslash k -55 +KPX oslash kcommaaccent -55 +KPX oslash l -55 +KPX oslash lacute -55 +KPX oslash lcommaaccent -55 +KPX oslash lslash -55 +KPX oslash m -55 +KPX oslash n -55 +KPX oslash nacute -55 +KPX oslash ncaron -55 +KPX oslash ncommaaccent -55 +KPX oslash ntilde -55 +KPX oslash o -55 +KPX oslash oacute -55 +KPX oslash ocircumflex -55 +KPX oslash odieresis -55 +KPX oslash ograve -55 +KPX oslash ohungarumlaut -55 +KPX oslash omacron -55 +KPX oslash oslash -55 +KPX oslash otilde -55 +KPX oslash p -55 +KPX oslash period -95 +KPX oslash q -55 +KPX oslash r -55 +KPX oslash racute -55 +KPX oslash rcaron -55 +KPX oslash rcommaaccent -55 +KPX oslash s -55 +KPX oslash sacute -55 +KPX oslash scaron -55 +KPX oslash scedilla -55 +KPX oslash scommaaccent -55 +KPX oslash t -55 +KPX oslash tcommaaccent -55 +KPX oslash u -55 +KPX oslash uacute -55 +KPX oslash ucircumflex -55 +KPX oslash udieresis -55 +KPX oslash ugrave -55 +KPX oslash uhungarumlaut -55 +KPX oslash umacron -55 +KPX oslash uogonek -55 +KPX oslash uring -55 +KPX oslash v -70 +KPX oslash w -70 +KPX oslash x -85 +KPX oslash y -70 +KPX oslash yacute -70 +KPX oslash ydieresis -70 +KPX oslash z -55 +KPX oslash zacute -55 +KPX oslash zcaron -55 +KPX oslash zdotaccent -55 +KPX otilde comma -40 +KPX otilde period -40 +KPX otilde v -15 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -30 +KPX otilde yacute -30 +KPX otilde ydieresis -30 +KPX p comma -35 +KPX p period -35 +KPX p y -30 +KPX p yacute -30 +KPX p ydieresis -30 +KPX period quotedblright -100 +KPX period quoteright -100 +KPX period space -60 +KPX quotedblright space -40 +KPX quoteleft quoteleft -57 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright quoteright -57 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -50 +KPX quoteright sacute -50 +KPX quoteright scaron -50 +KPX quoteright scedilla -50 +KPX quoteright scommaaccent -50 +KPX quoteright space -70 +KPX r a -10 +KPX r aacute -10 +KPX r abreve -10 +KPX r acircumflex -10 +KPX r adieresis -10 +KPX r agrave -10 +KPX r amacron -10 +KPX r aogonek -10 +KPX r aring -10 +KPX r atilde -10 +KPX r colon 30 +KPX r comma -50 +KPX r i 15 +KPX r iacute 15 +KPX r icircumflex 15 +KPX r idieresis 15 +KPX r igrave 15 +KPX r imacron 15 +KPX r iogonek 15 +KPX r k 15 +KPX r kcommaaccent 15 +KPX r l 15 +KPX r lacute 15 +KPX r lcommaaccent 15 +KPX r lslash 15 +KPX r m 25 +KPX r n 25 +KPX r nacute 25 +KPX r ncaron 25 +KPX r ncommaaccent 25 +KPX r ntilde 25 +KPX r p 30 +KPX r period -50 +KPX r semicolon 30 +KPX r t 40 +KPX r tcommaaccent 40 +KPX r u 15 +KPX r uacute 15 +KPX r ucircumflex 15 +KPX r udieresis 15 +KPX r ugrave 15 +KPX r uhungarumlaut 15 +KPX r umacron 15 +KPX r uogonek 15 +KPX r uring 15 +KPX r v 30 +KPX r y 30 +KPX r yacute 30 +KPX r ydieresis 30 +KPX racute a -10 +KPX racute aacute -10 +KPX racute abreve -10 +KPX racute acircumflex -10 +KPX racute adieresis -10 +KPX racute agrave -10 +KPX racute amacron -10 +KPX racute aogonek -10 +KPX racute aring -10 +KPX racute atilde -10 +KPX racute colon 30 +KPX racute comma -50 +KPX racute i 15 +KPX racute iacute 15 +KPX racute icircumflex 15 +KPX racute idieresis 15 +KPX racute igrave 15 +KPX racute imacron 15 +KPX racute iogonek 15 +KPX racute k 15 +KPX racute kcommaaccent 15 +KPX racute l 15 +KPX racute lacute 15 +KPX racute lcommaaccent 15 +KPX racute lslash 15 +KPX racute m 25 +KPX racute n 25 +KPX racute nacute 25 +KPX racute ncaron 25 +KPX racute ncommaaccent 25 +KPX racute ntilde 25 +KPX racute p 30 +KPX racute period -50 +KPX racute semicolon 30 +KPX racute t 40 +KPX racute tcommaaccent 40 +KPX racute u 15 +KPX racute uacute 15 +KPX racute ucircumflex 15 +KPX racute udieresis 15 +KPX racute ugrave 15 +KPX racute uhungarumlaut 15 +KPX racute umacron 15 +KPX racute uogonek 15 +KPX racute uring 15 +KPX racute v 30 +KPX racute y 30 +KPX racute yacute 30 +KPX racute ydieresis 30 +KPX rcaron a -10 +KPX rcaron aacute -10 +KPX rcaron abreve -10 +KPX rcaron acircumflex -10 +KPX rcaron adieresis -10 +KPX rcaron agrave -10 +KPX rcaron amacron -10 +KPX rcaron aogonek -10 +KPX rcaron aring -10 +KPX rcaron atilde -10 +KPX rcaron colon 30 +KPX rcaron comma -50 +KPX rcaron i 15 +KPX rcaron iacute 15 +KPX rcaron icircumflex 15 +KPX rcaron idieresis 15 +KPX rcaron igrave 15 +KPX rcaron imacron 15 +KPX rcaron iogonek 15 +KPX rcaron k 15 +KPX rcaron kcommaaccent 15 +KPX rcaron l 15 +KPX rcaron lacute 15 +KPX rcaron lcommaaccent 15 +KPX rcaron lslash 15 +KPX rcaron m 25 +KPX rcaron n 25 +KPX rcaron nacute 25 +KPX rcaron ncaron 25 +KPX rcaron ncommaaccent 25 +KPX rcaron ntilde 25 +KPX rcaron p 30 +KPX rcaron period -50 +KPX rcaron semicolon 30 +KPX rcaron t 40 +KPX rcaron tcommaaccent 40 +KPX rcaron u 15 +KPX rcaron uacute 15 +KPX rcaron ucircumflex 15 +KPX rcaron udieresis 15 +KPX rcaron ugrave 15 +KPX rcaron uhungarumlaut 15 +KPX rcaron umacron 15 +KPX rcaron uogonek 15 +KPX rcaron uring 15 +KPX rcaron v 30 +KPX rcaron y 30 +KPX rcaron yacute 30 +KPX rcaron ydieresis 30 +KPX rcommaaccent a -10 +KPX rcommaaccent aacute -10 +KPX rcommaaccent abreve -10 +KPX rcommaaccent acircumflex -10 +KPX rcommaaccent adieresis -10 +KPX rcommaaccent agrave -10 +KPX rcommaaccent amacron -10 +KPX rcommaaccent aogonek -10 +KPX rcommaaccent aring -10 +KPX rcommaaccent atilde -10 +KPX rcommaaccent colon 30 +KPX rcommaaccent comma -50 +KPX rcommaaccent i 15 +KPX rcommaaccent iacute 15 +KPX rcommaaccent icircumflex 15 +KPX rcommaaccent idieresis 15 +KPX rcommaaccent igrave 15 +KPX rcommaaccent imacron 15 +KPX rcommaaccent iogonek 15 +KPX rcommaaccent k 15 +KPX rcommaaccent kcommaaccent 15 +KPX rcommaaccent l 15 +KPX rcommaaccent lacute 15 +KPX rcommaaccent lcommaaccent 15 +KPX rcommaaccent lslash 15 +KPX rcommaaccent m 25 +KPX rcommaaccent n 25 +KPX rcommaaccent nacute 25 +KPX rcommaaccent ncaron 25 +KPX rcommaaccent ncommaaccent 25 +KPX rcommaaccent ntilde 25 +KPX rcommaaccent p 30 +KPX rcommaaccent period -50 +KPX rcommaaccent semicolon 30 +KPX rcommaaccent t 40 +KPX rcommaaccent tcommaaccent 40 +KPX rcommaaccent u 15 +KPX rcommaaccent uacute 15 +KPX rcommaaccent ucircumflex 15 +KPX rcommaaccent udieresis 15 +KPX rcommaaccent ugrave 15 +KPX rcommaaccent uhungarumlaut 15 +KPX rcommaaccent umacron 15 +KPX rcommaaccent uogonek 15 +KPX rcommaaccent uring 15 +KPX rcommaaccent v 30 +KPX rcommaaccent y 30 +KPX rcommaaccent yacute 30 +KPX rcommaaccent ydieresis 30 +KPX s comma -15 +KPX s period -15 +KPX s w -30 +KPX sacute comma -15 +KPX sacute period -15 +KPX sacute w -30 +KPX scaron comma -15 +KPX scaron period -15 +KPX scaron w -30 +KPX scedilla comma -15 +KPX scedilla period -15 +KPX scedilla w -30 +KPX scommaaccent comma -15 +KPX scommaaccent period -15 +KPX scommaaccent w -30 +KPX semicolon space -50 +KPX space T -50 +KPX space Tcaron -50 +KPX space Tcommaaccent -50 +KPX space V -50 +KPX space W -40 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX space quotedblleft -30 +KPX space quoteleft -60 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -80 +KPX v e -25 +KPX v eacute -25 +KPX v ecaron -25 +KPX v ecircumflex -25 +KPX v edieresis -25 +KPX v edotaccent -25 +KPX v egrave -25 +KPX v emacron -25 +KPX v eogonek -25 +KPX v o -25 +KPX v oacute -25 +KPX v ocircumflex -25 +KPX v odieresis -25 +KPX v ograve -25 +KPX v ohungarumlaut -25 +KPX v omacron -25 +KPX v oslash -25 +KPX v otilde -25 +KPX v period -80 +KPX w a -15 +KPX w aacute -15 +KPX w abreve -15 +KPX w acircumflex -15 +KPX w adieresis -15 +KPX w agrave -15 +KPX w amacron -15 +KPX w aogonek -15 +KPX w aring -15 +KPX w atilde -15 +KPX w comma -60 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -60 +KPX x e -30 +KPX x eacute -30 +KPX x ecaron -30 +KPX x ecircumflex -30 +KPX x edieresis -30 +KPX x edotaccent -30 +KPX x egrave -30 +KPX x emacron -30 +KPX x eogonek -30 +KPX y a -20 +KPX y aacute -20 +KPX y abreve -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y agrave -20 +KPX y amacron -20 +KPX y aogonek -20 +KPX y aring -20 +KPX y atilde -20 +KPX y comma -100 +KPX y e -20 +KPX y eacute -20 +KPX y ecaron -20 +KPX y ecircumflex -20 +KPX y edieresis -20 +KPX y edotaccent -20 +KPX y egrave -20 +KPX y emacron -20 +KPX y eogonek -20 +KPX y o -20 +KPX y oacute -20 +KPX y ocircumflex -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y ohungarumlaut -20 +KPX y omacron -20 +KPX y oslash -20 +KPX y otilde -20 +KPX y period -100 +KPX yacute a -20 +KPX yacute aacute -20 +KPX yacute abreve -20 +KPX yacute acircumflex -20 +KPX yacute adieresis -20 +KPX yacute agrave -20 +KPX yacute amacron -20 +KPX yacute aogonek -20 +KPX yacute aring -20 +KPX yacute atilde -20 +KPX yacute comma -100 +KPX yacute e -20 +KPX yacute eacute -20 +KPX yacute ecaron -20 +KPX yacute ecircumflex -20 +KPX yacute edieresis -20 +KPX yacute edotaccent -20 +KPX yacute egrave -20 +KPX yacute emacron -20 +KPX yacute eogonek -20 +KPX yacute o -20 +KPX yacute oacute -20 +KPX yacute ocircumflex -20 +KPX yacute odieresis -20 +KPX yacute ograve -20 +KPX yacute ohungarumlaut -20 +KPX yacute omacron -20 +KPX yacute oslash -20 +KPX yacute otilde -20 +KPX yacute period -100 +KPX ydieresis a -20 +KPX ydieresis aacute -20 +KPX ydieresis abreve -20 +KPX ydieresis acircumflex -20 +KPX ydieresis adieresis -20 +KPX ydieresis agrave -20 +KPX ydieresis amacron -20 +KPX ydieresis aogonek -20 +KPX ydieresis aring -20 +KPX ydieresis atilde -20 +KPX ydieresis comma -100 +KPX ydieresis e -20 +KPX ydieresis eacute -20 +KPX ydieresis ecaron -20 +KPX ydieresis ecircumflex -20 +KPX ydieresis edieresis -20 +KPX ydieresis edotaccent -20 +KPX ydieresis egrave -20 +KPX ydieresis emacron -20 +KPX ydieresis eogonek -20 +KPX ydieresis o -20 +KPX ydieresis oacute -20 +KPX ydieresis ocircumflex -20 +KPX ydieresis odieresis -20 +KPX ydieresis ograve -20 +KPX ydieresis ohungarumlaut -20 +KPX ydieresis omacron -20 +KPX ydieresis oslash -20 +KPX ydieresis otilde -20 +KPX ydieresis period -100 +KPX z e -15 +KPX z eacute -15 +KPX z ecaron -15 +KPX z ecircumflex -15 +KPX z edieresis -15 +KPX z edotaccent -15 +KPX z egrave -15 +KPX z emacron -15 +KPX z eogonek -15 +KPX z o -15 +KPX z oacute -15 +KPX z ocircumflex -15 +KPX z odieresis -15 +KPX z ograve -15 +KPX z ohungarumlaut -15 +KPX z omacron -15 +KPX z oslash -15 +KPX z otilde -15 +KPX zacute e -15 +KPX zacute eacute -15 +KPX zacute ecaron -15 +KPX zacute ecircumflex -15 +KPX zacute edieresis -15 +KPX zacute edotaccent -15 +KPX zacute egrave -15 +KPX zacute emacron -15 +KPX zacute eogonek -15 +KPX zacute o -15 +KPX zacute oacute -15 +KPX zacute ocircumflex -15 +KPX zacute odieresis -15 +KPX zacute ograve -15 +KPX zacute ohungarumlaut -15 +KPX zacute omacron -15 +KPX zacute oslash -15 +KPX zacute otilde -15 +KPX zcaron e -15 +KPX zcaron eacute -15 +KPX zcaron ecaron -15 +KPX zcaron ecircumflex -15 +KPX zcaron edieresis -15 +KPX zcaron edotaccent -15 +KPX zcaron egrave -15 +KPX zcaron emacron -15 +KPX zcaron eogonek -15 +KPX zcaron o -15 +KPX zcaron oacute -15 +KPX zcaron ocircumflex -15 +KPX zcaron odieresis -15 +KPX zcaron ograve -15 +KPX zcaron ohungarumlaut -15 +KPX zcaron omacron -15 +KPX zcaron oslash -15 +KPX zcaron otilde -15 +KPX zdotaccent e -15 +KPX zdotaccent eacute -15 +KPX zdotaccent ecaron -15 +KPX zdotaccent ecircumflex -15 +KPX zdotaccent edieresis -15 +KPX zdotaccent edotaccent -15 +KPX zdotaccent egrave -15 +KPX zdotaccent emacron -15 +KPX zdotaccent eogonek -15 +KPX zdotaccent o -15 +KPX zdotaccent oacute -15 +KPX zdotaccent ocircumflex -15 +KPX zdotaccent odieresis -15 +KPX zdotaccent ograve -15 +KPX zdotaccent ohungarumlaut -15 +KPX zdotaccent omacron -15 +KPX zdotaccent oslash -15 +KPX zdotaccent otilde -15 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Helvetica.afm.php b/application/third_party/dompdf/lib/fonts/Helvetica.afm.php new file mode 100644 index 00000000..f58cc543 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica.afm.php @@ -0,0 +1,570 @@ + + array ( + 32 => 'space', + 160 => 'space', + 33 => 'exclam', + 34 => 'quotedbl', + 35 => 'numbersign', + 36 => 'dollar', + 37 => 'percent', + 38 => 'ampersand', + 146 => 'quoteright', + 40 => 'parenleft', + 41 => 'parenright', + 42 => 'asterisk', + 43 => 'plus', + 44 => 'comma', + 45 => 'hyphen', + 173 => 'hyphen', + 46 => 'period', + 47 => 'slash', + 48 => 'zero', + 49 => 'one', + 50 => 'two', + 51 => 'three', + 52 => 'four', + 53 => 'five', + 54 => 'six', + 55 => 'seven', + 56 => 'eight', + 57 => 'nine', + 58 => 'colon', + 59 => 'semicolon', + 60 => 'less', + 61 => 'equal', + 62 => 'greater', + 63 => 'question', + 64 => 'at', + 65 => 'A', + 66 => 'B', + 67 => 'C', + 68 => 'D', + 69 => 'E', + 70 => 'F', + 71 => 'G', + 72 => 'H', + 73 => 'I', + 74 => 'J', + 75 => 'K', + 76 => 'L', + 77 => 'M', + 78 => 'N', + 79 => 'O', + 80 => 'P', + 81 => 'Q', + 82 => 'R', + 83 => 'S', + 84 => 'T', + 85 => 'U', + 86 => 'V', + 87 => 'W', + 88 => 'X', + 89 => 'Y', + 90 => 'Z', + 91 => 'bracketleft', + 92 => 'backslash', + 93 => 'bracketright', + 94 => 'asciicircum', + 95 => 'underscore', + 145 => 'quoteleft', + 97 => 'a', + 98 => 'b', + 99 => 'c', + 100 => 'd', + 101 => 'e', + 102 => 'f', + 103 => 'g', + 104 => 'h', + 105 => 'i', + 106 => 'j', + 107 => 'k', + 108 => 'l', + 109 => 'm', + 110 => 'n', + 111 => 'o', + 112 => 'p', + 113 => 'q', + 114 => 'r', + 115 => 's', + 116 => 't', + 117 => 'u', + 118 => 'v', + 119 => 'w', + 120 => 'x', + 121 => 'y', + 122 => 'z', + 123 => 'braceleft', + 124 => 'bar', + 125 => 'braceright', + 126 => 'asciitilde', + 161 => 'exclamdown', + 162 => 'cent', + 163 => 'sterling', + 165 => 'yen', + 131 => 'florin', + 167 => 'section', + 164 => 'currency', + 39 => 'quotesingle', + 147 => 'quotedblleft', + 170 => 'ordfeminine', + 139 => 'guilsinglleft', + 155 => 'guilsinglright', + 150 => 'endash', + 134 => 'dagger', + 135 => 'daggerdbl', + 183 => 'periodcentered', + 182 => 'paragraph', + 149 => 'bullet', + 130 => 'quotesinglbase', + 132 => 'quotedblbase', + 148 => 'quotedblright', + 187 => 'guillemotright', + 133 => 'ellipsis', + 137 => 'perthousand', + 191 => 'questiondown', + 96 => 'grave', + 180 => 'acute', + 136 => 'circumflex', + 152 => 'tilde', + 175 => 'macron', + 168 => 'dieresis', + 184 => 'cedilla', + 151 => 'emdash', + 198 => 'AE', + 216 => 'Oslash', + 140 => 'OE', + 186 => 'ordmasculine', + 230 => 'ae', + 248 => 'oslash', + 156 => 'oe', + 223 => 'germandbls', + 207 => 'Idieresis', + 233 => 'eacute', + 159 => 'Ydieresis', + 247 => 'divide', + 221 => 'Yacute', + 194 => 'Acircumflex', + 225 => 'aacute', + 219 => 'Ucircumflex', + 253 => 'yacute', + 234 => 'ecircumflex', + 220 => 'Udieresis', + 218 => 'Uacute', + 203 => 'Edieresis', + 169 => 'copyright', + 229 => 'aring', + 224 => 'agrave', + 227 => 'atilde', + 154 => 'scaron', + 237 => 'iacute', + 251 => 'ucircumflex', + 226 => 'acircumflex', + 231 => 'ccedilla', + 222 => 'Thorn', + 179 => 'threesuperior', + 210 => 'Ograve', + 192 => 'Agrave', + 215 => 'multiply', + 250 => 'uacute', + 255 => 'ydieresis', + 238 => 'icircumflex', + 202 => 'Ecircumflex', + 228 => 'adieresis', + 235 => 'edieresis', + 205 => 'Iacute', + 177 => 'plusminus', + 166 => 'brokenbar', + 174 => 'registered', + 200 => 'Egrave', + 142 => 'Zcaron', + 208 => 'Eth', + 199 => 'Ccedilla', + 193 => 'Aacute', + 196 => 'Adieresis', + 232 => 'egrave', + 211 => 'Oacute', + 243 => 'oacute', + 239 => 'idieresis', + 212 => 'Ocircumflex', + 217 => 'Ugrave', + 254 => 'thorn', + 178 => 'twosuperior', + 214 => 'Odieresis', + 181 => 'mu', + 236 => 'igrave', + 190 => 'threequarters', + 153 => 'trademark', + 204 => 'Igrave', + 189 => 'onehalf', + 244 => 'ocircumflex', + 241 => 'ntilde', + 201 => 'Eacute', + 188 => 'onequarter', + 138 => 'Scaron', + 176 => 'degree', + 242 => 'ograve', + 249 => 'ugrave', + 209 => 'Ntilde', + 245 => 'otilde', + 195 => 'Atilde', + 197 => 'Aring', + 213 => 'Otilde', + 206 => 'Icircumflex', + 172 => 'logicalnot', + 246 => 'odieresis', + 252 => 'udieresis', + 240 => 'eth', + 158 => 'zcaron', + 185 => 'onesuperior', + 128 => 'Euro', + ), + 'isUnicode' => false, + 'FontName' => 'Helvetica', + 'FullName' => 'Helvetica', + 'FamilyName' => 'Helvetica', + 'Weight' => 'Medium', + 'ItalicAngle' => '0', + 'IsFixedPitch' => 'false', + 'CharacterSet' => 'ExtendedRoman', + 'FontBBox' => + array ( + 0 => '-166', + 1 => '-225', + 2 => '1000', + 3 => '931', + ), + 'UnderlinePosition' => '-100', + 'UnderlineThickness' => '50', + 'Version' => '002.000', + 'EncodingScheme' => 'WinAnsiEncoding', + 'CapHeight' => '718', + 'XHeight' => '523', + 'Ascender' => '718', + 'Descender' => '-207', + 'StdHW' => '76', + 'StdVW' => '88', + 'StartCharMetrics' => '317', + 'C' => + array ( + 32 => 278.0, + 160 => 278.0, + 33 => 278.0, + 34 => 355.0, + 35 => 556.0, + 36 => 556.0, + 37 => 889.0, + 38 => 667.0, + 146 => 222.0, + 40 => 333.0, + 41 => 333.0, + 42 => 389.0, + 43 => 584.0, + 44 => 278.0, + 45 => 333.0, + 173 => 333.0, + 46 => 278.0, + 47 => 278.0, + 48 => 556.0, + 49 => 556.0, + 50 => 556.0, + 51 => 556.0, + 52 => 556.0, + 53 => 556.0, + 54 => 556.0, + 55 => 556.0, + 56 => 556.0, + 57 => 556.0, + 58 => 278.0, + 59 => 278.0, + 60 => 584.0, + 61 => 584.0, + 62 => 584.0, + 63 => 556.0, + 64 => 1015.0, + 65 => 667.0, + 66 => 667.0, + 67 => 722.0, + 68 => 722.0, + 69 => 667.0, + 70 => 611.0, + 71 => 778.0, + 72 => 722.0, + 73 => 278.0, + 74 => 500.0, + 75 => 667.0, + 76 => 556.0, + 77 => 833.0, + 78 => 722.0, + 79 => 778.0, + 80 => 667.0, + 81 => 778.0, + 82 => 722.0, + 83 => 667.0, + 84 => 611.0, + 85 => 722.0, + 86 => 667.0, + 87 => 944.0, + 88 => 667.0, + 89 => 667.0, + 90 => 611.0, + 91 => 278.0, + 92 => 278.0, + 93 => 278.0, + 94 => 469.0, + 95 => 556.0, + 145 => 222.0, + 97 => 556.0, + 98 => 556.0, + 99 => 500.0, + 100 => 556.0, + 101 => 556.0, + 102 => 278.0, + 103 => 556.0, + 104 => 556.0, + 105 => 222.0, + 106 => 222.0, + 107 => 500.0, + 108 => 222.0, + 109 => 833.0, + 110 => 556.0, + 111 => 556.0, + 112 => 556.0, + 113 => 556.0, + 114 => 333.0, + 115 => 500.0, + 116 => 278.0, + 117 => 556.0, + 118 => 500.0, + 119 => 722.0, + 120 => 500.0, + 121 => 500.0, + 122 => 500.0, + 123 => 334.0, + 124 => 260.0, + 125 => 334.0, + 126 => 584.0, + 161 => 333.0, + 162 => 556.0, + 163 => 556.0, + 'fraction' => 167.0, + 165 => 556.0, + 131 => 556.0, + 167 => 556.0, + 164 => 556.0, + 39 => 191.0, + 147 => 333.0, + 170 => 370.0, + 139 => 333.0, + 155 => 333.0, + 'fi' => 500.0, + 'fl' => 500.0, + 150 => 556.0, + 134 => 556.0, + 135 => 556.0, + 183 => 278.0, + 182 => 537.0, + 149 => 350.0, + 130 => 222.0, + 132 => 333.0, + 148 => 333.0, + 187 => 556.0, + 133 => 1000.0, + 137 => 1000.0, + 191 => 611.0, + 96 => 333.0, + 180 => 333.0, + 136 => 333.0, + 152 => 333.0, + 175 => 333.0, + 'breve' => 333.0, + 'dotaccent' => 333.0, + 168 => 333.0, + 'ring' => 333.0, + 184 => 333.0, + 'hungarumlaut' => 333.0, + 'ogonek' => 333.0, + 'caron' => 333.0, + 151 => 1000.0, + 198 => 1000.0, + 'Lslash' => 556.0, + 216 => 778.0, + 140 => 1000.0, + 186 => 365.0, + 230 => 889.0, + 'dotlessi' => 278.0, + 'lslash' => 222.0, + 248 => 611.0, + 156 => 944.0, + 223 => 611.0, + 207 => 278.0, + 233 => 556.0, + 'abreve' => 556.0, + 'uhungarumlaut' => 556.0, + 'ecaron' => 556.0, + 159 => 667.0, + 247 => 584.0, + 221 => 667.0, + 194 => 667.0, + 225 => 556.0, + 219 => 722.0, + 253 => 500.0, + 'scommaaccent' => 500.0, + 234 => 556.0, + 'Uring' => 722.0, + 220 => 722.0, + 'aogonek' => 556.0, + 218 => 722.0, + 'uogonek' => 556.0, + 203 => 667.0, + 'Dcroat' => 722.0, + 'commaaccent' => 250.0, + 169 => 737.0, + 'Emacron' => 667.0, + 'ccaron' => 500.0, + 229 => 556.0, + 'Ncommaaccent' => 722.0, + 'lacute' => 222.0, + 224 => 556.0, + 'Tcommaaccent' => 611.0, + 'Cacute' => 722.0, + 227 => 556.0, + 'Edotaccent' => 667.0, + 154 => 500.0, + 'scedilla' => 500.0, + 237 => 278.0, + 'lozenge' => 471.0, + 'Rcaron' => 722.0, + 'Gcommaaccent' => 778.0, + 251 => 556.0, + 226 => 556.0, + 'Amacron' => 667.0, + 'rcaron' => 333.0, + 231 => 500.0, + 'Zdotaccent' => 611.0, + 222 => 667.0, + 'Omacron' => 778.0, + 'Racute' => 722.0, + 'Sacute' => 667.0, + 'dcaron' => 643.0, + 'Umacron' => 722.0, + 'uring' => 556.0, + 179 => 333.0, + 210 => 778.0, + 192 => 667.0, + 'Abreve' => 667.0, + 215 => 584.0, + 250 => 556.0, + 'Tcaron' => 611.0, + 'partialdiff' => 476.0, + 255 => 500.0, + 'Nacute' => 722.0, + 238 => 278.0, + 202 => 667.0, + 228 => 556.0, + 235 => 556.0, + 'cacute' => 500.0, + 'nacute' => 556.0, + 'umacron' => 556.0, + 'Ncaron' => 722.0, + 205 => 278.0, + 177 => 584.0, + 166 => 260.0, + 174 => 737.0, + 'Gbreve' => 778.0, + 'Idotaccent' => 278.0, + 'summation' => 600.0, + 200 => 667.0, + 'racute' => 333.0, + 'omacron' => 556.0, + 'Zacute' => 611.0, + 142 => 611.0, + 'greaterequal' => 549.0, + 208 => 722.0, + 199 => 722.0, + 'lcommaaccent' => 222.0, + 'tcaron' => 317.0, + 'eogonek' => 556.0, + 'Uogonek' => 722.0, + 193 => 667.0, + 196 => 667.0, + 232 => 556.0, + 'zacute' => 500.0, + 'iogonek' => 222.0, + 211 => 778.0, + 243 => 556.0, + 'amacron' => 556.0, + 'sacute' => 500.0, + 239 => 278.0, + 212 => 778.0, + 217 => 722.0, + 'Delta' => 612.0, + 254 => 556.0, + 178 => 333.0, + 214 => 778.0, + 181 => 556.0, + 236 => 278.0, + 'ohungarumlaut' => 556.0, + 'Eogonek' => 667.0, + 'dcroat' => 556.0, + 190 => 834.0, + 'Scedilla' => 667.0, + 'lcaron' => 299.0, + 'Kcommaaccent' => 667.0, + 'Lacute' => 556.0, + 153 => 1000.0, + 'edotaccent' => 556.0, + 204 => 278.0, + 'Imacron' => 278.0, + 'Lcaron' => 556.0, + 189 => 834.0, + 'lessequal' => 549.0, + 244 => 556.0, + 241 => 556.0, + 'Uhungarumlaut' => 722.0, + 201 => 667.0, + 'emacron' => 556.0, + 'gbreve' => 556.0, + 188 => 834.0, + 138 => 667.0, + 'Scommaaccent' => 667.0, + 'Ohungarumlaut' => 778.0, + 176 => 400.0, + 242 => 556.0, + 'Ccaron' => 722.0, + 249 => 556.0, + 'radical' => 453.0, + 'Dcaron' => 722.0, + 'rcommaaccent' => 333.0, + 209 => 722.0, + 245 => 556.0, + 'Rcommaaccent' => 722.0, + 'Lcommaaccent' => 556.0, + 195 => 667.0, + 'Aogonek' => 667.0, + 197 => 667.0, + 213 => 778.0, + 'zdotaccent' => 500.0, + 'Ecaron' => 667.0, + 'Iogonek' => 278.0, + 'kcommaaccent' => 500.0, + 'minus' => 584.0, + 206 => 278.0, + 'ncaron' => 556.0, + 'tcommaaccent' => 278.0, + 172 => 584.0, + 246 => 556.0, + 252 => 556.0, + 'notequal' => 549.0, + 'gcommaaccent' => 556.0, + 240 => 556.0, + 158 => 500.0, + 'ncommaaccent' => 556.0, + 185 => 333.0, + 'imacron' => 278.0, + 128 => 556.0, + ), + 'CIDtoGID_Compressed' => true, + 'CIDtoGID' => 'eJwDAAAAAAE=', + '_version_' => 4, +); \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/Symbol.afm b/application/third_party/dompdf/lib/fonts/Symbol.afm new file mode 100644 index 00000000..6a5386a9 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Symbol.afm @@ -0,0 +1,213 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. +Comment Creation Date: Thu May 1 15:12:25 1997 +Comment UniqueID 43064 +Comment VMusage 30820 39997 +FontName Symbol +FullName Symbol +FamilyName Symbol +Weight Medium +ItalicAngle 0 +IsFixedPitch false +CharacterSet Special +FontBBox -180 -293 1090 1010 +UnderlinePosition -100 +UnderlineThickness 50 +Version 001.008 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. +EncodingScheme FontSpecific +StdHW 92 +StdVW 85 +StartCharMetrics 190 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ; +C 34 ; WX 713 ; N universal ; B 31 0 681 705 ; +C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ; +C 36 ; WX 549 ; N existential ; B 25 0 478 707 ; +C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ; +C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ; +C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ; +C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ; +C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ; +C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ; +C 43 ; WX 549 ; N plus ; B 10 0 539 533 ; +C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ; +C 45 ; WX 549 ; N minus ; B 11 233 535 288 ; +C 46 ; WX 250 ; N period ; B 69 -17 181 95 ; +C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ; +C 48 ; WX 500 ; N zero ; B 24 -14 476 685 ; +C 49 ; WX 500 ; N one ; B 117 0 390 673 ; +C 50 ; WX 500 ; N two ; B 25 0 475 685 ; +C 51 ; WX 500 ; N three ; B 43 -14 435 685 ; +C 52 ; WX 500 ; N four ; B 15 0 469 685 ; +C 53 ; WX 500 ; N five ; B 32 -14 445 690 ; +C 54 ; WX 500 ; N six ; B 34 -14 468 685 ; +C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ; +C 56 ; WX 500 ; N eight ; B 56 -14 445 685 ; +C 57 ; WX 500 ; N nine ; B 30 -18 459 685 ; +C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ; +C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ; +C 60 ; WX 549 ; N less ; B 26 0 523 522 ; +C 61 ; WX 549 ; N equal ; B 11 141 537 390 ; +C 62 ; WX 549 ; N greater ; B 26 0 523 522 ; +C 63 ; WX 444 ; N question ; B 70 -17 412 686 ; +C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ; +C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ; +C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ; +C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ; +C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ; +C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ; +C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ; +C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ; +C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ; +C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ; +C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ; +C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ; +C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ; +C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ; +C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ; +C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ; +C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ; +C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ; +C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ; +C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ; +C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ; +C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ; +C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ; +C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ; +C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ; +C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ; +C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ; +C 92 ; WX 863 ; N therefore ; B 163 0 701 487 ; +C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ; +C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ; +C 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ; +C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ; +C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ; +C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ; +C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ; +C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ; +C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ; +C 102 ; WX 521 ; N phi ; B 28 -224 492 673 ; +C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ; +C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ; +C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ; +C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ; +C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ; +C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ; +C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ; +C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ; +C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ; +C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ; +C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ; +C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ; +C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ; +C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ; +C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ; +C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ; +C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ; +C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ; +C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ; +C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ; +C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ; +C 124 ; WX 200 ; N bar ; B 65 -293 135 707 ; +C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ; +C 126 ; WX 549 ; N similar ; B 17 203 529 307 ; +C 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ; +C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ; +C 162 ; WX 247 ; N minute ; B 27 459 228 735 ; +C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ; +C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ; +C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ; +C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ; +C 167 ; WX 753 ; N club ; B 86 -26 660 533 ; +C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ; +C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ; +C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ; +C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ; +C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ; +C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ; +C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ; +C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ; +C 176 ; WX 400 ; N degree ; B 50 385 350 685 ; +C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ; +C 178 ; WX 411 ; N second ; B 20 459 413 737 ; +C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ; +C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ; +C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ; +C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ; +C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ; +C 184 ; WX 549 ; N divide ; B 10 71 536 456 ; +C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ; +C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ; +C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ; +C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ; +C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ; +C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ; +C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ; +C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ; +C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ; +C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ; +C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ; +C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ; +C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ; +C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ; +C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ; +C 200 ; WX 768 ; N union ; B 40 -17 732 492 ; +C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ; +C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ; +C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ; +C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ; +C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ; +C 206 ; WX 713 ; N element ; B 45 0 505 468 ; +C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ; +C 208 ; WX 768 ; N angle ; B 26 0 738 673 ; +C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ; +C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ; +C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ; +C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ; +C 213 ; WX 823 ; N product ; B 25 -101 803 751 ; +C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ; +C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ; +C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ; +C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ; +C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ; +C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ; +C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ; +C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ; +C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ; +C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ; +C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ; +C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ; +C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ; +C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ; +C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ; +C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ; +C 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ; +C 231 ; WX 384 ; N parenleftex ; B 24 -85 108 925 ; +C 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 926 ; +C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 349 926 ; +C 234 ; WX 384 ; N bracketleftex ; B 0 -79 77 925 ; +C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 349 926 ; +C 236 ; WX 494 ; N bracelefttp ; B 209 -85 445 925 ; +C 237 ; WX 494 ; N braceleftmid ; B 20 -85 284 935 ; +C 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 935 ; +C 239 ; WX 494 ; N braceex ; B 209 -85 284 935 ; +C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ; +C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ; +C 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ; +C 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ; +C 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ; +C 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ; +C 247 ; WX 384 ; N parenrightex ; B 382 -85 466 925 ; +C 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 926 ; +C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 371 926 ; +C 250 ; WX 384 ; N bracketrightex ; B 294 -79 371 925 ; +C 251 ; WX 384 ; N bracketrightbt ; B 22 -80 371 926 ; +C 252 ; WX 494 ; N bracerighttp ; B 48 -85 284 925 ; +C 253 ; WX 494 ; N bracerightmid ; B 209 -85 473 935 ; +C 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 935 ; +C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Times-Bold.afm b/application/third_party/dompdf/lib/fonts/Times-Bold.afm new file mode 100644 index 00000000..7adf4dab --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Bold.afm @@ -0,0 +1,2590 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:52:56 1997 +Comment UniqueID 43065 +Comment VMusage 41636 52661 +FontName Times-Bold +FullName Times Bold +FamilyName Times +Weight Bold +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -168 -218 1000 935 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 676 +XHeight 461 +Ascender 683 +Descender -217 +StdHW 44 +StdVW 139 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ; +C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ; +C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ; +C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ; +C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ; +C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ; +C 146 ; WX 333 ; N quoteright ; B 79 356 263 691 ; +C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ; +C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ; +C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ; +C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; +C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ; +C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ; +C 173 ; WX 333 ; N hyphen ; B 44 171 287 287 ; +C 46 ; WX 250 ; N period ; B 41 -13 210 156 ; +C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ; +C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ; +C 49 ; WX 500 ; N one ; B 65 0 442 688 ; +C 50 ; WX 500 ; N two ; B 17 0 478 688 ; +C 51 ; WX 500 ; N three ; B 16 -14 468 688 ; +C 52 ; WX 500 ; N four ; B 19 0 475 688 ; +C 53 ; WX 500 ; N five ; B 22 -8 470 676 ; +C 54 ; WX 500 ; N six ; B 28 -13 475 688 ; +C 55 ; WX 500 ; N seven ; B 17 0 477 676 ; +C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ; +C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ; +C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ; +C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ; +C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; +C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; +C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; +C 63 ; WX 500 ; N question ; B 57 -13 445 689 ; +C 64 ; WX 930 ; N at ; B 108 -19 822 691 ; +C 65 ; WX 722 ; N A ; B 9 0 689 690 ; +C 66 ; WX 667 ; N B ; B 16 0 619 676 ; +C 67 ; WX 722 ; N C ; B 49 -19 687 691 ; +C 68 ; WX 722 ; N D ; B 14 0 690 676 ; +C 69 ; WX 667 ; N E ; B 16 0 641 676 ; +C 70 ; WX 611 ; N F ; B 16 0 583 676 ; +C 71 ; WX 778 ; N G ; B 37 -19 755 691 ; +C 72 ; WX 778 ; N H ; B 21 0 759 676 ; +C 73 ; WX 389 ; N I ; B 20 0 370 676 ; +C 74 ; WX 500 ; N J ; B 3 -96 479 676 ; +C 75 ; WX 778 ; N K ; B 30 0 769 676 ; +C 76 ; WX 667 ; N L ; B 19 0 638 676 ; +C 77 ; WX 944 ; N M ; B 14 0 921 676 ; +C 78 ; WX 722 ; N N ; B 16 -18 701 676 ; +C 79 ; WX 778 ; N O ; B 35 -19 743 691 ; +C 80 ; WX 611 ; N P ; B 16 0 600 676 ; +C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ; +C 82 ; WX 722 ; N R ; B 26 0 715 676 ; +C 83 ; WX 556 ; N S ; B 35 -19 513 692 ; +C 84 ; WX 667 ; N T ; B 31 0 636 676 ; +C 85 ; WX 722 ; N U ; B 16 -19 701 676 ; +C 86 ; WX 722 ; N V ; B 16 -18 701 676 ; +C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ; +C 88 ; WX 722 ; N X ; B 16 0 699 676 ; +C 89 ; WX 722 ; N Y ; B 15 0 699 676 ; +C 90 ; WX 667 ; N Z ; B 28 0 634 676 ; +C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ; +C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ; +C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ; +C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 70 356 254 691 ; +C 97 ; WX 500 ; N a ; B 25 -14 488 473 ; +C 98 ; WX 556 ; N b ; B 17 -14 521 676 ; +C 99 ; WX 444 ; N c ; B 25 -14 430 473 ; +C 100 ; WX 556 ; N d ; B 25 -14 534 676 ; +C 101 ; WX 444 ; N e ; B 25 -14 426 473 ; +C 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B 28 -206 483 473 ; +C 104 ; WX 556 ; N h ; B 16 0 534 676 ; +C 105 ; WX 278 ; N i ; B 16 0 255 691 ; +C 106 ; WX 333 ; N j ; B -57 -203 263 691 ; +C 107 ; WX 556 ; N k ; B 22 0 543 676 ; +C 108 ; WX 278 ; N l ; B 16 0 255 676 ; +C 109 ; WX 833 ; N m ; B 16 0 814 473 ; +C 110 ; WX 556 ; N n ; B 21 0 539 473 ; +C 111 ; WX 500 ; N o ; B 25 -14 476 473 ; +C 112 ; WX 556 ; N p ; B 19 -205 524 473 ; +C 113 ; WX 556 ; N q ; B 34 -205 536 473 ; +C 114 ; WX 444 ; N r ; B 29 0 434 473 ; +C 115 ; WX 389 ; N s ; B 25 -14 361 473 ; +C 116 ; WX 333 ; N t ; B 20 -12 332 630 ; +C 117 ; WX 556 ; N u ; B 16 -14 537 461 ; +C 118 ; WX 500 ; N v ; B 21 -14 485 461 ; +C 119 ; WX 722 ; N w ; B 23 -14 707 461 ; +C 120 ; WX 500 ; N x ; B 12 0 484 461 ; +C 121 ; WX 500 ; N y ; B 16 -205 480 461 ; +C 122 ; WX 444 ; N z ; B 21 0 420 461 ; +C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ; +C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; +C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ; +C 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ; +C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ; +C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ; +C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ; +C -1 ; WX 167 ; N fraction ; B -168 -12 329 688 ; +C 165 ; WX 500 ; N yen ; B -64 0 547 676 ; +C 131 ; WX 500 ; N florin ; B 0 -155 498 706 ; +C 167 ; WX 500 ; N section ; B 57 -132 443 691 ; +C 164 ; WX 500 ; N currency ; B -26 61 526 613 ; +C 39 ; WX 278 ; N quotesingle ; B 75 404 204 691 ; +C 147 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ; +C 170 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ; +C 139 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ; +C 155 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ; +C -1 ; WX 556 ; N fi ; B 14 0 536 691 ; +C -1 ; WX 556 ; N fl ; B 14 0 536 691 ; +C 150 ; WX 500 ; N endash ; B 0 181 500 271 ; +C 134 ; WX 500 ; N dagger ; B 47 -134 453 691 ; +C 135 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ; +C 183 ; WX 250 ; N periodcentered ; B 41 248 210 417 ; +C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ; +C 149 ; WX 350 ; N bullet ; B 35 198 315 478 ; +C 130 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ; +C 132 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ; +C 148 ; WX 500 ; N quotedblright ; B 14 356 468 691 ; +C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ; +C 133 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ; +C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ; +C 96 ; WX 333 ; N grave ; B 8 528 246 713 ; +C 180 ; WX 333 ; N acute ; B 86 528 324 713 ; +C 136 ; WX 333 ; N circumflex ; B -2 528 335 704 ; +C 152 ; WX 333 ; N tilde ; B -16 547 349 674 ; +C 175 ; WX 333 ; N macron ; B 1 565 331 637 ; +C -1 ; WX 333 ; N breve ; B 15 528 318 691 ; +C -1 ; WX 333 ; N dotaccent ; B 103 536 258 691 ; +C 168 ; WX 333 ; N dieresis ; B -2 537 335 667 ; +C -1 ; WX 333 ; N ring ; B 60 527 273 740 ; +C 184 ; WX 333 ; N cedilla ; B 68 -218 294 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ; +C -1 ; WX 333 ; N ogonek ; B 90 -193 319 24 ; +C -1 ; WX 333 ; N caron ; B -2 528 335 704 ; +C 151 ; WX 1000 ; N emdash ; B 0 181 1000 271 ; +C 198 ; WX 1000 ; N AE ; B 4 0 951 676 ; +C 170 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ; +C -1 ; WX 667 ; N Lslash ; B 19 0 638 676 ; +C 216 ; WX 778 ; N Oslash ; B 35 -74 743 737 ; +C 140 ; WX 1000 ; N OE ; B 22 -5 981 684 ; +C 186 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ; +C 230 ; WX 722 ; N ae ; B 33 -14 693 473 ; +C -1 ; WX 278 ; N dotlessi ; B 16 0 255 461 ; +C -1 ; WX 278 ; N lslash ; B -22 0 303 676 ; +C 248 ; WX 500 ; N oslash ; B 25 -92 476 549 ; +C 156 ; WX 722 ; N oe ; B 22 -14 696 473 ; +C 223 ; WX 556 ; N germandbls ; B 19 -12 517 691 ; +C 207 ; WX 389 ; N Idieresis ; B 20 0 370 877 ; +C 233 ; WX 444 ; N eacute ; B 25 -14 426 713 ; +C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ; +C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ; +C 159 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ; +C 247 ; WX 570 ; N divide ; B 33 -31 537 537 ; +C 221 ; WX 722 ; N Yacute ; B 15 0 699 923 ; +C 194 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ; +C 225 ; WX 500 ; N aacute ; B 25 -14 488 713 ; +C 219 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ; +C 253 ; WX 500 ; N yacute ; B 16 -205 480 713 ; +C -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ; +C 234 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ; +C -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ; +C 220 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ; +C -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ; +C 218 ; WX 722 ; N Uacute ; B 16 -19 701 923 ; +C -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ; +C 203 ; WX 667 ; N Edieresis ; B 16 0 641 877 ; +C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ; +C -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ; +C 169 ; WX 747 ; N copyright ; B 26 -19 721 691 ; +C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ; +C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ; +C 229 ; WX 500 ; N aring ; B 25 -14 488 740 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ; +C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ; +C 224 ; WX 500 ; N agrave ; B 25 -14 488 713 ; +C -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ; +C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ; +C 227 ; WX 500 ; N atilde ; B 25 -14 488 674 ; +C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ; +C 154 ; WX 389 ; N scaron ; B 25 -14 363 704 ; +C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ; +C 237 ; WX 278 ; N iacute ; B 16 0 289 713 ; +C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; +C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ; +C 251 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ; +C 226 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ; +C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ; +C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ; +C 231 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ; +C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ; +C 222 ; WX 611 ; N Thorn ; B 16 0 600 676 ; +C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ; +C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ; +C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ; +C -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ; +C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ; +C -1 ; WX 556 ; N uring ; B 16 -14 537 740 ; +C 179 ; WX 300 ; N threesuperior ; B 3 268 297 688 ; +C 210 ; WX 778 ; N Ograve ; B 35 -19 743 923 ; +C 192 ; WX 722 ; N Agrave ; B 9 0 689 923 ; +C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ; +C 215 ; WX 570 ; N multiply ; B 48 16 522 490 ; +C 250 ; WX 556 ; N uacute ; B 16 -14 537 713 ; +C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ; +C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; +C 255 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ; +C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ; +C 238 ; WX 278 ; N icircumflex ; B -37 0 300 704 ; +C 202 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ; +C 228 ; WX 500 ; N adieresis ; B 25 -14 488 667 ; +C 235 ; WX 444 ; N edieresis ; B 25 -14 426 667 ; +C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ; +C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ; +C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ; +C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ; +C 205 ; WX 389 ; N Iacute ; B 20 0 370 923 ; +C 177 ; WX 570 ; N plusminus ; B 33 0 537 506 ; +C 166 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; +C 174 ; WX 747 ; N registered ; B 26 -19 721 691 ; +C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ; +C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ; +C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; +C 200 ; WX 667 ; N Egrave ; B 16 0 641 923 ; +C -1 ; WX 444 ; N racute ; B 29 0 434 713 ; +C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ; +C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ; +C 142 ; WX 667 ; N Zcaron ; B 28 0 634 914 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; +C 208 ; WX 722 ; N Eth ; B 6 0 690 676 ; +C 199 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ; +C -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ; +C -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ; +C -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ; +C -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ; +C 193 ; WX 722 ; N Aacute ; B 9 0 689 923 ; +C 196 ; WX 722 ; N Adieresis ; B 9 0 689 877 ; +C 232 ; WX 444 ; N egrave ; B 25 -14 426 713 ; +C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ; +C -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ; +C 211 ; WX 778 ; N Oacute ; B 35 -19 743 923 ; +C 243 ; WX 500 ; N oacute ; B 25 -14 476 713 ; +C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ; +C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ; +C 239 ; WX 278 ; N idieresis ; B -37 0 300 667 ; +C 212 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ; +C 217 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 556 ; N thorn ; B 19 -205 524 676 ; +C 178 ; WX 300 ; N twosuperior ; B 0 275 300 688 ; +C 214 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ; +C 181 ; WX 556 ; N mu ; B 33 -206 536 461 ; +C 236 ; WX 278 ; N igrave ; B -27 0 255 713 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ; +C -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ; +C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ; +C 190 ; WX 750 ; N threequarters ; B 23 -12 733 688 ; +C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ; +C -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ; +C -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ; +C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ; +C 153 ; WX 1000 ; N trademark ; B 24 271 977 676 ; +C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ; +C 204 ; WX 389 ; N Igrave ; B 20 0 370 923 ; +C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ; +C -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ; +C 189 ; WX 750 ; N onehalf ; B -7 -12 775 688 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; +C 244 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ; +C 241 ; WX 556 ; N ntilde ; B 21 0 539 674 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ; +C 201 ; WX 667 ; N Eacute ; B 16 0 641 923 ; +C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ; +C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ; +C 188 ; WX 750 ; N onequarter ; B 28 -12 743 688 ; +C 138 ; WX 556 ; N Scaron ; B 35 -19 513 914 ; +C -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ; +C 176 ; WX 400 ; N degree ; B 57 402 343 688 ; +C 242 ; WX 500 ; N ograve ; B 25 -14 476 713 ; +C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ; +C 249 ; WX 556 ; N ugrave ; B 16 -14 537 713 ; +C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; +C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ; +C -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ; +C 209 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ; +C 245 ; WX 500 ; N otilde ; B 25 -14 476 674 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ; +C -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ; +C 195 ; WX 722 ; N Atilde ; B 9 0 689 884 ; +C -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ; +C 197 ; WX 722 ; N Aring ; B 9 0 689 935 ; +C 213 ; WX 778 ; N Otilde ; B 35 -19 743 884 ; +C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ; +C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ; +C -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ; +C -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ; +C -1 ; WX 570 ; N minus ; B 33 209 537 297 ; +C 206 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ; +C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ; +C -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ; +C 172 ; WX 570 ; N logicalnot ; B 33 108 537 399 ; +C 246 ; WX 500 ; N odieresis ; B 25 -14 476 667 ; +C 252 ; WX 556 ; N udieresis ; B 16 -14 537 667 ; +C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; +C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ; +C 240 ; WX 500 ; N eth ; B 25 -14 476 691 ; +C 158 ; WX 444 ; N zcaron ; B 21 0 420 704 ; +C -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ; +C 185 ; WX 300 ; N onesuperior ; B 28 275 273 688 ; +C -1 ; WX 278 ; N imacron ; B -8 0 272 637 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2242 +KPX A C -55 +KPX A Cacute -55 +KPX A Ccaron -55 +KPX A Ccedilla -55 +KPX A G -55 +KPX A Gbreve -55 +KPX A Gcommaaccent -55 +KPX A O -45 +KPX A Oacute -45 +KPX A Ocircumflex -45 +KPX A Odieresis -45 +KPX A Ograve -45 +KPX A Ohungarumlaut -45 +KPX A Omacron -45 +KPX A Oslash -45 +KPX A Otilde -45 +KPX A Q -45 +KPX A T -95 +KPX A Tcaron -95 +KPX A Tcommaaccent -95 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -145 +KPX A W -130 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A p -25 +KPX A quoteright -74 +KPX A u -50 +KPX A uacute -50 +KPX A ucircumflex -50 +KPX A udieresis -50 +KPX A ugrave -50 +KPX A uhungarumlaut -50 +KPX A umacron -50 +KPX A uogonek -50 +KPX A uring -50 +KPX A v -100 +KPX A w -90 +KPX A y -74 +KPX A yacute -74 +KPX A ydieresis -74 +KPX Aacute C -55 +KPX Aacute Cacute -55 +KPX Aacute Ccaron -55 +KPX Aacute Ccedilla -55 +KPX Aacute G -55 +KPX Aacute Gbreve -55 +KPX Aacute Gcommaaccent -55 +KPX Aacute O -45 +KPX Aacute Oacute -45 +KPX Aacute Ocircumflex -45 +KPX Aacute Odieresis -45 +KPX Aacute Ograve -45 +KPX Aacute Ohungarumlaut -45 +KPX Aacute Omacron -45 +KPX Aacute Oslash -45 +KPX Aacute Otilde -45 +KPX Aacute Q -45 +KPX Aacute T -95 +KPX Aacute Tcaron -95 +KPX Aacute Tcommaaccent -95 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -145 +KPX Aacute W -130 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute p -25 +KPX Aacute quoteright -74 +KPX Aacute u -50 +KPX Aacute uacute -50 +KPX Aacute ucircumflex -50 +KPX Aacute udieresis -50 +KPX Aacute ugrave -50 +KPX Aacute uhungarumlaut -50 +KPX Aacute umacron -50 +KPX Aacute uogonek -50 +KPX Aacute uring -50 +KPX Aacute v -100 +KPX Aacute w -90 +KPX Aacute y -74 +KPX Aacute yacute -74 +KPX Aacute ydieresis -74 +KPX Abreve C -55 +KPX Abreve Cacute -55 +KPX Abreve Ccaron -55 +KPX Abreve Ccedilla -55 +KPX Abreve G -55 +KPX Abreve Gbreve -55 +KPX Abreve Gcommaaccent -55 +KPX Abreve O -45 +KPX Abreve Oacute -45 +KPX Abreve Ocircumflex -45 +KPX Abreve Odieresis -45 +KPX Abreve Ograve -45 +KPX Abreve Ohungarumlaut -45 +KPX Abreve Omacron -45 +KPX Abreve Oslash -45 +KPX Abreve Otilde -45 +KPX Abreve Q -45 +KPX Abreve T -95 +KPX Abreve Tcaron -95 +KPX Abreve Tcommaaccent -95 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -145 +KPX Abreve W -130 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve p -25 +KPX Abreve quoteright -74 +KPX Abreve u -50 +KPX Abreve uacute -50 +KPX Abreve ucircumflex -50 +KPX Abreve udieresis -50 +KPX Abreve ugrave -50 +KPX Abreve uhungarumlaut -50 +KPX Abreve umacron -50 +KPX Abreve uogonek -50 +KPX Abreve uring -50 +KPX Abreve v -100 +KPX Abreve w -90 +KPX Abreve y -74 +KPX Abreve yacute -74 +KPX Abreve ydieresis -74 +KPX Acircumflex C -55 +KPX Acircumflex Cacute -55 +KPX Acircumflex Ccaron -55 +KPX Acircumflex Ccedilla -55 +KPX Acircumflex G -55 +KPX Acircumflex Gbreve -55 +KPX Acircumflex Gcommaaccent -55 +KPX Acircumflex O -45 +KPX Acircumflex Oacute -45 +KPX Acircumflex Ocircumflex -45 +KPX Acircumflex Odieresis -45 +KPX Acircumflex Ograve -45 +KPX Acircumflex Ohungarumlaut -45 +KPX Acircumflex Omacron -45 +KPX Acircumflex Oslash -45 +KPX Acircumflex Otilde -45 +KPX Acircumflex Q -45 +KPX Acircumflex T -95 +KPX Acircumflex Tcaron -95 +KPX Acircumflex Tcommaaccent -95 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -145 +KPX Acircumflex W -130 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex p -25 +KPX Acircumflex quoteright -74 +KPX Acircumflex u -50 +KPX Acircumflex uacute -50 +KPX Acircumflex ucircumflex -50 +KPX Acircumflex udieresis -50 +KPX Acircumflex ugrave -50 +KPX Acircumflex uhungarumlaut -50 +KPX Acircumflex umacron -50 +KPX Acircumflex uogonek -50 +KPX Acircumflex uring -50 +KPX Acircumflex v -100 +KPX Acircumflex w -90 +KPX Acircumflex y -74 +KPX Acircumflex yacute -74 +KPX Acircumflex ydieresis -74 +KPX Adieresis C -55 +KPX Adieresis Cacute -55 +KPX Adieresis Ccaron -55 +KPX Adieresis Ccedilla -55 +KPX Adieresis G -55 +KPX Adieresis Gbreve -55 +KPX Adieresis Gcommaaccent -55 +KPX Adieresis O -45 +KPX Adieresis Oacute -45 +KPX Adieresis Ocircumflex -45 +KPX Adieresis Odieresis -45 +KPX Adieresis Ograve -45 +KPX Adieresis Ohungarumlaut -45 +KPX Adieresis Omacron -45 +KPX Adieresis Oslash -45 +KPX Adieresis Otilde -45 +KPX Adieresis Q -45 +KPX Adieresis T -95 +KPX Adieresis Tcaron -95 +KPX Adieresis Tcommaaccent -95 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -145 +KPX Adieresis W -130 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis p -25 +KPX Adieresis quoteright -74 +KPX Adieresis u -50 +KPX Adieresis uacute -50 +KPX Adieresis ucircumflex -50 +KPX Adieresis udieresis -50 +KPX Adieresis ugrave -50 +KPX Adieresis uhungarumlaut -50 +KPX Adieresis umacron -50 +KPX Adieresis uogonek -50 +KPX Adieresis uring -50 +KPX Adieresis v -100 +KPX Adieresis w -90 +KPX Adieresis y -74 +KPX Adieresis yacute -74 +KPX Adieresis ydieresis -74 +KPX Agrave C -55 +KPX Agrave Cacute -55 +KPX Agrave Ccaron -55 +KPX Agrave Ccedilla -55 +KPX Agrave G -55 +KPX Agrave Gbreve -55 +KPX Agrave Gcommaaccent -55 +KPX Agrave O -45 +KPX Agrave Oacute -45 +KPX Agrave Ocircumflex -45 +KPX Agrave Odieresis -45 +KPX Agrave Ograve -45 +KPX Agrave Ohungarumlaut -45 +KPX Agrave Omacron -45 +KPX Agrave Oslash -45 +KPX Agrave Otilde -45 +KPX Agrave Q -45 +KPX Agrave T -95 +KPX Agrave Tcaron -95 +KPX Agrave Tcommaaccent -95 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -145 +KPX Agrave W -130 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave p -25 +KPX Agrave quoteright -74 +KPX Agrave u -50 +KPX Agrave uacute -50 +KPX Agrave ucircumflex -50 +KPX Agrave udieresis -50 +KPX Agrave ugrave -50 +KPX Agrave uhungarumlaut -50 +KPX Agrave umacron -50 +KPX Agrave uogonek -50 +KPX Agrave uring -50 +KPX Agrave v -100 +KPX Agrave w -90 +KPX Agrave y -74 +KPX Agrave yacute -74 +KPX Agrave ydieresis -74 +KPX Amacron C -55 +KPX Amacron Cacute -55 +KPX Amacron Ccaron -55 +KPX Amacron Ccedilla -55 +KPX Amacron G -55 +KPX Amacron Gbreve -55 +KPX Amacron Gcommaaccent -55 +KPX Amacron O -45 +KPX Amacron Oacute -45 +KPX Amacron Ocircumflex -45 +KPX Amacron Odieresis -45 +KPX Amacron Ograve -45 +KPX Amacron Ohungarumlaut -45 +KPX Amacron Omacron -45 +KPX Amacron Oslash -45 +KPX Amacron Otilde -45 +KPX Amacron Q -45 +KPX Amacron T -95 +KPX Amacron Tcaron -95 +KPX Amacron Tcommaaccent -95 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -145 +KPX Amacron W -130 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron p -25 +KPX Amacron quoteright -74 +KPX Amacron u -50 +KPX Amacron uacute -50 +KPX Amacron ucircumflex -50 +KPX Amacron udieresis -50 +KPX Amacron ugrave -50 +KPX Amacron uhungarumlaut -50 +KPX Amacron umacron -50 +KPX Amacron uogonek -50 +KPX Amacron uring -50 +KPX Amacron v -100 +KPX Amacron w -90 +KPX Amacron y -74 +KPX Amacron yacute -74 +KPX Amacron ydieresis -74 +KPX Aogonek C -55 +KPX Aogonek Cacute -55 +KPX Aogonek Ccaron -55 +KPX Aogonek Ccedilla -55 +KPX Aogonek G -55 +KPX Aogonek Gbreve -55 +KPX Aogonek Gcommaaccent -55 +KPX Aogonek O -45 +KPX Aogonek Oacute -45 +KPX Aogonek Ocircumflex -45 +KPX Aogonek Odieresis -45 +KPX Aogonek Ograve -45 +KPX Aogonek Ohungarumlaut -45 +KPX Aogonek Omacron -45 +KPX Aogonek Oslash -45 +KPX Aogonek Otilde -45 +KPX Aogonek Q -45 +KPX Aogonek T -95 +KPX Aogonek Tcaron -95 +KPX Aogonek Tcommaaccent -95 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -145 +KPX Aogonek W -130 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek p -25 +KPX Aogonek quoteright -74 +KPX Aogonek u -50 +KPX Aogonek uacute -50 +KPX Aogonek ucircumflex -50 +KPX Aogonek udieresis -50 +KPX Aogonek ugrave -50 +KPX Aogonek uhungarumlaut -50 +KPX Aogonek umacron -50 +KPX Aogonek uogonek -50 +KPX Aogonek uring -50 +KPX Aogonek v -100 +KPX Aogonek w -90 +KPX Aogonek y -34 +KPX Aogonek yacute -34 +KPX Aogonek ydieresis -34 +KPX Aring C -55 +KPX Aring Cacute -55 +KPX Aring Ccaron -55 +KPX Aring Ccedilla -55 +KPX Aring G -55 +KPX Aring Gbreve -55 +KPX Aring Gcommaaccent -55 +KPX Aring O -45 +KPX Aring Oacute -45 +KPX Aring Ocircumflex -45 +KPX Aring Odieresis -45 +KPX Aring Ograve -45 +KPX Aring Ohungarumlaut -45 +KPX Aring Omacron -45 +KPX Aring Oslash -45 +KPX Aring Otilde -45 +KPX Aring Q -45 +KPX Aring T -95 +KPX Aring Tcaron -95 +KPX Aring Tcommaaccent -95 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -145 +KPX Aring W -130 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring p -25 +KPX Aring quoteright -74 +KPX Aring u -50 +KPX Aring uacute -50 +KPX Aring ucircumflex -50 +KPX Aring udieresis -50 +KPX Aring ugrave -50 +KPX Aring uhungarumlaut -50 +KPX Aring umacron -50 +KPX Aring uogonek -50 +KPX Aring uring -50 +KPX Aring v -100 +KPX Aring w -90 +KPX Aring y -74 +KPX Aring yacute -74 +KPX Aring ydieresis -74 +KPX Atilde C -55 +KPX Atilde Cacute -55 +KPX Atilde Ccaron -55 +KPX Atilde Ccedilla -55 +KPX Atilde G -55 +KPX Atilde Gbreve -55 +KPX Atilde Gcommaaccent -55 +KPX Atilde O -45 +KPX Atilde Oacute -45 +KPX Atilde Ocircumflex -45 +KPX Atilde Odieresis -45 +KPX Atilde Ograve -45 +KPX Atilde Ohungarumlaut -45 +KPX Atilde Omacron -45 +KPX Atilde Oslash -45 +KPX Atilde Otilde -45 +KPX Atilde Q -45 +KPX Atilde T -95 +KPX Atilde Tcaron -95 +KPX Atilde Tcommaaccent -95 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -145 +KPX Atilde W -130 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde p -25 +KPX Atilde quoteright -74 +KPX Atilde u -50 +KPX Atilde uacute -50 +KPX Atilde ucircumflex -50 +KPX Atilde udieresis -50 +KPX Atilde ugrave -50 +KPX Atilde uhungarumlaut -50 +KPX Atilde umacron -50 +KPX Atilde uogonek -50 +KPX Atilde uring -50 +KPX Atilde v -100 +KPX Atilde w -90 +KPX Atilde y -74 +KPX Atilde yacute -74 +KPX Atilde ydieresis -74 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -35 +KPX D Aacute -35 +KPX D Abreve -35 +KPX D Acircumflex -35 +KPX D Adieresis -35 +KPX D Agrave -35 +KPX D Amacron -35 +KPX D Aogonek -35 +KPX D Aring -35 +KPX D Atilde -35 +KPX D V -40 +KPX D W -40 +KPX D Y -40 +KPX D Yacute -40 +KPX D Ydieresis -40 +KPX D period -20 +KPX Dcaron A -35 +KPX Dcaron Aacute -35 +KPX Dcaron Abreve -35 +KPX Dcaron Acircumflex -35 +KPX Dcaron Adieresis -35 +KPX Dcaron Agrave -35 +KPX Dcaron Amacron -35 +KPX Dcaron Aogonek -35 +KPX Dcaron Aring -35 +KPX Dcaron Atilde -35 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -40 +KPX Dcaron Yacute -40 +KPX Dcaron Ydieresis -40 +KPX Dcaron period -20 +KPX Dcroat A -35 +KPX Dcroat Aacute -35 +KPX Dcroat Abreve -35 +KPX Dcroat Acircumflex -35 +KPX Dcroat Adieresis -35 +KPX Dcroat Agrave -35 +KPX Dcroat Amacron -35 +KPX Dcroat Aogonek -35 +KPX Dcroat Aring -35 +KPX Dcroat Atilde -35 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -40 +KPX Dcroat Yacute -40 +KPX Dcroat Ydieresis -40 +KPX Dcroat period -20 +KPX F A -90 +KPX F Aacute -90 +KPX F Abreve -90 +KPX F Acircumflex -90 +KPX F Adieresis -90 +KPX F Agrave -90 +KPX F Amacron -90 +KPX F Aogonek -90 +KPX F Aring -90 +KPX F Atilde -90 +KPX F a -25 +KPX F aacute -25 +KPX F abreve -25 +KPX F acircumflex -25 +KPX F adieresis -25 +KPX F agrave -25 +KPX F amacron -25 +KPX F aogonek -25 +KPX F aring -25 +KPX F atilde -25 +KPX F comma -92 +KPX F e -25 +KPX F eacute -25 +KPX F ecaron -25 +KPX F ecircumflex -25 +KPX F edieresis -25 +KPX F edotaccent -25 +KPX F egrave -25 +KPX F emacron -25 +KPX F eogonek -25 +KPX F o -25 +KPX F oacute -25 +KPX F ocircumflex -25 +KPX F odieresis -25 +KPX F ograve -25 +KPX F ohungarumlaut -25 +KPX F omacron -25 +KPX F oslash -25 +KPX F otilde -25 +KPX F period -110 +KPX J A -30 +KPX J Aacute -30 +KPX J Abreve -30 +KPX J Acircumflex -30 +KPX J Adieresis -30 +KPX J Agrave -30 +KPX J Amacron -30 +KPX J Aogonek -30 +KPX J Aring -30 +KPX J Atilde -30 +KPX J a -15 +KPX J aacute -15 +KPX J abreve -15 +KPX J acircumflex -15 +KPX J adieresis -15 +KPX J agrave -15 +KPX J amacron -15 +KPX J aogonek -15 +KPX J aring -15 +KPX J atilde -15 +KPX J e -15 +KPX J eacute -15 +KPX J ecaron -15 +KPX J ecircumflex -15 +KPX J edieresis -15 +KPX J edotaccent -15 +KPX J egrave -15 +KPX J emacron -15 +KPX J eogonek -15 +KPX J o -15 +KPX J oacute -15 +KPX J ocircumflex -15 +KPX J odieresis -15 +KPX J ograve -15 +KPX J ohungarumlaut -15 +KPX J omacron -15 +KPX J oslash -15 +KPX J otilde -15 +KPX J period -20 +KPX J u -15 +KPX J uacute -15 +KPX J ucircumflex -15 +KPX J udieresis -15 +KPX J ugrave -15 +KPX J uhungarumlaut -15 +KPX J umacron -15 +KPX J uogonek -15 +KPX J uring -15 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -25 +KPX K eacute -25 +KPX K ecaron -25 +KPX K ecircumflex -25 +KPX K edieresis -25 +KPX K edotaccent -25 +KPX K egrave -25 +KPX K emacron -25 +KPX K eogonek -25 +KPX K o -25 +KPX K oacute -25 +KPX K ocircumflex -25 +KPX K odieresis -25 +KPX K ograve -25 +KPX K ohungarumlaut -25 +KPX K omacron -25 +KPX K oslash -25 +KPX K otilde -25 +KPX K u -15 +KPX K uacute -15 +KPX K ucircumflex -15 +KPX K udieresis -15 +KPX K ugrave -15 +KPX K uhungarumlaut -15 +KPX K umacron -15 +KPX K uogonek -15 +KPX K uring -15 +KPX K y -45 +KPX K yacute -45 +KPX K ydieresis -45 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -25 +KPX Kcommaaccent eacute -25 +KPX Kcommaaccent ecaron -25 +KPX Kcommaaccent ecircumflex -25 +KPX Kcommaaccent edieresis -25 +KPX Kcommaaccent edotaccent -25 +KPX Kcommaaccent egrave -25 +KPX Kcommaaccent emacron -25 +KPX Kcommaaccent eogonek -25 +KPX Kcommaaccent o -25 +KPX Kcommaaccent oacute -25 +KPX Kcommaaccent ocircumflex -25 +KPX Kcommaaccent odieresis -25 +KPX Kcommaaccent ograve -25 +KPX Kcommaaccent ohungarumlaut -25 +KPX Kcommaaccent omacron -25 +KPX Kcommaaccent oslash -25 +KPX Kcommaaccent otilde -25 +KPX Kcommaaccent u -15 +KPX Kcommaaccent uacute -15 +KPX Kcommaaccent ucircumflex -15 +KPX Kcommaaccent udieresis -15 +KPX Kcommaaccent ugrave -15 +KPX Kcommaaccent uhungarumlaut -15 +KPX Kcommaaccent umacron -15 +KPX Kcommaaccent uogonek -15 +KPX Kcommaaccent uring -15 +KPX Kcommaaccent y -45 +KPX Kcommaaccent yacute -45 +KPX Kcommaaccent ydieresis -45 +KPX L T -92 +KPX L Tcaron -92 +KPX L Tcommaaccent -92 +KPX L V -92 +KPX L W -92 +KPX L Y -92 +KPX L Yacute -92 +KPX L Ydieresis -92 +KPX L quotedblright -20 +KPX L quoteright -110 +KPX L y -55 +KPX L yacute -55 +KPX L ydieresis -55 +KPX Lacute T -92 +KPX Lacute Tcaron -92 +KPX Lacute Tcommaaccent -92 +KPX Lacute V -92 +KPX Lacute W -92 +KPX Lacute Y -92 +KPX Lacute Yacute -92 +KPX Lacute Ydieresis -92 +KPX Lacute quotedblright -20 +KPX Lacute quoteright -110 +KPX Lacute y -55 +KPX Lacute yacute -55 +KPX Lacute ydieresis -55 +KPX Lcommaaccent T -92 +KPX Lcommaaccent Tcaron -92 +KPX Lcommaaccent Tcommaaccent -92 +KPX Lcommaaccent V -92 +KPX Lcommaaccent W -92 +KPX Lcommaaccent Y -92 +KPX Lcommaaccent Yacute -92 +KPX Lcommaaccent Ydieresis -92 +KPX Lcommaaccent quotedblright -20 +KPX Lcommaaccent quoteright -110 +KPX Lcommaaccent y -55 +KPX Lcommaaccent yacute -55 +KPX Lcommaaccent ydieresis -55 +KPX Lslash T -92 +KPX Lslash Tcaron -92 +KPX Lslash Tcommaaccent -92 +KPX Lslash V -92 +KPX Lslash W -92 +KPX Lslash Y -92 +KPX Lslash Yacute -92 +KPX Lslash Ydieresis -92 +KPX Lslash quotedblright -20 +KPX Lslash quoteright -110 +KPX Lslash y -55 +KPX Lslash yacute -55 +KPX Lslash ydieresis -55 +KPX N A -20 +KPX N Aacute -20 +KPX N Abreve -20 +KPX N Acircumflex -20 +KPX N Adieresis -20 +KPX N Agrave -20 +KPX N Amacron -20 +KPX N Aogonek -20 +KPX N Aring -20 +KPX N Atilde -20 +KPX Nacute A -20 +KPX Nacute Aacute -20 +KPX Nacute Abreve -20 +KPX Nacute Acircumflex -20 +KPX Nacute Adieresis -20 +KPX Nacute Agrave -20 +KPX Nacute Amacron -20 +KPX Nacute Aogonek -20 +KPX Nacute Aring -20 +KPX Nacute Atilde -20 +KPX Ncaron A -20 +KPX Ncaron Aacute -20 +KPX Ncaron Abreve -20 +KPX Ncaron Acircumflex -20 +KPX Ncaron Adieresis -20 +KPX Ncaron Agrave -20 +KPX Ncaron Amacron -20 +KPX Ncaron Aogonek -20 +KPX Ncaron Aring -20 +KPX Ncaron Atilde -20 +KPX Ncommaaccent A -20 +KPX Ncommaaccent Aacute -20 +KPX Ncommaaccent Abreve -20 +KPX Ncommaaccent Acircumflex -20 +KPX Ncommaaccent Adieresis -20 +KPX Ncommaaccent Agrave -20 +KPX Ncommaaccent Amacron -20 +KPX Ncommaaccent Aogonek -20 +KPX Ncommaaccent Aring -20 +KPX Ncommaaccent Atilde -20 +KPX Ntilde A -20 +KPX Ntilde Aacute -20 +KPX Ntilde Abreve -20 +KPX Ntilde Acircumflex -20 +KPX Ntilde Adieresis -20 +KPX Ntilde Agrave -20 +KPX Ntilde Amacron -20 +KPX Ntilde Aogonek -20 +KPX Ntilde Aring -20 +KPX Ntilde Atilde -20 +KPX O A -40 +KPX O Aacute -40 +KPX O Abreve -40 +KPX O Acircumflex -40 +KPX O Adieresis -40 +KPX O Agrave -40 +KPX O Amacron -40 +KPX O Aogonek -40 +KPX O Aring -40 +KPX O Atilde -40 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -40 +KPX Oacute Aacute -40 +KPX Oacute Abreve -40 +KPX Oacute Acircumflex -40 +KPX Oacute Adieresis -40 +KPX Oacute Agrave -40 +KPX Oacute Amacron -40 +KPX Oacute Aogonek -40 +KPX Oacute Aring -40 +KPX Oacute Atilde -40 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -40 +KPX Ocircumflex Aacute -40 +KPX Ocircumflex Abreve -40 +KPX Ocircumflex Acircumflex -40 +KPX Ocircumflex Adieresis -40 +KPX Ocircumflex Agrave -40 +KPX Ocircumflex Amacron -40 +KPX Ocircumflex Aogonek -40 +KPX Ocircumflex Aring -40 +KPX Ocircumflex Atilde -40 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -40 +KPX Odieresis Aacute -40 +KPX Odieresis Abreve -40 +KPX Odieresis Acircumflex -40 +KPX Odieresis Adieresis -40 +KPX Odieresis Agrave -40 +KPX Odieresis Amacron -40 +KPX Odieresis Aogonek -40 +KPX Odieresis Aring -40 +KPX Odieresis Atilde -40 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -40 +KPX Ograve Aacute -40 +KPX Ograve Abreve -40 +KPX Ograve Acircumflex -40 +KPX Ograve Adieresis -40 +KPX Ograve Agrave -40 +KPX Ograve Amacron -40 +KPX Ograve Aogonek -40 +KPX Ograve Aring -40 +KPX Ograve Atilde -40 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -40 +KPX Ohungarumlaut Aacute -40 +KPX Ohungarumlaut Abreve -40 +KPX Ohungarumlaut Acircumflex -40 +KPX Ohungarumlaut Adieresis -40 +KPX Ohungarumlaut Agrave -40 +KPX Ohungarumlaut Amacron -40 +KPX Ohungarumlaut Aogonek -40 +KPX Ohungarumlaut Aring -40 +KPX Ohungarumlaut Atilde -40 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -40 +KPX Omacron Aacute -40 +KPX Omacron Abreve -40 +KPX Omacron Acircumflex -40 +KPX Omacron Adieresis -40 +KPX Omacron Agrave -40 +KPX Omacron Amacron -40 +KPX Omacron Aogonek -40 +KPX Omacron Aring -40 +KPX Omacron Atilde -40 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -40 +KPX Oslash Aacute -40 +KPX Oslash Abreve -40 +KPX Oslash Acircumflex -40 +KPX Oslash Adieresis -40 +KPX Oslash Agrave -40 +KPX Oslash Amacron -40 +KPX Oslash Aogonek -40 +KPX Oslash Aring -40 +KPX Oslash Atilde -40 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -40 +KPX Otilde Aacute -40 +KPX Otilde Abreve -40 +KPX Otilde Acircumflex -40 +KPX Otilde Adieresis -40 +KPX Otilde Agrave -40 +KPX Otilde Amacron -40 +KPX Otilde Aogonek -40 +KPX Otilde Aring -40 +KPX Otilde Atilde -40 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -74 +KPX P Aacute -74 +KPX P Abreve -74 +KPX P Acircumflex -74 +KPX P Adieresis -74 +KPX P Agrave -74 +KPX P Amacron -74 +KPX P Aogonek -74 +KPX P Aring -74 +KPX P Atilde -74 +KPX P a -10 +KPX P aacute -10 +KPX P abreve -10 +KPX P acircumflex -10 +KPX P adieresis -10 +KPX P agrave -10 +KPX P amacron -10 +KPX P aogonek -10 +KPX P aring -10 +KPX P atilde -10 +KPX P comma -92 +KPX P e -20 +KPX P eacute -20 +KPX P ecaron -20 +KPX P ecircumflex -20 +KPX P edieresis -20 +KPX P edotaccent -20 +KPX P egrave -20 +KPX P emacron -20 +KPX P eogonek -20 +KPX P o -20 +KPX P oacute -20 +KPX P ocircumflex -20 +KPX P odieresis -20 +KPX P ograve -20 +KPX P ohungarumlaut -20 +KPX P omacron -20 +KPX P oslash -20 +KPX P otilde -20 +KPX P period -110 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q period -20 +KPX R O -30 +KPX R Oacute -30 +KPX R Ocircumflex -30 +KPX R Odieresis -30 +KPX R Ograve -30 +KPX R Ohungarumlaut -30 +KPX R Omacron -30 +KPX R Oslash -30 +KPX R Otilde -30 +KPX R T -40 +KPX R Tcaron -40 +KPX R Tcommaaccent -40 +KPX R U -30 +KPX R Uacute -30 +KPX R Ucircumflex -30 +KPX R Udieresis -30 +KPX R Ugrave -30 +KPX R Uhungarumlaut -30 +KPX R Umacron -30 +KPX R Uogonek -30 +KPX R Uring -30 +KPX R V -55 +KPX R W -35 +KPX R Y -35 +KPX R Yacute -35 +KPX R Ydieresis -35 +KPX Racute O -30 +KPX Racute Oacute -30 +KPX Racute Ocircumflex -30 +KPX Racute Odieresis -30 +KPX Racute Ograve -30 +KPX Racute Ohungarumlaut -30 +KPX Racute Omacron -30 +KPX Racute Oslash -30 +KPX Racute Otilde -30 +KPX Racute T -40 +KPX Racute Tcaron -40 +KPX Racute Tcommaaccent -40 +KPX Racute U -30 +KPX Racute Uacute -30 +KPX Racute Ucircumflex -30 +KPX Racute Udieresis -30 +KPX Racute Ugrave -30 +KPX Racute Uhungarumlaut -30 +KPX Racute Umacron -30 +KPX Racute Uogonek -30 +KPX Racute Uring -30 +KPX Racute V -55 +KPX Racute W -35 +KPX Racute Y -35 +KPX Racute Yacute -35 +KPX Racute Ydieresis -35 +KPX Rcaron O -30 +KPX Rcaron Oacute -30 +KPX Rcaron Ocircumflex -30 +KPX Rcaron Odieresis -30 +KPX Rcaron Ograve -30 +KPX Rcaron Ohungarumlaut -30 +KPX Rcaron Omacron -30 +KPX Rcaron Oslash -30 +KPX Rcaron Otilde -30 +KPX Rcaron T -40 +KPX Rcaron Tcaron -40 +KPX Rcaron Tcommaaccent -40 +KPX Rcaron U -30 +KPX Rcaron Uacute -30 +KPX Rcaron Ucircumflex -30 +KPX Rcaron Udieresis -30 +KPX Rcaron Ugrave -30 +KPX Rcaron Uhungarumlaut -30 +KPX Rcaron Umacron -30 +KPX Rcaron Uogonek -30 +KPX Rcaron Uring -30 +KPX Rcaron V -55 +KPX Rcaron W -35 +KPX Rcaron Y -35 +KPX Rcaron Yacute -35 +KPX Rcaron Ydieresis -35 +KPX Rcommaaccent O -30 +KPX Rcommaaccent Oacute -30 +KPX Rcommaaccent Ocircumflex -30 +KPX Rcommaaccent Odieresis -30 +KPX Rcommaaccent Ograve -30 +KPX Rcommaaccent Ohungarumlaut -30 +KPX Rcommaaccent Omacron -30 +KPX Rcommaaccent Oslash -30 +KPX Rcommaaccent Otilde -30 +KPX Rcommaaccent T -40 +KPX Rcommaaccent Tcaron -40 +KPX Rcommaaccent Tcommaaccent -40 +KPX Rcommaaccent U -30 +KPX Rcommaaccent Uacute -30 +KPX Rcommaaccent Ucircumflex -30 +KPX Rcommaaccent Udieresis -30 +KPX Rcommaaccent Ugrave -30 +KPX Rcommaaccent Uhungarumlaut -30 +KPX Rcommaaccent Umacron -30 +KPX Rcommaaccent Uogonek -30 +KPX Rcommaaccent Uring -30 +KPX Rcommaaccent V -55 +KPX Rcommaaccent W -35 +KPX Rcommaaccent Y -35 +KPX Rcommaaccent Yacute -35 +KPX Rcommaaccent Ydieresis -35 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -92 +KPX T aacute -92 +KPX T abreve -52 +KPX T acircumflex -52 +KPX T adieresis -52 +KPX T agrave -52 +KPX T amacron -52 +KPX T aogonek -92 +KPX T aring -92 +KPX T atilde -52 +KPX T colon -74 +KPX T comma -74 +KPX T e -92 +KPX T eacute -92 +KPX T ecaron -92 +KPX T ecircumflex -92 +KPX T edieresis -52 +KPX T edotaccent -92 +KPX T egrave -52 +KPX T emacron -52 +KPX T eogonek -92 +KPX T hyphen -92 +KPX T i -18 +KPX T iacute -18 +KPX T iogonek -18 +KPX T o -92 +KPX T oacute -92 +KPX T ocircumflex -92 +KPX T odieresis -92 +KPX T ograve -92 +KPX T ohungarumlaut -92 +KPX T omacron -92 +KPX T oslash -92 +KPX T otilde -92 +KPX T period -90 +KPX T r -74 +KPX T racute -74 +KPX T rcaron -74 +KPX T rcommaaccent -74 +KPX T semicolon -74 +KPX T u -92 +KPX T uacute -92 +KPX T ucircumflex -92 +KPX T udieresis -92 +KPX T ugrave -92 +KPX T uhungarumlaut -92 +KPX T umacron -92 +KPX T uogonek -92 +KPX T uring -92 +KPX T w -74 +KPX T y -34 +KPX T yacute -34 +KPX T ydieresis -34 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -92 +KPX Tcaron aacute -92 +KPX Tcaron abreve -52 +KPX Tcaron acircumflex -52 +KPX Tcaron adieresis -52 +KPX Tcaron agrave -52 +KPX Tcaron amacron -52 +KPX Tcaron aogonek -92 +KPX Tcaron aring -92 +KPX Tcaron atilde -52 +KPX Tcaron colon -74 +KPX Tcaron comma -74 +KPX Tcaron e -92 +KPX Tcaron eacute -92 +KPX Tcaron ecaron -92 +KPX Tcaron ecircumflex -92 +KPX Tcaron edieresis -52 +KPX Tcaron edotaccent -92 +KPX Tcaron egrave -52 +KPX Tcaron emacron -52 +KPX Tcaron eogonek -92 +KPX Tcaron hyphen -92 +KPX Tcaron i -18 +KPX Tcaron iacute -18 +KPX Tcaron iogonek -18 +KPX Tcaron o -92 +KPX Tcaron oacute -92 +KPX Tcaron ocircumflex -92 +KPX Tcaron odieresis -92 +KPX Tcaron ograve -92 +KPX Tcaron ohungarumlaut -92 +KPX Tcaron omacron -92 +KPX Tcaron oslash -92 +KPX Tcaron otilde -92 +KPX Tcaron period -90 +KPX Tcaron r -74 +KPX Tcaron racute -74 +KPX Tcaron rcaron -74 +KPX Tcaron rcommaaccent -74 +KPX Tcaron semicolon -74 +KPX Tcaron u -92 +KPX Tcaron uacute -92 +KPX Tcaron ucircumflex -92 +KPX Tcaron udieresis -92 +KPX Tcaron ugrave -92 +KPX Tcaron uhungarumlaut -92 +KPX Tcaron umacron -92 +KPX Tcaron uogonek -92 +KPX Tcaron uring -92 +KPX Tcaron w -74 +KPX Tcaron y -34 +KPX Tcaron yacute -34 +KPX Tcaron ydieresis -34 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -92 +KPX Tcommaaccent aacute -92 +KPX Tcommaaccent abreve -52 +KPX Tcommaaccent acircumflex -52 +KPX Tcommaaccent adieresis -52 +KPX Tcommaaccent agrave -52 +KPX Tcommaaccent amacron -52 +KPX Tcommaaccent aogonek -92 +KPX Tcommaaccent aring -92 +KPX Tcommaaccent atilde -52 +KPX Tcommaaccent colon -74 +KPX Tcommaaccent comma -74 +KPX Tcommaaccent e -92 +KPX Tcommaaccent eacute -92 +KPX Tcommaaccent ecaron -92 +KPX Tcommaaccent ecircumflex -92 +KPX Tcommaaccent edieresis -52 +KPX Tcommaaccent edotaccent -92 +KPX Tcommaaccent egrave -52 +KPX Tcommaaccent emacron -52 +KPX Tcommaaccent eogonek -92 +KPX Tcommaaccent hyphen -92 +KPX Tcommaaccent i -18 +KPX Tcommaaccent iacute -18 +KPX Tcommaaccent iogonek -18 +KPX Tcommaaccent o -92 +KPX Tcommaaccent oacute -92 +KPX Tcommaaccent ocircumflex -92 +KPX Tcommaaccent odieresis -92 +KPX Tcommaaccent ograve -92 +KPX Tcommaaccent ohungarumlaut -92 +KPX Tcommaaccent omacron -92 +KPX Tcommaaccent oslash -92 +KPX Tcommaaccent otilde -92 +KPX Tcommaaccent period -90 +KPX Tcommaaccent r -74 +KPX Tcommaaccent racute -74 +KPX Tcommaaccent rcaron -74 +KPX Tcommaaccent rcommaaccent -74 +KPX Tcommaaccent semicolon -74 +KPX Tcommaaccent u -92 +KPX Tcommaaccent uacute -92 +KPX Tcommaaccent ucircumflex -92 +KPX Tcommaaccent udieresis -92 +KPX Tcommaaccent ugrave -92 +KPX Tcommaaccent uhungarumlaut -92 +KPX Tcommaaccent umacron -92 +KPX Tcommaaccent uogonek -92 +KPX Tcommaaccent uring -92 +KPX Tcommaaccent w -74 +KPX Tcommaaccent y -34 +KPX Tcommaaccent yacute -34 +KPX Tcommaaccent ydieresis -34 +KPX U A -60 +KPX U Aacute -60 +KPX U Abreve -60 +KPX U Acircumflex -60 +KPX U Adieresis -60 +KPX U Agrave -60 +KPX U Amacron -60 +KPX U Aogonek -60 +KPX U Aring -60 +KPX U Atilde -60 +KPX U comma -50 +KPX U period -50 +KPX Uacute A -60 +KPX Uacute Aacute -60 +KPX Uacute Abreve -60 +KPX Uacute Acircumflex -60 +KPX Uacute Adieresis -60 +KPX Uacute Agrave -60 +KPX Uacute Amacron -60 +KPX Uacute Aogonek -60 +KPX Uacute Aring -60 +KPX Uacute Atilde -60 +KPX Uacute comma -50 +KPX Uacute period -50 +KPX Ucircumflex A -60 +KPX Ucircumflex Aacute -60 +KPX Ucircumflex Abreve -60 +KPX Ucircumflex Acircumflex -60 +KPX Ucircumflex Adieresis -60 +KPX Ucircumflex Agrave -60 +KPX Ucircumflex Amacron -60 +KPX Ucircumflex Aogonek -60 +KPX Ucircumflex Aring -60 +KPX Ucircumflex Atilde -60 +KPX Ucircumflex comma -50 +KPX Ucircumflex period -50 +KPX Udieresis A -60 +KPX Udieresis Aacute -60 +KPX Udieresis Abreve -60 +KPX Udieresis Acircumflex -60 +KPX Udieresis Adieresis -60 +KPX Udieresis Agrave -60 +KPX Udieresis Amacron -60 +KPX Udieresis Aogonek -60 +KPX Udieresis Aring -60 +KPX Udieresis Atilde -60 +KPX Udieresis comma -50 +KPX Udieresis period -50 +KPX Ugrave A -60 +KPX Ugrave Aacute -60 +KPX Ugrave Abreve -60 +KPX Ugrave Acircumflex -60 +KPX Ugrave Adieresis -60 +KPX Ugrave Agrave -60 +KPX Ugrave Amacron -60 +KPX Ugrave Aogonek -60 +KPX Ugrave Aring -60 +KPX Ugrave Atilde -60 +KPX Ugrave comma -50 +KPX Ugrave period -50 +KPX Uhungarumlaut A -60 +KPX Uhungarumlaut Aacute -60 +KPX Uhungarumlaut Abreve -60 +KPX Uhungarumlaut Acircumflex -60 +KPX Uhungarumlaut Adieresis -60 +KPX Uhungarumlaut Agrave -60 +KPX Uhungarumlaut Amacron -60 +KPX Uhungarumlaut Aogonek -60 +KPX Uhungarumlaut Aring -60 +KPX Uhungarumlaut Atilde -60 +KPX Uhungarumlaut comma -50 +KPX Uhungarumlaut period -50 +KPX Umacron A -60 +KPX Umacron Aacute -60 +KPX Umacron Abreve -60 +KPX Umacron Acircumflex -60 +KPX Umacron Adieresis -60 +KPX Umacron Agrave -60 +KPX Umacron Amacron -60 +KPX Umacron Aogonek -60 +KPX Umacron Aring -60 +KPX Umacron Atilde -60 +KPX Umacron comma -50 +KPX Umacron period -50 +KPX Uogonek A -60 +KPX Uogonek Aacute -60 +KPX Uogonek Abreve -60 +KPX Uogonek Acircumflex -60 +KPX Uogonek Adieresis -60 +KPX Uogonek Agrave -60 +KPX Uogonek Amacron -60 +KPX Uogonek Aogonek -60 +KPX Uogonek Aring -60 +KPX Uogonek Atilde -60 +KPX Uogonek comma -50 +KPX Uogonek period -50 +KPX Uring A -60 +KPX Uring Aacute -60 +KPX Uring Abreve -60 +KPX Uring Acircumflex -60 +KPX Uring Adieresis -60 +KPX Uring Agrave -60 +KPX Uring Amacron -60 +KPX Uring Aogonek -60 +KPX Uring Aring -60 +KPX Uring Atilde -60 +KPX Uring comma -50 +KPX Uring period -50 +KPX V A -135 +KPX V Aacute -135 +KPX V Abreve -135 +KPX V Acircumflex -135 +KPX V Adieresis -135 +KPX V Agrave -135 +KPX V Amacron -135 +KPX V Aogonek -135 +KPX V Aring -135 +KPX V Atilde -135 +KPX V G -30 +KPX V Gbreve -30 +KPX V Gcommaaccent -30 +KPX V O -45 +KPX V Oacute -45 +KPX V Ocircumflex -45 +KPX V Odieresis -45 +KPX V Ograve -45 +KPX V Ohungarumlaut -45 +KPX V Omacron -45 +KPX V Oslash -45 +KPX V Otilde -45 +KPX V a -92 +KPX V aacute -92 +KPX V abreve -92 +KPX V acircumflex -92 +KPX V adieresis -92 +KPX V agrave -92 +KPX V amacron -92 +KPX V aogonek -92 +KPX V aring -92 +KPX V atilde -92 +KPX V colon -92 +KPX V comma -129 +KPX V e -100 +KPX V eacute -100 +KPX V ecaron -100 +KPX V ecircumflex -100 +KPX V edieresis -100 +KPX V edotaccent -100 +KPX V egrave -100 +KPX V emacron -100 +KPX V eogonek -100 +KPX V hyphen -74 +KPX V i -37 +KPX V iacute -37 +KPX V icircumflex -37 +KPX V idieresis -37 +KPX V igrave -37 +KPX V imacron -37 +KPX V iogonek -37 +KPX V o -100 +KPX V oacute -100 +KPX V ocircumflex -100 +KPX V odieresis -100 +KPX V ograve -100 +KPX V ohungarumlaut -100 +KPX V omacron -100 +KPX V oslash -100 +KPX V otilde -100 +KPX V period -145 +KPX V semicolon -92 +KPX V u -92 +KPX V uacute -92 +KPX V ucircumflex -92 +KPX V udieresis -92 +KPX V ugrave -92 +KPX V uhungarumlaut -92 +KPX V umacron -92 +KPX V uogonek -92 +KPX V uring -92 +KPX W A -120 +KPX W Aacute -120 +KPX W Abreve -120 +KPX W Acircumflex -120 +KPX W Adieresis -120 +KPX W Agrave -120 +KPX W Amacron -120 +KPX W Aogonek -120 +KPX W Aring -120 +KPX W Atilde -120 +KPX W O -10 +KPX W Oacute -10 +KPX W Ocircumflex -10 +KPX W Odieresis -10 +KPX W Ograve -10 +KPX W Ohungarumlaut -10 +KPX W Omacron -10 +KPX W Oslash -10 +KPX W Otilde -10 +KPX W a -65 +KPX W aacute -65 +KPX W abreve -65 +KPX W acircumflex -65 +KPX W adieresis -65 +KPX W agrave -65 +KPX W amacron -65 +KPX W aogonek -65 +KPX W aring -65 +KPX W atilde -65 +KPX W colon -55 +KPX W comma -92 +KPX W e -65 +KPX W eacute -65 +KPX W ecaron -65 +KPX W ecircumflex -65 +KPX W edieresis -65 +KPX W edotaccent -65 +KPX W egrave -65 +KPX W emacron -65 +KPX W eogonek -65 +KPX W hyphen -37 +KPX W i -18 +KPX W iacute -18 +KPX W iogonek -18 +KPX W o -75 +KPX W oacute -75 +KPX W ocircumflex -75 +KPX W odieresis -75 +KPX W ograve -75 +KPX W ohungarumlaut -75 +KPX W omacron -75 +KPX W oslash -75 +KPX W otilde -75 +KPX W period -92 +KPX W semicolon -55 +KPX W u -50 +KPX W uacute -50 +KPX W ucircumflex -50 +KPX W udieresis -50 +KPX W ugrave -50 +KPX W uhungarumlaut -50 +KPX W umacron -50 +KPX W uogonek -50 +KPX W uring -50 +KPX W y -60 +KPX W yacute -60 +KPX W ydieresis -60 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -35 +KPX Y Oacute -35 +KPX Y Ocircumflex -35 +KPX Y Odieresis -35 +KPX Y Ograve -35 +KPX Y Ohungarumlaut -35 +KPX Y Omacron -35 +KPX Y Oslash -35 +KPX Y Otilde -35 +KPX Y a -85 +KPX Y aacute -85 +KPX Y abreve -85 +KPX Y acircumflex -85 +KPX Y adieresis -85 +KPX Y agrave -85 +KPX Y amacron -85 +KPX Y aogonek -85 +KPX Y aring -85 +KPX Y atilde -85 +KPX Y colon -92 +KPX Y comma -92 +KPX Y e -111 +KPX Y eacute -111 +KPX Y ecaron -111 +KPX Y ecircumflex -111 +KPX Y edieresis -71 +KPX Y edotaccent -111 +KPX Y egrave -71 +KPX Y emacron -71 +KPX Y eogonek -111 +KPX Y hyphen -92 +KPX Y i -37 +KPX Y iacute -37 +KPX Y iogonek -37 +KPX Y o -111 +KPX Y oacute -111 +KPX Y ocircumflex -111 +KPX Y odieresis -111 +KPX Y ograve -111 +KPX Y ohungarumlaut -111 +KPX Y omacron -111 +KPX Y oslash -111 +KPX Y otilde -111 +KPX Y period -92 +KPX Y semicolon -92 +KPX Y u -92 +KPX Y uacute -92 +KPX Y ucircumflex -92 +KPX Y udieresis -92 +KPX Y ugrave -92 +KPX Y uhungarumlaut -92 +KPX Y umacron -92 +KPX Y uogonek -92 +KPX Y uring -92 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -35 +KPX Yacute Oacute -35 +KPX Yacute Ocircumflex -35 +KPX Yacute Odieresis -35 +KPX Yacute Ograve -35 +KPX Yacute Ohungarumlaut -35 +KPX Yacute Omacron -35 +KPX Yacute Oslash -35 +KPX Yacute Otilde -35 +KPX Yacute a -85 +KPX Yacute aacute -85 +KPX Yacute abreve -85 +KPX Yacute acircumflex -85 +KPX Yacute adieresis -85 +KPX Yacute agrave -85 +KPX Yacute amacron -85 +KPX Yacute aogonek -85 +KPX Yacute aring -85 +KPX Yacute atilde -85 +KPX Yacute colon -92 +KPX Yacute comma -92 +KPX Yacute e -111 +KPX Yacute eacute -111 +KPX Yacute ecaron -111 +KPX Yacute ecircumflex -111 +KPX Yacute edieresis -71 +KPX Yacute edotaccent -111 +KPX Yacute egrave -71 +KPX Yacute emacron -71 +KPX Yacute eogonek -111 +KPX Yacute hyphen -92 +KPX Yacute i -37 +KPX Yacute iacute -37 +KPX Yacute iogonek -37 +KPX Yacute o -111 +KPX Yacute oacute -111 +KPX Yacute ocircumflex -111 +KPX Yacute odieresis -111 +KPX Yacute ograve -111 +KPX Yacute ohungarumlaut -111 +KPX Yacute omacron -111 +KPX Yacute oslash -111 +KPX Yacute otilde -111 +KPX Yacute period -92 +KPX Yacute semicolon -92 +KPX Yacute u -92 +KPX Yacute uacute -92 +KPX Yacute ucircumflex -92 +KPX Yacute udieresis -92 +KPX Yacute ugrave -92 +KPX Yacute uhungarumlaut -92 +KPX Yacute umacron -92 +KPX Yacute uogonek -92 +KPX Yacute uring -92 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -35 +KPX Ydieresis Oacute -35 +KPX Ydieresis Ocircumflex -35 +KPX Ydieresis Odieresis -35 +KPX Ydieresis Ograve -35 +KPX Ydieresis Ohungarumlaut -35 +KPX Ydieresis Omacron -35 +KPX Ydieresis Oslash -35 +KPX Ydieresis Otilde -35 +KPX Ydieresis a -85 +KPX Ydieresis aacute -85 +KPX Ydieresis abreve -85 +KPX Ydieresis acircumflex -85 +KPX Ydieresis adieresis -85 +KPX Ydieresis agrave -85 +KPX Ydieresis amacron -85 +KPX Ydieresis aogonek -85 +KPX Ydieresis aring -85 +KPX Ydieresis atilde -85 +KPX Ydieresis colon -92 +KPX Ydieresis comma -92 +KPX Ydieresis e -111 +KPX Ydieresis eacute -111 +KPX Ydieresis ecaron -111 +KPX Ydieresis ecircumflex -111 +KPX Ydieresis edieresis -71 +KPX Ydieresis edotaccent -111 +KPX Ydieresis egrave -71 +KPX Ydieresis emacron -71 +KPX Ydieresis eogonek -111 +KPX Ydieresis hyphen -92 +KPX Ydieresis i -37 +KPX Ydieresis iacute -37 +KPX Ydieresis iogonek -37 +KPX Ydieresis o -111 +KPX Ydieresis oacute -111 +KPX Ydieresis ocircumflex -111 +KPX Ydieresis odieresis -111 +KPX Ydieresis ograve -111 +KPX Ydieresis ohungarumlaut -111 +KPX Ydieresis omacron -111 +KPX Ydieresis oslash -111 +KPX Ydieresis otilde -111 +KPX Ydieresis period -92 +KPX Ydieresis semicolon -92 +KPX Ydieresis u -92 +KPX Ydieresis uacute -92 +KPX Ydieresis ucircumflex -92 +KPX Ydieresis udieresis -92 +KPX Ydieresis ugrave -92 +KPX Ydieresis uhungarumlaut -92 +KPX Ydieresis umacron -92 +KPX Ydieresis uogonek -92 +KPX Ydieresis uring -92 +KPX a v -25 +KPX aacute v -25 +KPX abreve v -25 +KPX acircumflex v -25 +KPX adieresis v -25 +KPX agrave v -25 +KPX amacron v -25 +KPX aogonek v -25 +KPX aring v -25 +KPX atilde v -25 +KPX b b -10 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -15 +KPX comma quotedblright -45 +KPX comma quoteright -55 +KPX d w -15 +KPX dcroat w -15 +KPX e v -15 +KPX eacute v -15 +KPX ecaron v -15 +KPX ecircumflex v -15 +KPX edieresis v -15 +KPX edotaccent v -15 +KPX egrave v -15 +KPX emacron v -15 +KPX eogonek v -15 +KPX f comma -15 +KPX f dotlessi -35 +KPX f i -25 +KPX f o -25 +KPX f oacute -25 +KPX f ocircumflex -25 +KPX f odieresis -25 +KPX f ograve -25 +KPX f ohungarumlaut -25 +KPX f omacron -25 +KPX f oslash -25 +KPX f otilde -25 +KPX f period -15 +KPX f quotedblright 50 +KPX f quoteright 55 +KPX g period -15 +KPX gbreve period -15 +KPX gcommaaccent period -15 +KPX h y -15 +KPX h yacute -15 +KPX h ydieresis -15 +KPX i v -10 +KPX iacute v -10 +KPX icircumflex v -10 +KPX idieresis v -10 +KPX igrave v -10 +KPX imacron v -10 +KPX iogonek v -10 +KPX k e -10 +KPX k eacute -10 +KPX k ecaron -10 +KPX k ecircumflex -10 +KPX k edieresis -10 +KPX k edotaccent -10 +KPX k egrave -10 +KPX k emacron -10 +KPX k eogonek -10 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX k y -15 +KPX k yacute -15 +KPX k ydieresis -15 +KPX kcommaaccent e -10 +KPX kcommaaccent eacute -10 +KPX kcommaaccent ecaron -10 +KPX kcommaaccent ecircumflex -10 +KPX kcommaaccent edieresis -10 +KPX kcommaaccent edotaccent -10 +KPX kcommaaccent egrave -10 +KPX kcommaaccent emacron -10 +KPX kcommaaccent eogonek -10 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX kcommaaccent y -15 +KPX kcommaaccent yacute -15 +KPX kcommaaccent ydieresis -15 +KPX n v -40 +KPX nacute v -40 +KPX ncaron v -40 +KPX ncommaaccent v -40 +KPX ntilde v -40 +KPX o v -10 +KPX o w -10 +KPX oacute v -10 +KPX oacute w -10 +KPX ocircumflex v -10 +KPX ocircumflex w -10 +KPX odieresis v -10 +KPX odieresis w -10 +KPX ograve v -10 +KPX ograve w -10 +KPX ohungarumlaut v -10 +KPX ohungarumlaut w -10 +KPX omacron v -10 +KPX omacron w -10 +KPX oslash v -10 +KPX oslash w -10 +KPX otilde v -10 +KPX otilde w -10 +KPX period quotedblright -55 +KPX period quoteright -55 +KPX quotedblleft A -10 +KPX quotedblleft Aacute -10 +KPX quotedblleft Abreve -10 +KPX quotedblleft Acircumflex -10 +KPX quotedblleft Adieresis -10 +KPX quotedblleft Agrave -10 +KPX quotedblleft Amacron -10 +KPX quotedblleft Aogonek -10 +KPX quotedblleft Aring -10 +KPX quotedblleft Atilde -10 +KPX quoteleft A -10 +KPX quoteleft Aacute -10 +KPX quoteleft Abreve -10 +KPX quoteleft Acircumflex -10 +KPX quoteleft Adieresis -10 +KPX quoteleft Agrave -10 +KPX quoteleft Amacron -10 +KPX quoteleft Aogonek -10 +KPX quoteleft Aring -10 +KPX quoteleft Atilde -10 +KPX quoteleft quoteleft -63 +KPX quoteright d -20 +KPX quoteright dcroat -20 +KPX quoteright quoteright -63 +KPX quoteright r -20 +KPX quoteright racute -20 +KPX quoteright rcaron -20 +KPX quoteright rcommaaccent -20 +KPX quoteright s -37 +KPX quoteright sacute -37 +KPX quoteright scaron -37 +KPX quoteright scedilla -37 +KPX quoteright scommaaccent -37 +KPX quoteright space -74 +KPX quoteright v -20 +KPX r c -18 +KPX r cacute -18 +KPX r ccaron -18 +KPX r ccedilla -18 +KPX r comma -92 +KPX r e -18 +KPX r eacute -18 +KPX r ecaron -18 +KPX r ecircumflex -18 +KPX r edieresis -18 +KPX r edotaccent -18 +KPX r egrave -18 +KPX r emacron -18 +KPX r eogonek -18 +KPX r g -10 +KPX r gbreve -10 +KPX r gcommaaccent -10 +KPX r hyphen -37 +KPX r n -15 +KPX r nacute -15 +KPX r ncaron -15 +KPX r ncommaaccent -15 +KPX r ntilde -15 +KPX r o -18 +KPX r oacute -18 +KPX r ocircumflex -18 +KPX r odieresis -18 +KPX r ograve -18 +KPX r ohungarumlaut -18 +KPX r omacron -18 +KPX r oslash -18 +KPX r otilde -18 +KPX r p -10 +KPX r period -100 +KPX r q -18 +KPX r v -10 +KPX racute c -18 +KPX racute cacute -18 +KPX racute ccaron -18 +KPX racute ccedilla -18 +KPX racute comma -92 +KPX racute e -18 +KPX racute eacute -18 +KPX racute ecaron -18 +KPX racute ecircumflex -18 +KPX racute edieresis -18 +KPX racute edotaccent -18 +KPX racute egrave -18 +KPX racute emacron -18 +KPX racute eogonek -18 +KPX racute g -10 +KPX racute gbreve -10 +KPX racute gcommaaccent -10 +KPX racute hyphen -37 +KPX racute n -15 +KPX racute nacute -15 +KPX racute ncaron -15 +KPX racute ncommaaccent -15 +KPX racute ntilde -15 +KPX racute o -18 +KPX racute oacute -18 +KPX racute ocircumflex -18 +KPX racute odieresis -18 +KPX racute ograve -18 +KPX racute ohungarumlaut -18 +KPX racute omacron -18 +KPX racute oslash -18 +KPX racute otilde -18 +KPX racute p -10 +KPX racute period -100 +KPX racute q -18 +KPX racute v -10 +KPX rcaron c -18 +KPX rcaron cacute -18 +KPX rcaron ccaron -18 +KPX rcaron ccedilla -18 +KPX rcaron comma -92 +KPX rcaron e -18 +KPX rcaron eacute -18 +KPX rcaron ecaron -18 +KPX rcaron ecircumflex -18 +KPX rcaron edieresis -18 +KPX rcaron edotaccent -18 +KPX rcaron egrave -18 +KPX rcaron emacron -18 +KPX rcaron eogonek -18 +KPX rcaron g -10 +KPX rcaron gbreve -10 +KPX rcaron gcommaaccent -10 +KPX rcaron hyphen -37 +KPX rcaron n -15 +KPX rcaron nacute -15 +KPX rcaron ncaron -15 +KPX rcaron ncommaaccent -15 +KPX rcaron ntilde -15 +KPX rcaron o -18 +KPX rcaron oacute -18 +KPX rcaron ocircumflex -18 +KPX rcaron odieresis -18 +KPX rcaron ograve -18 +KPX rcaron ohungarumlaut -18 +KPX rcaron omacron -18 +KPX rcaron oslash -18 +KPX rcaron otilde -18 +KPX rcaron p -10 +KPX rcaron period -100 +KPX rcaron q -18 +KPX rcaron v -10 +KPX rcommaaccent c -18 +KPX rcommaaccent cacute -18 +KPX rcommaaccent ccaron -18 +KPX rcommaaccent ccedilla -18 +KPX rcommaaccent comma -92 +KPX rcommaaccent e -18 +KPX rcommaaccent eacute -18 +KPX rcommaaccent ecaron -18 +KPX rcommaaccent ecircumflex -18 +KPX rcommaaccent edieresis -18 +KPX rcommaaccent edotaccent -18 +KPX rcommaaccent egrave -18 +KPX rcommaaccent emacron -18 +KPX rcommaaccent eogonek -18 +KPX rcommaaccent g -10 +KPX rcommaaccent gbreve -10 +KPX rcommaaccent gcommaaccent -10 +KPX rcommaaccent hyphen -37 +KPX rcommaaccent n -15 +KPX rcommaaccent nacute -15 +KPX rcommaaccent ncaron -15 +KPX rcommaaccent ncommaaccent -15 +KPX rcommaaccent ntilde -15 +KPX rcommaaccent o -18 +KPX rcommaaccent oacute -18 +KPX rcommaaccent ocircumflex -18 +KPX rcommaaccent odieresis -18 +KPX rcommaaccent ograve -18 +KPX rcommaaccent ohungarumlaut -18 +KPX rcommaaccent omacron -18 +KPX rcommaaccent oslash -18 +KPX rcommaaccent otilde -18 +KPX rcommaaccent p -10 +KPX rcommaaccent period -100 +KPX rcommaaccent q -18 +KPX rcommaaccent v -10 +KPX space A -55 +KPX space Aacute -55 +KPX space Abreve -55 +KPX space Acircumflex -55 +KPX space Adieresis -55 +KPX space Agrave -55 +KPX space Amacron -55 +KPX space Aogonek -55 +KPX space Aring -55 +KPX space Atilde -55 +KPX space T -30 +KPX space Tcaron -30 +KPX space Tcommaaccent -30 +KPX space V -45 +KPX space W -30 +KPX space Y -55 +KPX space Yacute -55 +KPX space Ydieresis -55 +KPX v a -10 +KPX v aacute -10 +KPX v abreve -10 +KPX v acircumflex -10 +KPX v adieresis -10 +KPX v agrave -10 +KPX v amacron -10 +KPX v aogonek -10 +KPX v aring -10 +KPX v atilde -10 +KPX v comma -55 +KPX v e -10 +KPX v eacute -10 +KPX v ecaron -10 +KPX v ecircumflex -10 +KPX v edieresis -10 +KPX v edotaccent -10 +KPX v egrave -10 +KPX v emacron -10 +KPX v eogonek -10 +KPX v o -10 +KPX v oacute -10 +KPX v ocircumflex -10 +KPX v odieresis -10 +KPX v ograve -10 +KPX v ohungarumlaut -10 +KPX v omacron -10 +KPX v oslash -10 +KPX v otilde -10 +KPX v period -70 +KPX w comma -55 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -70 +KPX y comma -55 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -70 +KPX yacute comma -55 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -70 +KPX ydieresis comma -55 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -70 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Times-Bold.afm.php b/application/third_party/dompdf/lib/fonts/Times-Bold.afm.php new file mode 100644 index 00000000..c925535c --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Bold.afm.php @@ -0,0 +1,570 @@ + + array ( + 32 => 'space', + 160 => 'space', + 33 => 'exclam', + 34 => 'quotedbl', + 35 => 'numbersign', + 36 => 'dollar', + 37 => 'percent', + 38 => 'ampersand', + 146 => 'quoteright', + 40 => 'parenleft', + 41 => 'parenright', + 42 => 'asterisk', + 43 => 'plus', + 44 => 'comma', + 45 => 'hyphen', + 173 => 'hyphen', + 46 => 'period', + 47 => 'slash', + 48 => 'zero', + 49 => 'one', + 50 => 'two', + 51 => 'three', + 52 => 'four', + 53 => 'five', + 54 => 'six', + 55 => 'seven', + 56 => 'eight', + 57 => 'nine', + 58 => 'colon', + 59 => 'semicolon', + 60 => 'less', + 61 => 'equal', + 62 => 'greater', + 63 => 'question', + 64 => 'at', + 65 => 'A', + 66 => 'B', + 67 => 'C', + 68 => 'D', + 69 => 'E', + 70 => 'F', + 71 => 'G', + 72 => 'H', + 73 => 'I', + 74 => 'J', + 75 => 'K', + 76 => 'L', + 77 => 'M', + 78 => 'N', + 79 => 'O', + 80 => 'P', + 81 => 'Q', + 82 => 'R', + 83 => 'S', + 84 => 'T', + 85 => 'U', + 86 => 'V', + 87 => 'W', + 88 => 'X', + 89 => 'Y', + 90 => 'Z', + 91 => 'bracketleft', + 92 => 'backslash', + 93 => 'bracketright', + 94 => 'asciicircum', + 95 => 'underscore', + 145 => 'quoteleft', + 97 => 'a', + 98 => 'b', + 99 => 'c', + 100 => 'd', + 101 => 'e', + 102 => 'f', + 103 => 'g', + 104 => 'h', + 105 => 'i', + 106 => 'j', + 107 => 'k', + 108 => 'l', + 109 => 'm', + 110 => 'n', + 111 => 'o', + 112 => 'p', + 113 => 'q', + 114 => 'r', + 115 => 's', + 116 => 't', + 117 => 'u', + 118 => 'v', + 119 => 'w', + 120 => 'x', + 121 => 'y', + 122 => 'z', + 123 => 'braceleft', + 124 => 'bar', + 125 => 'braceright', + 126 => 'asciitilde', + 161 => 'exclamdown', + 162 => 'cent', + 163 => 'sterling', + 165 => 'yen', + 131 => 'florin', + 167 => 'section', + 164 => 'currency', + 39 => 'quotesingle', + 147 => 'quotedblleft', + 170 => 'ordfeminine', + 139 => 'guilsinglleft', + 155 => 'guilsinglright', + 150 => 'endash', + 134 => 'dagger', + 135 => 'daggerdbl', + 183 => 'periodcentered', + 182 => 'paragraph', + 149 => 'bullet', + 130 => 'quotesinglbase', + 132 => 'quotedblbase', + 148 => 'quotedblright', + 187 => 'guillemotright', + 133 => 'ellipsis', + 137 => 'perthousand', + 191 => 'questiondown', + 96 => 'grave', + 180 => 'acute', + 136 => 'circumflex', + 152 => 'tilde', + 175 => 'macron', + 168 => 'dieresis', + 184 => 'cedilla', + 151 => 'emdash', + 198 => 'AE', + 216 => 'Oslash', + 140 => 'OE', + 186 => 'ordmasculine', + 230 => 'ae', + 248 => 'oslash', + 156 => 'oe', + 223 => 'germandbls', + 207 => 'Idieresis', + 233 => 'eacute', + 159 => 'Ydieresis', + 247 => 'divide', + 221 => 'Yacute', + 194 => 'Acircumflex', + 225 => 'aacute', + 219 => 'Ucircumflex', + 253 => 'yacute', + 234 => 'ecircumflex', + 220 => 'Udieresis', + 218 => 'Uacute', + 203 => 'Edieresis', + 169 => 'copyright', + 229 => 'aring', + 224 => 'agrave', + 227 => 'atilde', + 154 => 'scaron', + 237 => 'iacute', + 251 => 'ucircumflex', + 226 => 'acircumflex', + 231 => 'ccedilla', + 222 => 'Thorn', + 179 => 'threesuperior', + 210 => 'Ograve', + 192 => 'Agrave', + 215 => 'multiply', + 250 => 'uacute', + 255 => 'ydieresis', + 238 => 'icircumflex', + 202 => 'Ecircumflex', + 228 => 'adieresis', + 235 => 'edieresis', + 205 => 'Iacute', + 177 => 'plusminus', + 166 => 'brokenbar', + 174 => 'registered', + 200 => 'Egrave', + 142 => 'Zcaron', + 208 => 'Eth', + 199 => 'Ccedilla', + 193 => 'Aacute', + 196 => 'Adieresis', + 232 => 'egrave', + 211 => 'Oacute', + 243 => 'oacute', + 239 => 'idieresis', + 212 => 'Ocircumflex', + 217 => 'Ugrave', + 254 => 'thorn', + 178 => 'twosuperior', + 214 => 'Odieresis', + 181 => 'mu', + 236 => 'igrave', + 190 => 'threequarters', + 153 => 'trademark', + 204 => 'Igrave', + 189 => 'onehalf', + 244 => 'ocircumflex', + 241 => 'ntilde', + 201 => 'Eacute', + 188 => 'onequarter', + 138 => 'Scaron', + 176 => 'degree', + 242 => 'ograve', + 249 => 'ugrave', + 209 => 'Ntilde', + 245 => 'otilde', + 195 => 'Atilde', + 197 => 'Aring', + 213 => 'Otilde', + 206 => 'Icircumflex', + 172 => 'logicalnot', + 246 => 'odieresis', + 252 => 'udieresis', + 240 => 'eth', + 158 => 'zcaron', + 185 => 'onesuperior', + 128 => 'Euro', + ), + 'isUnicode' => false, + 'FontName' => 'Times-Bold', + 'FullName' => 'Times Bold', + 'FamilyName' => 'Times', + 'Weight' => 'Bold', + 'ItalicAngle' => '0', + 'IsFixedPitch' => 'false', + 'CharacterSet' => 'ExtendedRoman', + 'FontBBox' => + array ( + 0 => '-168', + 1 => '-218', + 2 => '1000', + 3 => '935', + ), + 'UnderlinePosition' => '-100', + 'UnderlineThickness' => '50', + 'Version' => '002.000', + 'EncodingScheme' => 'WinAnsiEncoding', + 'CapHeight' => '676', + 'XHeight' => '461', + 'Ascender' => '683', + 'Descender' => '-217', + 'StdHW' => '44', + 'StdVW' => '139', + 'StartCharMetrics' => '317', + 'C' => + array ( + 32 => 250.0, + 160 => 250.0, + 33 => 333.0, + 34 => 555.0, + 35 => 500.0, + 36 => 500.0, + 37 => 1000.0, + 38 => 833.0, + 146 => 333.0, + 40 => 333.0, + 41 => 333.0, + 42 => 500.0, + 43 => 570.0, + 44 => 250.0, + 45 => 333.0, + 173 => 333.0, + 46 => 250.0, + 47 => 278.0, + 48 => 500.0, + 49 => 500.0, + 50 => 500.0, + 51 => 500.0, + 52 => 500.0, + 53 => 500.0, + 54 => 500.0, + 55 => 500.0, + 56 => 500.0, + 57 => 500.0, + 58 => 333.0, + 59 => 333.0, + 60 => 570.0, + 61 => 570.0, + 62 => 570.0, + 63 => 500.0, + 64 => 930.0, + 65 => 722.0, + 66 => 667.0, + 67 => 722.0, + 68 => 722.0, + 69 => 667.0, + 70 => 611.0, + 71 => 778.0, + 72 => 778.0, + 73 => 389.0, + 74 => 500.0, + 75 => 778.0, + 76 => 667.0, + 77 => 944.0, + 78 => 722.0, + 79 => 778.0, + 80 => 611.0, + 81 => 778.0, + 82 => 722.0, + 83 => 556.0, + 84 => 667.0, + 85 => 722.0, + 86 => 722.0, + 87 => 1000.0, + 88 => 722.0, + 89 => 722.0, + 90 => 667.0, + 91 => 333.0, + 92 => 278.0, + 93 => 333.0, + 94 => 581.0, + 95 => 500.0, + 145 => 333.0, + 97 => 500.0, + 98 => 556.0, + 99 => 444.0, + 100 => 556.0, + 101 => 444.0, + 102 => 333.0, + 103 => 500.0, + 104 => 556.0, + 105 => 278.0, + 106 => 333.0, + 107 => 556.0, + 108 => 278.0, + 109 => 833.0, + 110 => 556.0, + 111 => 500.0, + 112 => 556.0, + 113 => 556.0, + 114 => 444.0, + 115 => 389.0, + 116 => 333.0, + 117 => 556.0, + 118 => 500.0, + 119 => 722.0, + 120 => 500.0, + 121 => 500.0, + 122 => 444.0, + 123 => 394.0, + 124 => 220.0, + 125 => 394.0, + 126 => 520.0, + 161 => 333.0, + 162 => 500.0, + 163 => 500.0, + 'fraction' => 167.0, + 165 => 500.0, + 131 => 500.0, + 167 => 500.0, + 164 => 500.0, + 39 => 278.0, + 147 => 500.0, + 170 => 300.0, + 139 => 333.0, + 155 => 333.0, + 'fi' => 556.0, + 'fl' => 556.0, + 150 => 500.0, + 134 => 500.0, + 135 => 500.0, + 183 => 250.0, + 182 => 540.0, + 149 => 350.0, + 130 => 333.0, + 132 => 500.0, + 148 => 500.0, + 187 => 500.0, + 133 => 1000.0, + 137 => 1000.0, + 191 => 500.0, + 96 => 333.0, + 180 => 333.0, + 136 => 333.0, + 152 => 333.0, + 175 => 333.0, + 'breve' => 333.0, + 'dotaccent' => 333.0, + 168 => 333.0, + 'ring' => 333.0, + 184 => 333.0, + 'hungarumlaut' => 333.0, + 'ogonek' => 333.0, + 'caron' => 333.0, + 151 => 1000.0, + 198 => 1000.0, + 'Lslash' => 667.0, + 216 => 778.0, + 140 => 1000.0, + 186 => 330.0, + 230 => 722.0, + 'dotlessi' => 278.0, + 'lslash' => 278.0, + 248 => 500.0, + 156 => 722.0, + 223 => 556.0, + 207 => 389.0, + 233 => 444.0, + 'abreve' => 500.0, + 'uhungarumlaut' => 556.0, + 'ecaron' => 444.0, + 159 => 722.0, + 247 => 570.0, + 221 => 722.0, + 194 => 722.0, + 225 => 500.0, + 219 => 722.0, + 253 => 500.0, + 'scommaaccent' => 389.0, + 234 => 444.0, + 'Uring' => 722.0, + 220 => 722.0, + 'aogonek' => 500.0, + 218 => 722.0, + 'uogonek' => 556.0, + 203 => 667.0, + 'Dcroat' => 722.0, + 'commaaccent' => 250.0, + 169 => 747.0, + 'Emacron' => 667.0, + 'ccaron' => 444.0, + 229 => 500.0, + 'Ncommaaccent' => 722.0, + 'lacute' => 278.0, + 224 => 500.0, + 'Tcommaaccent' => 667.0, + 'Cacute' => 722.0, + 227 => 500.0, + 'Edotaccent' => 667.0, + 154 => 389.0, + 'scedilla' => 389.0, + 237 => 278.0, + 'lozenge' => 494.0, + 'Rcaron' => 722.0, + 'Gcommaaccent' => 778.0, + 251 => 556.0, + 226 => 500.0, + 'Amacron' => 722.0, + 'rcaron' => 444.0, + 231 => 444.0, + 'Zdotaccent' => 667.0, + 222 => 611.0, + 'Omacron' => 778.0, + 'Racute' => 722.0, + 'Sacute' => 556.0, + 'dcaron' => 672.0, + 'Umacron' => 722.0, + 'uring' => 556.0, + 179 => 300.0, + 210 => 778.0, + 192 => 722.0, + 'Abreve' => 722.0, + 215 => 570.0, + 250 => 556.0, + 'Tcaron' => 667.0, + 'partialdiff' => 494.0, + 255 => 500.0, + 'Nacute' => 722.0, + 238 => 278.0, + 202 => 667.0, + 228 => 500.0, + 235 => 444.0, + 'cacute' => 444.0, + 'nacute' => 556.0, + 'umacron' => 556.0, + 'Ncaron' => 722.0, + 205 => 389.0, + 177 => 570.0, + 166 => 220.0, + 174 => 747.0, + 'Gbreve' => 778.0, + 'Idotaccent' => 389.0, + 'summation' => 600.0, + 200 => 667.0, + 'racute' => 444.0, + 'omacron' => 500.0, + 'Zacute' => 667.0, + 142 => 667.0, + 'greaterequal' => 549.0, + 208 => 722.0, + 199 => 722.0, + 'lcommaaccent' => 278.0, + 'tcaron' => 416.0, + 'eogonek' => 444.0, + 'Uogonek' => 722.0, + 193 => 722.0, + 196 => 722.0, + 232 => 444.0, + 'zacute' => 444.0, + 'iogonek' => 278.0, + 211 => 778.0, + 243 => 500.0, + 'amacron' => 500.0, + 'sacute' => 389.0, + 239 => 278.0, + 212 => 778.0, + 217 => 722.0, + 'Delta' => 612.0, + 254 => 556.0, + 178 => 300.0, + 214 => 778.0, + 181 => 556.0, + 236 => 278.0, + 'ohungarumlaut' => 500.0, + 'Eogonek' => 667.0, + 'dcroat' => 556.0, + 190 => 750.0, + 'Scedilla' => 556.0, + 'lcaron' => 394.0, + 'Kcommaaccent' => 778.0, + 'Lacute' => 667.0, + 153 => 1000.0, + 'edotaccent' => 444.0, + 204 => 389.0, + 'Imacron' => 389.0, + 'Lcaron' => 667.0, + 189 => 750.0, + 'lessequal' => 549.0, + 244 => 500.0, + 241 => 556.0, + 'Uhungarumlaut' => 722.0, + 201 => 667.0, + 'emacron' => 444.0, + 'gbreve' => 500.0, + 188 => 750.0, + 138 => 556.0, + 'Scommaaccent' => 556.0, + 'Ohungarumlaut' => 778.0, + 176 => 400.0, + 242 => 500.0, + 'Ccaron' => 722.0, + 249 => 556.0, + 'radical' => 549.0, + 'Dcaron' => 722.0, + 'rcommaaccent' => 444.0, + 209 => 722.0, + 245 => 500.0, + 'Rcommaaccent' => 722.0, + 'Lcommaaccent' => 667.0, + 195 => 722.0, + 'Aogonek' => 722.0, + 197 => 722.0, + 213 => 778.0, + 'zdotaccent' => 444.0, + 'Ecaron' => 667.0, + 'Iogonek' => 389.0, + 'kcommaaccent' => 556.0, + 'minus' => 570.0, + 206 => 389.0, + 'ncaron' => 556.0, + 'tcommaaccent' => 333.0, + 172 => 570.0, + 246 => 500.0, + 252 => 556.0, + 'notequal' => 549.0, + 'gcommaaccent' => 500.0, + 240 => 500.0, + 158 => 444.0, + 'ncommaaccent' => 556.0, + 185 => 300.0, + 'imacron' => 278.0, + 128 => 500.0, + ), + 'CIDtoGID_Compressed' => true, + 'CIDtoGID' => 'eJwDAAAAAAE=', + '_version_' => 4, +); \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm b/application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm new file mode 100644 index 00000000..eff5240e --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm @@ -0,0 +1,2386 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 13:04:06 1997 +Comment UniqueID 43066 +Comment VMusage 45874 56899 +FontName Times-BoldItalic +FullName Times Bold Italic +FamilyName Times +Weight Bold +ItalicAngle -15 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -200 -218 996 921 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 669 +XHeight 462 +Ascender 683 +Descender -217 +StdHW 42 +StdVW 121 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ; +C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ; +C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ; +C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ; +C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ; +C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ; +C 146 ; WX 333 ; N quoteright ; B 98 369 302 685 ; +C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ; +C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ; +C 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ; +C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; +C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ; +C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ; +C 173 ; WX 333 ; N hyphen ; B 2 166 271 282 ; +C 46 ; WX 250 ; N period ; B -9 -13 139 135 ; +C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ; +C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ; +C 49 ; WX 500 ; N one ; B 5 0 419 683 ; +C 50 ; WX 500 ; N two ; B -27 0 446 683 ; +C 51 ; WX 500 ; N three ; B -15 -13 450 683 ; +C 52 ; WX 500 ; N four ; B -15 0 503 683 ; +C 53 ; WX 500 ; N five ; B -11 -13 487 669 ; +C 54 ; WX 500 ; N six ; B 23 -15 509 679 ; +C 55 ; WX 500 ; N seven ; B 52 0 525 669 ; +C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ; +C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ; +C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ; +C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ; +C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; +C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; +C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; +C 63 ; WX 500 ; N question ; B 79 -13 470 684 ; +C 64 ; WX 832 ; N at ; B 63 -18 770 685 ; +C 65 ; WX 667 ; N A ; B -67 0 593 683 ; +C 66 ; WX 667 ; N B ; B -24 0 624 669 ; +C 67 ; WX 667 ; N C ; B 32 -18 677 685 ; +C 68 ; WX 722 ; N D ; B -46 0 685 669 ; +C 69 ; WX 667 ; N E ; B -27 0 653 669 ; +C 70 ; WX 667 ; N F ; B -13 0 660 669 ; +C 71 ; WX 722 ; N G ; B 21 -18 706 685 ; +C 72 ; WX 778 ; N H ; B -24 0 799 669 ; +C 73 ; WX 389 ; N I ; B -32 0 406 669 ; +C 74 ; WX 500 ; N J ; B -46 -99 524 669 ; +C 75 ; WX 667 ; N K ; B -21 0 702 669 ; +C 76 ; WX 611 ; N L ; B -22 0 590 669 ; +C 77 ; WX 889 ; N M ; B -29 -12 917 669 ; +C 78 ; WX 722 ; N N ; B -27 -15 748 669 ; +C 79 ; WX 722 ; N O ; B 27 -18 691 685 ; +C 80 ; WX 611 ; N P ; B -27 0 613 669 ; +C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ; +C 82 ; WX 667 ; N R ; B -29 0 623 669 ; +C 83 ; WX 556 ; N S ; B 2 -18 526 685 ; +C 84 ; WX 611 ; N T ; B 50 0 650 669 ; +C 85 ; WX 722 ; N U ; B 67 -18 744 669 ; +C 86 ; WX 667 ; N V ; B 65 -18 715 669 ; +C 87 ; WX 889 ; N W ; B 65 -18 940 669 ; +C 88 ; WX 667 ; N X ; B -24 0 694 669 ; +C 89 ; WX 611 ; N Y ; B 73 0 659 669 ; +C 90 ; WX 611 ; N Z ; B -11 0 590 669 ; +C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ; +C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ; +C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ; +C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 128 369 332 685 ; +C 97 ; WX 500 ; N a ; B -21 -14 455 462 ; +C 98 ; WX 500 ; N b ; B -14 -13 444 699 ; +C 99 ; WX 444 ; N c ; B -5 -13 392 462 ; +C 100 ; WX 500 ; N d ; B -21 -13 517 699 ; +C 101 ; WX 444 ; N e ; B 5 -13 398 462 ; +C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B -52 -203 478 462 ; +C 104 ; WX 556 ; N h ; B -13 -9 498 699 ; +C 105 ; WX 278 ; N i ; B 2 -9 263 684 ; +C 106 ; WX 278 ; N j ; B -189 -207 279 684 ; +C 107 ; WX 500 ; N k ; B -23 -8 483 699 ; +C 108 ; WX 278 ; N l ; B 2 -9 290 699 ; +C 109 ; WX 778 ; N m ; B -14 -9 722 462 ; +C 110 ; WX 556 ; N n ; B -6 -9 493 462 ; +C 111 ; WX 500 ; N o ; B -3 -13 441 462 ; +C 112 ; WX 500 ; N p ; B -120 -205 446 462 ; +C 113 ; WX 500 ; N q ; B 1 -205 471 462 ; +C 114 ; WX 389 ; N r ; B -21 0 389 462 ; +C 115 ; WX 389 ; N s ; B -19 -13 333 462 ; +C 116 ; WX 278 ; N t ; B -11 -9 281 594 ; +C 117 ; WX 556 ; N u ; B 15 -9 492 462 ; +C 118 ; WX 444 ; N v ; B 16 -13 401 462 ; +C 119 ; WX 667 ; N w ; B 16 -13 614 462 ; +C 120 ; WX 500 ; N x ; B -46 -13 469 462 ; +C 121 ; WX 444 ; N y ; B -94 -205 392 462 ; +C 122 ; WX 389 ; N z ; B -43 -78 368 449 ; +C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ; +C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; +C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ; +C 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ; +C 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ; +C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ; +C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ; +C -1 ; WX 167 ; N fraction ; B -169 -14 324 683 ; +C 165 ; WX 500 ; N yen ; B 33 0 628 669 ; +C 131 ; WX 500 ; N florin ; B -87 -156 537 707 ; +C 167 ; WX 500 ; N section ; B 36 -143 459 685 ; +C 164 ; WX 500 ; N currency ; B -26 34 526 586 ; +C 39 ; WX 278 ; N quotesingle ; B 128 398 268 685 ; +C 147 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ; +C 170 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ; +C 139 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ; +C 155 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ; +C -1 ; WX 556 ; N fi ; B -188 -205 514 703 ; +C -1 ; WX 556 ; N fl ; B -186 -205 553 704 ; +C 150 ; WX 500 ; N endash ; B -40 178 477 269 ; +C 134 ; WX 500 ; N dagger ; B 91 -145 494 685 ; +C 135 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ; +C 183 ; WX 250 ; N periodcentered ; B 51 257 199 405 ; +C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ; +C 149 ; WX 350 ; N bullet ; B 0 175 350 525 ; +C 130 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ; +C 132 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ; +C 148 ; WX 500 ; N quotedblright ; B 53 369 513 685 ; +C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ; +C 133 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ; +C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ; +C 96 ; WX 333 ; N grave ; B 85 516 297 697 ; +C 180 ; WX 333 ; N acute ; B 139 516 379 697 ; +C 136 ; WX 333 ; N circumflex ; B 40 516 367 690 ; +C 152 ; WX 333 ; N tilde ; B 48 536 407 655 ; +C 175 ; WX 333 ; N macron ; B 51 553 393 623 ; +C -1 ; WX 333 ; N breve ; B 71 516 387 678 ; +C -1 ; WX 333 ; N dotaccent ; B 163 550 298 684 ; +C 168 ; WX 333 ; N dieresis ; B 55 550 402 684 ; +C -1 ; WX 333 ; N ring ; B 127 516 340 729 ; +C 184 ; WX 333 ; N cedilla ; B -80 -218 156 5 ; +C -1 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ; +C -1 ; WX 333 ; N ogonek ; B 15 -183 244 34 ; +C -1 ; WX 333 ; N caron ; B 79 516 411 690 ; +C 151 ; WX 1000 ; N emdash ; B -40 178 977 269 ; +C 198 ; WX 944 ; N AE ; B -64 0 918 669 ; +C 170 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ; +C -1 ; WX 611 ; N Lslash ; B -22 0 590 669 ; +C 216 ; WX 722 ; N Oslash ; B 27 -125 691 764 ; +C 140 ; WX 944 ; N OE ; B 23 -8 946 677 ; +C 186 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ; +C 230 ; WX 722 ; N ae ; B -5 -13 673 462 ; +C -1 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ; +C -1 ; WX 278 ; N lslash ; B -7 -9 307 699 ; +C 248 ; WX 500 ; N oslash ; B -3 -119 441 560 ; +C 156 ; WX 722 ; N oe ; B 6 -13 674 462 ; +C 223 ; WX 500 ; N germandbls ; B -200 -200 473 705 ; +C 207 ; WX 389 ; N Idieresis ; B -32 0 450 862 ; +C 233 ; WX 444 ; N eacute ; B 5 -13 435 697 ; +C -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ; +C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ; +C 159 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ; +C 247 ; WX 570 ; N divide ; B 33 -29 537 535 ; +C 221 ; WX 611 ; N Yacute ; B 73 0 659 904 ; +C 194 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ; +C 225 ; WX 500 ; N aacute ; B -21 -14 463 697 ; +C 219 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ; +C 253 ; WX 444 ; N yacute ; B -94 -205 435 697 ; +C -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ; +C 234 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ; +C -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ; +C 220 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ; +C -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ; +C 218 ; WX 722 ; N Uacute ; B 67 -18 744 904 ; +C -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ; +C 203 ; WX 667 ; N Edieresis ; B -27 0 653 862 ; +C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ; +C -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ; +C 169 ; WX 747 ; N copyright ; B 30 -18 718 685 ; +C -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ; +C -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ; +C 229 ; WX 500 ; N aring ; B -21 -14 455 729 ; +C -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ; +C -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ; +C 224 ; WX 500 ; N agrave ; B -21 -14 455 697 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ; +C -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ; +C 227 ; WX 500 ; N atilde ; B -21 -14 491 655 ; +C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ; +C 154 ; WX 389 ; N scaron ; B -19 -13 424 690 ; +C -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ; +C 237 ; WX 278 ; N iacute ; B 2 -9 352 697 ; +C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; +C -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ; +C 251 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ; +C 226 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ; +C -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ; +C -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ; +C 231 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ; +C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ; +C 222 ; WX 611 ; N Thorn ; B -27 0 573 669 ; +C -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ; +C -1 ; WX 667 ; N Racute ; B -29 0 623 904 ; +C -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ; +C -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ; +C -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ; +C -1 ; WX 556 ; N uring ; B 15 -9 492 729 ; +C 179 ; WX 300 ; N threesuperior ; B 17 265 321 683 ; +C 210 ; WX 722 ; N Ograve ; B 27 -18 691 904 ; +C 192 ; WX 667 ; N Agrave ; B -67 0 593 904 ; +C -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ; +C 215 ; WX 570 ; N multiply ; B 48 16 522 490 ; +C 250 ; WX 556 ; N uacute ; B 15 -9 492 697 ; +C -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ; +C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; +C 255 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ; +C -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ; +C 238 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ; +C 202 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ; +C 228 ; WX 500 ; N adieresis ; B -21 -14 476 655 ; +C 235 ; WX 444 ; N edieresis ; B 5 -13 448 655 ; +C -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ; +C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ; +C -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ; +C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ; +C 205 ; WX 389 ; N Iacute ; B -32 0 432 904 ; +C 177 ; WX 570 ; N plusminus ; B 33 0 537 506 ; +C 166 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; +C 174 ; WX 747 ; N registered ; B 30 -18 718 685 ; +C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ; +C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ; +C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; +C 200 ; WX 667 ; N Egrave ; B -27 0 653 904 ; +C -1 ; WX 389 ; N racute ; B -21 0 407 697 ; +C -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ; +C -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ; +C 142 ; WX 611 ; N Zcaron ; B -11 0 590 897 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; +C 208 ; WX 722 ; N Eth ; B -31 0 700 669 ; +C 199 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ; +C -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ; +C -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ; +C -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ; +C -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ; +C 193 ; WX 667 ; N Aacute ; B -67 0 593 904 ; +C 196 ; WX 667 ; N Adieresis ; B -67 0 593 862 ; +C 232 ; WX 444 ; N egrave ; B 5 -13 398 697 ; +C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ; +C -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ; +C 211 ; WX 722 ; N Oacute ; B 27 -18 691 904 ; +C 243 ; WX 500 ; N oacute ; B -3 -13 463 697 ; +C -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ; +C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ; +C 239 ; WX 278 ; N idieresis ; B 2 -9 364 655 ; +C 212 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ; +C 217 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 500 ; N thorn ; B -120 -205 446 699 ; +C 178 ; WX 300 ; N twosuperior ; B 2 274 313 683 ; +C 214 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ; +C 181 ; WX 576 ; N mu ; B -60 -207 516 449 ; +C 236 ; WX 278 ; N igrave ; B 2 -9 259 697 ; +C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ; +C -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ; +C -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ; +C 190 ; WX 750 ; N threequarters ; B 7 -14 726 683 ; +C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ; +C -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ; +C -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ; +C -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ; +C 153 ; WX 1000 ; N trademark ; B 32 263 968 669 ; +C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ; +C 204 ; WX 389 ; N Igrave ; B -32 0 406 904 ; +C -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ; +C -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ; +C 189 ; WX 750 ; N onehalf ; B -9 -14 723 683 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; +C 244 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ; +C 241 ; WX 556 ; N ntilde ; B -6 -9 504 655 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ; +C 201 ; WX 667 ; N Eacute ; B -27 0 653 904 ; +C -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ; +C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ; +C 188 ; WX 750 ; N onequarter ; B 7 -14 721 683 ; +C 138 ; WX 556 ; N Scaron ; B 2 -18 553 897 ; +C -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ; +C 176 ; WX 400 ; N degree ; B 83 397 369 683 ; +C 242 ; WX 500 ; N ograve ; B -3 -13 441 697 ; +C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ; +C 249 ; WX 556 ; N ugrave ; B 15 -9 492 697 ; +C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; +C -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ; +C -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ; +C 209 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ; +C 245 ; WX 500 ; N otilde ; B -3 -13 491 655 ; +C -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ; +C -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ; +C 195 ; WX 667 ; N Atilde ; B -67 0 593 862 ; +C -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ; +C 197 ; WX 667 ; N Aring ; B -67 0 593 921 ; +C 213 ; WX 722 ; N Otilde ; B 27 -18 691 862 ; +C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ; +C -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ; +C -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ; +C -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ; +C -1 ; WX 606 ; N minus ; B 51 209 555 297 ; +C 206 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ; +C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ; +C -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ; +C 172 ; WX 606 ; N logicalnot ; B 51 108 555 399 ; +C 246 ; WX 500 ; N odieresis ; B -3 -13 471 655 ; +C 252 ; WX 556 ; N udieresis ; B 15 -9 499 655 ; +C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; +C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ; +C 240 ; WX 500 ; N eth ; B -3 -13 454 699 ; +C 158 ; WX 389 ; N zcaron ; B -43 -78 424 690 ; +C -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ; +C 185 ; WX 300 ; N onesuperior ; B 30 274 301 683 ; +C -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2038 +KPX A C -65 +KPX A Cacute -65 +KPX A Ccaron -65 +KPX A Ccedilla -65 +KPX A G -60 +KPX A Gbreve -60 +KPX A Gcommaaccent -60 +KPX A O -50 +KPX A Oacute -50 +KPX A Ocircumflex -50 +KPX A Odieresis -50 +KPX A Ograve -50 +KPX A Ohungarumlaut -50 +KPX A Omacron -50 +KPX A Oslash -50 +KPX A Otilde -50 +KPX A Q -55 +KPX A T -55 +KPX A Tcaron -55 +KPX A Tcommaaccent -55 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -95 +KPX A W -100 +KPX A Y -70 +KPX A Yacute -70 +KPX A Ydieresis -70 +KPX A quoteright -74 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -74 +KPX A w -74 +KPX A y -74 +KPX A yacute -74 +KPX A ydieresis -74 +KPX Aacute C -65 +KPX Aacute Cacute -65 +KPX Aacute Ccaron -65 +KPX Aacute Ccedilla -65 +KPX Aacute G -60 +KPX Aacute Gbreve -60 +KPX Aacute Gcommaaccent -60 +KPX Aacute O -50 +KPX Aacute Oacute -50 +KPX Aacute Ocircumflex -50 +KPX Aacute Odieresis -50 +KPX Aacute Ograve -50 +KPX Aacute Ohungarumlaut -50 +KPX Aacute Omacron -50 +KPX Aacute Oslash -50 +KPX Aacute Otilde -50 +KPX Aacute Q -55 +KPX Aacute T -55 +KPX Aacute Tcaron -55 +KPX Aacute Tcommaaccent -55 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -95 +KPX Aacute W -100 +KPX Aacute Y -70 +KPX Aacute Yacute -70 +KPX Aacute Ydieresis -70 +KPX Aacute quoteright -74 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -74 +KPX Aacute w -74 +KPX Aacute y -74 +KPX Aacute yacute -74 +KPX Aacute ydieresis -74 +KPX Abreve C -65 +KPX Abreve Cacute -65 +KPX Abreve Ccaron -65 +KPX Abreve Ccedilla -65 +KPX Abreve G -60 +KPX Abreve Gbreve -60 +KPX Abreve Gcommaaccent -60 +KPX Abreve O -50 +KPX Abreve Oacute -50 +KPX Abreve Ocircumflex -50 +KPX Abreve Odieresis -50 +KPX Abreve Ograve -50 +KPX Abreve Ohungarumlaut -50 +KPX Abreve Omacron -50 +KPX Abreve Oslash -50 +KPX Abreve Otilde -50 +KPX Abreve Q -55 +KPX Abreve T -55 +KPX Abreve Tcaron -55 +KPX Abreve Tcommaaccent -55 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -95 +KPX Abreve W -100 +KPX Abreve Y -70 +KPX Abreve Yacute -70 +KPX Abreve Ydieresis -70 +KPX Abreve quoteright -74 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -74 +KPX Abreve w -74 +KPX Abreve y -74 +KPX Abreve yacute -74 +KPX Abreve ydieresis -74 +KPX Acircumflex C -65 +KPX Acircumflex Cacute -65 +KPX Acircumflex Ccaron -65 +KPX Acircumflex Ccedilla -65 +KPX Acircumflex G -60 +KPX Acircumflex Gbreve -60 +KPX Acircumflex Gcommaaccent -60 +KPX Acircumflex O -50 +KPX Acircumflex Oacute -50 +KPX Acircumflex Ocircumflex -50 +KPX Acircumflex Odieresis -50 +KPX Acircumflex Ograve -50 +KPX Acircumflex Ohungarumlaut -50 +KPX Acircumflex Omacron -50 +KPX Acircumflex Oslash -50 +KPX Acircumflex Otilde -50 +KPX Acircumflex Q -55 +KPX Acircumflex T -55 +KPX Acircumflex Tcaron -55 +KPX Acircumflex Tcommaaccent -55 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -95 +KPX Acircumflex W -100 +KPX Acircumflex Y -70 +KPX Acircumflex Yacute -70 +KPX Acircumflex Ydieresis -70 +KPX Acircumflex quoteright -74 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -74 +KPX Acircumflex w -74 +KPX Acircumflex y -74 +KPX Acircumflex yacute -74 +KPX Acircumflex ydieresis -74 +KPX Adieresis C -65 +KPX Adieresis Cacute -65 +KPX Adieresis Ccaron -65 +KPX Adieresis Ccedilla -65 +KPX Adieresis G -60 +KPX Adieresis Gbreve -60 +KPX Adieresis Gcommaaccent -60 +KPX Adieresis O -50 +KPX Adieresis Oacute -50 +KPX Adieresis Ocircumflex -50 +KPX Adieresis Odieresis -50 +KPX Adieresis Ograve -50 +KPX Adieresis Ohungarumlaut -50 +KPX Adieresis Omacron -50 +KPX Adieresis Oslash -50 +KPX Adieresis Otilde -50 +KPX Adieresis Q -55 +KPX Adieresis T -55 +KPX Adieresis Tcaron -55 +KPX Adieresis Tcommaaccent -55 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -95 +KPX Adieresis W -100 +KPX Adieresis Y -70 +KPX Adieresis Yacute -70 +KPX Adieresis Ydieresis -70 +KPX Adieresis quoteright -74 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -74 +KPX Adieresis w -74 +KPX Adieresis y -74 +KPX Adieresis yacute -74 +KPX Adieresis ydieresis -74 +KPX Agrave C -65 +KPX Agrave Cacute -65 +KPX Agrave Ccaron -65 +KPX Agrave Ccedilla -65 +KPX Agrave G -60 +KPX Agrave Gbreve -60 +KPX Agrave Gcommaaccent -60 +KPX Agrave O -50 +KPX Agrave Oacute -50 +KPX Agrave Ocircumflex -50 +KPX Agrave Odieresis -50 +KPX Agrave Ograve -50 +KPX Agrave Ohungarumlaut -50 +KPX Agrave Omacron -50 +KPX Agrave Oslash -50 +KPX Agrave Otilde -50 +KPX Agrave Q -55 +KPX Agrave T -55 +KPX Agrave Tcaron -55 +KPX Agrave Tcommaaccent -55 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -95 +KPX Agrave W -100 +KPX Agrave Y -70 +KPX Agrave Yacute -70 +KPX Agrave Ydieresis -70 +KPX Agrave quoteright -74 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -74 +KPX Agrave w -74 +KPX Agrave y -74 +KPX Agrave yacute -74 +KPX Agrave ydieresis -74 +KPX Amacron C -65 +KPX Amacron Cacute -65 +KPX Amacron Ccaron -65 +KPX Amacron Ccedilla -65 +KPX Amacron G -60 +KPX Amacron Gbreve -60 +KPX Amacron Gcommaaccent -60 +KPX Amacron O -50 +KPX Amacron Oacute -50 +KPX Amacron Ocircumflex -50 +KPX Amacron Odieresis -50 +KPX Amacron Ograve -50 +KPX Amacron Ohungarumlaut -50 +KPX Amacron Omacron -50 +KPX Amacron Oslash -50 +KPX Amacron Otilde -50 +KPX Amacron Q -55 +KPX Amacron T -55 +KPX Amacron Tcaron -55 +KPX Amacron Tcommaaccent -55 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -95 +KPX Amacron W -100 +KPX Amacron Y -70 +KPX Amacron Yacute -70 +KPX Amacron Ydieresis -70 +KPX Amacron quoteright -74 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -74 +KPX Amacron w -74 +KPX Amacron y -74 +KPX Amacron yacute -74 +KPX Amacron ydieresis -74 +KPX Aogonek C -65 +KPX Aogonek Cacute -65 +KPX Aogonek Ccaron -65 +KPX Aogonek Ccedilla -65 +KPX Aogonek G -60 +KPX Aogonek Gbreve -60 +KPX Aogonek Gcommaaccent -60 +KPX Aogonek O -50 +KPX Aogonek Oacute -50 +KPX Aogonek Ocircumflex -50 +KPX Aogonek Odieresis -50 +KPX Aogonek Ograve -50 +KPX Aogonek Ohungarumlaut -50 +KPX Aogonek Omacron -50 +KPX Aogonek Oslash -50 +KPX Aogonek Otilde -50 +KPX Aogonek Q -55 +KPX Aogonek T -55 +KPX Aogonek Tcaron -55 +KPX Aogonek Tcommaaccent -55 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -95 +KPX Aogonek W -100 +KPX Aogonek Y -70 +KPX Aogonek Yacute -70 +KPX Aogonek Ydieresis -70 +KPX Aogonek quoteright -74 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -74 +KPX Aogonek w -74 +KPX Aogonek y -34 +KPX Aogonek yacute -34 +KPX Aogonek ydieresis -34 +KPX Aring C -65 +KPX Aring Cacute -65 +KPX Aring Ccaron -65 +KPX Aring Ccedilla -65 +KPX Aring G -60 +KPX Aring Gbreve -60 +KPX Aring Gcommaaccent -60 +KPX Aring O -50 +KPX Aring Oacute -50 +KPX Aring Ocircumflex -50 +KPX Aring Odieresis -50 +KPX Aring Ograve -50 +KPX Aring Ohungarumlaut -50 +KPX Aring Omacron -50 +KPX Aring Oslash -50 +KPX Aring Otilde -50 +KPX Aring Q -55 +KPX Aring T -55 +KPX Aring Tcaron -55 +KPX Aring Tcommaaccent -55 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -95 +KPX Aring W -100 +KPX Aring Y -70 +KPX Aring Yacute -70 +KPX Aring Ydieresis -70 +KPX Aring quoteright -74 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -74 +KPX Aring w -74 +KPX Aring y -74 +KPX Aring yacute -74 +KPX Aring ydieresis -74 +KPX Atilde C -65 +KPX Atilde Cacute -65 +KPX Atilde Ccaron -65 +KPX Atilde Ccedilla -65 +KPX Atilde G -60 +KPX Atilde Gbreve -60 +KPX Atilde Gcommaaccent -60 +KPX Atilde O -50 +KPX Atilde Oacute -50 +KPX Atilde Ocircumflex -50 +KPX Atilde Odieresis -50 +KPX Atilde Ograve -50 +KPX Atilde Ohungarumlaut -50 +KPX Atilde Omacron -50 +KPX Atilde Oslash -50 +KPX Atilde Otilde -50 +KPX Atilde Q -55 +KPX Atilde T -55 +KPX Atilde Tcaron -55 +KPX Atilde Tcommaaccent -55 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -95 +KPX Atilde W -100 +KPX Atilde Y -70 +KPX Atilde Yacute -70 +KPX Atilde Ydieresis -70 +KPX Atilde quoteright -74 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -74 +KPX Atilde w -74 +KPX Atilde y -74 +KPX Atilde yacute -74 +KPX Atilde ydieresis -74 +KPX B A -25 +KPX B Aacute -25 +KPX B Abreve -25 +KPX B Acircumflex -25 +KPX B Adieresis -25 +KPX B Agrave -25 +KPX B Amacron -25 +KPX B Aogonek -25 +KPX B Aring -25 +KPX B Atilde -25 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -25 +KPX D Aacute -25 +KPX D Abreve -25 +KPX D Acircumflex -25 +KPX D Adieresis -25 +KPX D Agrave -25 +KPX D Amacron -25 +KPX D Aogonek -25 +KPX D Aring -25 +KPX D Atilde -25 +KPX D V -50 +KPX D W -40 +KPX D Y -50 +KPX D Yacute -50 +KPX D Ydieresis -50 +KPX Dcaron A -25 +KPX Dcaron Aacute -25 +KPX Dcaron Abreve -25 +KPX Dcaron Acircumflex -25 +KPX Dcaron Adieresis -25 +KPX Dcaron Agrave -25 +KPX Dcaron Amacron -25 +KPX Dcaron Aogonek -25 +KPX Dcaron Aring -25 +KPX Dcaron Atilde -25 +KPX Dcaron V -50 +KPX Dcaron W -40 +KPX Dcaron Y -50 +KPX Dcaron Yacute -50 +KPX Dcaron Ydieresis -50 +KPX Dcroat A -25 +KPX Dcroat Aacute -25 +KPX Dcroat Abreve -25 +KPX Dcroat Acircumflex -25 +KPX Dcroat Adieresis -25 +KPX Dcroat Agrave -25 +KPX Dcroat Amacron -25 +KPX Dcroat Aogonek -25 +KPX Dcroat Aring -25 +KPX Dcroat Atilde -25 +KPX Dcroat V -50 +KPX Dcroat W -40 +KPX Dcroat Y -50 +KPX Dcroat Yacute -50 +KPX Dcroat Ydieresis -50 +KPX F A -100 +KPX F Aacute -100 +KPX F Abreve -100 +KPX F Acircumflex -100 +KPX F Adieresis -100 +KPX F Agrave -100 +KPX F Amacron -100 +KPX F Aogonek -100 +KPX F Aring -100 +KPX F Atilde -100 +KPX F a -95 +KPX F aacute -95 +KPX F abreve -95 +KPX F acircumflex -95 +KPX F adieresis -95 +KPX F agrave -95 +KPX F amacron -95 +KPX F aogonek -95 +KPX F aring -95 +KPX F atilde -95 +KPX F comma -129 +KPX F e -100 +KPX F eacute -100 +KPX F ecaron -100 +KPX F ecircumflex -100 +KPX F edieresis -100 +KPX F edotaccent -100 +KPX F egrave -100 +KPX F emacron -100 +KPX F eogonek -100 +KPX F i -40 +KPX F iacute -40 +KPX F icircumflex -40 +KPX F idieresis -40 +KPX F igrave -40 +KPX F imacron -40 +KPX F iogonek -40 +KPX F o -70 +KPX F oacute -70 +KPX F ocircumflex -70 +KPX F odieresis -70 +KPX F ograve -70 +KPX F ohungarumlaut -70 +KPX F omacron -70 +KPX F oslash -70 +KPX F otilde -70 +KPX F period -129 +KPX F r -50 +KPX F racute -50 +KPX F rcaron -50 +KPX F rcommaaccent -50 +KPX J A -25 +KPX J Aacute -25 +KPX J Abreve -25 +KPX J Acircumflex -25 +KPX J Adieresis -25 +KPX J Agrave -25 +KPX J Amacron -25 +KPX J Aogonek -25 +KPX J Aring -25 +KPX J Atilde -25 +KPX J a -40 +KPX J aacute -40 +KPX J abreve -40 +KPX J acircumflex -40 +KPX J adieresis -40 +KPX J agrave -40 +KPX J amacron -40 +KPX J aogonek -40 +KPX J aring -40 +KPX J atilde -40 +KPX J comma -10 +KPX J e -40 +KPX J eacute -40 +KPX J ecaron -40 +KPX J ecircumflex -40 +KPX J edieresis -40 +KPX J edotaccent -40 +KPX J egrave -40 +KPX J emacron -40 +KPX J eogonek -40 +KPX J o -40 +KPX J oacute -40 +KPX J ocircumflex -40 +KPX J odieresis -40 +KPX J ograve -40 +KPX J ohungarumlaut -40 +KPX J omacron -40 +KPX J oslash -40 +KPX J otilde -40 +KPX J period -10 +KPX J u -40 +KPX J uacute -40 +KPX J ucircumflex -40 +KPX J udieresis -40 +KPX J ugrave -40 +KPX J uhungarumlaut -40 +KPX J umacron -40 +KPX J uogonek -40 +KPX J uring -40 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -25 +KPX K eacute -25 +KPX K ecaron -25 +KPX K ecircumflex -25 +KPX K edieresis -25 +KPX K edotaccent -25 +KPX K egrave -25 +KPX K emacron -25 +KPX K eogonek -25 +KPX K o -25 +KPX K oacute -25 +KPX K ocircumflex -25 +KPX K odieresis -25 +KPX K ograve -25 +KPX K ohungarumlaut -25 +KPX K omacron -25 +KPX K oslash -25 +KPX K otilde -25 +KPX K u -20 +KPX K uacute -20 +KPX K ucircumflex -20 +KPX K udieresis -20 +KPX K ugrave -20 +KPX K uhungarumlaut -20 +KPX K umacron -20 +KPX K uogonek -20 +KPX K uring -20 +KPX K y -20 +KPX K yacute -20 +KPX K ydieresis -20 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -25 +KPX Kcommaaccent eacute -25 +KPX Kcommaaccent ecaron -25 +KPX Kcommaaccent ecircumflex -25 +KPX Kcommaaccent edieresis -25 +KPX Kcommaaccent edotaccent -25 +KPX Kcommaaccent egrave -25 +KPX Kcommaaccent emacron -25 +KPX Kcommaaccent eogonek -25 +KPX Kcommaaccent o -25 +KPX Kcommaaccent oacute -25 +KPX Kcommaaccent ocircumflex -25 +KPX Kcommaaccent odieresis -25 +KPX Kcommaaccent ograve -25 +KPX Kcommaaccent ohungarumlaut -25 +KPX Kcommaaccent omacron -25 +KPX Kcommaaccent oslash -25 +KPX Kcommaaccent otilde -25 +KPX Kcommaaccent u -20 +KPX Kcommaaccent uacute -20 +KPX Kcommaaccent ucircumflex -20 +KPX Kcommaaccent udieresis -20 +KPX Kcommaaccent ugrave -20 +KPX Kcommaaccent uhungarumlaut -20 +KPX Kcommaaccent umacron -20 +KPX Kcommaaccent uogonek -20 +KPX Kcommaaccent uring -20 +KPX Kcommaaccent y -20 +KPX Kcommaaccent yacute -20 +KPX Kcommaaccent ydieresis -20 +KPX L T -18 +KPX L Tcaron -18 +KPX L Tcommaaccent -18 +KPX L V -37 +KPX L W -37 +KPX L Y -37 +KPX L Yacute -37 +KPX L Ydieresis -37 +KPX L quoteright -55 +KPX L y -37 +KPX L yacute -37 +KPX L ydieresis -37 +KPX Lacute T -18 +KPX Lacute Tcaron -18 +KPX Lacute Tcommaaccent -18 +KPX Lacute V -37 +KPX Lacute W -37 +KPX Lacute Y -37 +KPX Lacute Yacute -37 +KPX Lacute Ydieresis -37 +KPX Lacute quoteright -55 +KPX Lacute y -37 +KPX Lacute yacute -37 +KPX Lacute ydieresis -37 +KPX Lcommaaccent T -18 +KPX Lcommaaccent Tcaron -18 +KPX Lcommaaccent Tcommaaccent -18 +KPX Lcommaaccent V -37 +KPX Lcommaaccent W -37 +KPX Lcommaaccent Y -37 +KPX Lcommaaccent Yacute -37 +KPX Lcommaaccent Ydieresis -37 +KPX Lcommaaccent quoteright -55 +KPX Lcommaaccent y -37 +KPX Lcommaaccent yacute -37 +KPX Lcommaaccent ydieresis -37 +KPX Lslash T -18 +KPX Lslash Tcaron -18 +KPX Lslash Tcommaaccent -18 +KPX Lslash V -37 +KPX Lslash W -37 +KPX Lslash Y -37 +KPX Lslash Yacute -37 +KPX Lslash Ydieresis -37 +KPX Lslash quoteright -55 +KPX Lslash y -37 +KPX Lslash yacute -37 +KPX Lslash ydieresis -37 +KPX N A -30 +KPX N Aacute -30 +KPX N Abreve -30 +KPX N Acircumflex -30 +KPX N Adieresis -30 +KPX N Agrave -30 +KPX N Amacron -30 +KPX N Aogonek -30 +KPX N Aring -30 +KPX N Atilde -30 +KPX Nacute A -30 +KPX Nacute Aacute -30 +KPX Nacute Abreve -30 +KPX Nacute Acircumflex -30 +KPX Nacute Adieresis -30 +KPX Nacute Agrave -30 +KPX Nacute Amacron -30 +KPX Nacute Aogonek -30 +KPX Nacute Aring -30 +KPX Nacute Atilde -30 +KPX Ncaron A -30 +KPX Ncaron Aacute -30 +KPX Ncaron Abreve -30 +KPX Ncaron Acircumflex -30 +KPX Ncaron Adieresis -30 +KPX Ncaron Agrave -30 +KPX Ncaron Amacron -30 +KPX Ncaron Aogonek -30 +KPX Ncaron Aring -30 +KPX Ncaron Atilde -30 +KPX Ncommaaccent A -30 +KPX Ncommaaccent Aacute -30 +KPX Ncommaaccent Abreve -30 +KPX Ncommaaccent Acircumflex -30 +KPX Ncommaaccent Adieresis -30 +KPX Ncommaaccent Agrave -30 +KPX Ncommaaccent Amacron -30 +KPX Ncommaaccent Aogonek -30 +KPX Ncommaaccent Aring -30 +KPX Ncommaaccent Atilde -30 +KPX Ntilde A -30 +KPX Ntilde Aacute -30 +KPX Ntilde Abreve -30 +KPX Ntilde Acircumflex -30 +KPX Ntilde Adieresis -30 +KPX Ntilde Agrave -30 +KPX Ntilde Amacron -30 +KPX Ntilde Aogonek -30 +KPX Ntilde Aring -30 +KPX Ntilde Atilde -30 +KPX O A -40 +KPX O Aacute -40 +KPX O Abreve -40 +KPX O Acircumflex -40 +KPX O Adieresis -40 +KPX O Agrave -40 +KPX O Amacron -40 +KPX O Aogonek -40 +KPX O Aring -40 +KPX O Atilde -40 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -40 +KPX Oacute Aacute -40 +KPX Oacute Abreve -40 +KPX Oacute Acircumflex -40 +KPX Oacute Adieresis -40 +KPX Oacute Agrave -40 +KPX Oacute Amacron -40 +KPX Oacute Aogonek -40 +KPX Oacute Aring -40 +KPX Oacute Atilde -40 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -40 +KPX Ocircumflex Aacute -40 +KPX Ocircumflex Abreve -40 +KPX Ocircumflex Acircumflex -40 +KPX Ocircumflex Adieresis -40 +KPX Ocircumflex Agrave -40 +KPX Ocircumflex Amacron -40 +KPX Ocircumflex Aogonek -40 +KPX Ocircumflex Aring -40 +KPX Ocircumflex Atilde -40 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -40 +KPX Odieresis Aacute -40 +KPX Odieresis Abreve -40 +KPX Odieresis Acircumflex -40 +KPX Odieresis Adieresis -40 +KPX Odieresis Agrave -40 +KPX Odieresis Amacron -40 +KPX Odieresis Aogonek -40 +KPX Odieresis Aring -40 +KPX Odieresis Atilde -40 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -40 +KPX Ograve Aacute -40 +KPX Ograve Abreve -40 +KPX Ograve Acircumflex -40 +KPX Ograve Adieresis -40 +KPX Ograve Agrave -40 +KPX Ograve Amacron -40 +KPX Ograve Aogonek -40 +KPX Ograve Aring -40 +KPX Ograve Atilde -40 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -40 +KPX Ohungarumlaut Aacute -40 +KPX Ohungarumlaut Abreve -40 +KPX Ohungarumlaut Acircumflex -40 +KPX Ohungarumlaut Adieresis -40 +KPX Ohungarumlaut Agrave -40 +KPX Ohungarumlaut Amacron -40 +KPX Ohungarumlaut Aogonek -40 +KPX Ohungarumlaut Aring -40 +KPX Ohungarumlaut Atilde -40 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -40 +KPX Omacron Aacute -40 +KPX Omacron Abreve -40 +KPX Omacron Acircumflex -40 +KPX Omacron Adieresis -40 +KPX Omacron Agrave -40 +KPX Omacron Amacron -40 +KPX Omacron Aogonek -40 +KPX Omacron Aring -40 +KPX Omacron Atilde -40 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -40 +KPX Oslash Aacute -40 +KPX Oslash Abreve -40 +KPX Oslash Acircumflex -40 +KPX Oslash Adieresis -40 +KPX Oslash Agrave -40 +KPX Oslash Amacron -40 +KPX Oslash Aogonek -40 +KPX Oslash Aring -40 +KPX Oslash Atilde -40 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -40 +KPX Otilde Aacute -40 +KPX Otilde Abreve -40 +KPX Otilde Acircumflex -40 +KPX Otilde Adieresis -40 +KPX Otilde Agrave -40 +KPX Otilde Amacron -40 +KPX Otilde Aogonek -40 +KPX Otilde Aring -40 +KPX Otilde Atilde -40 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -85 +KPX P Aacute -85 +KPX P Abreve -85 +KPX P Acircumflex -85 +KPX P Adieresis -85 +KPX P Agrave -85 +KPX P Amacron -85 +KPX P Aogonek -85 +KPX P Aring -85 +KPX P Atilde -85 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -129 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -55 +KPX P oacute -55 +KPX P ocircumflex -55 +KPX P odieresis -55 +KPX P ograve -55 +KPX P ohungarumlaut -55 +KPX P omacron -55 +KPX P oslash -55 +KPX P otilde -55 +KPX P period -129 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -40 +KPX R Oacute -40 +KPX R Ocircumflex -40 +KPX R Odieresis -40 +KPX R Ograve -40 +KPX R Ohungarumlaut -40 +KPX R Omacron -40 +KPX R Oslash -40 +KPX R Otilde -40 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -18 +KPX R W -18 +KPX R Y -18 +KPX R Yacute -18 +KPX R Ydieresis -18 +KPX Racute O -40 +KPX Racute Oacute -40 +KPX Racute Ocircumflex -40 +KPX Racute Odieresis -40 +KPX Racute Ograve -40 +KPX Racute Ohungarumlaut -40 +KPX Racute Omacron -40 +KPX Racute Oslash -40 +KPX Racute Otilde -40 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -18 +KPX Racute W -18 +KPX Racute Y -18 +KPX Racute Yacute -18 +KPX Racute Ydieresis -18 +KPX Rcaron O -40 +KPX Rcaron Oacute -40 +KPX Rcaron Ocircumflex -40 +KPX Rcaron Odieresis -40 +KPX Rcaron Ograve -40 +KPX Rcaron Ohungarumlaut -40 +KPX Rcaron Omacron -40 +KPX Rcaron Oslash -40 +KPX Rcaron Otilde -40 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -18 +KPX Rcaron W -18 +KPX Rcaron Y -18 +KPX Rcaron Yacute -18 +KPX Rcaron Ydieresis -18 +KPX Rcommaaccent O -40 +KPX Rcommaaccent Oacute -40 +KPX Rcommaaccent Ocircumflex -40 +KPX Rcommaaccent Odieresis -40 +KPX Rcommaaccent Ograve -40 +KPX Rcommaaccent Ohungarumlaut -40 +KPX Rcommaaccent Omacron -40 +KPX Rcommaaccent Oslash -40 +KPX Rcommaaccent Otilde -40 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -18 +KPX Rcommaaccent W -18 +KPX Rcommaaccent Y -18 +KPX Rcommaaccent Yacute -18 +KPX Rcommaaccent Ydieresis -18 +KPX T A -55 +KPX T Aacute -55 +KPX T Abreve -55 +KPX T Acircumflex -55 +KPX T Adieresis -55 +KPX T Agrave -55 +KPX T Amacron -55 +KPX T Aogonek -55 +KPX T Aring -55 +KPX T Atilde -55 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -92 +KPX T aacute -92 +KPX T abreve -92 +KPX T acircumflex -92 +KPX T adieresis -92 +KPX T agrave -92 +KPX T amacron -92 +KPX T aogonek -92 +KPX T aring -92 +KPX T atilde -92 +KPX T colon -74 +KPX T comma -92 +KPX T e -92 +KPX T eacute -92 +KPX T ecaron -92 +KPX T ecircumflex -92 +KPX T edieresis -52 +KPX T edotaccent -92 +KPX T egrave -52 +KPX T emacron -52 +KPX T eogonek -92 +KPX T hyphen -92 +KPX T i -37 +KPX T iacute -37 +KPX T iogonek -37 +KPX T o -95 +KPX T oacute -95 +KPX T ocircumflex -95 +KPX T odieresis -95 +KPX T ograve -95 +KPX T ohungarumlaut -95 +KPX T omacron -95 +KPX T oslash -95 +KPX T otilde -95 +KPX T period -92 +KPX T r -37 +KPX T racute -37 +KPX T rcaron -37 +KPX T rcommaaccent -37 +KPX T semicolon -74 +KPX T u -37 +KPX T uacute -37 +KPX T ucircumflex -37 +KPX T udieresis -37 +KPX T ugrave -37 +KPX T uhungarumlaut -37 +KPX T umacron -37 +KPX T uogonek -37 +KPX T uring -37 +KPX T w -37 +KPX T y -37 +KPX T yacute -37 +KPX T ydieresis -37 +KPX Tcaron A -55 +KPX Tcaron Aacute -55 +KPX Tcaron Abreve -55 +KPX Tcaron Acircumflex -55 +KPX Tcaron Adieresis -55 +KPX Tcaron Agrave -55 +KPX Tcaron Amacron -55 +KPX Tcaron Aogonek -55 +KPX Tcaron Aring -55 +KPX Tcaron Atilde -55 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -92 +KPX Tcaron aacute -92 +KPX Tcaron abreve -92 +KPX Tcaron acircumflex -92 +KPX Tcaron adieresis -92 +KPX Tcaron agrave -92 +KPX Tcaron amacron -92 +KPX Tcaron aogonek -92 +KPX Tcaron aring -92 +KPX Tcaron atilde -92 +KPX Tcaron colon -74 +KPX Tcaron comma -92 +KPX Tcaron e -92 +KPX Tcaron eacute -92 +KPX Tcaron ecaron -92 +KPX Tcaron ecircumflex -92 +KPX Tcaron edieresis -52 +KPX Tcaron edotaccent -92 +KPX Tcaron egrave -52 +KPX Tcaron emacron -52 +KPX Tcaron eogonek -92 +KPX Tcaron hyphen -92 +KPX Tcaron i -37 +KPX Tcaron iacute -37 +KPX Tcaron iogonek -37 +KPX Tcaron o -95 +KPX Tcaron oacute -95 +KPX Tcaron ocircumflex -95 +KPX Tcaron odieresis -95 +KPX Tcaron ograve -95 +KPX Tcaron ohungarumlaut -95 +KPX Tcaron omacron -95 +KPX Tcaron oslash -95 +KPX Tcaron otilde -95 +KPX Tcaron period -92 +KPX Tcaron r -37 +KPX Tcaron racute -37 +KPX Tcaron rcaron -37 +KPX Tcaron rcommaaccent -37 +KPX Tcaron semicolon -74 +KPX Tcaron u -37 +KPX Tcaron uacute -37 +KPX Tcaron ucircumflex -37 +KPX Tcaron udieresis -37 +KPX Tcaron ugrave -37 +KPX Tcaron uhungarumlaut -37 +KPX Tcaron umacron -37 +KPX Tcaron uogonek -37 +KPX Tcaron uring -37 +KPX Tcaron w -37 +KPX Tcaron y -37 +KPX Tcaron yacute -37 +KPX Tcaron ydieresis -37 +KPX Tcommaaccent A -55 +KPX Tcommaaccent Aacute -55 +KPX Tcommaaccent Abreve -55 +KPX Tcommaaccent Acircumflex -55 +KPX Tcommaaccent Adieresis -55 +KPX Tcommaaccent Agrave -55 +KPX Tcommaaccent Amacron -55 +KPX Tcommaaccent Aogonek -55 +KPX Tcommaaccent Aring -55 +KPX Tcommaaccent Atilde -55 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -92 +KPX Tcommaaccent aacute -92 +KPX Tcommaaccent abreve -92 +KPX Tcommaaccent acircumflex -92 +KPX Tcommaaccent adieresis -92 +KPX Tcommaaccent agrave -92 +KPX Tcommaaccent amacron -92 +KPX Tcommaaccent aogonek -92 +KPX Tcommaaccent aring -92 +KPX Tcommaaccent atilde -92 +KPX Tcommaaccent colon -74 +KPX Tcommaaccent comma -92 +KPX Tcommaaccent e -92 +KPX Tcommaaccent eacute -92 +KPX Tcommaaccent ecaron -92 +KPX Tcommaaccent ecircumflex -92 +KPX Tcommaaccent edieresis -52 +KPX Tcommaaccent edotaccent -92 +KPX Tcommaaccent egrave -52 +KPX Tcommaaccent emacron -52 +KPX Tcommaaccent eogonek -92 +KPX Tcommaaccent hyphen -92 +KPX Tcommaaccent i -37 +KPX Tcommaaccent iacute -37 +KPX Tcommaaccent iogonek -37 +KPX Tcommaaccent o -95 +KPX Tcommaaccent oacute -95 +KPX Tcommaaccent ocircumflex -95 +KPX Tcommaaccent odieresis -95 +KPX Tcommaaccent ograve -95 +KPX Tcommaaccent ohungarumlaut -95 +KPX Tcommaaccent omacron -95 +KPX Tcommaaccent oslash -95 +KPX Tcommaaccent otilde -95 +KPX Tcommaaccent period -92 +KPX Tcommaaccent r -37 +KPX Tcommaaccent racute -37 +KPX Tcommaaccent rcaron -37 +KPX Tcommaaccent rcommaaccent -37 +KPX Tcommaaccent semicolon -74 +KPX Tcommaaccent u -37 +KPX Tcommaaccent uacute -37 +KPX Tcommaaccent ucircumflex -37 +KPX Tcommaaccent udieresis -37 +KPX Tcommaaccent ugrave -37 +KPX Tcommaaccent uhungarumlaut -37 +KPX Tcommaaccent umacron -37 +KPX Tcommaaccent uogonek -37 +KPX Tcommaaccent uring -37 +KPX Tcommaaccent w -37 +KPX Tcommaaccent y -37 +KPX Tcommaaccent yacute -37 +KPX Tcommaaccent ydieresis -37 +KPX U A -45 +KPX U Aacute -45 +KPX U Abreve -45 +KPX U Acircumflex -45 +KPX U Adieresis -45 +KPX U Agrave -45 +KPX U Amacron -45 +KPX U Aogonek -45 +KPX U Aring -45 +KPX U Atilde -45 +KPX Uacute A -45 +KPX Uacute Aacute -45 +KPX Uacute Abreve -45 +KPX Uacute Acircumflex -45 +KPX Uacute Adieresis -45 +KPX Uacute Agrave -45 +KPX Uacute Amacron -45 +KPX Uacute Aogonek -45 +KPX Uacute Aring -45 +KPX Uacute Atilde -45 +KPX Ucircumflex A -45 +KPX Ucircumflex Aacute -45 +KPX Ucircumflex Abreve -45 +KPX Ucircumflex Acircumflex -45 +KPX Ucircumflex Adieresis -45 +KPX Ucircumflex Agrave -45 +KPX Ucircumflex Amacron -45 +KPX Ucircumflex Aogonek -45 +KPX Ucircumflex Aring -45 +KPX Ucircumflex Atilde -45 +KPX Udieresis A -45 +KPX Udieresis Aacute -45 +KPX Udieresis Abreve -45 +KPX Udieresis Acircumflex -45 +KPX Udieresis Adieresis -45 +KPX Udieresis Agrave -45 +KPX Udieresis Amacron -45 +KPX Udieresis Aogonek -45 +KPX Udieresis Aring -45 +KPX Udieresis Atilde -45 +KPX Ugrave A -45 +KPX Ugrave Aacute -45 +KPX Ugrave Abreve -45 +KPX Ugrave Acircumflex -45 +KPX Ugrave Adieresis -45 +KPX Ugrave Agrave -45 +KPX Ugrave Amacron -45 +KPX Ugrave Aogonek -45 +KPX Ugrave Aring -45 +KPX Ugrave Atilde -45 +KPX Uhungarumlaut A -45 +KPX Uhungarumlaut Aacute -45 +KPX Uhungarumlaut Abreve -45 +KPX Uhungarumlaut Acircumflex -45 +KPX Uhungarumlaut Adieresis -45 +KPX Uhungarumlaut Agrave -45 +KPX Uhungarumlaut Amacron -45 +KPX Uhungarumlaut Aogonek -45 +KPX Uhungarumlaut Aring -45 +KPX Uhungarumlaut Atilde -45 +KPX Umacron A -45 +KPX Umacron Aacute -45 +KPX Umacron Abreve -45 +KPX Umacron Acircumflex -45 +KPX Umacron Adieresis -45 +KPX Umacron Agrave -45 +KPX Umacron Amacron -45 +KPX Umacron Aogonek -45 +KPX Umacron Aring -45 +KPX Umacron Atilde -45 +KPX Uogonek A -45 +KPX Uogonek Aacute -45 +KPX Uogonek Abreve -45 +KPX Uogonek Acircumflex -45 +KPX Uogonek Adieresis -45 +KPX Uogonek Agrave -45 +KPX Uogonek Amacron -45 +KPX Uogonek Aogonek -45 +KPX Uogonek Aring -45 +KPX Uogonek Atilde -45 +KPX Uring A -45 +KPX Uring Aacute -45 +KPX Uring Abreve -45 +KPX Uring Acircumflex -45 +KPX Uring Adieresis -45 +KPX Uring Agrave -45 +KPX Uring Amacron -45 +KPX Uring Aogonek -45 +KPX Uring Aring -45 +KPX Uring Atilde -45 +KPX V A -85 +KPX V Aacute -85 +KPX V Abreve -85 +KPX V Acircumflex -85 +KPX V Adieresis -85 +KPX V Agrave -85 +KPX V Amacron -85 +KPX V Aogonek -85 +KPX V Aring -85 +KPX V Atilde -85 +KPX V G -10 +KPX V Gbreve -10 +KPX V Gcommaaccent -10 +KPX V O -30 +KPX V Oacute -30 +KPX V Ocircumflex -30 +KPX V Odieresis -30 +KPX V Ograve -30 +KPX V Ohungarumlaut -30 +KPX V Omacron -30 +KPX V Oslash -30 +KPX V Otilde -30 +KPX V a -111 +KPX V aacute -111 +KPX V abreve -111 +KPX V acircumflex -111 +KPX V adieresis -111 +KPX V agrave -111 +KPX V amacron -111 +KPX V aogonek -111 +KPX V aring -111 +KPX V atilde -111 +KPX V colon -74 +KPX V comma -129 +KPX V e -111 +KPX V eacute -111 +KPX V ecaron -111 +KPX V ecircumflex -111 +KPX V edieresis -71 +KPX V edotaccent -111 +KPX V egrave -71 +KPX V emacron -71 +KPX V eogonek -111 +KPX V hyphen -70 +KPX V i -55 +KPX V iacute -55 +KPX V iogonek -55 +KPX V o -111 +KPX V oacute -111 +KPX V ocircumflex -111 +KPX V odieresis -111 +KPX V ograve -111 +KPX V ohungarumlaut -111 +KPX V omacron -111 +KPX V oslash -111 +KPX V otilde -111 +KPX V period -129 +KPX V semicolon -74 +KPX V u -55 +KPX V uacute -55 +KPX V ucircumflex -55 +KPX V udieresis -55 +KPX V ugrave -55 +KPX V uhungarumlaut -55 +KPX V umacron -55 +KPX V uogonek -55 +KPX V uring -55 +KPX W A -74 +KPX W Aacute -74 +KPX W Abreve -74 +KPX W Acircumflex -74 +KPX W Adieresis -74 +KPX W Agrave -74 +KPX W Amacron -74 +KPX W Aogonek -74 +KPX W Aring -74 +KPX W Atilde -74 +KPX W O -15 +KPX W Oacute -15 +KPX W Ocircumflex -15 +KPX W Odieresis -15 +KPX W Ograve -15 +KPX W Ohungarumlaut -15 +KPX W Omacron -15 +KPX W Oslash -15 +KPX W Otilde -15 +KPX W a -85 +KPX W aacute -85 +KPX W abreve -85 +KPX W acircumflex -85 +KPX W adieresis -85 +KPX W agrave -85 +KPX W amacron -85 +KPX W aogonek -85 +KPX W aring -85 +KPX W atilde -85 +KPX W colon -55 +KPX W comma -74 +KPX W e -90 +KPX W eacute -90 +KPX W ecaron -90 +KPX W ecircumflex -90 +KPX W edieresis -50 +KPX W edotaccent -90 +KPX W egrave -50 +KPX W emacron -50 +KPX W eogonek -90 +KPX W hyphen -50 +KPX W i -37 +KPX W iacute -37 +KPX W iogonek -37 +KPX W o -80 +KPX W oacute -80 +KPX W ocircumflex -80 +KPX W odieresis -80 +KPX W ograve -80 +KPX W ohungarumlaut -80 +KPX W omacron -80 +KPX W oslash -80 +KPX W otilde -80 +KPX W period -74 +KPX W semicolon -55 +KPX W u -55 +KPX W uacute -55 +KPX W ucircumflex -55 +KPX W udieresis -55 +KPX W ugrave -55 +KPX W uhungarumlaut -55 +KPX W umacron -55 +KPX W uogonek -55 +KPX W uring -55 +KPX W y -55 +KPX W yacute -55 +KPX W ydieresis -55 +KPX Y A -74 +KPX Y Aacute -74 +KPX Y Abreve -74 +KPX Y Acircumflex -74 +KPX Y Adieresis -74 +KPX Y Agrave -74 +KPX Y Amacron -74 +KPX Y Aogonek -74 +KPX Y Aring -74 +KPX Y Atilde -74 +KPX Y O -25 +KPX Y Oacute -25 +KPX Y Ocircumflex -25 +KPX Y Odieresis -25 +KPX Y Ograve -25 +KPX Y Ohungarumlaut -25 +KPX Y Omacron -25 +KPX Y Oslash -25 +KPX Y Otilde -25 +KPX Y a -92 +KPX Y aacute -92 +KPX Y abreve -92 +KPX Y acircumflex -92 +KPX Y adieresis -92 +KPX Y agrave -92 +KPX Y amacron -92 +KPX Y aogonek -92 +KPX Y aring -92 +KPX Y atilde -92 +KPX Y colon -92 +KPX Y comma -92 +KPX Y e -111 +KPX Y eacute -111 +KPX Y ecaron -111 +KPX Y ecircumflex -71 +KPX Y edieresis -71 +KPX Y edotaccent -111 +KPX Y egrave -71 +KPX Y emacron -71 +KPX Y eogonek -111 +KPX Y hyphen -92 +KPX Y i -55 +KPX Y iacute -55 +KPX Y iogonek -55 +KPX Y o -111 +KPX Y oacute -111 +KPX Y ocircumflex -111 +KPX Y odieresis -111 +KPX Y ograve -111 +KPX Y ohungarumlaut -111 +KPX Y omacron -111 +KPX Y oslash -111 +KPX Y otilde -111 +KPX Y period -74 +KPX Y semicolon -92 +KPX Y u -92 +KPX Y uacute -92 +KPX Y ucircumflex -92 +KPX Y udieresis -92 +KPX Y ugrave -92 +KPX Y uhungarumlaut -92 +KPX Y umacron -92 +KPX Y uogonek -92 +KPX Y uring -92 +KPX Yacute A -74 +KPX Yacute Aacute -74 +KPX Yacute Abreve -74 +KPX Yacute Acircumflex -74 +KPX Yacute Adieresis -74 +KPX Yacute Agrave -74 +KPX Yacute Amacron -74 +KPX Yacute Aogonek -74 +KPX Yacute Aring -74 +KPX Yacute Atilde -74 +KPX Yacute O -25 +KPX Yacute Oacute -25 +KPX Yacute Ocircumflex -25 +KPX Yacute Odieresis -25 +KPX Yacute Ograve -25 +KPX Yacute Ohungarumlaut -25 +KPX Yacute Omacron -25 +KPX Yacute Oslash -25 +KPX Yacute Otilde -25 +KPX Yacute a -92 +KPX Yacute aacute -92 +KPX Yacute abreve -92 +KPX Yacute acircumflex -92 +KPX Yacute adieresis -92 +KPX Yacute agrave -92 +KPX Yacute amacron -92 +KPX Yacute aogonek -92 +KPX Yacute aring -92 +KPX Yacute atilde -92 +KPX Yacute colon -92 +KPX Yacute comma -92 +KPX Yacute e -111 +KPX Yacute eacute -111 +KPX Yacute ecaron -111 +KPX Yacute ecircumflex -71 +KPX Yacute edieresis -71 +KPX Yacute edotaccent -111 +KPX Yacute egrave -71 +KPX Yacute emacron -71 +KPX Yacute eogonek -111 +KPX Yacute hyphen -92 +KPX Yacute i -55 +KPX Yacute iacute -55 +KPX Yacute iogonek -55 +KPX Yacute o -111 +KPX Yacute oacute -111 +KPX Yacute ocircumflex -111 +KPX Yacute odieresis -111 +KPX Yacute ograve -111 +KPX Yacute ohungarumlaut -111 +KPX Yacute omacron -111 +KPX Yacute oslash -111 +KPX Yacute otilde -111 +KPX Yacute period -74 +KPX Yacute semicolon -92 +KPX Yacute u -92 +KPX Yacute uacute -92 +KPX Yacute ucircumflex -92 +KPX Yacute udieresis -92 +KPX Yacute ugrave -92 +KPX Yacute uhungarumlaut -92 +KPX Yacute umacron -92 +KPX Yacute uogonek -92 +KPX Yacute uring -92 +KPX Ydieresis A -74 +KPX Ydieresis Aacute -74 +KPX Ydieresis Abreve -74 +KPX Ydieresis Acircumflex -74 +KPX Ydieresis Adieresis -74 +KPX Ydieresis Agrave -74 +KPX Ydieresis Amacron -74 +KPX Ydieresis Aogonek -74 +KPX Ydieresis Aring -74 +KPX Ydieresis Atilde -74 +KPX Ydieresis O -25 +KPX Ydieresis Oacute -25 +KPX Ydieresis Ocircumflex -25 +KPX Ydieresis Odieresis -25 +KPX Ydieresis Ograve -25 +KPX Ydieresis Ohungarumlaut -25 +KPX Ydieresis Omacron -25 +KPX Ydieresis Oslash -25 +KPX Ydieresis Otilde -25 +KPX Ydieresis a -92 +KPX Ydieresis aacute -92 +KPX Ydieresis abreve -92 +KPX Ydieresis acircumflex -92 +KPX Ydieresis adieresis -92 +KPX Ydieresis agrave -92 +KPX Ydieresis amacron -92 +KPX Ydieresis aogonek -92 +KPX Ydieresis aring -92 +KPX Ydieresis atilde -92 +KPX Ydieresis colon -92 +KPX Ydieresis comma -92 +KPX Ydieresis e -111 +KPX Ydieresis eacute -111 +KPX Ydieresis ecaron -111 +KPX Ydieresis ecircumflex -71 +KPX Ydieresis edieresis -71 +KPX Ydieresis edotaccent -111 +KPX Ydieresis egrave -71 +KPX Ydieresis emacron -71 +KPX Ydieresis eogonek -111 +KPX Ydieresis hyphen -92 +KPX Ydieresis i -55 +KPX Ydieresis iacute -55 +KPX Ydieresis iogonek -55 +KPX Ydieresis o -111 +KPX Ydieresis oacute -111 +KPX Ydieresis ocircumflex -111 +KPX Ydieresis odieresis -111 +KPX Ydieresis ograve -111 +KPX Ydieresis ohungarumlaut -111 +KPX Ydieresis omacron -111 +KPX Ydieresis oslash -111 +KPX Ydieresis otilde -111 +KPX Ydieresis period -74 +KPX Ydieresis semicolon -92 +KPX Ydieresis u -92 +KPX Ydieresis uacute -92 +KPX Ydieresis ucircumflex -92 +KPX Ydieresis udieresis -92 +KPX Ydieresis ugrave -92 +KPX Ydieresis uhungarumlaut -92 +KPX Ydieresis umacron -92 +KPX Ydieresis uogonek -92 +KPX Ydieresis uring -92 +KPX b b -10 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX c h -10 +KPX c k -10 +KPX c kcommaaccent -10 +KPX cacute h -10 +KPX cacute k -10 +KPX cacute kcommaaccent -10 +KPX ccaron h -10 +KPX ccaron k -10 +KPX ccaron kcommaaccent -10 +KPX ccedilla h -10 +KPX ccedilla k -10 +KPX ccedilla kcommaaccent -10 +KPX comma quotedblright -95 +KPX comma quoteright -95 +KPX e b -10 +KPX eacute b -10 +KPX ecaron b -10 +KPX ecircumflex b -10 +KPX edieresis b -10 +KPX edotaccent b -10 +KPX egrave b -10 +KPX emacron b -10 +KPX eogonek b -10 +KPX f comma -10 +KPX f dotlessi -30 +KPX f e -10 +KPX f eacute -10 +KPX f edotaccent -10 +KPX f eogonek -10 +KPX f f -18 +KPX f o -10 +KPX f oacute -10 +KPX f ocircumflex -10 +KPX f ograve -10 +KPX f ohungarumlaut -10 +KPX f oslash -10 +KPX f otilde -10 +KPX f period -10 +KPX f quoteright 55 +KPX k e -30 +KPX k eacute -30 +KPX k ecaron -30 +KPX k ecircumflex -30 +KPX k edieresis -30 +KPX k edotaccent -30 +KPX k egrave -30 +KPX k emacron -30 +KPX k eogonek -30 +KPX k o -10 +KPX k oacute -10 +KPX k ocircumflex -10 +KPX k odieresis -10 +KPX k ograve -10 +KPX k ohungarumlaut -10 +KPX k omacron -10 +KPX k oslash -10 +KPX k otilde -10 +KPX kcommaaccent e -30 +KPX kcommaaccent eacute -30 +KPX kcommaaccent ecaron -30 +KPX kcommaaccent ecircumflex -30 +KPX kcommaaccent edieresis -30 +KPX kcommaaccent edotaccent -30 +KPX kcommaaccent egrave -30 +KPX kcommaaccent emacron -30 +KPX kcommaaccent eogonek -30 +KPX kcommaaccent o -10 +KPX kcommaaccent oacute -10 +KPX kcommaaccent ocircumflex -10 +KPX kcommaaccent odieresis -10 +KPX kcommaaccent ograve -10 +KPX kcommaaccent ohungarumlaut -10 +KPX kcommaaccent omacron -10 +KPX kcommaaccent oslash -10 +KPX kcommaaccent otilde -10 +KPX n v -40 +KPX nacute v -40 +KPX ncaron v -40 +KPX ncommaaccent v -40 +KPX ntilde v -40 +KPX o v -15 +KPX o w -25 +KPX o x -10 +KPX o y -10 +KPX o yacute -10 +KPX o ydieresis -10 +KPX oacute v -15 +KPX oacute w -25 +KPX oacute x -10 +KPX oacute y -10 +KPX oacute yacute -10 +KPX oacute ydieresis -10 +KPX ocircumflex v -15 +KPX ocircumflex w -25 +KPX ocircumflex x -10 +KPX ocircumflex y -10 +KPX ocircumflex yacute -10 +KPX ocircumflex ydieresis -10 +KPX odieresis v -15 +KPX odieresis w -25 +KPX odieresis x -10 +KPX odieresis y -10 +KPX odieresis yacute -10 +KPX odieresis ydieresis -10 +KPX ograve v -15 +KPX ograve w -25 +KPX ograve x -10 +KPX ograve y -10 +KPX ograve yacute -10 +KPX ograve ydieresis -10 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -25 +KPX ohungarumlaut x -10 +KPX ohungarumlaut y -10 +KPX ohungarumlaut yacute -10 +KPX ohungarumlaut ydieresis -10 +KPX omacron v -15 +KPX omacron w -25 +KPX omacron x -10 +KPX omacron y -10 +KPX omacron yacute -10 +KPX omacron ydieresis -10 +KPX oslash v -15 +KPX oslash w -25 +KPX oslash x -10 +KPX oslash y -10 +KPX oslash yacute -10 +KPX oslash ydieresis -10 +KPX otilde v -15 +KPX otilde w -25 +KPX otilde x -10 +KPX otilde y -10 +KPX otilde yacute -10 +KPX otilde ydieresis -10 +KPX period quotedblright -95 +KPX period quoteright -95 +KPX quoteleft quoteleft -74 +KPX quoteright d -15 +KPX quoteright dcroat -15 +KPX quoteright quoteright -74 +KPX quoteright r -15 +KPX quoteright racute -15 +KPX quoteright rcaron -15 +KPX quoteright rcommaaccent -15 +KPX quoteright s -74 +KPX quoteright sacute -74 +KPX quoteright scaron -74 +KPX quoteright scedilla -74 +KPX quoteright scommaaccent -74 +KPX quoteright space -74 +KPX quoteright t -37 +KPX quoteright tcommaaccent -37 +KPX quoteright v -15 +KPX r comma -65 +KPX r period -65 +KPX racute comma -65 +KPX racute period -65 +KPX rcaron comma -65 +KPX rcaron period -65 +KPX rcommaaccent comma -65 +KPX rcommaaccent period -65 +KPX space A -37 +KPX space Aacute -37 +KPX space Abreve -37 +KPX space Acircumflex -37 +KPX space Adieresis -37 +KPX space Agrave -37 +KPX space Amacron -37 +KPX space Aogonek -37 +KPX space Aring -37 +KPX space Atilde -37 +KPX space V -70 +KPX space W -70 +KPX space Y -70 +KPX space Yacute -70 +KPX space Ydieresis -70 +KPX v comma -37 +KPX v e -15 +KPX v eacute -15 +KPX v ecaron -15 +KPX v ecircumflex -15 +KPX v edieresis -15 +KPX v edotaccent -15 +KPX v egrave -15 +KPX v emacron -15 +KPX v eogonek -15 +KPX v o -15 +KPX v oacute -15 +KPX v ocircumflex -15 +KPX v odieresis -15 +KPX v ograve -15 +KPX v ohungarumlaut -15 +KPX v omacron -15 +KPX v oslash -15 +KPX v otilde -15 +KPX v period -37 +KPX w a -10 +KPX w aacute -10 +KPX w abreve -10 +KPX w acircumflex -10 +KPX w adieresis -10 +KPX w agrave -10 +KPX w amacron -10 +KPX w aogonek -10 +KPX w aring -10 +KPX w atilde -10 +KPX w comma -37 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -15 +KPX w oacute -15 +KPX w ocircumflex -15 +KPX w odieresis -15 +KPX w ograve -15 +KPX w ohungarumlaut -15 +KPX w omacron -15 +KPX w oslash -15 +KPX w otilde -15 +KPX w period -37 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y comma -37 +KPX y period -37 +KPX yacute comma -37 +KPX yacute period -37 +KPX ydieresis comma -37 +KPX ydieresis period -37 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Times-Italic.afm b/application/third_party/dompdf/lib/fonts/Times-Italic.afm new file mode 100644 index 00000000..822e8986 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Italic.afm @@ -0,0 +1,2669 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:56:55 1997 +Comment UniqueID 43067 +Comment VMusage 47727 58752 +FontName Times-Italic +FullName Times Italic +FamilyName Times +Weight Medium +ItalicAngle -15.5 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -169 -217 1010 883 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 653 +XHeight 441 +Ascender 683 +Descender -217 +StdHW 32 +StdVW 76 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ; +C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ; +C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ; +C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ; +C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ; +C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ; +C 146 ; WX 333 ; N quoteright ; B 151 436 290 666 ; +C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ; +C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ; +C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ; +C 43 ; WX 675 ; N plus ; B 86 0 590 506 ; +C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ; +C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ; +C 173 ; WX 333 ; N hyphen ; B 49 192 282 255 ; +C 46 ; WX 250 ; N period ; B 27 -11 138 100 ; +C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ; +C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ; +C 49 ; WX 500 ; N one ; B 49 0 409 676 ; +C 50 ; WX 500 ; N two ; B 12 0 452 676 ; +C 51 ; WX 500 ; N three ; B 15 -7 465 676 ; +C 52 ; WX 500 ; N four ; B 1 0 479 676 ; +C 53 ; WX 500 ; N five ; B 15 -7 491 666 ; +C 54 ; WX 500 ; N six ; B 30 -7 521 686 ; +C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ; +C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ; +C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ; +C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ; +C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ; +C 60 ; WX 675 ; N less ; B 84 -8 592 514 ; +C 61 ; WX 675 ; N equal ; B 86 120 590 386 ; +C 62 ; WX 675 ; N greater ; B 84 -8 592 514 ; +C 63 ; WX 500 ; N question ; B 132 -12 472 664 ; +C 64 ; WX 920 ; N at ; B 118 -18 806 666 ; +C 65 ; WX 611 ; N A ; B -51 0 564 668 ; +C 66 ; WX 611 ; N B ; B -8 0 588 653 ; +C 67 ; WX 667 ; N C ; B 66 -18 689 666 ; +C 68 ; WX 722 ; N D ; B -8 0 700 653 ; +C 69 ; WX 611 ; N E ; B -1 0 634 653 ; +C 70 ; WX 611 ; N F ; B 8 0 645 653 ; +C 71 ; WX 722 ; N G ; B 52 -18 722 666 ; +C 72 ; WX 722 ; N H ; B -8 0 767 653 ; +C 73 ; WX 333 ; N I ; B -8 0 384 653 ; +C 74 ; WX 444 ; N J ; B -6 -18 491 653 ; +C 75 ; WX 667 ; N K ; B 7 0 722 653 ; +C 76 ; WX 556 ; N L ; B -8 0 559 653 ; +C 77 ; WX 833 ; N M ; B -18 0 873 653 ; +C 78 ; WX 667 ; N N ; B -20 -15 727 653 ; +C 79 ; WX 722 ; N O ; B 60 -18 699 666 ; +C 80 ; WX 611 ; N P ; B 0 0 605 653 ; +C 81 ; WX 722 ; N Q ; B 59 -182 699 666 ; +C 82 ; WX 611 ; N R ; B -13 0 588 653 ; +C 83 ; WX 500 ; N S ; B 17 -18 508 667 ; +C 84 ; WX 556 ; N T ; B 59 0 633 653 ; +C 85 ; WX 722 ; N U ; B 102 -18 765 653 ; +C 86 ; WX 611 ; N V ; B 76 -18 688 653 ; +C 87 ; WX 833 ; N W ; B 71 -18 906 653 ; +C 88 ; WX 611 ; N X ; B -29 0 655 653 ; +C 89 ; WX 556 ; N Y ; B 78 0 633 653 ; +C 90 ; WX 556 ; N Z ; B -6 0 606 653 ; +C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ; +C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ; +C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ; +C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 171 436 310 666 ; +C 97 ; WX 500 ; N a ; B 17 -11 476 441 ; +C 98 ; WX 500 ; N b ; B 23 -11 473 683 ; +C 99 ; WX 444 ; N c ; B 30 -11 425 441 ; +C 100 ; WX 500 ; N d ; B 15 -13 527 683 ; +C 101 ; WX 444 ; N e ; B 31 -11 412 441 ; +C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B 8 -206 472 441 ; +C 104 ; WX 500 ; N h ; B 19 -9 478 683 ; +C 105 ; WX 278 ; N i ; B 49 -11 264 654 ; +C 106 ; WX 278 ; N j ; B -124 -207 276 654 ; +C 107 ; WX 444 ; N k ; B 14 -11 461 683 ; +C 108 ; WX 278 ; N l ; B 41 -11 279 683 ; +C 109 ; WX 722 ; N m ; B 12 -9 704 441 ; +C 110 ; WX 500 ; N n ; B 14 -9 474 441 ; +C 111 ; WX 500 ; N o ; B 27 -11 468 441 ; +C 112 ; WX 500 ; N p ; B -75 -205 469 441 ; +C 113 ; WX 500 ; N q ; B 25 -209 483 441 ; +C 114 ; WX 389 ; N r ; B 45 0 412 441 ; +C 115 ; WX 389 ; N s ; B 16 -13 366 442 ; +C 116 ; WX 278 ; N t ; B 37 -11 296 546 ; +C 117 ; WX 500 ; N u ; B 42 -11 475 441 ; +C 118 ; WX 444 ; N v ; B 21 -18 426 441 ; +C 119 ; WX 667 ; N w ; B 16 -18 648 441 ; +C 120 ; WX 444 ; N x ; B -27 -11 447 441 ; +C 121 ; WX 444 ; N y ; B -24 -206 426 441 ; +C 122 ; WX 389 ; N z ; B -2 -81 380 428 ; +C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ; +C 124 ; WX 275 ; N bar ; B 105 -217 171 783 ; +C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ; +C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; +C 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ; +C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ; +C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ; +C -1 ; WX 167 ; N fraction ; B -169 -10 337 676 ; +C 165 ; WX 500 ; N yen ; B 27 0 603 653 ; +C 131 ; WX 500 ; N florin ; B 25 -182 507 682 ; +C 167 ; WX 500 ; N section ; B 53 -162 461 666 ; +C 164 ; WX 500 ; N currency ; B -22 53 522 597 ; +C 39 ; WX 214 ; N quotesingle ; B 132 421 241 666 ; +C 147 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ; +C 170 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ; +C 139 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ; +C 155 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ; +C -1 ; WX 500 ; N fi ; B -141 -207 481 681 ; +C -1 ; WX 500 ; N fl ; B -141 -204 518 682 ; +C 150 ; WX 500 ; N endash ; B -6 197 505 243 ; +C 134 ; WX 500 ; N dagger ; B 101 -159 488 666 ; +C 135 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ; +C 183 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; +C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ; +C 149 ; WX 350 ; N bullet ; B 40 191 310 461 ; +C 130 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ; +C 132 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ; +C 148 ; WX 556 ; N quotedblright ; B 151 436 499 666 ; +C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ; +C 133 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ; +C 137 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ; +C 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ; +C 96 ; WX 333 ; N grave ; B 121 492 311 664 ; +C 180 ; WX 333 ; N acute ; B 180 494 403 664 ; +C 136 ; WX 333 ; N circumflex ; B 91 492 385 661 ; +C 152 ; WX 333 ; N tilde ; B 100 517 427 624 ; +C 175 ; WX 333 ; N macron ; B 99 532 411 583 ; +C -1 ; WX 333 ; N breve ; B 117 492 418 650 ; +C -1 ; WX 333 ; N dotaccent ; B 207 548 305 646 ; +C 168 ; WX 333 ; N dieresis ; B 107 548 405 646 ; +C -1 ; WX 333 ; N ring ; B 155 492 355 691 ; +C 184 ; WX 333 ; N cedilla ; B -30 -217 182 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ; +C -1 ; WX 333 ; N ogonek ; B 20 -169 203 40 ; +C -1 ; WX 333 ; N caron ; B 121 492 426 661 ; +C 151 ; WX 889 ; N emdash ; B -6 197 894 243 ; +C 198 ; WX 889 ; N AE ; B -27 0 911 653 ; +C 170 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ; +C -1 ; WX 556 ; N Lslash ; B -8 0 559 653 ; +C 216 ; WX 722 ; N Oslash ; B 60 -105 699 722 ; +C 140 ; WX 944 ; N OE ; B 49 -8 964 666 ; +C 186 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ; +C 230 ; WX 667 ; N ae ; B 23 -11 640 441 ; +C -1 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ; +C -1 ; WX 278 ; N lslash ; B 41 -11 312 683 ; +C 248 ; WX 500 ; N oslash ; B 28 -135 469 554 ; +C 156 ; WX 667 ; N oe ; B 20 -12 646 441 ; +C 223 ; WX 500 ; N germandbls ; B -168 -207 493 679 ; +C 207 ; WX 333 ; N Idieresis ; B -8 0 435 818 ; +C 233 ; WX 444 ; N eacute ; B 31 -11 459 664 ; +C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ; +C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ; +C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ; +C 159 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ; +C 247 ; WX 675 ; N divide ; B 86 -11 590 517 ; +C 221 ; WX 556 ; N Yacute ; B 78 0 633 876 ; +C 194 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ; +C 225 ; WX 500 ; N aacute ; B 17 -11 487 664 ; +C 219 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ; +C 253 ; WX 444 ; N yacute ; B -24 -206 459 664 ; +C -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ; +C 234 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ; +C -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ; +C 220 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ; +C -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ; +C 218 ; WX 722 ; N Uacute ; B 102 -18 765 876 ; +C -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ; +C 203 ; WX 611 ; N Edieresis ; B -1 0 634 818 ; +C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ; +C -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ; +C 169 ; WX 760 ; N copyright ; B 41 -18 719 666 ; +C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ; +C -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ; +C 229 ; WX 500 ; N aring ; B 17 -11 476 691 ; +C -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ; +C -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ; +C 224 ; WX 500 ; N agrave ; B 17 -11 476 664 ; +C -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ; +C -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ; +C 227 ; WX 500 ; N atilde ; B 17 -11 511 624 ; +C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ; +C 154 ; WX 389 ; N scaron ; B 16 -13 454 661 ; +C -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ; +C 237 ; WX 278 ; N iacute ; B 49 -11 355 664 ; +C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; +C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ; +C 251 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ; +C 226 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ; +C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ; +C -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ; +C 231 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ; +C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ; +C 222 ; WX 611 ; N Thorn ; B 0 0 569 653 ; +C -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ; +C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ; +C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ; +C -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ; +C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ; +C -1 ; WX 500 ; N uring ; B 42 -11 475 691 ; +C 179 ; WX 300 ; N threesuperior ; B 43 268 339 676 ; +C 210 ; WX 722 ; N Ograve ; B 60 -18 699 876 ; +C 192 ; WX 611 ; N Agrave ; B -51 0 564 876 ; +C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ; +C 215 ; WX 675 ; N multiply ; B 93 8 582 497 ; +C 250 ; WX 500 ; N uacute ; B 42 -11 477 664 ; +C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ; +C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; +C 255 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ; +C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ; +C 238 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ; +C 202 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ; +C 228 ; WX 500 ; N adieresis ; B 17 -11 489 606 ; +C 235 ; WX 444 ; N edieresis ; B 31 -11 451 606 ; +C -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ; +C -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ; +C -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ; +C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ; +C 205 ; WX 333 ; N Iacute ; B -8 0 433 876 ; +C 177 ; WX 675 ; N plusminus ; B 86 0 590 506 ; +C 166 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ; +C 174 ; WX 760 ; N registered ; B 41 -18 719 666 ; +C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ; +C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ; +C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; +C 200 ; WX 611 ; N Egrave ; B -1 0 634 876 ; +C -1 ; WX 389 ; N racute ; B 45 0 431 664 ; +C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ; +C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ; +C 142 ; WX 556 ; N Zcaron ; B -6 0 606 873 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ; +C 208 ; WX 722 ; N Eth ; B -8 0 700 653 ; +C 199 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ; +C -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ; +C -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ; +C -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ; +C -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ; +C 193 ; WX 611 ; N Aacute ; B -51 0 564 876 ; +C 196 ; WX 611 ; N Adieresis ; B -51 0 564 818 ; +C 232 ; WX 444 ; N egrave ; B 31 -11 412 664 ; +C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ; +C -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ; +C 211 ; WX 722 ; N Oacute ; B 60 -18 699 876 ; +C 243 ; WX 500 ; N oacute ; B 27 -11 487 664 ; +C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ; +C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ; +C 239 ; WX 278 ; N idieresis ; B 49 -11 352 606 ; +C 212 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ; +C 217 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 500 ; N thorn ; B -75 -205 469 683 ; +C 178 ; WX 300 ; N twosuperior ; B 33 271 324 676 ; +C 214 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ; +C 181 ; WX 500 ; N mu ; B -30 -209 497 428 ; +C 236 ; WX 278 ; N igrave ; B 49 -11 284 664 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ; +C -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ; +C -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ; +C 190 ; WX 750 ; N threequarters ; B 23 -10 736 676 ; +C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ; +C -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ; +C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ; +C 153 ; WX 980 ; N trademark ; B 30 247 957 653 ; +C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ; +C 204 ; WX 333 ; N Igrave ; B -8 0 384 876 ; +C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ; +C -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ; +C 189 ; WX 750 ; N onehalf ; B 34 -10 749 676 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ; +C 244 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ; +C 241 ; WX 500 ; N ntilde ; B 14 -9 476 624 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ; +C 201 ; WX 611 ; N Eacute ; B -1 0 634 876 ; +C -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ; +C -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ; +C 188 ; WX 750 ; N onequarter ; B 33 -10 736 676 ; +C 138 ; WX 500 ; N Scaron ; B 17 -18 520 873 ; +C -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ; +C 176 ; WX 400 ; N degree ; B 101 390 387 676 ; +C 242 ; WX 500 ; N ograve ; B 27 -11 468 664 ; +C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ; +C 249 ; WX 500 ; N ugrave ; B 42 -11 475 664 ; +C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; +C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ; +C -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ; +C 209 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ; +C 245 ; WX 500 ; N otilde ; B 27 -11 496 624 ; +C -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ; +C -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ; +C 195 ; WX 611 ; N Atilde ; B -51 0 566 836 ; +C -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ; +C 197 ; WX 611 ; N Aring ; B -51 0 564 883 ; +C 213 ; WX 722 ; N Otilde ; B 60 -18 699 836 ; +C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ; +C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ; +C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ; +C -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ; +C -1 ; WX 675 ; N minus ; B 86 220 590 286 ; +C 206 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ; +C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ; +C -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ; +C 172 ; WX 675 ; N logicalnot ; B 86 108 590 386 ; +C 246 ; WX 500 ; N odieresis ; B 27 -11 489 606 ; +C 252 ; WX 500 ; N udieresis ; B 42 -11 479 606 ; +C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ; +C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ; +C 240 ; WX 500 ; N eth ; B 27 -11 482 683 ; +C 158 ; WX 389 ; N zcaron ; B -2 -81 434 661 ; +C -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ; +C 185 ; WX 300 ; N onesuperior ; B 43 271 284 676 ; +C -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2321 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -35 +KPX A Gbreve -35 +KPX A Gcommaaccent -35 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -37 +KPX A Tcaron -37 +KPX A Tcommaaccent -37 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -105 +KPX A W -95 +KPX A Y -55 +KPX A Yacute -55 +KPX A Ydieresis -55 +KPX A quoteright -37 +KPX A u -20 +KPX A uacute -20 +KPX A ucircumflex -20 +KPX A udieresis -20 +KPX A ugrave -20 +KPX A uhungarumlaut -20 +KPX A umacron -20 +KPX A uogonek -20 +KPX A uring -20 +KPX A v -55 +KPX A w -55 +KPX A y -55 +KPX A yacute -55 +KPX A ydieresis -55 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -35 +KPX Aacute Gbreve -35 +KPX Aacute Gcommaaccent -35 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -37 +KPX Aacute Tcaron -37 +KPX Aacute Tcommaaccent -37 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -105 +KPX Aacute W -95 +KPX Aacute Y -55 +KPX Aacute Yacute -55 +KPX Aacute Ydieresis -55 +KPX Aacute quoteright -37 +KPX Aacute u -20 +KPX Aacute uacute -20 +KPX Aacute ucircumflex -20 +KPX Aacute udieresis -20 +KPX Aacute ugrave -20 +KPX Aacute uhungarumlaut -20 +KPX Aacute umacron -20 +KPX Aacute uogonek -20 +KPX Aacute uring -20 +KPX Aacute v -55 +KPX Aacute w -55 +KPX Aacute y -55 +KPX Aacute yacute -55 +KPX Aacute ydieresis -55 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -35 +KPX Abreve Gbreve -35 +KPX Abreve Gcommaaccent -35 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -37 +KPX Abreve Tcaron -37 +KPX Abreve Tcommaaccent -37 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -105 +KPX Abreve W -95 +KPX Abreve Y -55 +KPX Abreve Yacute -55 +KPX Abreve Ydieresis -55 +KPX Abreve quoteright -37 +KPX Abreve u -20 +KPX Abreve uacute -20 +KPX Abreve ucircumflex -20 +KPX Abreve udieresis -20 +KPX Abreve ugrave -20 +KPX Abreve uhungarumlaut -20 +KPX Abreve umacron -20 +KPX Abreve uogonek -20 +KPX Abreve uring -20 +KPX Abreve v -55 +KPX Abreve w -55 +KPX Abreve y -55 +KPX Abreve yacute -55 +KPX Abreve ydieresis -55 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -35 +KPX Acircumflex Gbreve -35 +KPX Acircumflex Gcommaaccent -35 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -37 +KPX Acircumflex Tcaron -37 +KPX Acircumflex Tcommaaccent -37 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -105 +KPX Acircumflex W -95 +KPX Acircumflex Y -55 +KPX Acircumflex Yacute -55 +KPX Acircumflex Ydieresis -55 +KPX Acircumflex quoteright -37 +KPX Acircumflex u -20 +KPX Acircumflex uacute -20 +KPX Acircumflex ucircumflex -20 +KPX Acircumflex udieresis -20 +KPX Acircumflex ugrave -20 +KPX Acircumflex uhungarumlaut -20 +KPX Acircumflex umacron -20 +KPX Acircumflex uogonek -20 +KPX Acircumflex uring -20 +KPX Acircumflex v -55 +KPX Acircumflex w -55 +KPX Acircumflex y -55 +KPX Acircumflex yacute -55 +KPX Acircumflex ydieresis -55 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -35 +KPX Adieresis Gbreve -35 +KPX Adieresis Gcommaaccent -35 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -37 +KPX Adieresis Tcaron -37 +KPX Adieresis Tcommaaccent -37 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -105 +KPX Adieresis W -95 +KPX Adieresis Y -55 +KPX Adieresis Yacute -55 +KPX Adieresis Ydieresis -55 +KPX Adieresis quoteright -37 +KPX Adieresis u -20 +KPX Adieresis uacute -20 +KPX Adieresis ucircumflex -20 +KPX Adieresis udieresis -20 +KPX Adieresis ugrave -20 +KPX Adieresis uhungarumlaut -20 +KPX Adieresis umacron -20 +KPX Adieresis uogonek -20 +KPX Adieresis uring -20 +KPX Adieresis v -55 +KPX Adieresis w -55 +KPX Adieresis y -55 +KPX Adieresis yacute -55 +KPX Adieresis ydieresis -55 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -35 +KPX Agrave Gbreve -35 +KPX Agrave Gcommaaccent -35 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -37 +KPX Agrave Tcaron -37 +KPX Agrave Tcommaaccent -37 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -105 +KPX Agrave W -95 +KPX Agrave Y -55 +KPX Agrave Yacute -55 +KPX Agrave Ydieresis -55 +KPX Agrave quoteright -37 +KPX Agrave u -20 +KPX Agrave uacute -20 +KPX Agrave ucircumflex -20 +KPX Agrave udieresis -20 +KPX Agrave ugrave -20 +KPX Agrave uhungarumlaut -20 +KPX Agrave umacron -20 +KPX Agrave uogonek -20 +KPX Agrave uring -20 +KPX Agrave v -55 +KPX Agrave w -55 +KPX Agrave y -55 +KPX Agrave yacute -55 +KPX Agrave ydieresis -55 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -35 +KPX Amacron Gbreve -35 +KPX Amacron Gcommaaccent -35 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -37 +KPX Amacron Tcaron -37 +KPX Amacron Tcommaaccent -37 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -105 +KPX Amacron W -95 +KPX Amacron Y -55 +KPX Amacron Yacute -55 +KPX Amacron Ydieresis -55 +KPX Amacron quoteright -37 +KPX Amacron u -20 +KPX Amacron uacute -20 +KPX Amacron ucircumflex -20 +KPX Amacron udieresis -20 +KPX Amacron ugrave -20 +KPX Amacron uhungarumlaut -20 +KPX Amacron umacron -20 +KPX Amacron uogonek -20 +KPX Amacron uring -20 +KPX Amacron v -55 +KPX Amacron w -55 +KPX Amacron y -55 +KPX Amacron yacute -55 +KPX Amacron ydieresis -55 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -35 +KPX Aogonek Gbreve -35 +KPX Aogonek Gcommaaccent -35 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -37 +KPX Aogonek Tcaron -37 +KPX Aogonek Tcommaaccent -37 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -105 +KPX Aogonek W -95 +KPX Aogonek Y -55 +KPX Aogonek Yacute -55 +KPX Aogonek Ydieresis -55 +KPX Aogonek quoteright -37 +KPX Aogonek u -20 +KPX Aogonek uacute -20 +KPX Aogonek ucircumflex -20 +KPX Aogonek udieresis -20 +KPX Aogonek ugrave -20 +KPX Aogonek uhungarumlaut -20 +KPX Aogonek umacron -20 +KPX Aogonek uogonek -20 +KPX Aogonek uring -20 +KPX Aogonek v -55 +KPX Aogonek w -55 +KPX Aogonek y -55 +KPX Aogonek yacute -55 +KPX Aogonek ydieresis -55 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -35 +KPX Aring Gbreve -35 +KPX Aring Gcommaaccent -35 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -37 +KPX Aring Tcaron -37 +KPX Aring Tcommaaccent -37 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -105 +KPX Aring W -95 +KPX Aring Y -55 +KPX Aring Yacute -55 +KPX Aring Ydieresis -55 +KPX Aring quoteright -37 +KPX Aring u -20 +KPX Aring uacute -20 +KPX Aring ucircumflex -20 +KPX Aring udieresis -20 +KPX Aring ugrave -20 +KPX Aring uhungarumlaut -20 +KPX Aring umacron -20 +KPX Aring uogonek -20 +KPX Aring uring -20 +KPX Aring v -55 +KPX Aring w -55 +KPX Aring y -55 +KPX Aring yacute -55 +KPX Aring ydieresis -55 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -35 +KPX Atilde Gbreve -35 +KPX Atilde Gcommaaccent -35 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -37 +KPX Atilde Tcaron -37 +KPX Atilde Tcommaaccent -37 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -105 +KPX Atilde W -95 +KPX Atilde Y -55 +KPX Atilde Yacute -55 +KPX Atilde Ydieresis -55 +KPX Atilde quoteright -37 +KPX Atilde u -20 +KPX Atilde uacute -20 +KPX Atilde ucircumflex -20 +KPX Atilde udieresis -20 +KPX Atilde ugrave -20 +KPX Atilde uhungarumlaut -20 +KPX Atilde umacron -20 +KPX Atilde uogonek -20 +KPX Atilde uring -20 +KPX Atilde v -55 +KPX Atilde w -55 +KPX Atilde y -55 +KPX Atilde yacute -55 +KPX Atilde ydieresis -55 +KPX B A -25 +KPX B Aacute -25 +KPX B Abreve -25 +KPX B Acircumflex -25 +KPX B Adieresis -25 +KPX B Agrave -25 +KPX B Amacron -25 +KPX B Aogonek -25 +KPX B Aring -25 +KPX B Atilde -25 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -35 +KPX D Aacute -35 +KPX D Abreve -35 +KPX D Acircumflex -35 +KPX D Adieresis -35 +KPX D Agrave -35 +KPX D Amacron -35 +KPX D Aogonek -35 +KPX D Aring -35 +KPX D Atilde -35 +KPX D V -40 +KPX D W -40 +KPX D Y -40 +KPX D Yacute -40 +KPX D Ydieresis -40 +KPX Dcaron A -35 +KPX Dcaron Aacute -35 +KPX Dcaron Abreve -35 +KPX Dcaron Acircumflex -35 +KPX Dcaron Adieresis -35 +KPX Dcaron Agrave -35 +KPX Dcaron Amacron -35 +KPX Dcaron Aogonek -35 +KPX Dcaron Aring -35 +KPX Dcaron Atilde -35 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -40 +KPX Dcaron Yacute -40 +KPX Dcaron Ydieresis -40 +KPX Dcroat A -35 +KPX Dcroat Aacute -35 +KPX Dcroat Abreve -35 +KPX Dcroat Acircumflex -35 +KPX Dcroat Adieresis -35 +KPX Dcroat Agrave -35 +KPX Dcroat Amacron -35 +KPX Dcroat Aogonek -35 +KPX Dcroat Aring -35 +KPX Dcroat Atilde -35 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -40 +KPX Dcroat Yacute -40 +KPX Dcroat Ydieresis -40 +KPX F A -115 +KPX F Aacute -115 +KPX F Abreve -115 +KPX F Acircumflex -115 +KPX F Adieresis -115 +KPX F Agrave -115 +KPX F Amacron -115 +KPX F Aogonek -115 +KPX F Aring -115 +KPX F Atilde -115 +KPX F a -75 +KPX F aacute -75 +KPX F abreve -75 +KPX F acircumflex -75 +KPX F adieresis -75 +KPX F agrave -75 +KPX F amacron -75 +KPX F aogonek -75 +KPX F aring -75 +KPX F atilde -75 +KPX F comma -135 +KPX F e -75 +KPX F eacute -75 +KPX F ecaron -75 +KPX F ecircumflex -75 +KPX F edieresis -75 +KPX F edotaccent -75 +KPX F egrave -75 +KPX F emacron -75 +KPX F eogonek -75 +KPX F i -45 +KPX F iacute -45 +KPX F icircumflex -45 +KPX F idieresis -45 +KPX F igrave -45 +KPX F imacron -45 +KPX F iogonek -45 +KPX F o -105 +KPX F oacute -105 +KPX F ocircumflex -105 +KPX F odieresis -105 +KPX F ograve -105 +KPX F ohungarumlaut -105 +KPX F omacron -105 +KPX F oslash -105 +KPX F otilde -105 +KPX F period -135 +KPX F r -55 +KPX F racute -55 +KPX F rcaron -55 +KPX F rcommaaccent -55 +KPX J A -40 +KPX J Aacute -40 +KPX J Abreve -40 +KPX J Acircumflex -40 +KPX J Adieresis -40 +KPX J Agrave -40 +KPX J Amacron -40 +KPX J Aogonek -40 +KPX J Aring -40 +KPX J Atilde -40 +KPX J a -35 +KPX J aacute -35 +KPX J abreve -35 +KPX J acircumflex -35 +KPX J adieresis -35 +KPX J agrave -35 +KPX J amacron -35 +KPX J aogonek -35 +KPX J aring -35 +KPX J atilde -35 +KPX J comma -25 +KPX J e -25 +KPX J eacute -25 +KPX J ecaron -25 +KPX J ecircumflex -25 +KPX J edieresis -25 +KPX J edotaccent -25 +KPX J egrave -25 +KPX J emacron -25 +KPX J eogonek -25 +KPX J o -25 +KPX J oacute -25 +KPX J ocircumflex -25 +KPX J odieresis -25 +KPX J ograve -25 +KPX J ohungarumlaut -25 +KPX J omacron -25 +KPX J oslash -25 +KPX J otilde -25 +KPX J period -25 +KPX J u -35 +KPX J uacute -35 +KPX J ucircumflex -35 +KPX J udieresis -35 +KPX J ugrave -35 +KPX J uhungarumlaut -35 +KPX J umacron -35 +KPX J uogonek -35 +KPX J uring -35 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -35 +KPX K eacute -35 +KPX K ecaron -35 +KPX K ecircumflex -35 +KPX K edieresis -35 +KPX K edotaccent -35 +KPX K egrave -35 +KPX K emacron -35 +KPX K eogonek -35 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -40 +KPX K uacute -40 +KPX K ucircumflex -40 +KPX K udieresis -40 +KPX K ugrave -40 +KPX K uhungarumlaut -40 +KPX K umacron -40 +KPX K uogonek -40 +KPX K uring -40 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -35 +KPX Kcommaaccent eacute -35 +KPX Kcommaaccent ecaron -35 +KPX Kcommaaccent ecircumflex -35 +KPX Kcommaaccent edieresis -35 +KPX Kcommaaccent edotaccent -35 +KPX Kcommaaccent egrave -35 +KPX Kcommaaccent emacron -35 +KPX Kcommaaccent eogonek -35 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -40 +KPX Kcommaaccent uacute -40 +KPX Kcommaaccent ucircumflex -40 +KPX Kcommaaccent udieresis -40 +KPX Kcommaaccent ugrave -40 +KPX Kcommaaccent uhungarumlaut -40 +KPX Kcommaaccent umacron -40 +KPX Kcommaaccent uogonek -40 +KPX Kcommaaccent uring -40 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -20 +KPX L Tcaron -20 +KPX L Tcommaaccent -20 +KPX L V -55 +KPX L W -55 +KPX L Y -20 +KPX L Yacute -20 +KPX L Ydieresis -20 +KPX L quoteright -37 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -20 +KPX Lacute Tcaron -20 +KPX Lacute Tcommaaccent -20 +KPX Lacute V -55 +KPX Lacute W -55 +KPX Lacute Y -20 +KPX Lacute Yacute -20 +KPX Lacute Ydieresis -20 +KPX Lacute quoteright -37 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -20 +KPX Lcommaaccent Tcaron -20 +KPX Lcommaaccent Tcommaaccent -20 +KPX Lcommaaccent V -55 +KPX Lcommaaccent W -55 +KPX Lcommaaccent Y -20 +KPX Lcommaaccent Yacute -20 +KPX Lcommaaccent Ydieresis -20 +KPX Lcommaaccent quoteright -37 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -20 +KPX Lslash Tcaron -20 +KPX Lslash Tcommaaccent -20 +KPX Lslash V -55 +KPX Lslash W -55 +KPX Lslash Y -20 +KPX Lslash Yacute -20 +KPX Lslash Ydieresis -20 +KPX Lslash quoteright -37 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX N A -27 +KPX N Aacute -27 +KPX N Abreve -27 +KPX N Acircumflex -27 +KPX N Adieresis -27 +KPX N Agrave -27 +KPX N Amacron -27 +KPX N Aogonek -27 +KPX N Aring -27 +KPX N Atilde -27 +KPX Nacute A -27 +KPX Nacute Aacute -27 +KPX Nacute Abreve -27 +KPX Nacute Acircumflex -27 +KPX Nacute Adieresis -27 +KPX Nacute Agrave -27 +KPX Nacute Amacron -27 +KPX Nacute Aogonek -27 +KPX Nacute Aring -27 +KPX Nacute Atilde -27 +KPX Ncaron A -27 +KPX Ncaron Aacute -27 +KPX Ncaron Abreve -27 +KPX Ncaron Acircumflex -27 +KPX Ncaron Adieresis -27 +KPX Ncaron Agrave -27 +KPX Ncaron Amacron -27 +KPX Ncaron Aogonek -27 +KPX Ncaron Aring -27 +KPX Ncaron Atilde -27 +KPX Ncommaaccent A -27 +KPX Ncommaaccent Aacute -27 +KPX Ncommaaccent Abreve -27 +KPX Ncommaaccent Acircumflex -27 +KPX Ncommaaccent Adieresis -27 +KPX Ncommaaccent Agrave -27 +KPX Ncommaaccent Amacron -27 +KPX Ncommaaccent Aogonek -27 +KPX Ncommaaccent Aring -27 +KPX Ncommaaccent Atilde -27 +KPX Ntilde A -27 +KPX Ntilde Aacute -27 +KPX Ntilde Abreve -27 +KPX Ntilde Acircumflex -27 +KPX Ntilde Adieresis -27 +KPX Ntilde Agrave -27 +KPX Ntilde Amacron -27 +KPX Ntilde Aogonek -27 +KPX Ntilde Aring -27 +KPX Ntilde Atilde -27 +KPX O A -55 +KPX O Aacute -55 +KPX O Abreve -55 +KPX O Acircumflex -55 +KPX O Adieresis -55 +KPX O Agrave -55 +KPX O Amacron -55 +KPX O Aogonek -55 +KPX O Aring -55 +KPX O Atilde -55 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -55 +KPX Oacute Aacute -55 +KPX Oacute Abreve -55 +KPX Oacute Acircumflex -55 +KPX Oacute Adieresis -55 +KPX Oacute Agrave -55 +KPX Oacute Amacron -55 +KPX Oacute Aogonek -55 +KPX Oacute Aring -55 +KPX Oacute Atilde -55 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -55 +KPX Ocircumflex Aacute -55 +KPX Ocircumflex Abreve -55 +KPX Ocircumflex Acircumflex -55 +KPX Ocircumflex Adieresis -55 +KPX Ocircumflex Agrave -55 +KPX Ocircumflex Amacron -55 +KPX Ocircumflex Aogonek -55 +KPX Ocircumflex Aring -55 +KPX Ocircumflex Atilde -55 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -55 +KPX Odieresis Aacute -55 +KPX Odieresis Abreve -55 +KPX Odieresis Acircumflex -55 +KPX Odieresis Adieresis -55 +KPX Odieresis Agrave -55 +KPX Odieresis Amacron -55 +KPX Odieresis Aogonek -55 +KPX Odieresis Aring -55 +KPX Odieresis Atilde -55 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -55 +KPX Ograve Aacute -55 +KPX Ograve Abreve -55 +KPX Ograve Acircumflex -55 +KPX Ograve Adieresis -55 +KPX Ograve Agrave -55 +KPX Ograve Amacron -55 +KPX Ograve Aogonek -55 +KPX Ograve Aring -55 +KPX Ograve Atilde -55 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -55 +KPX Ohungarumlaut Aacute -55 +KPX Ohungarumlaut Abreve -55 +KPX Ohungarumlaut Acircumflex -55 +KPX Ohungarumlaut Adieresis -55 +KPX Ohungarumlaut Agrave -55 +KPX Ohungarumlaut Amacron -55 +KPX Ohungarumlaut Aogonek -55 +KPX Ohungarumlaut Aring -55 +KPX Ohungarumlaut Atilde -55 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -55 +KPX Omacron Aacute -55 +KPX Omacron Abreve -55 +KPX Omacron Acircumflex -55 +KPX Omacron Adieresis -55 +KPX Omacron Agrave -55 +KPX Omacron Amacron -55 +KPX Omacron Aogonek -55 +KPX Omacron Aring -55 +KPX Omacron Atilde -55 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -55 +KPX Oslash Aacute -55 +KPX Oslash Abreve -55 +KPX Oslash Acircumflex -55 +KPX Oslash Adieresis -55 +KPX Oslash Agrave -55 +KPX Oslash Amacron -55 +KPX Oslash Aogonek -55 +KPX Oslash Aring -55 +KPX Oslash Atilde -55 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -55 +KPX Otilde Aacute -55 +KPX Otilde Abreve -55 +KPX Otilde Acircumflex -55 +KPX Otilde Adieresis -55 +KPX Otilde Agrave -55 +KPX Otilde Amacron -55 +KPX Otilde Aogonek -55 +KPX Otilde Aring -55 +KPX Otilde Atilde -55 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -90 +KPX P Aacute -90 +KPX P Abreve -90 +KPX P Acircumflex -90 +KPX P Adieresis -90 +KPX P Agrave -90 +KPX P Amacron -90 +KPX P Aogonek -90 +KPX P Aring -90 +KPX P Atilde -90 +KPX P a -80 +KPX P aacute -80 +KPX P abreve -80 +KPX P acircumflex -80 +KPX P adieresis -80 +KPX P agrave -80 +KPX P amacron -80 +KPX P aogonek -80 +KPX P aring -80 +KPX P atilde -80 +KPX P comma -135 +KPX P e -80 +KPX P eacute -80 +KPX P ecaron -80 +KPX P ecircumflex -80 +KPX P edieresis -80 +KPX P edotaccent -80 +KPX P egrave -80 +KPX P emacron -80 +KPX P eogonek -80 +KPX P o -80 +KPX P oacute -80 +KPX P ocircumflex -80 +KPX P odieresis -80 +KPX P ograve -80 +KPX P ohungarumlaut -80 +KPX P omacron -80 +KPX P oslash -80 +KPX P otilde -80 +KPX P period -135 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -40 +KPX R Oacute -40 +KPX R Ocircumflex -40 +KPX R Odieresis -40 +KPX R Ograve -40 +KPX R Ohungarumlaut -40 +KPX R Omacron -40 +KPX R Oslash -40 +KPX R Otilde -40 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -18 +KPX R W -18 +KPX R Y -18 +KPX R Yacute -18 +KPX R Ydieresis -18 +KPX Racute O -40 +KPX Racute Oacute -40 +KPX Racute Ocircumflex -40 +KPX Racute Odieresis -40 +KPX Racute Ograve -40 +KPX Racute Ohungarumlaut -40 +KPX Racute Omacron -40 +KPX Racute Oslash -40 +KPX Racute Otilde -40 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -18 +KPX Racute W -18 +KPX Racute Y -18 +KPX Racute Yacute -18 +KPX Racute Ydieresis -18 +KPX Rcaron O -40 +KPX Rcaron Oacute -40 +KPX Rcaron Ocircumflex -40 +KPX Rcaron Odieresis -40 +KPX Rcaron Ograve -40 +KPX Rcaron Ohungarumlaut -40 +KPX Rcaron Omacron -40 +KPX Rcaron Oslash -40 +KPX Rcaron Otilde -40 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -18 +KPX Rcaron W -18 +KPX Rcaron Y -18 +KPX Rcaron Yacute -18 +KPX Rcaron Ydieresis -18 +KPX Rcommaaccent O -40 +KPX Rcommaaccent Oacute -40 +KPX Rcommaaccent Ocircumflex -40 +KPX Rcommaaccent Odieresis -40 +KPX Rcommaaccent Ograve -40 +KPX Rcommaaccent Ohungarumlaut -40 +KPX Rcommaaccent Omacron -40 +KPX Rcommaaccent Oslash -40 +KPX Rcommaaccent Otilde -40 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -18 +KPX Rcommaaccent W -18 +KPX Rcommaaccent Y -18 +KPX Rcommaaccent Yacute -18 +KPX Rcommaaccent Ydieresis -18 +KPX T A -50 +KPX T Aacute -50 +KPX T Abreve -50 +KPX T Acircumflex -50 +KPX T Adieresis -50 +KPX T Agrave -50 +KPX T Amacron -50 +KPX T Aogonek -50 +KPX T Aring -50 +KPX T Atilde -50 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -92 +KPX T aacute -92 +KPX T abreve -92 +KPX T acircumflex -92 +KPX T adieresis -92 +KPX T agrave -92 +KPX T amacron -92 +KPX T aogonek -92 +KPX T aring -92 +KPX T atilde -92 +KPX T colon -55 +KPX T comma -74 +KPX T e -92 +KPX T eacute -92 +KPX T ecaron -92 +KPX T ecircumflex -52 +KPX T edieresis -52 +KPX T edotaccent -92 +KPX T egrave -52 +KPX T emacron -52 +KPX T eogonek -92 +KPX T hyphen -74 +KPX T i -55 +KPX T iacute -55 +KPX T iogonek -55 +KPX T o -92 +KPX T oacute -92 +KPX T ocircumflex -92 +KPX T odieresis -92 +KPX T ograve -92 +KPX T ohungarumlaut -92 +KPX T omacron -92 +KPX T oslash -92 +KPX T otilde -92 +KPX T period -74 +KPX T r -55 +KPX T racute -55 +KPX T rcaron -55 +KPX T rcommaaccent -55 +KPX T semicolon -65 +KPX T u -55 +KPX T uacute -55 +KPX T ucircumflex -55 +KPX T udieresis -55 +KPX T ugrave -55 +KPX T uhungarumlaut -55 +KPX T umacron -55 +KPX T uogonek -55 +KPX T uring -55 +KPX T w -74 +KPX T y -74 +KPX T yacute -74 +KPX T ydieresis -34 +KPX Tcaron A -50 +KPX Tcaron Aacute -50 +KPX Tcaron Abreve -50 +KPX Tcaron Acircumflex -50 +KPX Tcaron Adieresis -50 +KPX Tcaron Agrave -50 +KPX Tcaron Amacron -50 +KPX Tcaron Aogonek -50 +KPX Tcaron Aring -50 +KPX Tcaron Atilde -50 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -92 +KPX Tcaron aacute -92 +KPX Tcaron abreve -92 +KPX Tcaron acircumflex -92 +KPX Tcaron adieresis -92 +KPX Tcaron agrave -92 +KPX Tcaron amacron -92 +KPX Tcaron aogonek -92 +KPX Tcaron aring -92 +KPX Tcaron atilde -92 +KPX Tcaron colon -55 +KPX Tcaron comma -74 +KPX Tcaron e -92 +KPX Tcaron eacute -92 +KPX Tcaron ecaron -92 +KPX Tcaron ecircumflex -52 +KPX Tcaron edieresis -52 +KPX Tcaron edotaccent -92 +KPX Tcaron egrave -52 +KPX Tcaron emacron -52 +KPX Tcaron eogonek -92 +KPX Tcaron hyphen -74 +KPX Tcaron i -55 +KPX Tcaron iacute -55 +KPX Tcaron iogonek -55 +KPX Tcaron o -92 +KPX Tcaron oacute -92 +KPX Tcaron ocircumflex -92 +KPX Tcaron odieresis -92 +KPX Tcaron ograve -92 +KPX Tcaron ohungarumlaut -92 +KPX Tcaron omacron -92 +KPX Tcaron oslash -92 +KPX Tcaron otilde -92 +KPX Tcaron period -74 +KPX Tcaron r -55 +KPX Tcaron racute -55 +KPX Tcaron rcaron -55 +KPX Tcaron rcommaaccent -55 +KPX Tcaron semicolon -65 +KPX Tcaron u -55 +KPX Tcaron uacute -55 +KPX Tcaron ucircumflex -55 +KPX Tcaron udieresis -55 +KPX Tcaron ugrave -55 +KPX Tcaron uhungarumlaut -55 +KPX Tcaron umacron -55 +KPX Tcaron uogonek -55 +KPX Tcaron uring -55 +KPX Tcaron w -74 +KPX Tcaron y -74 +KPX Tcaron yacute -74 +KPX Tcaron ydieresis -34 +KPX Tcommaaccent A -50 +KPX Tcommaaccent Aacute -50 +KPX Tcommaaccent Abreve -50 +KPX Tcommaaccent Acircumflex -50 +KPX Tcommaaccent Adieresis -50 +KPX Tcommaaccent Agrave -50 +KPX Tcommaaccent Amacron -50 +KPX Tcommaaccent Aogonek -50 +KPX Tcommaaccent Aring -50 +KPX Tcommaaccent Atilde -50 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -92 +KPX Tcommaaccent aacute -92 +KPX Tcommaaccent abreve -92 +KPX Tcommaaccent acircumflex -92 +KPX Tcommaaccent adieresis -92 +KPX Tcommaaccent agrave -92 +KPX Tcommaaccent amacron -92 +KPX Tcommaaccent aogonek -92 +KPX Tcommaaccent aring -92 +KPX Tcommaaccent atilde -92 +KPX Tcommaaccent colon -55 +KPX Tcommaaccent comma -74 +KPX Tcommaaccent e -92 +KPX Tcommaaccent eacute -92 +KPX Tcommaaccent ecaron -92 +KPX Tcommaaccent ecircumflex -52 +KPX Tcommaaccent edieresis -52 +KPX Tcommaaccent edotaccent -92 +KPX Tcommaaccent egrave -52 +KPX Tcommaaccent emacron -52 +KPX Tcommaaccent eogonek -92 +KPX Tcommaaccent hyphen -74 +KPX Tcommaaccent i -55 +KPX Tcommaaccent iacute -55 +KPX Tcommaaccent iogonek -55 +KPX Tcommaaccent o -92 +KPX Tcommaaccent oacute -92 +KPX Tcommaaccent ocircumflex -92 +KPX Tcommaaccent odieresis -92 +KPX Tcommaaccent ograve -92 +KPX Tcommaaccent ohungarumlaut -92 +KPX Tcommaaccent omacron -92 +KPX Tcommaaccent oslash -92 +KPX Tcommaaccent otilde -92 +KPX Tcommaaccent period -74 +KPX Tcommaaccent r -55 +KPX Tcommaaccent racute -55 +KPX Tcommaaccent rcaron -55 +KPX Tcommaaccent rcommaaccent -55 +KPX Tcommaaccent semicolon -65 +KPX Tcommaaccent u -55 +KPX Tcommaaccent uacute -55 +KPX Tcommaaccent ucircumflex -55 +KPX Tcommaaccent udieresis -55 +KPX Tcommaaccent ugrave -55 +KPX Tcommaaccent uhungarumlaut -55 +KPX Tcommaaccent umacron -55 +KPX Tcommaaccent uogonek -55 +KPX Tcommaaccent uring -55 +KPX Tcommaaccent w -74 +KPX Tcommaaccent y -74 +KPX Tcommaaccent yacute -74 +KPX Tcommaaccent ydieresis -34 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -25 +KPX U period -25 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -25 +KPX Uacute period -25 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -25 +KPX Ucircumflex period -25 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -25 +KPX Udieresis period -25 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -25 +KPX Ugrave period -25 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -25 +KPX Uhungarumlaut period -25 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -25 +KPX Umacron period -25 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -25 +KPX Uogonek period -25 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -25 +KPX Uring period -25 +KPX V A -60 +KPX V Aacute -60 +KPX V Abreve -60 +KPX V Acircumflex -60 +KPX V Adieresis -60 +KPX V Agrave -60 +KPX V Amacron -60 +KPX V Aogonek -60 +KPX V Aring -60 +KPX V Atilde -60 +KPX V O -30 +KPX V Oacute -30 +KPX V Ocircumflex -30 +KPX V Odieresis -30 +KPX V Ograve -30 +KPX V Ohungarumlaut -30 +KPX V Omacron -30 +KPX V Oslash -30 +KPX V Otilde -30 +KPX V a -111 +KPX V aacute -111 +KPX V abreve -111 +KPX V acircumflex -111 +KPX V adieresis -111 +KPX V agrave -111 +KPX V amacron -111 +KPX V aogonek -111 +KPX V aring -111 +KPX V atilde -111 +KPX V colon -65 +KPX V comma -129 +KPX V e -111 +KPX V eacute -111 +KPX V ecaron -111 +KPX V ecircumflex -111 +KPX V edieresis -71 +KPX V edotaccent -111 +KPX V egrave -71 +KPX V emacron -71 +KPX V eogonek -111 +KPX V hyphen -55 +KPX V i -74 +KPX V iacute -74 +KPX V icircumflex -34 +KPX V idieresis -34 +KPX V igrave -34 +KPX V imacron -34 +KPX V iogonek -74 +KPX V o -111 +KPX V oacute -111 +KPX V ocircumflex -111 +KPX V odieresis -111 +KPX V ograve -111 +KPX V ohungarumlaut -111 +KPX V omacron -111 +KPX V oslash -111 +KPX V otilde -111 +KPX V period -129 +KPX V semicolon -74 +KPX V u -74 +KPX V uacute -74 +KPX V ucircumflex -74 +KPX V udieresis -74 +KPX V ugrave -74 +KPX V uhungarumlaut -74 +KPX V umacron -74 +KPX V uogonek -74 +KPX V uring -74 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -25 +KPX W Oacute -25 +KPX W Ocircumflex -25 +KPX W Odieresis -25 +KPX W Ograve -25 +KPX W Ohungarumlaut -25 +KPX W Omacron -25 +KPX W Oslash -25 +KPX W Otilde -25 +KPX W a -92 +KPX W aacute -92 +KPX W abreve -92 +KPX W acircumflex -92 +KPX W adieresis -92 +KPX W agrave -92 +KPX W amacron -92 +KPX W aogonek -92 +KPX W aring -92 +KPX W atilde -92 +KPX W colon -65 +KPX W comma -92 +KPX W e -92 +KPX W eacute -92 +KPX W ecaron -92 +KPX W ecircumflex -92 +KPX W edieresis -52 +KPX W edotaccent -92 +KPX W egrave -52 +KPX W emacron -52 +KPX W eogonek -92 +KPX W hyphen -37 +KPX W i -55 +KPX W iacute -55 +KPX W iogonek -55 +KPX W o -92 +KPX W oacute -92 +KPX W ocircumflex -92 +KPX W odieresis -92 +KPX W ograve -92 +KPX W ohungarumlaut -92 +KPX W omacron -92 +KPX W oslash -92 +KPX W otilde -92 +KPX W period -92 +KPX W semicolon -65 +KPX W u -55 +KPX W uacute -55 +KPX W ucircumflex -55 +KPX W udieresis -55 +KPX W ugrave -55 +KPX W uhungarumlaut -55 +KPX W umacron -55 +KPX W uogonek -55 +KPX W uring -55 +KPX W y -70 +KPX W yacute -70 +KPX W ydieresis -70 +KPX Y A -50 +KPX Y Aacute -50 +KPX Y Abreve -50 +KPX Y Acircumflex -50 +KPX Y Adieresis -50 +KPX Y Agrave -50 +KPX Y Amacron -50 +KPX Y Aogonek -50 +KPX Y Aring -50 +KPX Y Atilde -50 +KPX Y O -15 +KPX Y Oacute -15 +KPX Y Ocircumflex -15 +KPX Y Odieresis -15 +KPX Y Ograve -15 +KPX Y Ohungarumlaut -15 +KPX Y Omacron -15 +KPX Y Oslash -15 +KPX Y Otilde -15 +KPX Y a -92 +KPX Y aacute -92 +KPX Y abreve -92 +KPX Y acircumflex -92 +KPX Y adieresis -92 +KPX Y agrave -92 +KPX Y amacron -92 +KPX Y aogonek -92 +KPX Y aring -92 +KPX Y atilde -92 +KPX Y colon -65 +KPX Y comma -92 +KPX Y e -92 +KPX Y eacute -92 +KPX Y ecaron -92 +KPX Y ecircumflex -92 +KPX Y edieresis -52 +KPX Y edotaccent -92 +KPX Y egrave -52 +KPX Y emacron -52 +KPX Y eogonek -92 +KPX Y hyphen -74 +KPX Y i -74 +KPX Y iacute -74 +KPX Y icircumflex -34 +KPX Y idieresis -34 +KPX Y igrave -34 +KPX Y imacron -34 +KPX Y iogonek -74 +KPX Y o -92 +KPX Y oacute -92 +KPX Y ocircumflex -92 +KPX Y odieresis -92 +KPX Y ograve -92 +KPX Y ohungarumlaut -92 +KPX Y omacron -92 +KPX Y oslash -92 +KPX Y otilde -92 +KPX Y period -92 +KPX Y semicolon -65 +KPX Y u -92 +KPX Y uacute -92 +KPX Y ucircumflex -92 +KPX Y udieresis -92 +KPX Y ugrave -92 +KPX Y uhungarumlaut -92 +KPX Y umacron -92 +KPX Y uogonek -92 +KPX Y uring -92 +KPX Yacute A -50 +KPX Yacute Aacute -50 +KPX Yacute Abreve -50 +KPX Yacute Acircumflex -50 +KPX Yacute Adieresis -50 +KPX Yacute Agrave -50 +KPX Yacute Amacron -50 +KPX Yacute Aogonek -50 +KPX Yacute Aring -50 +KPX Yacute Atilde -50 +KPX Yacute O -15 +KPX Yacute Oacute -15 +KPX Yacute Ocircumflex -15 +KPX Yacute Odieresis -15 +KPX Yacute Ograve -15 +KPX Yacute Ohungarumlaut -15 +KPX Yacute Omacron -15 +KPX Yacute Oslash -15 +KPX Yacute Otilde -15 +KPX Yacute a -92 +KPX Yacute aacute -92 +KPX Yacute abreve -92 +KPX Yacute acircumflex -92 +KPX Yacute adieresis -92 +KPX Yacute agrave -92 +KPX Yacute amacron -92 +KPX Yacute aogonek -92 +KPX Yacute aring -92 +KPX Yacute atilde -92 +KPX Yacute colon -65 +KPX Yacute comma -92 +KPX Yacute e -92 +KPX Yacute eacute -92 +KPX Yacute ecaron -92 +KPX Yacute ecircumflex -92 +KPX Yacute edieresis -52 +KPX Yacute edotaccent -92 +KPX Yacute egrave -52 +KPX Yacute emacron -52 +KPX Yacute eogonek -92 +KPX Yacute hyphen -74 +KPX Yacute i -74 +KPX Yacute iacute -74 +KPX Yacute icircumflex -34 +KPX Yacute idieresis -34 +KPX Yacute igrave -34 +KPX Yacute imacron -34 +KPX Yacute iogonek -74 +KPX Yacute o -92 +KPX Yacute oacute -92 +KPX Yacute ocircumflex -92 +KPX Yacute odieresis -92 +KPX Yacute ograve -92 +KPX Yacute ohungarumlaut -92 +KPX Yacute omacron -92 +KPX Yacute oslash -92 +KPX Yacute otilde -92 +KPX Yacute period -92 +KPX Yacute semicolon -65 +KPX Yacute u -92 +KPX Yacute uacute -92 +KPX Yacute ucircumflex -92 +KPX Yacute udieresis -92 +KPX Yacute ugrave -92 +KPX Yacute uhungarumlaut -92 +KPX Yacute umacron -92 +KPX Yacute uogonek -92 +KPX Yacute uring -92 +KPX Ydieresis A -50 +KPX Ydieresis Aacute -50 +KPX Ydieresis Abreve -50 +KPX Ydieresis Acircumflex -50 +KPX Ydieresis Adieresis -50 +KPX Ydieresis Agrave -50 +KPX Ydieresis Amacron -50 +KPX Ydieresis Aogonek -50 +KPX Ydieresis Aring -50 +KPX Ydieresis Atilde -50 +KPX Ydieresis O -15 +KPX Ydieresis Oacute -15 +KPX Ydieresis Ocircumflex -15 +KPX Ydieresis Odieresis -15 +KPX Ydieresis Ograve -15 +KPX Ydieresis Ohungarumlaut -15 +KPX Ydieresis Omacron -15 +KPX Ydieresis Oslash -15 +KPX Ydieresis Otilde -15 +KPX Ydieresis a -92 +KPX Ydieresis aacute -92 +KPX Ydieresis abreve -92 +KPX Ydieresis acircumflex -92 +KPX Ydieresis adieresis -92 +KPX Ydieresis agrave -92 +KPX Ydieresis amacron -92 +KPX Ydieresis aogonek -92 +KPX Ydieresis aring -92 +KPX Ydieresis atilde -92 +KPX Ydieresis colon -65 +KPX Ydieresis comma -92 +KPX Ydieresis e -92 +KPX Ydieresis eacute -92 +KPX Ydieresis ecaron -92 +KPX Ydieresis ecircumflex -92 +KPX Ydieresis edieresis -52 +KPX Ydieresis edotaccent -92 +KPX Ydieresis egrave -52 +KPX Ydieresis emacron -52 +KPX Ydieresis eogonek -92 +KPX Ydieresis hyphen -74 +KPX Ydieresis i -74 +KPX Ydieresis iacute -74 +KPX Ydieresis icircumflex -34 +KPX Ydieresis idieresis -34 +KPX Ydieresis igrave -34 +KPX Ydieresis imacron -34 +KPX Ydieresis iogonek -74 +KPX Ydieresis o -92 +KPX Ydieresis oacute -92 +KPX Ydieresis ocircumflex -92 +KPX Ydieresis odieresis -92 +KPX Ydieresis ograve -92 +KPX Ydieresis ohungarumlaut -92 +KPX Ydieresis omacron -92 +KPX Ydieresis oslash -92 +KPX Ydieresis otilde -92 +KPX Ydieresis period -92 +KPX Ydieresis semicolon -65 +KPX Ydieresis u -92 +KPX Ydieresis uacute -92 +KPX Ydieresis ucircumflex -92 +KPX Ydieresis udieresis -92 +KPX Ydieresis ugrave -92 +KPX Ydieresis uhungarumlaut -92 +KPX Ydieresis umacron -92 +KPX Ydieresis uogonek -92 +KPX Ydieresis uring -92 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX c h -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute h -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron h -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla h -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX comma quotedblright -140 +KPX comma quoteright -140 +KPX e comma -10 +KPX e g -40 +KPX e gbreve -40 +KPX e gcommaaccent -40 +KPX e period -15 +KPX e v -15 +KPX e w -15 +KPX e x -20 +KPX e y -30 +KPX e yacute -30 +KPX e ydieresis -30 +KPX eacute comma -10 +KPX eacute g -40 +KPX eacute gbreve -40 +KPX eacute gcommaaccent -40 +KPX eacute period -15 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -20 +KPX eacute y -30 +KPX eacute yacute -30 +KPX eacute ydieresis -30 +KPX ecaron comma -10 +KPX ecaron g -40 +KPX ecaron gbreve -40 +KPX ecaron gcommaaccent -40 +KPX ecaron period -15 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -20 +KPX ecaron y -30 +KPX ecaron yacute -30 +KPX ecaron ydieresis -30 +KPX ecircumflex comma -10 +KPX ecircumflex g -40 +KPX ecircumflex gbreve -40 +KPX ecircumflex gcommaaccent -40 +KPX ecircumflex period -15 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -20 +KPX ecircumflex y -30 +KPX ecircumflex yacute -30 +KPX ecircumflex ydieresis -30 +KPX edieresis comma -10 +KPX edieresis g -40 +KPX edieresis gbreve -40 +KPX edieresis gcommaaccent -40 +KPX edieresis period -15 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -20 +KPX edieresis y -30 +KPX edieresis yacute -30 +KPX edieresis ydieresis -30 +KPX edotaccent comma -10 +KPX edotaccent g -40 +KPX edotaccent gbreve -40 +KPX edotaccent gcommaaccent -40 +KPX edotaccent period -15 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -20 +KPX edotaccent y -30 +KPX edotaccent yacute -30 +KPX edotaccent ydieresis -30 +KPX egrave comma -10 +KPX egrave g -40 +KPX egrave gbreve -40 +KPX egrave gcommaaccent -40 +KPX egrave period -15 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -20 +KPX egrave y -30 +KPX egrave yacute -30 +KPX egrave ydieresis -30 +KPX emacron comma -10 +KPX emacron g -40 +KPX emacron gbreve -40 +KPX emacron gcommaaccent -40 +KPX emacron period -15 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -20 +KPX emacron y -30 +KPX emacron yacute -30 +KPX emacron ydieresis -30 +KPX eogonek comma -10 +KPX eogonek g -40 +KPX eogonek gbreve -40 +KPX eogonek gcommaaccent -40 +KPX eogonek period -15 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -20 +KPX eogonek y -30 +KPX eogonek yacute -30 +KPX eogonek ydieresis -30 +KPX f comma -10 +KPX f dotlessi -60 +KPX f f -18 +KPX f i -20 +KPX f iogonek -20 +KPX f period -15 +KPX f quoteright 92 +KPX g comma -10 +KPX g e -10 +KPX g eacute -10 +KPX g ecaron -10 +KPX g ecircumflex -10 +KPX g edieresis -10 +KPX g edotaccent -10 +KPX g egrave -10 +KPX g emacron -10 +KPX g eogonek -10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX g period -15 +KPX gbreve comma -10 +KPX gbreve e -10 +KPX gbreve eacute -10 +KPX gbreve ecaron -10 +KPX gbreve ecircumflex -10 +KPX gbreve edieresis -10 +KPX gbreve edotaccent -10 +KPX gbreve egrave -10 +KPX gbreve emacron -10 +KPX gbreve eogonek -10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gbreve period -15 +KPX gcommaaccent comma -10 +KPX gcommaaccent e -10 +KPX gcommaaccent eacute -10 +KPX gcommaaccent ecaron -10 +KPX gcommaaccent ecircumflex -10 +KPX gcommaaccent edieresis -10 +KPX gcommaaccent edotaccent -10 +KPX gcommaaccent egrave -10 +KPX gcommaaccent emacron -10 +KPX gcommaaccent eogonek -10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX gcommaaccent period -15 +KPX k e -10 +KPX k eacute -10 +KPX k ecaron -10 +KPX k ecircumflex -10 +KPX k edieresis -10 +KPX k edotaccent -10 +KPX k egrave -10 +KPX k emacron -10 +KPX k eogonek -10 +KPX k o -10 +KPX k oacute -10 +KPX k ocircumflex -10 +KPX k odieresis -10 +KPX k ograve -10 +KPX k ohungarumlaut -10 +KPX k omacron -10 +KPX k oslash -10 +KPX k otilde -10 +KPX k y -10 +KPX k yacute -10 +KPX k ydieresis -10 +KPX kcommaaccent e -10 +KPX kcommaaccent eacute -10 +KPX kcommaaccent ecaron -10 +KPX kcommaaccent ecircumflex -10 +KPX kcommaaccent edieresis -10 +KPX kcommaaccent edotaccent -10 +KPX kcommaaccent egrave -10 +KPX kcommaaccent emacron -10 +KPX kcommaaccent eogonek -10 +KPX kcommaaccent o -10 +KPX kcommaaccent oacute -10 +KPX kcommaaccent ocircumflex -10 +KPX kcommaaccent odieresis -10 +KPX kcommaaccent ograve -10 +KPX kcommaaccent ohungarumlaut -10 +KPX kcommaaccent omacron -10 +KPX kcommaaccent oslash -10 +KPX kcommaaccent otilde -10 +KPX kcommaaccent y -10 +KPX kcommaaccent yacute -10 +KPX kcommaaccent ydieresis -10 +KPX n v -40 +KPX nacute v -40 +KPX ncaron v -40 +KPX ncommaaccent v -40 +KPX ntilde v -40 +KPX o g -10 +KPX o gbreve -10 +KPX o gcommaaccent -10 +KPX o v -10 +KPX oacute g -10 +KPX oacute gbreve -10 +KPX oacute gcommaaccent -10 +KPX oacute v -10 +KPX ocircumflex g -10 +KPX ocircumflex gbreve -10 +KPX ocircumflex gcommaaccent -10 +KPX ocircumflex v -10 +KPX odieresis g -10 +KPX odieresis gbreve -10 +KPX odieresis gcommaaccent -10 +KPX odieresis v -10 +KPX ograve g -10 +KPX ograve gbreve -10 +KPX ograve gcommaaccent -10 +KPX ograve v -10 +KPX ohungarumlaut g -10 +KPX ohungarumlaut gbreve -10 +KPX ohungarumlaut gcommaaccent -10 +KPX ohungarumlaut v -10 +KPX omacron g -10 +KPX omacron gbreve -10 +KPX omacron gcommaaccent -10 +KPX omacron v -10 +KPX oslash g -10 +KPX oslash gbreve -10 +KPX oslash gcommaaccent -10 +KPX oslash v -10 +KPX otilde g -10 +KPX otilde gbreve -10 +KPX otilde gcommaaccent -10 +KPX otilde v -10 +KPX period quotedblright -140 +KPX period quoteright -140 +KPX quoteleft quoteleft -111 +KPX quoteright d -25 +KPX quoteright dcroat -25 +KPX quoteright quoteright -111 +KPX quoteright r -25 +KPX quoteright racute -25 +KPX quoteright rcaron -25 +KPX quoteright rcommaaccent -25 +KPX quoteright s -40 +KPX quoteright sacute -40 +KPX quoteright scaron -40 +KPX quoteright scedilla -40 +KPX quoteright scommaaccent -40 +KPX quoteright space -111 +KPX quoteright t -30 +KPX quoteright tcommaaccent -30 +KPX quoteright v -10 +KPX r a -15 +KPX r aacute -15 +KPX r abreve -15 +KPX r acircumflex -15 +KPX r adieresis -15 +KPX r agrave -15 +KPX r amacron -15 +KPX r aogonek -15 +KPX r aring -15 +KPX r atilde -15 +KPX r c -37 +KPX r cacute -37 +KPX r ccaron -37 +KPX r ccedilla -37 +KPX r comma -111 +KPX r d -37 +KPX r dcroat -37 +KPX r e -37 +KPX r eacute -37 +KPX r ecaron -37 +KPX r ecircumflex -37 +KPX r edieresis -37 +KPX r edotaccent -37 +KPX r egrave -37 +KPX r emacron -37 +KPX r eogonek -37 +KPX r g -37 +KPX r gbreve -37 +KPX r gcommaaccent -37 +KPX r hyphen -20 +KPX r o -45 +KPX r oacute -45 +KPX r ocircumflex -45 +KPX r odieresis -45 +KPX r ograve -45 +KPX r ohungarumlaut -45 +KPX r omacron -45 +KPX r oslash -45 +KPX r otilde -45 +KPX r period -111 +KPX r q -37 +KPX r s -10 +KPX r sacute -10 +KPX r scaron -10 +KPX r scedilla -10 +KPX r scommaaccent -10 +KPX racute a -15 +KPX racute aacute -15 +KPX racute abreve -15 +KPX racute acircumflex -15 +KPX racute adieresis -15 +KPX racute agrave -15 +KPX racute amacron -15 +KPX racute aogonek -15 +KPX racute aring -15 +KPX racute atilde -15 +KPX racute c -37 +KPX racute cacute -37 +KPX racute ccaron -37 +KPX racute ccedilla -37 +KPX racute comma -111 +KPX racute d -37 +KPX racute dcroat -37 +KPX racute e -37 +KPX racute eacute -37 +KPX racute ecaron -37 +KPX racute ecircumflex -37 +KPX racute edieresis -37 +KPX racute edotaccent -37 +KPX racute egrave -37 +KPX racute emacron -37 +KPX racute eogonek -37 +KPX racute g -37 +KPX racute gbreve -37 +KPX racute gcommaaccent -37 +KPX racute hyphen -20 +KPX racute o -45 +KPX racute oacute -45 +KPX racute ocircumflex -45 +KPX racute odieresis -45 +KPX racute ograve -45 +KPX racute ohungarumlaut -45 +KPX racute omacron -45 +KPX racute oslash -45 +KPX racute otilde -45 +KPX racute period -111 +KPX racute q -37 +KPX racute s -10 +KPX racute sacute -10 +KPX racute scaron -10 +KPX racute scedilla -10 +KPX racute scommaaccent -10 +KPX rcaron a -15 +KPX rcaron aacute -15 +KPX rcaron abreve -15 +KPX rcaron acircumflex -15 +KPX rcaron adieresis -15 +KPX rcaron agrave -15 +KPX rcaron amacron -15 +KPX rcaron aogonek -15 +KPX rcaron aring -15 +KPX rcaron atilde -15 +KPX rcaron c -37 +KPX rcaron cacute -37 +KPX rcaron ccaron -37 +KPX rcaron ccedilla -37 +KPX rcaron comma -111 +KPX rcaron d -37 +KPX rcaron dcroat -37 +KPX rcaron e -37 +KPX rcaron eacute -37 +KPX rcaron ecaron -37 +KPX rcaron ecircumflex -37 +KPX rcaron edieresis -37 +KPX rcaron edotaccent -37 +KPX rcaron egrave -37 +KPX rcaron emacron -37 +KPX rcaron eogonek -37 +KPX rcaron g -37 +KPX rcaron gbreve -37 +KPX rcaron gcommaaccent -37 +KPX rcaron hyphen -20 +KPX rcaron o -45 +KPX rcaron oacute -45 +KPX rcaron ocircumflex -45 +KPX rcaron odieresis -45 +KPX rcaron ograve -45 +KPX rcaron ohungarumlaut -45 +KPX rcaron omacron -45 +KPX rcaron oslash -45 +KPX rcaron otilde -45 +KPX rcaron period -111 +KPX rcaron q -37 +KPX rcaron s -10 +KPX rcaron sacute -10 +KPX rcaron scaron -10 +KPX rcaron scedilla -10 +KPX rcaron scommaaccent -10 +KPX rcommaaccent a -15 +KPX rcommaaccent aacute -15 +KPX rcommaaccent abreve -15 +KPX rcommaaccent acircumflex -15 +KPX rcommaaccent adieresis -15 +KPX rcommaaccent agrave -15 +KPX rcommaaccent amacron -15 +KPX rcommaaccent aogonek -15 +KPX rcommaaccent aring -15 +KPX rcommaaccent atilde -15 +KPX rcommaaccent c -37 +KPX rcommaaccent cacute -37 +KPX rcommaaccent ccaron -37 +KPX rcommaaccent ccedilla -37 +KPX rcommaaccent comma -111 +KPX rcommaaccent d -37 +KPX rcommaaccent dcroat -37 +KPX rcommaaccent e -37 +KPX rcommaaccent eacute -37 +KPX rcommaaccent ecaron -37 +KPX rcommaaccent ecircumflex -37 +KPX rcommaaccent edieresis -37 +KPX rcommaaccent edotaccent -37 +KPX rcommaaccent egrave -37 +KPX rcommaaccent emacron -37 +KPX rcommaaccent eogonek -37 +KPX rcommaaccent g -37 +KPX rcommaaccent gbreve -37 +KPX rcommaaccent gcommaaccent -37 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -45 +KPX rcommaaccent oacute -45 +KPX rcommaaccent ocircumflex -45 +KPX rcommaaccent odieresis -45 +KPX rcommaaccent ograve -45 +KPX rcommaaccent ohungarumlaut -45 +KPX rcommaaccent omacron -45 +KPX rcommaaccent oslash -45 +KPX rcommaaccent otilde -45 +KPX rcommaaccent period -111 +KPX rcommaaccent q -37 +KPX rcommaaccent s -10 +KPX rcommaaccent sacute -10 +KPX rcommaaccent scaron -10 +KPX rcommaaccent scedilla -10 +KPX rcommaaccent scommaaccent -10 +KPX space A -18 +KPX space Aacute -18 +KPX space Abreve -18 +KPX space Acircumflex -18 +KPX space Adieresis -18 +KPX space Agrave -18 +KPX space Amacron -18 +KPX space Aogonek -18 +KPX space Aring -18 +KPX space Atilde -18 +KPX space T -18 +KPX space Tcaron -18 +KPX space Tcommaaccent -18 +KPX space V -35 +KPX space W -40 +KPX space Y -75 +KPX space Yacute -75 +KPX space Ydieresis -75 +KPX v comma -74 +KPX v period -74 +KPX w comma -74 +KPX w period -74 +KPX y comma -55 +KPX y period -55 +KPX yacute comma -55 +KPX yacute period -55 +KPX ydieresis comma -55 +KPX ydieresis period -55 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Times-Roman.afm b/application/third_party/dompdf/lib/fonts/Times-Roman.afm new file mode 100644 index 00000000..cf0ce275 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Roman.afm @@ -0,0 +1,2421 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:49:17 1997 +Comment UniqueID 43068 +Comment VMusage 43909 54934 +FontName Times-Roman +FullName Times Roman +FamilyName Times +Weight Roman +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -168 -218 1000 898 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.00 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 662 +XHeight 450 +Ascender 683 +Descender -217 +StdHW 28 +StdVW 84 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ; +C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ; +C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ; +C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ; +C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ; +C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ; +C 146 ; WX 333 ; N quoteright ; B 79 433 218 676 ; +C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ; +C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ; +C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ; +C 43 ; WX 564 ; N plus ; B 30 0 534 506 ; +C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ; +C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ; +C 173 ; WX 333 ; N hyphen ; B 39 194 285 257 ; +C 46 ; WX 250 ; N period ; B 70 -11 181 100 ; +C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ; +C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ; +C 49 ; WX 500 ; N one ; B 111 0 394 676 ; +C 50 ; WX 500 ; N two ; B 30 0 475 676 ; +C 51 ; WX 500 ; N three ; B 43 -14 431 676 ; +C 52 ; WX 500 ; N four ; B 12 0 472 676 ; +C 53 ; WX 500 ; N five ; B 32 -14 438 688 ; +C 54 ; WX 500 ; N six ; B 34 -14 468 684 ; +C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ; +C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ; +C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ; +C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ; +C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ; +C 60 ; WX 564 ; N less ; B 28 -8 536 514 ; +C 61 ; WX 564 ; N equal ; B 30 120 534 386 ; +C 62 ; WX 564 ; N greater ; B 28 -8 536 514 ; +C 63 ; WX 444 ; N question ; B 68 -8 414 676 ; +C 64 ; WX 921 ; N at ; B 116 -14 809 676 ; +C 65 ; WX 722 ; N A ; B 15 0 706 674 ; +C 66 ; WX 667 ; N B ; B 17 0 593 662 ; +C 67 ; WX 667 ; N C ; B 28 -14 633 676 ; +C 68 ; WX 722 ; N D ; B 16 0 685 662 ; +C 69 ; WX 611 ; N E ; B 12 0 597 662 ; +C 70 ; WX 556 ; N F ; B 12 0 546 662 ; +C 71 ; WX 722 ; N G ; B 32 -14 709 676 ; +C 72 ; WX 722 ; N H ; B 19 0 702 662 ; +C 73 ; WX 333 ; N I ; B 18 0 315 662 ; +C 74 ; WX 389 ; N J ; B 10 -14 370 662 ; +C 75 ; WX 722 ; N K ; B 34 0 723 662 ; +C 76 ; WX 611 ; N L ; B 12 0 598 662 ; +C 77 ; WX 889 ; N M ; B 12 0 863 662 ; +C 78 ; WX 722 ; N N ; B 12 -11 707 662 ; +C 79 ; WX 722 ; N O ; B 34 -14 688 676 ; +C 80 ; WX 556 ; N P ; B 16 0 542 662 ; +C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ; +C 82 ; WX 667 ; N R ; B 17 0 659 662 ; +C 83 ; WX 556 ; N S ; B 42 -14 491 676 ; +C 84 ; WX 611 ; N T ; B 17 0 593 662 ; +C 85 ; WX 722 ; N U ; B 14 -14 705 662 ; +C 86 ; WX 722 ; N V ; B 16 -11 697 662 ; +C 87 ; WX 944 ; N W ; B 5 -11 932 662 ; +C 88 ; WX 722 ; N X ; B 10 0 704 662 ; +C 89 ; WX 722 ; N Y ; B 22 0 703 662 ; +C 90 ; WX 611 ; N Z ; B 9 0 597 662 ; +C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ; +C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ; +C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ; +C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 115 433 254 676 ; +C 97 ; WX 444 ; N a ; B 37 -10 442 460 ; +C 98 ; WX 500 ; N b ; B 3 -10 468 683 ; +C 99 ; WX 444 ; N c ; B 25 -10 412 460 ; +C 100 ; WX 500 ; N d ; B 27 -10 491 683 ; +C 101 ; WX 444 ; N e ; B 25 -10 424 460 ; +C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B 28 -218 470 460 ; +C 104 ; WX 500 ; N h ; B 9 0 487 683 ; +C 105 ; WX 278 ; N i ; B 16 0 253 683 ; +C 106 ; WX 278 ; N j ; B -70 -218 194 683 ; +C 107 ; WX 500 ; N k ; B 7 0 505 683 ; +C 108 ; WX 278 ; N l ; B 19 0 257 683 ; +C 109 ; WX 778 ; N m ; B 16 0 775 460 ; +C 110 ; WX 500 ; N n ; B 16 0 485 460 ; +C 111 ; WX 500 ; N o ; B 29 -10 470 460 ; +C 112 ; WX 500 ; N p ; B 5 -217 470 460 ; +C 113 ; WX 500 ; N q ; B 24 -217 488 460 ; +C 114 ; WX 333 ; N r ; B 5 0 335 460 ; +C 115 ; WX 389 ; N s ; B 51 -10 348 460 ; +C 116 ; WX 278 ; N t ; B 13 -10 279 579 ; +C 117 ; WX 500 ; N u ; B 9 -10 479 450 ; +C 118 ; WX 500 ; N v ; B 19 -14 477 450 ; +C 119 ; WX 722 ; N w ; B 21 -14 694 450 ; +C 120 ; WX 500 ; N x ; B 17 0 479 450 ; +C 121 ; WX 500 ; N y ; B 14 -218 475 450 ; +C 122 ; WX 444 ; N z ; B 27 0 418 450 ; +C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ; +C 124 ; WX 200 ; N bar ; B 67 -218 133 782 ; +C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ; +C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; +C 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ; +C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ; +C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ; +C -1 ; WX 167 ; N fraction ; B -168 -14 331 676 ; +C 165 ; WX 500 ; N yen ; B -53 0 512 662 ; +C 131 ; WX 500 ; N florin ; B 7 -189 490 676 ; +C 167 ; WX 500 ; N section ; B 70 -148 426 676 ; +C 164 ; WX 500 ; N currency ; B -22 58 522 602 ; +C 39 ; WX 180 ; N quotesingle ; B 48 431 133 676 ; +C 147 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ; +C 170 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ; +C 139 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ; +C 155 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ; +C -1 ; WX 556 ; N fi ; B 31 0 521 683 ; +C -1 ; WX 556 ; N fl ; B 32 0 521 683 ; +C 150 ; WX 500 ; N endash ; B 0 201 500 250 ; +C 134 ; WX 500 ; N dagger ; B 59 -149 442 676 ; +C 135 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ; +C 183 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; +C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ; +C 149 ; WX 350 ; N bullet ; B 40 196 310 466 ; +C 130 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ; +C 132 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ; +C 148 ; WX 444 ; N quotedblright ; B 30 433 401 676 ; +C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ; +C 133 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ; +C 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ; +C 96 ; WX 333 ; N grave ; B 19 507 242 678 ; +C 180 ; WX 333 ; N acute ; B 93 507 317 678 ; +C 136 ; WX 333 ; N circumflex ; B 11 507 322 674 ; +C 152 ; WX 333 ; N tilde ; B 1 532 331 638 ; +C 175 ; WX 333 ; N macron ; B 11 547 322 601 ; +C -1 ; WX 333 ; N breve ; B 26 507 307 664 ; +C -1 ; WX 333 ; N dotaccent ; B 118 581 216 681 ; +C 168 ; WX 333 ; N dieresis ; B 18 581 315 681 ; +C -1 ; WX 333 ; N ring ; B 67 512 266 711 ; +C 184 ; WX 333 ; N cedilla ; B 52 -215 261 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ; +C -1 ; WX 333 ; N ogonek ; B 62 -165 243 0 ; +C -1 ; WX 333 ; N caron ; B 11 507 322 674 ; +C 151 ; WX 1000 ; N emdash ; B 0 201 1000 250 ; +C 198 ; WX 889 ; N AE ; B 0 0 863 662 ; +C 170 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ; +C -1 ; WX 611 ; N Lslash ; B 12 0 598 662 ; +C 216 ; WX 722 ; N Oslash ; B 34 -80 688 734 ; +C 140 ; WX 889 ; N OE ; B 30 -6 885 668 ; +C 186 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ; +C 230 ; WX 667 ; N ae ; B 38 -10 632 460 ; +C -1 ; WX 278 ; N dotlessi ; B 16 0 253 460 ; +C -1 ; WX 278 ; N lslash ; B 19 0 259 683 ; +C 248 ; WX 500 ; N oslash ; B 29 -112 470 551 ; +C 156 ; WX 722 ; N oe ; B 30 -10 690 460 ; +C 223 ; WX 500 ; N germandbls ; B 12 -9 468 683 ; +C 207 ; WX 333 ; N Idieresis ; B 18 0 315 835 ; +C 233 ; WX 444 ; N eacute ; B 25 -10 424 678 ; +C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ; +C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ; +C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ; +C 159 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ; +C 247 ; WX 564 ; N divide ; B 30 -10 534 516 ; +C 221 ; WX 722 ; N Yacute ; B 22 0 703 890 ; +C 194 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ; +C 225 ; WX 444 ; N aacute ; B 37 -10 442 678 ; +C 219 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ; +C 253 ; WX 500 ; N yacute ; B 14 -218 475 678 ; +C -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ; +C 234 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ; +C -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ; +C 220 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ; +C -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ; +C 218 ; WX 722 ; N Uacute ; B 14 -14 705 890 ; +C -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ; +C 203 ; WX 611 ; N Edieresis ; B 12 0 597 835 ; +C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ; +C -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ; +C 169 ; WX 760 ; N copyright ; B 38 -14 722 676 ; +C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ; +C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ; +C 229 ; WX 444 ; N aring ; B 37 -10 442 711 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ; +C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ; +C 224 ; WX 444 ; N agrave ; B 37 -10 442 678 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ; +C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ; +C 227 ; WX 444 ; N atilde ; B 37 -10 442 638 ; +C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ; +C 154 ; WX 389 ; N scaron ; B 39 -10 350 674 ; +C -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ; +C 237 ; WX 278 ; N iacute ; B 16 0 290 678 ; +C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; +C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ; +C 251 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ; +C 226 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ; +C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ; +C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ; +C 231 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ; +C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ; +C 222 ; WX 556 ; N Thorn ; B 16 0 542 662 ; +C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ; +C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ; +C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ; +C -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ; +C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ; +C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ; +C 179 ; WX 300 ; N threesuperior ; B 15 262 291 676 ; +C 210 ; WX 722 ; N Ograve ; B 34 -14 688 890 ; +C 192 ; WX 722 ; N Agrave ; B 15 0 706 890 ; +C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ; +C 215 ; WX 564 ; N multiply ; B 38 8 527 497 ; +C 250 ; WX 500 ; N uacute ; B 9 -10 479 678 ; +C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ; +C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; +C 255 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ; +C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ; +C 238 ; WX 278 ; N icircumflex ; B -16 0 295 674 ; +C 202 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ; +C 228 ; WX 444 ; N adieresis ; B 37 -10 442 623 ; +C 235 ; WX 444 ; N edieresis ; B 25 -10 424 623 ; +C -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ; +C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ; +C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ; +C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ; +C 205 ; WX 333 ; N Iacute ; B 18 0 317 890 ; +C 177 ; WX 564 ; N plusminus ; B 30 0 534 506 ; +C 166 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ; +C 174 ; WX 760 ; N registered ; B 38 -14 722 676 ; +C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ; +C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ; +C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; +C 200 ; WX 611 ; N Egrave ; B 12 0 597 890 ; +C -1 ; WX 333 ; N racute ; B 5 0 335 678 ; +C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ; +C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ; +C 142 ; WX 611 ; N Zcaron ; B 9 0 597 886 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ; +C 208 ; WX 722 ; N Eth ; B 16 0 685 662 ; +C 199 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ; +C -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ; +C -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ; +C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ; +C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ; +C 193 ; WX 722 ; N Aacute ; B 15 0 706 890 ; +C 196 ; WX 722 ; N Adieresis ; B 15 0 706 835 ; +C 232 ; WX 444 ; N egrave ; B 25 -10 424 678 ; +C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ; +C -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ; +C 211 ; WX 722 ; N Oacute ; B 34 -14 688 890 ; +C 243 ; WX 500 ; N oacute ; B 29 -10 470 678 ; +C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ; +C -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ; +C 239 ; WX 278 ; N idieresis ; B -9 0 288 623 ; +C 212 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ; +C 217 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 500 ; N thorn ; B 5 -217 470 683 ; +C 178 ; WX 300 ; N twosuperior ; B 1 270 296 676 ; +C 214 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ; +C 181 ; WX 500 ; N mu ; B 36 -218 512 450 ; +C 236 ; WX 278 ; N igrave ; B -8 0 253 678 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ; +C -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ; +C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ; +C 190 ; WX 750 ; N threequarters ; B 15 -14 718 676 ; +C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ; +C -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ; +C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ; +C 153 ; WX 980 ; N trademark ; B 30 256 957 662 ; +C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ; +C 204 ; WX 333 ; N Igrave ; B 18 0 315 890 ; +C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ; +C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ; +C 189 ; WX 750 ; N onehalf ; B 31 -14 746 676 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ; +C 244 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ; +C 241 ; WX 500 ; N ntilde ; B 16 0 485 638 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ; +C 201 ; WX 611 ; N Eacute ; B 12 0 597 890 ; +C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ; +C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ; +C 188 ; WX 750 ; N onequarter ; B 37 -14 718 676 ; +C 138 ; WX 556 ; N Scaron ; B 42 -14 491 886 ; +C -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ; +C 176 ; WX 400 ; N degree ; B 57 390 343 676 ; +C 242 ; WX 500 ; N ograve ; B 29 -10 470 678 ; +C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ; +C 249 ; WX 500 ; N ugrave ; B 9 -10 479 678 ; +C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; +C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ; +C -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ; +C 209 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ; +C 245 ; WX 500 ; N otilde ; B 29 -10 470 638 ; +C -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ; +C 195 ; WX 722 ; N Atilde ; B 15 0 706 850 ; +C -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ; +C 197 ; WX 722 ; N Aring ; B 15 0 706 898 ; +C 213 ; WX 722 ; N Otilde ; B 34 -14 688 850 ; +C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ; +C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ; +C -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ; +C -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ; +C -1 ; WX 564 ; N minus ; B 30 220 534 286 ; +C 206 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ; +C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ; +C -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ; +C 172 ; WX 564 ; N logicalnot ; B 30 108 534 386 ; +C 246 ; WX 500 ; N odieresis ; B 29 -10 470 623 ; +C 252 ; WX 500 ; N udieresis ; B 9 -10 479 623 ; +C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ; +C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ; +C 240 ; WX 500 ; N eth ; B 29 -10 471 686 ; +C 158 ; WX 444 ; N zcaron ; B 27 0 418 674 ; +C -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ; +C 185 ; WX 300 ; N onesuperior ; B 57 270 248 676 ; +C -1 ; WX 278 ; N imacron ; B 6 0 271 601 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2073 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -40 +KPX A Gbreve -40 +KPX A Gcommaaccent -40 +KPX A O -55 +KPX A Oacute -55 +KPX A Ocircumflex -55 +KPX A Odieresis -55 +KPX A Ograve -55 +KPX A Ohungarumlaut -55 +KPX A Omacron -55 +KPX A Oslash -55 +KPX A Otilde -55 +KPX A Q -55 +KPX A T -111 +KPX A Tcaron -111 +KPX A Tcommaaccent -111 +KPX A U -55 +KPX A Uacute -55 +KPX A Ucircumflex -55 +KPX A Udieresis -55 +KPX A Ugrave -55 +KPX A Uhungarumlaut -55 +KPX A Umacron -55 +KPX A Uogonek -55 +KPX A Uring -55 +KPX A V -135 +KPX A W -90 +KPX A Y -105 +KPX A Yacute -105 +KPX A Ydieresis -105 +KPX A quoteright -111 +KPX A v -74 +KPX A w -92 +KPX A y -92 +KPX A yacute -92 +KPX A ydieresis -92 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -40 +KPX Aacute Gbreve -40 +KPX Aacute Gcommaaccent -40 +KPX Aacute O -55 +KPX Aacute Oacute -55 +KPX Aacute Ocircumflex -55 +KPX Aacute Odieresis -55 +KPX Aacute Ograve -55 +KPX Aacute Ohungarumlaut -55 +KPX Aacute Omacron -55 +KPX Aacute Oslash -55 +KPX Aacute Otilde -55 +KPX Aacute Q -55 +KPX Aacute T -111 +KPX Aacute Tcaron -111 +KPX Aacute Tcommaaccent -111 +KPX Aacute U -55 +KPX Aacute Uacute -55 +KPX Aacute Ucircumflex -55 +KPX Aacute Udieresis -55 +KPX Aacute Ugrave -55 +KPX Aacute Uhungarumlaut -55 +KPX Aacute Umacron -55 +KPX Aacute Uogonek -55 +KPX Aacute Uring -55 +KPX Aacute V -135 +KPX Aacute W -90 +KPX Aacute Y -105 +KPX Aacute Yacute -105 +KPX Aacute Ydieresis -105 +KPX Aacute quoteright -111 +KPX Aacute v -74 +KPX Aacute w -92 +KPX Aacute y -92 +KPX Aacute yacute -92 +KPX Aacute ydieresis -92 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -40 +KPX Abreve Gbreve -40 +KPX Abreve Gcommaaccent -40 +KPX Abreve O -55 +KPX Abreve Oacute -55 +KPX Abreve Ocircumflex -55 +KPX Abreve Odieresis -55 +KPX Abreve Ograve -55 +KPX Abreve Ohungarumlaut -55 +KPX Abreve Omacron -55 +KPX Abreve Oslash -55 +KPX Abreve Otilde -55 +KPX Abreve Q -55 +KPX Abreve T -111 +KPX Abreve Tcaron -111 +KPX Abreve Tcommaaccent -111 +KPX Abreve U -55 +KPX Abreve Uacute -55 +KPX Abreve Ucircumflex -55 +KPX Abreve Udieresis -55 +KPX Abreve Ugrave -55 +KPX Abreve Uhungarumlaut -55 +KPX Abreve Umacron -55 +KPX Abreve Uogonek -55 +KPX Abreve Uring -55 +KPX Abreve V -135 +KPX Abreve W -90 +KPX Abreve Y -105 +KPX Abreve Yacute -105 +KPX Abreve Ydieresis -105 +KPX Abreve quoteright -111 +KPX Abreve v -74 +KPX Abreve w -92 +KPX Abreve y -92 +KPX Abreve yacute -92 +KPX Abreve ydieresis -92 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -40 +KPX Acircumflex Gbreve -40 +KPX Acircumflex Gcommaaccent -40 +KPX Acircumflex O -55 +KPX Acircumflex Oacute -55 +KPX Acircumflex Ocircumflex -55 +KPX Acircumflex Odieresis -55 +KPX Acircumflex Ograve -55 +KPX Acircumflex Ohungarumlaut -55 +KPX Acircumflex Omacron -55 +KPX Acircumflex Oslash -55 +KPX Acircumflex Otilde -55 +KPX Acircumflex Q -55 +KPX Acircumflex T -111 +KPX Acircumflex Tcaron -111 +KPX Acircumflex Tcommaaccent -111 +KPX Acircumflex U -55 +KPX Acircumflex Uacute -55 +KPX Acircumflex Ucircumflex -55 +KPX Acircumflex Udieresis -55 +KPX Acircumflex Ugrave -55 +KPX Acircumflex Uhungarumlaut -55 +KPX Acircumflex Umacron -55 +KPX Acircumflex Uogonek -55 +KPX Acircumflex Uring -55 +KPX Acircumflex V -135 +KPX Acircumflex W -90 +KPX Acircumflex Y -105 +KPX Acircumflex Yacute -105 +KPX Acircumflex Ydieresis -105 +KPX Acircumflex quoteright -111 +KPX Acircumflex v -74 +KPX Acircumflex w -92 +KPX Acircumflex y -92 +KPX Acircumflex yacute -92 +KPX Acircumflex ydieresis -92 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -40 +KPX Adieresis Gbreve -40 +KPX Adieresis Gcommaaccent -40 +KPX Adieresis O -55 +KPX Adieresis Oacute -55 +KPX Adieresis Ocircumflex -55 +KPX Adieresis Odieresis -55 +KPX Adieresis Ograve -55 +KPX Adieresis Ohungarumlaut -55 +KPX Adieresis Omacron -55 +KPX Adieresis Oslash -55 +KPX Adieresis Otilde -55 +KPX Adieresis Q -55 +KPX Adieresis T -111 +KPX Adieresis Tcaron -111 +KPX Adieresis Tcommaaccent -111 +KPX Adieresis U -55 +KPX Adieresis Uacute -55 +KPX Adieresis Ucircumflex -55 +KPX Adieresis Udieresis -55 +KPX Adieresis Ugrave -55 +KPX Adieresis Uhungarumlaut -55 +KPX Adieresis Umacron -55 +KPX Adieresis Uogonek -55 +KPX Adieresis Uring -55 +KPX Adieresis V -135 +KPX Adieresis W -90 +KPX Adieresis Y -105 +KPX Adieresis Yacute -105 +KPX Adieresis Ydieresis -105 +KPX Adieresis quoteright -111 +KPX Adieresis v -74 +KPX Adieresis w -92 +KPX Adieresis y -92 +KPX Adieresis yacute -92 +KPX Adieresis ydieresis -92 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -40 +KPX Agrave Gbreve -40 +KPX Agrave Gcommaaccent -40 +KPX Agrave O -55 +KPX Agrave Oacute -55 +KPX Agrave Ocircumflex -55 +KPX Agrave Odieresis -55 +KPX Agrave Ograve -55 +KPX Agrave Ohungarumlaut -55 +KPX Agrave Omacron -55 +KPX Agrave Oslash -55 +KPX Agrave Otilde -55 +KPX Agrave Q -55 +KPX Agrave T -111 +KPX Agrave Tcaron -111 +KPX Agrave Tcommaaccent -111 +KPX Agrave U -55 +KPX Agrave Uacute -55 +KPX Agrave Ucircumflex -55 +KPX Agrave Udieresis -55 +KPX Agrave Ugrave -55 +KPX Agrave Uhungarumlaut -55 +KPX Agrave Umacron -55 +KPX Agrave Uogonek -55 +KPX Agrave Uring -55 +KPX Agrave V -135 +KPX Agrave W -90 +KPX Agrave Y -105 +KPX Agrave Yacute -105 +KPX Agrave Ydieresis -105 +KPX Agrave quoteright -111 +KPX Agrave v -74 +KPX Agrave w -92 +KPX Agrave y -92 +KPX Agrave yacute -92 +KPX Agrave ydieresis -92 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -40 +KPX Amacron Gbreve -40 +KPX Amacron Gcommaaccent -40 +KPX Amacron O -55 +KPX Amacron Oacute -55 +KPX Amacron Ocircumflex -55 +KPX Amacron Odieresis -55 +KPX Amacron Ograve -55 +KPX Amacron Ohungarumlaut -55 +KPX Amacron Omacron -55 +KPX Amacron Oslash -55 +KPX Amacron Otilde -55 +KPX Amacron Q -55 +KPX Amacron T -111 +KPX Amacron Tcaron -111 +KPX Amacron Tcommaaccent -111 +KPX Amacron U -55 +KPX Amacron Uacute -55 +KPX Amacron Ucircumflex -55 +KPX Amacron Udieresis -55 +KPX Amacron Ugrave -55 +KPX Amacron Uhungarumlaut -55 +KPX Amacron Umacron -55 +KPX Amacron Uogonek -55 +KPX Amacron Uring -55 +KPX Amacron V -135 +KPX Amacron W -90 +KPX Amacron Y -105 +KPX Amacron Yacute -105 +KPX Amacron Ydieresis -105 +KPX Amacron quoteright -111 +KPX Amacron v -74 +KPX Amacron w -92 +KPX Amacron y -92 +KPX Amacron yacute -92 +KPX Amacron ydieresis -92 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -40 +KPX Aogonek Gbreve -40 +KPX Aogonek Gcommaaccent -40 +KPX Aogonek O -55 +KPX Aogonek Oacute -55 +KPX Aogonek Ocircumflex -55 +KPX Aogonek Odieresis -55 +KPX Aogonek Ograve -55 +KPX Aogonek Ohungarumlaut -55 +KPX Aogonek Omacron -55 +KPX Aogonek Oslash -55 +KPX Aogonek Otilde -55 +KPX Aogonek Q -55 +KPX Aogonek T -111 +KPX Aogonek Tcaron -111 +KPX Aogonek Tcommaaccent -111 +KPX Aogonek U -55 +KPX Aogonek Uacute -55 +KPX Aogonek Ucircumflex -55 +KPX Aogonek Udieresis -55 +KPX Aogonek Ugrave -55 +KPX Aogonek Uhungarumlaut -55 +KPX Aogonek Umacron -55 +KPX Aogonek Uogonek -55 +KPX Aogonek Uring -55 +KPX Aogonek V -135 +KPX Aogonek W -90 +KPX Aogonek Y -105 +KPX Aogonek Yacute -105 +KPX Aogonek Ydieresis -105 +KPX Aogonek quoteright -111 +KPX Aogonek v -74 +KPX Aogonek w -52 +KPX Aogonek y -52 +KPX Aogonek yacute -52 +KPX Aogonek ydieresis -52 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -40 +KPX Aring Gbreve -40 +KPX Aring Gcommaaccent -40 +KPX Aring O -55 +KPX Aring Oacute -55 +KPX Aring Ocircumflex -55 +KPX Aring Odieresis -55 +KPX Aring Ograve -55 +KPX Aring Ohungarumlaut -55 +KPX Aring Omacron -55 +KPX Aring Oslash -55 +KPX Aring Otilde -55 +KPX Aring Q -55 +KPX Aring T -111 +KPX Aring Tcaron -111 +KPX Aring Tcommaaccent -111 +KPX Aring U -55 +KPX Aring Uacute -55 +KPX Aring Ucircumflex -55 +KPX Aring Udieresis -55 +KPX Aring Ugrave -55 +KPX Aring Uhungarumlaut -55 +KPX Aring Umacron -55 +KPX Aring Uogonek -55 +KPX Aring Uring -55 +KPX Aring V -135 +KPX Aring W -90 +KPX Aring Y -105 +KPX Aring Yacute -105 +KPX Aring Ydieresis -105 +KPX Aring quoteright -111 +KPX Aring v -74 +KPX Aring w -92 +KPX Aring y -92 +KPX Aring yacute -92 +KPX Aring ydieresis -92 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -40 +KPX Atilde Gbreve -40 +KPX Atilde Gcommaaccent -40 +KPX Atilde O -55 +KPX Atilde Oacute -55 +KPX Atilde Ocircumflex -55 +KPX Atilde Odieresis -55 +KPX Atilde Ograve -55 +KPX Atilde Ohungarumlaut -55 +KPX Atilde Omacron -55 +KPX Atilde Oslash -55 +KPX Atilde Otilde -55 +KPX Atilde Q -55 +KPX Atilde T -111 +KPX Atilde Tcaron -111 +KPX Atilde Tcommaaccent -111 +KPX Atilde U -55 +KPX Atilde Uacute -55 +KPX Atilde Ucircumflex -55 +KPX Atilde Udieresis -55 +KPX Atilde Ugrave -55 +KPX Atilde Uhungarumlaut -55 +KPX Atilde Umacron -55 +KPX Atilde Uogonek -55 +KPX Atilde Uring -55 +KPX Atilde V -135 +KPX Atilde W -90 +KPX Atilde Y -105 +KPX Atilde Yacute -105 +KPX Atilde Ydieresis -105 +KPX Atilde quoteright -111 +KPX Atilde v -74 +KPX Atilde w -92 +KPX Atilde y -92 +KPX Atilde yacute -92 +KPX Atilde ydieresis -92 +KPX B A -35 +KPX B Aacute -35 +KPX B Abreve -35 +KPX B Acircumflex -35 +KPX B Adieresis -35 +KPX B Agrave -35 +KPX B Amacron -35 +KPX B Aogonek -35 +KPX B Aring -35 +KPX B Atilde -35 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -30 +KPX D Y -55 +KPX D Yacute -55 +KPX D Ydieresis -55 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -30 +KPX Dcaron Y -55 +KPX Dcaron Yacute -55 +KPX Dcaron Ydieresis -55 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -30 +KPX Dcroat Y -55 +KPX Dcroat Yacute -55 +KPX Dcroat Ydieresis -55 +KPX F A -74 +KPX F Aacute -74 +KPX F Abreve -74 +KPX F Acircumflex -74 +KPX F Adieresis -74 +KPX F Agrave -74 +KPX F Amacron -74 +KPX F Aogonek -74 +KPX F Aring -74 +KPX F Atilde -74 +KPX F a -15 +KPX F aacute -15 +KPX F abreve -15 +KPX F acircumflex -15 +KPX F adieresis -15 +KPX F agrave -15 +KPX F amacron -15 +KPX F aogonek -15 +KPX F aring -15 +KPX F atilde -15 +KPX F comma -80 +KPX F o -15 +KPX F oacute -15 +KPX F ocircumflex -15 +KPX F odieresis -15 +KPX F ograve -15 +KPX F ohungarumlaut -15 +KPX F omacron -15 +KPX F oslash -15 +KPX F otilde -15 +KPX F period -80 +KPX J A -60 +KPX J Aacute -60 +KPX J Abreve -60 +KPX J Acircumflex -60 +KPX J Adieresis -60 +KPX J Agrave -60 +KPX J Amacron -60 +KPX J Aogonek -60 +KPX J Aring -60 +KPX J Atilde -60 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -25 +KPX K eacute -25 +KPX K ecaron -25 +KPX K ecircumflex -25 +KPX K edieresis -25 +KPX K edotaccent -25 +KPX K egrave -25 +KPX K emacron -25 +KPX K eogonek -25 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -15 +KPX K uacute -15 +KPX K ucircumflex -15 +KPX K udieresis -15 +KPX K ugrave -15 +KPX K uhungarumlaut -15 +KPX K umacron -15 +KPX K uogonek -15 +KPX K uring -15 +KPX K y -25 +KPX K yacute -25 +KPX K ydieresis -25 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -25 +KPX Kcommaaccent eacute -25 +KPX Kcommaaccent ecaron -25 +KPX Kcommaaccent ecircumflex -25 +KPX Kcommaaccent edieresis -25 +KPX Kcommaaccent edotaccent -25 +KPX Kcommaaccent egrave -25 +KPX Kcommaaccent emacron -25 +KPX Kcommaaccent eogonek -25 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -15 +KPX Kcommaaccent uacute -15 +KPX Kcommaaccent ucircumflex -15 +KPX Kcommaaccent udieresis -15 +KPX Kcommaaccent ugrave -15 +KPX Kcommaaccent uhungarumlaut -15 +KPX Kcommaaccent umacron -15 +KPX Kcommaaccent uogonek -15 +KPX Kcommaaccent uring -15 +KPX Kcommaaccent y -25 +KPX Kcommaaccent yacute -25 +KPX Kcommaaccent ydieresis -25 +KPX L T -92 +KPX L Tcaron -92 +KPX L Tcommaaccent -92 +KPX L V -100 +KPX L W -74 +KPX L Y -100 +KPX L Yacute -100 +KPX L Ydieresis -100 +KPX L quoteright -92 +KPX L y -55 +KPX L yacute -55 +KPX L ydieresis -55 +KPX Lacute T -92 +KPX Lacute Tcaron -92 +KPX Lacute Tcommaaccent -92 +KPX Lacute V -100 +KPX Lacute W -74 +KPX Lacute Y -100 +KPX Lacute Yacute -100 +KPX Lacute Ydieresis -100 +KPX Lacute quoteright -92 +KPX Lacute y -55 +KPX Lacute yacute -55 +KPX Lacute ydieresis -55 +KPX Lcaron quoteright -92 +KPX Lcaron y -55 +KPX Lcaron yacute -55 +KPX Lcaron ydieresis -55 +KPX Lcommaaccent T -92 +KPX Lcommaaccent Tcaron -92 +KPX Lcommaaccent Tcommaaccent -92 +KPX Lcommaaccent V -100 +KPX Lcommaaccent W -74 +KPX Lcommaaccent Y -100 +KPX Lcommaaccent Yacute -100 +KPX Lcommaaccent Ydieresis -100 +KPX Lcommaaccent quoteright -92 +KPX Lcommaaccent y -55 +KPX Lcommaaccent yacute -55 +KPX Lcommaaccent ydieresis -55 +KPX Lslash T -92 +KPX Lslash Tcaron -92 +KPX Lslash Tcommaaccent -92 +KPX Lslash V -100 +KPX Lslash W -74 +KPX Lslash Y -100 +KPX Lslash Yacute -100 +KPX Lslash Ydieresis -100 +KPX Lslash quoteright -92 +KPX Lslash y -55 +KPX Lslash yacute -55 +KPX Lslash ydieresis -55 +KPX N A -35 +KPX N Aacute -35 +KPX N Abreve -35 +KPX N Acircumflex -35 +KPX N Adieresis -35 +KPX N Agrave -35 +KPX N Amacron -35 +KPX N Aogonek -35 +KPX N Aring -35 +KPX N Atilde -35 +KPX Nacute A -35 +KPX Nacute Aacute -35 +KPX Nacute Abreve -35 +KPX Nacute Acircumflex -35 +KPX Nacute Adieresis -35 +KPX Nacute Agrave -35 +KPX Nacute Amacron -35 +KPX Nacute Aogonek -35 +KPX Nacute Aring -35 +KPX Nacute Atilde -35 +KPX Ncaron A -35 +KPX Ncaron Aacute -35 +KPX Ncaron Abreve -35 +KPX Ncaron Acircumflex -35 +KPX Ncaron Adieresis -35 +KPX Ncaron Agrave -35 +KPX Ncaron Amacron -35 +KPX Ncaron Aogonek -35 +KPX Ncaron Aring -35 +KPX Ncaron Atilde -35 +KPX Ncommaaccent A -35 +KPX Ncommaaccent Aacute -35 +KPX Ncommaaccent Abreve -35 +KPX Ncommaaccent Acircumflex -35 +KPX Ncommaaccent Adieresis -35 +KPX Ncommaaccent Agrave -35 +KPX Ncommaaccent Amacron -35 +KPX Ncommaaccent Aogonek -35 +KPX Ncommaaccent Aring -35 +KPX Ncommaaccent Atilde -35 +KPX Ntilde A -35 +KPX Ntilde Aacute -35 +KPX Ntilde Abreve -35 +KPX Ntilde Acircumflex -35 +KPX Ntilde Adieresis -35 +KPX Ntilde Agrave -35 +KPX Ntilde Amacron -35 +KPX Ntilde Aogonek -35 +KPX Ntilde Aring -35 +KPX Ntilde Atilde -35 +KPX O A -35 +KPX O Aacute -35 +KPX O Abreve -35 +KPX O Acircumflex -35 +KPX O Adieresis -35 +KPX O Agrave -35 +KPX O Amacron -35 +KPX O Aogonek -35 +KPX O Aring -35 +KPX O Atilde -35 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -35 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -35 +KPX Oacute Aacute -35 +KPX Oacute Abreve -35 +KPX Oacute Acircumflex -35 +KPX Oacute Adieresis -35 +KPX Oacute Agrave -35 +KPX Oacute Amacron -35 +KPX Oacute Aogonek -35 +KPX Oacute Aring -35 +KPX Oacute Atilde -35 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -35 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -35 +KPX Ocircumflex Aacute -35 +KPX Ocircumflex Abreve -35 +KPX Ocircumflex Acircumflex -35 +KPX Ocircumflex Adieresis -35 +KPX Ocircumflex Agrave -35 +KPX Ocircumflex Amacron -35 +KPX Ocircumflex Aogonek -35 +KPX Ocircumflex Aring -35 +KPX Ocircumflex Atilde -35 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -35 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -35 +KPX Odieresis Aacute -35 +KPX Odieresis Abreve -35 +KPX Odieresis Acircumflex -35 +KPX Odieresis Adieresis -35 +KPX Odieresis Agrave -35 +KPX Odieresis Amacron -35 +KPX Odieresis Aogonek -35 +KPX Odieresis Aring -35 +KPX Odieresis Atilde -35 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -35 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -35 +KPX Ograve Aacute -35 +KPX Ograve Abreve -35 +KPX Ograve Acircumflex -35 +KPX Ograve Adieresis -35 +KPX Ograve Agrave -35 +KPX Ograve Amacron -35 +KPX Ograve Aogonek -35 +KPX Ograve Aring -35 +KPX Ograve Atilde -35 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -35 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -35 +KPX Ohungarumlaut Aacute -35 +KPX Ohungarumlaut Abreve -35 +KPX Ohungarumlaut Acircumflex -35 +KPX Ohungarumlaut Adieresis -35 +KPX Ohungarumlaut Agrave -35 +KPX Ohungarumlaut Amacron -35 +KPX Ohungarumlaut Aogonek -35 +KPX Ohungarumlaut Aring -35 +KPX Ohungarumlaut Atilde -35 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -35 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -35 +KPX Omacron Aacute -35 +KPX Omacron Abreve -35 +KPX Omacron Acircumflex -35 +KPX Omacron Adieresis -35 +KPX Omacron Agrave -35 +KPX Omacron Amacron -35 +KPX Omacron Aogonek -35 +KPX Omacron Aring -35 +KPX Omacron Atilde -35 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -35 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -35 +KPX Oslash Aacute -35 +KPX Oslash Abreve -35 +KPX Oslash Acircumflex -35 +KPX Oslash Adieresis -35 +KPX Oslash Agrave -35 +KPX Oslash Amacron -35 +KPX Oslash Aogonek -35 +KPX Oslash Aring -35 +KPX Oslash Atilde -35 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -35 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -35 +KPX Otilde Aacute -35 +KPX Otilde Abreve -35 +KPX Otilde Acircumflex -35 +KPX Otilde Adieresis -35 +KPX Otilde Agrave -35 +KPX Otilde Amacron -35 +KPX Otilde Aogonek -35 +KPX Otilde Aring -35 +KPX Otilde Atilde -35 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -35 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -92 +KPX P Aacute -92 +KPX P Abreve -92 +KPX P Acircumflex -92 +KPX P Adieresis -92 +KPX P Agrave -92 +KPX P Amacron -92 +KPX P Aogonek -92 +KPX P Aring -92 +KPX P Atilde -92 +KPX P a -15 +KPX P aacute -15 +KPX P abreve -15 +KPX P acircumflex -15 +KPX P adieresis -15 +KPX P agrave -15 +KPX P amacron -15 +KPX P aogonek -15 +KPX P aring -15 +KPX P atilde -15 +KPX P comma -111 +KPX P period -111 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -40 +KPX R Oacute -40 +KPX R Ocircumflex -40 +KPX R Odieresis -40 +KPX R Ograve -40 +KPX R Ohungarumlaut -40 +KPX R Omacron -40 +KPX R Oslash -40 +KPX R Otilde -40 +KPX R T -60 +KPX R Tcaron -60 +KPX R Tcommaaccent -60 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -80 +KPX R W -55 +KPX R Y -65 +KPX R Yacute -65 +KPX R Ydieresis -65 +KPX Racute O -40 +KPX Racute Oacute -40 +KPX Racute Ocircumflex -40 +KPX Racute Odieresis -40 +KPX Racute Ograve -40 +KPX Racute Ohungarumlaut -40 +KPX Racute Omacron -40 +KPX Racute Oslash -40 +KPX Racute Otilde -40 +KPX Racute T -60 +KPX Racute Tcaron -60 +KPX Racute Tcommaaccent -60 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -80 +KPX Racute W -55 +KPX Racute Y -65 +KPX Racute Yacute -65 +KPX Racute Ydieresis -65 +KPX Rcaron O -40 +KPX Rcaron Oacute -40 +KPX Rcaron Ocircumflex -40 +KPX Rcaron Odieresis -40 +KPX Rcaron Ograve -40 +KPX Rcaron Ohungarumlaut -40 +KPX Rcaron Omacron -40 +KPX Rcaron Oslash -40 +KPX Rcaron Otilde -40 +KPX Rcaron T -60 +KPX Rcaron Tcaron -60 +KPX Rcaron Tcommaaccent -60 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -80 +KPX Rcaron W -55 +KPX Rcaron Y -65 +KPX Rcaron Yacute -65 +KPX Rcaron Ydieresis -65 +KPX Rcommaaccent O -40 +KPX Rcommaaccent Oacute -40 +KPX Rcommaaccent Ocircumflex -40 +KPX Rcommaaccent Odieresis -40 +KPX Rcommaaccent Ograve -40 +KPX Rcommaaccent Ohungarumlaut -40 +KPX Rcommaaccent Omacron -40 +KPX Rcommaaccent Oslash -40 +KPX Rcommaaccent Otilde -40 +KPX Rcommaaccent T -60 +KPX Rcommaaccent Tcaron -60 +KPX Rcommaaccent Tcommaaccent -60 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -80 +KPX Rcommaaccent W -55 +KPX Rcommaaccent Y -65 +KPX Rcommaaccent Yacute -65 +KPX Rcommaaccent Ydieresis -65 +KPX T A -93 +KPX T Aacute -93 +KPX T Abreve -93 +KPX T Acircumflex -93 +KPX T Adieresis -93 +KPX T Agrave -93 +KPX T Amacron -93 +KPX T Aogonek -93 +KPX T Aring -93 +KPX T Atilde -93 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -40 +KPX T agrave -40 +KPX T amacron -40 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -40 +KPX T colon -50 +KPX T comma -74 +KPX T e -70 +KPX T eacute -70 +KPX T ecaron -70 +KPX T ecircumflex -70 +KPX T edieresis -30 +KPX T edotaccent -70 +KPX T egrave -70 +KPX T emacron -30 +KPX T eogonek -70 +KPX T hyphen -92 +KPX T i -35 +KPX T iacute -35 +KPX T iogonek -35 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -74 +KPX T r -35 +KPX T racute -35 +KPX T rcaron -35 +KPX T rcommaaccent -35 +KPX T semicolon -55 +KPX T u -45 +KPX T uacute -45 +KPX T ucircumflex -45 +KPX T udieresis -45 +KPX T ugrave -45 +KPX T uhungarumlaut -45 +KPX T umacron -45 +KPX T uogonek -45 +KPX T uring -45 +KPX T w -80 +KPX T y -80 +KPX T yacute -80 +KPX T ydieresis -80 +KPX Tcaron A -93 +KPX Tcaron Aacute -93 +KPX Tcaron Abreve -93 +KPX Tcaron Acircumflex -93 +KPX Tcaron Adieresis -93 +KPX Tcaron Agrave -93 +KPX Tcaron Amacron -93 +KPX Tcaron Aogonek -93 +KPX Tcaron Aring -93 +KPX Tcaron Atilde -93 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -40 +KPX Tcaron agrave -40 +KPX Tcaron amacron -40 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -40 +KPX Tcaron colon -50 +KPX Tcaron comma -74 +KPX Tcaron e -70 +KPX Tcaron eacute -70 +KPX Tcaron ecaron -70 +KPX Tcaron ecircumflex -30 +KPX Tcaron edieresis -30 +KPX Tcaron edotaccent -70 +KPX Tcaron egrave -70 +KPX Tcaron emacron -30 +KPX Tcaron eogonek -70 +KPX Tcaron hyphen -92 +KPX Tcaron i -35 +KPX Tcaron iacute -35 +KPX Tcaron iogonek -35 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -74 +KPX Tcaron r -35 +KPX Tcaron racute -35 +KPX Tcaron rcaron -35 +KPX Tcaron rcommaaccent -35 +KPX Tcaron semicolon -55 +KPX Tcaron u -45 +KPX Tcaron uacute -45 +KPX Tcaron ucircumflex -45 +KPX Tcaron udieresis -45 +KPX Tcaron ugrave -45 +KPX Tcaron uhungarumlaut -45 +KPX Tcaron umacron -45 +KPX Tcaron uogonek -45 +KPX Tcaron uring -45 +KPX Tcaron w -80 +KPX Tcaron y -80 +KPX Tcaron yacute -80 +KPX Tcaron ydieresis -80 +KPX Tcommaaccent A -93 +KPX Tcommaaccent Aacute -93 +KPX Tcommaaccent Abreve -93 +KPX Tcommaaccent Acircumflex -93 +KPX Tcommaaccent Adieresis -93 +KPX Tcommaaccent Agrave -93 +KPX Tcommaaccent Amacron -93 +KPX Tcommaaccent Aogonek -93 +KPX Tcommaaccent Aring -93 +KPX Tcommaaccent Atilde -93 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -40 +KPX Tcommaaccent agrave -40 +KPX Tcommaaccent amacron -40 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -40 +KPX Tcommaaccent colon -50 +KPX Tcommaaccent comma -74 +KPX Tcommaaccent e -70 +KPX Tcommaaccent eacute -70 +KPX Tcommaaccent ecaron -70 +KPX Tcommaaccent ecircumflex -30 +KPX Tcommaaccent edieresis -30 +KPX Tcommaaccent edotaccent -70 +KPX Tcommaaccent egrave -30 +KPX Tcommaaccent emacron -70 +KPX Tcommaaccent eogonek -70 +KPX Tcommaaccent hyphen -92 +KPX Tcommaaccent i -35 +KPX Tcommaaccent iacute -35 +KPX Tcommaaccent iogonek -35 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -74 +KPX Tcommaaccent r -35 +KPX Tcommaaccent racute -35 +KPX Tcommaaccent rcaron -35 +KPX Tcommaaccent rcommaaccent -35 +KPX Tcommaaccent semicolon -55 +KPX Tcommaaccent u -45 +KPX Tcommaaccent uacute -45 +KPX Tcommaaccent ucircumflex -45 +KPX Tcommaaccent udieresis -45 +KPX Tcommaaccent ugrave -45 +KPX Tcommaaccent uhungarumlaut -45 +KPX Tcommaaccent umacron -45 +KPX Tcommaaccent uogonek -45 +KPX Tcommaaccent uring -45 +KPX Tcommaaccent w -80 +KPX Tcommaaccent y -80 +KPX Tcommaaccent yacute -80 +KPX Tcommaaccent ydieresis -80 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX V A -135 +KPX V Aacute -135 +KPX V Abreve -135 +KPX V Acircumflex -135 +KPX V Adieresis -135 +KPX V Agrave -135 +KPX V Amacron -135 +KPX V Aogonek -135 +KPX V Aring -135 +KPX V Atilde -135 +KPX V G -15 +KPX V Gbreve -15 +KPX V Gcommaaccent -15 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -111 +KPX V aacute -111 +KPX V abreve -111 +KPX V acircumflex -71 +KPX V adieresis -71 +KPX V agrave -71 +KPX V amacron -71 +KPX V aogonek -111 +KPX V aring -111 +KPX V atilde -71 +KPX V colon -74 +KPX V comma -129 +KPX V e -111 +KPX V eacute -111 +KPX V ecaron -71 +KPX V ecircumflex -71 +KPX V edieresis -71 +KPX V edotaccent -111 +KPX V egrave -71 +KPX V emacron -71 +KPX V eogonek -111 +KPX V hyphen -100 +KPX V i -60 +KPX V iacute -60 +KPX V icircumflex -20 +KPX V idieresis -20 +KPX V igrave -20 +KPX V imacron -20 +KPX V iogonek -60 +KPX V o -129 +KPX V oacute -129 +KPX V ocircumflex -129 +KPX V odieresis -89 +KPX V ograve -89 +KPX V ohungarumlaut -129 +KPX V omacron -89 +KPX V oslash -129 +KPX V otilde -89 +KPX V period -129 +KPX V semicolon -74 +KPX V u -75 +KPX V uacute -75 +KPX V ucircumflex -75 +KPX V udieresis -75 +KPX V ugrave -75 +KPX V uhungarumlaut -75 +KPX V umacron -75 +KPX V uogonek -75 +KPX V uring -75 +KPX W A -120 +KPX W Aacute -120 +KPX W Abreve -120 +KPX W Acircumflex -120 +KPX W Adieresis -120 +KPX W Agrave -120 +KPX W Amacron -120 +KPX W Aogonek -120 +KPX W Aring -120 +KPX W Atilde -120 +KPX W O -10 +KPX W Oacute -10 +KPX W Ocircumflex -10 +KPX W Odieresis -10 +KPX W Ograve -10 +KPX W Ohungarumlaut -10 +KPX W Omacron -10 +KPX W Oslash -10 +KPX W Otilde -10 +KPX W a -80 +KPX W aacute -80 +KPX W abreve -80 +KPX W acircumflex -80 +KPX W adieresis -80 +KPX W agrave -80 +KPX W amacron -80 +KPX W aogonek -80 +KPX W aring -80 +KPX W atilde -80 +KPX W colon -37 +KPX W comma -92 +KPX W e -80 +KPX W eacute -80 +KPX W ecaron -80 +KPX W ecircumflex -80 +KPX W edieresis -40 +KPX W edotaccent -80 +KPX W egrave -40 +KPX W emacron -40 +KPX W eogonek -80 +KPX W hyphen -65 +KPX W i -40 +KPX W iacute -40 +KPX W iogonek -40 +KPX W o -80 +KPX W oacute -80 +KPX W ocircumflex -80 +KPX W odieresis -80 +KPX W ograve -80 +KPX W ohungarumlaut -80 +KPX W omacron -80 +KPX W oslash -80 +KPX W otilde -80 +KPX W period -92 +KPX W semicolon -37 +KPX W u -50 +KPX W uacute -50 +KPX W ucircumflex -50 +KPX W udieresis -50 +KPX W ugrave -50 +KPX W uhungarumlaut -50 +KPX W umacron -50 +KPX W uogonek -50 +KPX W uring -50 +KPX W y -73 +KPX W yacute -73 +KPX W ydieresis -73 +KPX Y A -120 +KPX Y Aacute -120 +KPX Y Abreve -120 +KPX Y Acircumflex -120 +KPX Y Adieresis -120 +KPX Y Agrave -120 +KPX Y Amacron -120 +KPX Y Aogonek -120 +KPX Y Aring -120 +KPX Y Atilde -120 +KPX Y O -30 +KPX Y Oacute -30 +KPX Y Ocircumflex -30 +KPX Y Odieresis -30 +KPX Y Ograve -30 +KPX Y Ohungarumlaut -30 +KPX Y Omacron -30 +KPX Y Oslash -30 +KPX Y Otilde -30 +KPX Y a -100 +KPX Y aacute -100 +KPX Y abreve -100 +KPX Y acircumflex -100 +KPX Y adieresis -60 +KPX Y agrave -60 +KPX Y amacron -60 +KPX Y aogonek -100 +KPX Y aring -100 +KPX Y atilde -60 +KPX Y colon -92 +KPX Y comma -129 +KPX Y e -100 +KPX Y eacute -100 +KPX Y ecaron -100 +KPX Y ecircumflex -100 +KPX Y edieresis -60 +KPX Y edotaccent -100 +KPX Y egrave -60 +KPX Y emacron -60 +KPX Y eogonek -100 +KPX Y hyphen -111 +KPX Y i -55 +KPX Y iacute -55 +KPX Y iogonek -55 +KPX Y o -110 +KPX Y oacute -110 +KPX Y ocircumflex -110 +KPX Y odieresis -70 +KPX Y ograve -70 +KPX Y ohungarumlaut -110 +KPX Y omacron -70 +KPX Y oslash -110 +KPX Y otilde -70 +KPX Y period -129 +KPX Y semicolon -92 +KPX Y u -111 +KPX Y uacute -111 +KPX Y ucircumflex -111 +KPX Y udieresis -71 +KPX Y ugrave -71 +KPX Y uhungarumlaut -111 +KPX Y umacron -71 +KPX Y uogonek -111 +KPX Y uring -111 +KPX Yacute A -120 +KPX Yacute Aacute -120 +KPX Yacute Abreve -120 +KPX Yacute Acircumflex -120 +KPX Yacute Adieresis -120 +KPX Yacute Agrave -120 +KPX Yacute Amacron -120 +KPX Yacute Aogonek -120 +KPX Yacute Aring -120 +KPX Yacute Atilde -120 +KPX Yacute O -30 +KPX Yacute Oacute -30 +KPX Yacute Ocircumflex -30 +KPX Yacute Odieresis -30 +KPX Yacute Ograve -30 +KPX Yacute Ohungarumlaut -30 +KPX Yacute Omacron -30 +KPX Yacute Oslash -30 +KPX Yacute Otilde -30 +KPX Yacute a -100 +KPX Yacute aacute -100 +KPX Yacute abreve -100 +KPX Yacute acircumflex -100 +KPX Yacute adieresis -60 +KPX Yacute agrave -60 +KPX Yacute amacron -60 +KPX Yacute aogonek -100 +KPX Yacute aring -100 +KPX Yacute atilde -60 +KPX Yacute colon -92 +KPX Yacute comma -129 +KPX Yacute e -100 +KPX Yacute eacute -100 +KPX Yacute ecaron -100 +KPX Yacute ecircumflex -100 +KPX Yacute edieresis -60 +KPX Yacute edotaccent -100 +KPX Yacute egrave -60 +KPX Yacute emacron -60 +KPX Yacute eogonek -100 +KPX Yacute hyphen -111 +KPX Yacute i -55 +KPX Yacute iacute -55 +KPX Yacute iogonek -55 +KPX Yacute o -110 +KPX Yacute oacute -110 +KPX Yacute ocircumflex -110 +KPX Yacute odieresis -70 +KPX Yacute ograve -70 +KPX Yacute ohungarumlaut -110 +KPX Yacute omacron -70 +KPX Yacute oslash -110 +KPX Yacute otilde -70 +KPX Yacute period -129 +KPX Yacute semicolon -92 +KPX Yacute u -111 +KPX Yacute uacute -111 +KPX Yacute ucircumflex -111 +KPX Yacute udieresis -71 +KPX Yacute ugrave -71 +KPX Yacute uhungarumlaut -111 +KPX Yacute umacron -71 +KPX Yacute uogonek -111 +KPX Yacute uring -111 +KPX Ydieresis A -120 +KPX Ydieresis Aacute -120 +KPX Ydieresis Abreve -120 +KPX Ydieresis Acircumflex -120 +KPX Ydieresis Adieresis -120 +KPX Ydieresis Agrave -120 +KPX Ydieresis Amacron -120 +KPX Ydieresis Aogonek -120 +KPX Ydieresis Aring -120 +KPX Ydieresis Atilde -120 +KPX Ydieresis O -30 +KPX Ydieresis Oacute -30 +KPX Ydieresis Ocircumflex -30 +KPX Ydieresis Odieresis -30 +KPX Ydieresis Ograve -30 +KPX Ydieresis Ohungarumlaut -30 +KPX Ydieresis Omacron -30 +KPX Ydieresis Oslash -30 +KPX Ydieresis Otilde -30 +KPX Ydieresis a -100 +KPX Ydieresis aacute -100 +KPX Ydieresis abreve -100 +KPX Ydieresis acircumflex -100 +KPX Ydieresis adieresis -60 +KPX Ydieresis agrave -60 +KPX Ydieresis amacron -60 +KPX Ydieresis aogonek -100 +KPX Ydieresis aring -100 +KPX Ydieresis atilde -100 +KPX Ydieresis colon -92 +KPX Ydieresis comma -129 +KPX Ydieresis e -100 +KPX Ydieresis eacute -100 +KPX Ydieresis ecaron -100 +KPX Ydieresis ecircumflex -100 +KPX Ydieresis edieresis -60 +KPX Ydieresis edotaccent -100 +KPX Ydieresis egrave -60 +KPX Ydieresis emacron -60 +KPX Ydieresis eogonek -100 +KPX Ydieresis hyphen -111 +KPX Ydieresis i -55 +KPX Ydieresis iacute -55 +KPX Ydieresis iogonek -55 +KPX Ydieresis o -110 +KPX Ydieresis oacute -110 +KPX Ydieresis ocircumflex -110 +KPX Ydieresis odieresis -70 +KPX Ydieresis ograve -70 +KPX Ydieresis ohungarumlaut -110 +KPX Ydieresis omacron -70 +KPX Ydieresis oslash -110 +KPX Ydieresis otilde -70 +KPX Ydieresis period -129 +KPX Ydieresis semicolon -92 +KPX Ydieresis u -111 +KPX Ydieresis uacute -111 +KPX Ydieresis ucircumflex -111 +KPX Ydieresis udieresis -71 +KPX Ydieresis ugrave -71 +KPX Ydieresis uhungarumlaut -111 +KPX Ydieresis umacron -71 +KPX Ydieresis uogonek -111 +KPX Ydieresis uring -111 +KPX a v -20 +KPX a w -15 +KPX aacute v -20 +KPX aacute w -15 +KPX abreve v -20 +KPX abreve w -15 +KPX acircumflex v -20 +KPX acircumflex w -15 +KPX adieresis v -20 +KPX adieresis w -15 +KPX agrave v -20 +KPX agrave w -15 +KPX amacron v -20 +KPX amacron w -15 +KPX aogonek v -20 +KPX aogonek w -15 +KPX aring v -20 +KPX aring w -15 +KPX atilde v -20 +KPX atilde w -15 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -15 +KPX c y -15 +KPX c yacute -15 +KPX c ydieresis -15 +KPX cacute y -15 +KPX cacute yacute -15 +KPX cacute ydieresis -15 +KPX ccaron y -15 +KPX ccaron yacute -15 +KPX ccaron ydieresis -15 +KPX ccedilla y -15 +KPX ccedilla yacute -15 +KPX ccedilla ydieresis -15 +KPX comma quotedblright -70 +KPX comma quoteright -70 +KPX e g -15 +KPX e gbreve -15 +KPX e gcommaaccent -15 +KPX e v -25 +KPX e w -25 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute g -15 +KPX eacute gbreve -15 +KPX eacute gcommaaccent -15 +KPX eacute v -25 +KPX eacute w -25 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron g -15 +KPX ecaron gbreve -15 +KPX ecaron gcommaaccent -15 +KPX ecaron v -25 +KPX ecaron w -25 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex g -15 +KPX ecircumflex gbreve -15 +KPX ecircumflex gcommaaccent -15 +KPX ecircumflex v -25 +KPX ecircumflex w -25 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis g -15 +KPX edieresis gbreve -15 +KPX edieresis gcommaaccent -15 +KPX edieresis v -25 +KPX edieresis w -25 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent g -15 +KPX edotaccent gbreve -15 +KPX edotaccent gcommaaccent -15 +KPX edotaccent v -25 +KPX edotaccent w -25 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave g -15 +KPX egrave gbreve -15 +KPX egrave gcommaaccent -15 +KPX egrave v -25 +KPX egrave w -25 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron g -15 +KPX emacron gbreve -15 +KPX emacron gcommaaccent -15 +KPX emacron v -25 +KPX emacron w -25 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek g -15 +KPX eogonek gbreve -15 +KPX eogonek gcommaaccent -15 +KPX eogonek v -25 +KPX eogonek w -25 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f a -10 +KPX f aacute -10 +KPX f abreve -10 +KPX f acircumflex -10 +KPX f adieresis -10 +KPX f agrave -10 +KPX f amacron -10 +KPX f aogonek -10 +KPX f aring -10 +KPX f atilde -10 +KPX f dotlessi -50 +KPX f f -25 +KPX f i -20 +KPX f iacute -20 +KPX f quoteright 55 +KPX g a -5 +KPX g aacute -5 +KPX g abreve -5 +KPX g acircumflex -5 +KPX g adieresis -5 +KPX g agrave -5 +KPX g amacron -5 +KPX g aogonek -5 +KPX g aring -5 +KPX g atilde -5 +KPX gbreve a -5 +KPX gbreve aacute -5 +KPX gbreve abreve -5 +KPX gbreve acircumflex -5 +KPX gbreve adieresis -5 +KPX gbreve agrave -5 +KPX gbreve amacron -5 +KPX gbreve aogonek -5 +KPX gbreve aring -5 +KPX gbreve atilde -5 +KPX gcommaaccent a -5 +KPX gcommaaccent aacute -5 +KPX gcommaaccent abreve -5 +KPX gcommaaccent acircumflex -5 +KPX gcommaaccent adieresis -5 +KPX gcommaaccent agrave -5 +KPX gcommaaccent amacron -5 +KPX gcommaaccent aogonek -5 +KPX gcommaaccent aring -5 +KPX gcommaaccent atilde -5 +KPX h y -5 +KPX h yacute -5 +KPX h ydieresis -5 +KPX i v -25 +KPX iacute v -25 +KPX icircumflex v -25 +KPX idieresis v -25 +KPX igrave v -25 +KPX imacron v -25 +KPX iogonek v -25 +KPX k e -10 +KPX k eacute -10 +KPX k ecaron -10 +KPX k ecircumflex -10 +KPX k edieresis -10 +KPX k edotaccent -10 +KPX k egrave -10 +KPX k emacron -10 +KPX k eogonek -10 +KPX k o -10 +KPX k oacute -10 +KPX k ocircumflex -10 +KPX k odieresis -10 +KPX k ograve -10 +KPX k ohungarumlaut -10 +KPX k omacron -10 +KPX k oslash -10 +KPX k otilde -10 +KPX k y -15 +KPX k yacute -15 +KPX k ydieresis -15 +KPX kcommaaccent e -10 +KPX kcommaaccent eacute -10 +KPX kcommaaccent ecaron -10 +KPX kcommaaccent ecircumflex -10 +KPX kcommaaccent edieresis -10 +KPX kcommaaccent edotaccent -10 +KPX kcommaaccent egrave -10 +KPX kcommaaccent emacron -10 +KPX kcommaaccent eogonek -10 +KPX kcommaaccent o -10 +KPX kcommaaccent oacute -10 +KPX kcommaaccent ocircumflex -10 +KPX kcommaaccent odieresis -10 +KPX kcommaaccent ograve -10 +KPX kcommaaccent ohungarumlaut -10 +KPX kcommaaccent omacron -10 +KPX kcommaaccent oslash -10 +KPX kcommaaccent otilde -10 +KPX kcommaaccent y -15 +KPX kcommaaccent yacute -15 +KPX kcommaaccent ydieresis -15 +KPX l w -10 +KPX lacute w -10 +KPX lcommaaccent w -10 +KPX lslash w -10 +KPX n v -40 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute v -40 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron v -40 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent v -40 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde v -40 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o v -15 +KPX o w -25 +KPX o y -10 +KPX o yacute -10 +KPX o ydieresis -10 +KPX oacute v -15 +KPX oacute w -25 +KPX oacute y -10 +KPX oacute yacute -10 +KPX oacute ydieresis -10 +KPX ocircumflex v -15 +KPX ocircumflex w -25 +KPX ocircumflex y -10 +KPX ocircumflex yacute -10 +KPX ocircumflex ydieresis -10 +KPX odieresis v -15 +KPX odieresis w -25 +KPX odieresis y -10 +KPX odieresis yacute -10 +KPX odieresis ydieresis -10 +KPX ograve v -15 +KPX ograve w -25 +KPX ograve y -10 +KPX ograve yacute -10 +KPX ograve ydieresis -10 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -25 +KPX ohungarumlaut y -10 +KPX ohungarumlaut yacute -10 +KPX ohungarumlaut ydieresis -10 +KPX omacron v -15 +KPX omacron w -25 +KPX omacron y -10 +KPX omacron yacute -10 +KPX omacron ydieresis -10 +KPX oslash v -15 +KPX oslash w -25 +KPX oslash y -10 +KPX oslash yacute -10 +KPX oslash ydieresis -10 +KPX otilde v -15 +KPX otilde w -25 +KPX otilde y -10 +KPX otilde yacute -10 +KPX otilde ydieresis -10 +KPX p y -10 +KPX p yacute -10 +KPX p ydieresis -10 +KPX period quotedblright -70 +KPX period quoteright -70 +KPX quotedblleft A -80 +KPX quotedblleft Aacute -80 +KPX quotedblleft Abreve -80 +KPX quotedblleft Acircumflex -80 +KPX quotedblleft Adieresis -80 +KPX quotedblleft Agrave -80 +KPX quotedblleft Amacron -80 +KPX quotedblleft Aogonek -80 +KPX quotedblleft Aring -80 +KPX quotedblleft Atilde -80 +KPX quoteleft A -80 +KPX quoteleft Aacute -80 +KPX quoteleft Abreve -80 +KPX quoteleft Acircumflex -80 +KPX quoteleft Adieresis -80 +KPX quoteleft Agrave -80 +KPX quoteleft Amacron -80 +KPX quoteleft Aogonek -80 +KPX quoteleft Aring -80 +KPX quoteleft Atilde -80 +KPX quoteleft quoteleft -74 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright l -10 +KPX quoteright lacute -10 +KPX quoteright lcommaaccent -10 +KPX quoteright lslash -10 +KPX quoteright quoteright -74 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -55 +KPX quoteright sacute -55 +KPX quoteright scaron -55 +KPX quoteright scedilla -55 +KPX quoteright scommaaccent -55 +KPX quoteright space -74 +KPX quoteright t -18 +KPX quoteright tcommaaccent -18 +KPX quoteright v -50 +KPX r comma -40 +KPX r g -18 +KPX r gbreve -18 +KPX r gcommaaccent -18 +KPX r hyphen -20 +KPX r period -55 +KPX racute comma -40 +KPX racute g -18 +KPX racute gbreve -18 +KPX racute gcommaaccent -18 +KPX racute hyphen -20 +KPX racute period -55 +KPX rcaron comma -40 +KPX rcaron g -18 +KPX rcaron gbreve -18 +KPX rcaron gcommaaccent -18 +KPX rcaron hyphen -20 +KPX rcaron period -55 +KPX rcommaaccent comma -40 +KPX rcommaaccent g -18 +KPX rcommaaccent gbreve -18 +KPX rcommaaccent gcommaaccent -18 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent period -55 +KPX space A -55 +KPX space Aacute -55 +KPX space Abreve -55 +KPX space Acircumflex -55 +KPX space Adieresis -55 +KPX space Agrave -55 +KPX space Amacron -55 +KPX space Aogonek -55 +KPX space Aring -55 +KPX space Atilde -55 +KPX space T -18 +KPX space Tcaron -18 +KPX space Tcommaaccent -18 +KPX space V -50 +KPX space W -30 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -65 +KPX v e -15 +KPX v eacute -15 +KPX v ecaron -15 +KPX v ecircumflex -15 +KPX v edieresis -15 +KPX v edotaccent -15 +KPX v egrave -15 +KPX v emacron -15 +KPX v eogonek -15 +KPX v o -20 +KPX v oacute -20 +KPX v ocircumflex -20 +KPX v odieresis -20 +KPX v ograve -20 +KPX v ohungarumlaut -20 +KPX v omacron -20 +KPX v oslash -20 +KPX v otilde -20 +KPX v period -65 +KPX w a -10 +KPX w aacute -10 +KPX w abreve -10 +KPX w acircumflex -10 +KPX w adieresis -10 +KPX w agrave -10 +KPX w amacron -10 +KPX w aogonek -10 +KPX w aring -10 +KPX w atilde -10 +KPX w comma -65 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -65 +KPX x e -15 +KPX x eacute -15 +KPX x ecaron -15 +KPX x ecircumflex -15 +KPX x edieresis -15 +KPX x edotaccent -15 +KPX x egrave -15 +KPX x emacron -15 +KPX x eogonek -15 +KPX y comma -65 +KPX y period -65 +KPX yacute comma -65 +KPX yacute period -65 +KPX ydieresis comma -65 +KPX ydieresis period -65 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Times-Roman.afm.php b/application/third_party/dompdf/lib/fonts/Times-Roman.afm.php new file mode 100644 index 00000000..db367a77 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Roman.afm.php @@ -0,0 +1,570 @@ + + array ( + 32 => 'space', + 160 => 'space', + 33 => 'exclam', + 34 => 'quotedbl', + 35 => 'numbersign', + 36 => 'dollar', + 37 => 'percent', + 38 => 'ampersand', + 146 => 'quoteright', + 40 => 'parenleft', + 41 => 'parenright', + 42 => 'asterisk', + 43 => 'plus', + 44 => 'comma', + 45 => 'hyphen', + 173 => 'hyphen', + 46 => 'period', + 47 => 'slash', + 48 => 'zero', + 49 => 'one', + 50 => 'two', + 51 => 'three', + 52 => 'four', + 53 => 'five', + 54 => 'six', + 55 => 'seven', + 56 => 'eight', + 57 => 'nine', + 58 => 'colon', + 59 => 'semicolon', + 60 => 'less', + 61 => 'equal', + 62 => 'greater', + 63 => 'question', + 64 => 'at', + 65 => 'A', + 66 => 'B', + 67 => 'C', + 68 => 'D', + 69 => 'E', + 70 => 'F', + 71 => 'G', + 72 => 'H', + 73 => 'I', + 74 => 'J', + 75 => 'K', + 76 => 'L', + 77 => 'M', + 78 => 'N', + 79 => 'O', + 80 => 'P', + 81 => 'Q', + 82 => 'R', + 83 => 'S', + 84 => 'T', + 85 => 'U', + 86 => 'V', + 87 => 'W', + 88 => 'X', + 89 => 'Y', + 90 => 'Z', + 91 => 'bracketleft', + 92 => 'backslash', + 93 => 'bracketright', + 94 => 'asciicircum', + 95 => 'underscore', + 145 => 'quoteleft', + 97 => 'a', + 98 => 'b', + 99 => 'c', + 100 => 'd', + 101 => 'e', + 102 => 'f', + 103 => 'g', + 104 => 'h', + 105 => 'i', + 106 => 'j', + 107 => 'k', + 108 => 'l', + 109 => 'm', + 110 => 'n', + 111 => 'o', + 112 => 'p', + 113 => 'q', + 114 => 'r', + 115 => 's', + 116 => 't', + 117 => 'u', + 118 => 'v', + 119 => 'w', + 120 => 'x', + 121 => 'y', + 122 => 'z', + 123 => 'braceleft', + 124 => 'bar', + 125 => 'braceright', + 126 => 'asciitilde', + 161 => 'exclamdown', + 162 => 'cent', + 163 => 'sterling', + 165 => 'yen', + 131 => 'florin', + 167 => 'section', + 164 => 'currency', + 39 => 'quotesingle', + 147 => 'quotedblleft', + 170 => 'ordfeminine', + 139 => 'guilsinglleft', + 155 => 'guilsinglright', + 150 => 'endash', + 134 => 'dagger', + 135 => 'daggerdbl', + 183 => 'periodcentered', + 182 => 'paragraph', + 149 => 'bullet', + 130 => 'quotesinglbase', + 132 => 'quotedblbase', + 148 => 'quotedblright', + 187 => 'guillemotright', + 133 => 'ellipsis', + 137 => 'perthousand', + 191 => 'questiondown', + 96 => 'grave', + 180 => 'acute', + 136 => 'circumflex', + 152 => 'tilde', + 175 => 'macron', + 168 => 'dieresis', + 184 => 'cedilla', + 151 => 'emdash', + 198 => 'AE', + 216 => 'Oslash', + 140 => 'OE', + 186 => 'ordmasculine', + 230 => 'ae', + 248 => 'oslash', + 156 => 'oe', + 223 => 'germandbls', + 207 => 'Idieresis', + 233 => 'eacute', + 159 => 'Ydieresis', + 247 => 'divide', + 221 => 'Yacute', + 194 => 'Acircumflex', + 225 => 'aacute', + 219 => 'Ucircumflex', + 253 => 'yacute', + 234 => 'ecircumflex', + 220 => 'Udieresis', + 218 => 'Uacute', + 203 => 'Edieresis', + 169 => 'copyright', + 229 => 'aring', + 224 => 'agrave', + 227 => 'atilde', + 154 => 'scaron', + 237 => 'iacute', + 251 => 'ucircumflex', + 226 => 'acircumflex', + 231 => 'ccedilla', + 222 => 'Thorn', + 179 => 'threesuperior', + 210 => 'Ograve', + 192 => 'Agrave', + 215 => 'multiply', + 250 => 'uacute', + 255 => 'ydieresis', + 238 => 'icircumflex', + 202 => 'Ecircumflex', + 228 => 'adieresis', + 235 => 'edieresis', + 205 => 'Iacute', + 177 => 'plusminus', + 166 => 'brokenbar', + 174 => 'registered', + 200 => 'Egrave', + 142 => 'Zcaron', + 208 => 'Eth', + 199 => 'Ccedilla', + 193 => 'Aacute', + 196 => 'Adieresis', + 232 => 'egrave', + 211 => 'Oacute', + 243 => 'oacute', + 239 => 'idieresis', + 212 => 'Ocircumflex', + 217 => 'Ugrave', + 254 => 'thorn', + 178 => 'twosuperior', + 214 => 'Odieresis', + 181 => 'mu', + 236 => 'igrave', + 190 => 'threequarters', + 153 => 'trademark', + 204 => 'Igrave', + 189 => 'onehalf', + 244 => 'ocircumflex', + 241 => 'ntilde', + 201 => 'Eacute', + 188 => 'onequarter', + 138 => 'Scaron', + 176 => 'degree', + 242 => 'ograve', + 249 => 'ugrave', + 209 => 'Ntilde', + 245 => 'otilde', + 195 => 'Atilde', + 197 => 'Aring', + 213 => 'Otilde', + 206 => 'Icircumflex', + 172 => 'logicalnot', + 246 => 'odieresis', + 252 => 'udieresis', + 240 => 'eth', + 158 => 'zcaron', + 185 => 'onesuperior', + 128 => 'Euro', + ), + 'isUnicode' => false, + 'FontName' => 'Times-Roman', + 'FullName' => 'Times Roman', + 'FamilyName' => 'Times', + 'Weight' => 'Roman', + 'ItalicAngle' => '0', + 'IsFixedPitch' => 'false', + 'CharacterSet' => 'ExtendedRoman', + 'FontBBox' => + array ( + 0 => '-168', + 1 => '-218', + 2 => '1000', + 3 => '898', + ), + 'UnderlinePosition' => '-100', + 'UnderlineThickness' => '50', + 'Version' => '002.00', + 'EncodingScheme' => 'WinAnsiEncoding', + 'CapHeight' => '662', + 'XHeight' => '450', + 'Ascender' => '683', + 'Descender' => '-217', + 'StdHW' => '28', + 'StdVW' => '84', + 'StartCharMetrics' => '317', + 'C' => + array ( + 32 => 250.0, + 160 => 250.0, + 33 => 333.0, + 34 => 408.0, + 35 => 500.0, + 36 => 500.0, + 37 => 833.0, + 38 => 778.0, + 146 => 333.0, + 40 => 333.0, + 41 => 333.0, + 42 => 500.0, + 43 => 564.0, + 44 => 250.0, + 45 => 333.0, + 173 => 333.0, + 46 => 250.0, + 47 => 278.0, + 48 => 500.0, + 49 => 500.0, + 50 => 500.0, + 51 => 500.0, + 52 => 500.0, + 53 => 500.0, + 54 => 500.0, + 55 => 500.0, + 56 => 500.0, + 57 => 500.0, + 58 => 278.0, + 59 => 278.0, + 60 => 564.0, + 61 => 564.0, + 62 => 564.0, + 63 => 444.0, + 64 => 921.0, + 65 => 722.0, + 66 => 667.0, + 67 => 667.0, + 68 => 722.0, + 69 => 611.0, + 70 => 556.0, + 71 => 722.0, + 72 => 722.0, + 73 => 333.0, + 74 => 389.0, + 75 => 722.0, + 76 => 611.0, + 77 => 889.0, + 78 => 722.0, + 79 => 722.0, + 80 => 556.0, + 81 => 722.0, + 82 => 667.0, + 83 => 556.0, + 84 => 611.0, + 85 => 722.0, + 86 => 722.0, + 87 => 944.0, + 88 => 722.0, + 89 => 722.0, + 90 => 611.0, + 91 => 333.0, + 92 => 278.0, + 93 => 333.0, + 94 => 469.0, + 95 => 500.0, + 145 => 333.0, + 97 => 444.0, + 98 => 500.0, + 99 => 444.0, + 100 => 500.0, + 101 => 444.0, + 102 => 333.0, + 103 => 500.0, + 104 => 500.0, + 105 => 278.0, + 106 => 278.0, + 107 => 500.0, + 108 => 278.0, + 109 => 778.0, + 110 => 500.0, + 111 => 500.0, + 112 => 500.0, + 113 => 500.0, + 114 => 333.0, + 115 => 389.0, + 116 => 278.0, + 117 => 500.0, + 118 => 500.0, + 119 => 722.0, + 120 => 500.0, + 121 => 500.0, + 122 => 444.0, + 123 => 480.0, + 124 => 200.0, + 125 => 480.0, + 126 => 541.0, + 161 => 333.0, + 162 => 500.0, + 163 => 500.0, + 'fraction' => 167.0, + 165 => 500.0, + 131 => 500.0, + 167 => 500.0, + 164 => 500.0, + 39 => 180.0, + 147 => 444.0, + 170 => 276.0, + 139 => 333.0, + 155 => 333.0, + 'fi' => 556.0, + 'fl' => 556.0, + 150 => 500.0, + 134 => 500.0, + 135 => 500.0, + 183 => 250.0, + 182 => 453.0, + 149 => 350.0, + 130 => 333.0, + 132 => 444.0, + 148 => 444.0, + 187 => 500.0, + 133 => 1000.0, + 137 => 1000.0, + 191 => 444.0, + 96 => 333.0, + 180 => 333.0, + 136 => 333.0, + 152 => 333.0, + 175 => 333.0, + 'breve' => 333.0, + 'dotaccent' => 333.0, + 168 => 333.0, + 'ring' => 333.0, + 184 => 333.0, + 'hungarumlaut' => 333.0, + 'ogonek' => 333.0, + 'caron' => 333.0, + 151 => 1000.0, + 198 => 889.0, + 'Lslash' => 611.0, + 216 => 722.0, + 140 => 889.0, + 186 => 310.0, + 230 => 667.0, + 'dotlessi' => 278.0, + 'lslash' => 278.0, + 248 => 500.0, + 156 => 722.0, + 223 => 500.0, + 207 => 333.0, + 233 => 444.0, + 'abreve' => 444.0, + 'uhungarumlaut' => 500.0, + 'ecaron' => 444.0, + 159 => 722.0, + 247 => 564.0, + 221 => 722.0, + 194 => 722.0, + 225 => 444.0, + 219 => 722.0, + 253 => 500.0, + 'scommaaccent' => 389.0, + 234 => 444.0, + 'Uring' => 722.0, + 220 => 722.0, + 'aogonek' => 444.0, + 218 => 722.0, + 'uogonek' => 500.0, + 203 => 611.0, + 'Dcroat' => 722.0, + 'commaaccent' => 250.0, + 169 => 760.0, + 'Emacron' => 611.0, + 'ccaron' => 444.0, + 229 => 444.0, + 'Ncommaaccent' => 722.0, + 'lacute' => 278.0, + 224 => 444.0, + 'Tcommaaccent' => 611.0, + 'Cacute' => 667.0, + 227 => 444.0, + 'Edotaccent' => 611.0, + 154 => 389.0, + 'scedilla' => 389.0, + 237 => 278.0, + 'lozenge' => 471.0, + 'Rcaron' => 667.0, + 'Gcommaaccent' => 722.0, + 251 => 500.0, + 226 => 444.0, + 'Amacron' => 722.0, + 'rcaron' => 333.0, + 231 => 444.0, + 'Zdotaccent' => 611.0, + 222 => 556.0, + 'Omacron' => 722.0, + 'Racute' => 667.0, + 'Sacute' => 556.0, + 'dcaron' => 588.0, + 'Umacron' => 722.0, + 'uring' => 500.0, + 179 => 300.0, + 210 => 722.0, + 192 => 722.0, + 'Abreve' => 722.0, + 215 => 564.0, + 250 => 500.0, + 'Tcaron' => 611.0, + 'partialdiff' => 476.0, + 255 => 500.0, + 'Nacute' => 722.0, + 238 => 278.0, + 202 => 611.0, + 228 => 444.0, + 235 => 444.0, + 'cacute' => 444.0, + 'nacute' => 500.0, + 'umacron' => 500.0, + 'Ncaron' => 722.0, + 205 => 333.0, + 177 => 564.0, + 166 => 200.0, + 174 => 760.0, + 'Gbreve' => 722.0, + 'Idotaccent' => 333.0, + 'summation' => 600.0, + 200 => 611.0, + 'racute' => 333.0, + 'omacron' => 500.0, + 'Zacute' => 611.0, + 142 => 611.0, + 'greaterequal' => 549.0, + 208 => 722.0, + 199 => 667.0, + 'lcommaaccent' => 278.0, + 'tcaron' => 326.0, + 'eogonek' => 444.0, + 'Uogonek' => 722.0, + 193 => 722.0, + 196 => 722.0, + 232 => 444.0, + 'zacute' => 444.0, + 'iogonek' => 278.0, + 211 => 722.0, + 243 => 500.0, + 'amacron' => 444.0, + 'sacute' => 389.0, + 239 => 278.0, + 212 => 722.0, + 217 => 722.0, + 'Delta' => 612.0, + 254 => 500.0, + 178 => 300.0, + 214 => 722.0, + 181 => 500.0, + 236 => 278.0, + 'ohungarumlaut' => 500.0, + 'Eogonek' => 611.0, + 'dcroat' => 500.0, + 190 => 750.0, + 'Scedilla' => 556.0, + 'lcaron' => 344.0, + 'Kcommaaccent' => 722.0, + 'Lacute' => 611.0, + 153 => 980.0, + 'edotaccent' => 444.0, + 204 => 333.0, + 'Imacron' => 333.0, + 'Lcaron' => 611.0, + 189 => 750.0, + 'lessequal' => 549.0, + 244 => 500.0, + 241 => 500.0, + 'Uhungarumlaut' => 722.0, + 201 => 611.0, + 'emacron' => 444.0, + 'gbreve' => 500.0, + 188 => 750.0, + 138 => 556.0, + 'Scommaaccent' => 556.0, + 'Ohungarumlaut' => 722.0, + 176 => 400.0, + 242 => 500.0, + 'Ccaron' => 667.0, + 249 => 500.0, + 'radical' => 453.0, + 'Dcaron' => 722.0, + 'rcommaaccent' => 333.0, + 209 => 722.0, + 245 => 500.0, + 'Rcommaaccent' => 667.0, + 'Lcommaaccent' => 611.0, + 195 => 722.0, + 'Aogonek' => 722.0, + 197 => 722.0, + 213 => 722.0, + 'zdotaccent' => 444.0, + 'Ecaron' => 611.0, + 'Iogonek' => 333.0, + 'kcommaaccent' => 500.0, + 'minus' => 564.0, + 206 => 333.0, + 'ncaron' => 500.0, + 'tcommaaccent' => 278.0, + 172 => 564.0, + 246 => 500.0, + 252 => 500.0, + 'notequal' => 549.0, + 'gcommaaccent' => 500.0, + 240 => 500.0, + 158 => 444.0, + 'ncommaaccent' => 500.0, + 185 => 300.0, + 'imacron' => 278.0, + 128 => 500.0, + ), + 'CIDtoGID_Compressed' => true, + 'CIDtoGID' => 'eJwDAAAAAAE=', + '_version_' => 4, +); \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/ZapfDingbats.afm b/application/third_party/dompdf/lib/fonts/ZapfDingbats.afm new file mode 100644 index 00000000..b2745053 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/ZapfDingbats.afm @@ -0,0 +1,225 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 15:14:13 1997 +Comment UniqueID 43082 +Comment VMusage 45775 55535 +FontName ZapfDingbats +FullName ITC Zapf Dingbats +FamilyName ZapfDingbats +Weight Medium +ItalicAngle 0 +IsFixedPitch false +CharacterSet Special +FontBBox -1 -143 981 820 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation. +EncodingScheme FontSpecific +StdHW 28 +StdVW 90 +StartCharMetrics 202 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ; +C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ; +C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ; +C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ; +C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ; +C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ; +C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ; +C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ; +C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ; +C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ; +C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ; +C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ; +C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ; +C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ; +C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ; +C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ; +C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ; +C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ; +C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ; +C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ; +C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ; +C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ; +C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ; +C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ; +C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ; +C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ; +C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ; +C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ; +C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ; +C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ; +C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ; +C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ; +C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ; +C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ; +C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ; +C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ; +C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ; +C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ; +C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ; +C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ; +C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ; +C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ; +C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ; +C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ; +C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ; +C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ; +C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ; +C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ; +C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ; +C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ; +C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ; +C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ; +C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ; +C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ; +C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ; +C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ; +C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ; +C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ; +C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ; +C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ; +C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ; +C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ; +C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ; +C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ; +C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ; +C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ; +C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ; +C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ; +C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ; +C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ; +C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ; +C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ; +C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ; +C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ; +C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ; +C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ; +C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ; +C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ; +C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ; +C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ; +C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ; +C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ; +C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ; +C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ; +C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ; +C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ; +C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ; +C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ; +C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ; +C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ; +C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ; +C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ; +C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ; +C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ; +C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ; +C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ; +C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ; +C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ; +C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ; +C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ; +C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ; +C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ; +C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ; +C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ; +C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ; +C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ; +C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ; +C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ; +C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ; +C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ; +C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ; +C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ; +C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ; +C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ; +C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ; +C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ; +C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ; +C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ; +C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ; +C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ; +C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ; +C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ; +C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ; +C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ; +C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ; +C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ; +C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ; +C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ; +C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ; +C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ; +C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ; +C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ; +C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ; +C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ; +C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ; +C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ; +C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ; +C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ; +C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ; +C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ; +C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ; +C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ; +C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ; +C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ; +C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ; +C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ; +C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ; +C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ; +C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ; +C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ; +C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ; +C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ; +C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ; +C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ; +C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ; +C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ; +C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ; +C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ; +C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ; +C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ; +C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ; +C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ; +C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ; +C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ; +C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ; +C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ; +C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ; +C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ; +C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ; +C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ; +C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ; +C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ; +C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ; +C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ; +C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ; +C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ; +C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ; +C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ; +C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ; +C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ; +C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ; +C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ; +C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ; +C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ; +C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ; +C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ; +C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ; +C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ; +C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ; +C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ; +C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ; +C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ; +C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ; +C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ; +C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ; +C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ; +C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ; +C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ; +C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ; +C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ; +C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/dompdf_font_family_cache.dist.php b/application/third_party/dompdf/lib/fonts/dompdf_font_family_cache.dist.php new file mode 100644 index 00000000..d634e889 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/dompdf_font_family_cache.dist.php @@ -0,0 +1,92 @@ + array ( + 'normal' => DOMPDF_FONT_DIR . 'Helvetica', + 'bold' => DOMPDF_FONT_DIR . 'Helvetica-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Helvetica-Oblique', + 'bold_italic' => DOMPDF_FONT_DIR . 'Helvetica-BoldOblique' + ), + 'times' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Times-Roman', + 'bold' => DOMPDF_FONT_DIR . 'Times-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Times-Italic', + 'bold_italic' => DOMPDF_FONT_DIR . 'Times-BoldItalic' + ), + 'times-roman' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Times-Roman', + 'bold' => DOMPDF_FONT_DIR . 'Times-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Times-Italic', + 'bold_italic' => DOMPDF_FONT_DIR . 'Times-BoldItalic' + ), + 'courier' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Courier', + 'bold' => DOMPDF_FONT_DIR . 'Courier-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Courier-Oblique', + 'bold_italic' => DOMPDF_FONT_DIR . 'Courier-BoldOblique' + ), + 'helvetica' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Helvetica', + 'bold' => DOMPDF_FONT_DIR . 'Helvetica-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Helvetica-Oblique', + 'bold_italic' => DOMPDF_FONT_DIR . 'Helvetica-BoldOblique' + ), + 'zapfdingbats' => array ( + 'normal' => DOMPDF_FONT_DIR . 'ZapfDingbats', + 'bold' => DOMPDF_FONT_DIR . 'ZapfDingbats', + 'italic' => DOMPDF_FONT_DIR . 'ZapfDingbats', + 'bold_italic' => DOMPDF_FONT_DIR . 'ZapfDingbats' + ), + 'symbol' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Symbol', + 'bold' => DOMPDF_FONT_DIR . 'Symbol', + 'italic' => DOMPDF_FONT_DIR . 'Symbol', + 'bold_italic' => DOMPDF_FONT_DIR . 'Symbol' + ), + 'serif' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Times-Roman', + 'bold' => DOMPDF_FONT_DIR . 'Times-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Times-Italic', + 'bold_italic' => DOMPDF_FONT_DIR . 'Times-BoldItalic' + ), + 'monospace' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Courier', + 'bold' => DOMPDF_FONT_DIR . 'Courier-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Courier-Oblique', + 'bold_italic' => DOMPDF_FONT_DIR . 'Courier-BoldOblique' + ), + 'fixed' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Courier', + 'bold' => DOMPDF_FONT_DIR . 'Courier-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Courier-Oblique', + 'bold_italic' => DOMPDF_FONT_DIR . 'Courier-BoldOblique' + ) +) + +/* The proper way for web browser environment independent font handling in html/css is, + * to defining a font search path ending in serif, sans-serif, or monospace, e.g.: + * + * + * For more satisfying results on html files without proper font search path, + * popular fonts which are candidates for further font aliases similar to + * 'sans-serif' and 'helvetica' above might be: + * + * See + * http://www.codestyle.org/css/font-family/index.shtml + * http://mondaybynoon.com/2007/04/02/linux-font-equivalents-to-popular-web-typefaces/ + * C:\Windows\Fonts + * + * Times: + * serif, times, times-roman, times, times new roman, georgia, garamond, ms reference serif, + * palatino, palatino linotype, dejavu serif, freeserif, liberation serif, luxi serif, + * century schoolbook, new century schoolbook + * + * Helvetica: + * sans-serif, helvetica, helvetica, microsoft sans serif, verdana, arial, tahoma, + * trebuchet ms, lucida sans, ms reference sans serif, lucida grande, freesans, + * liberation sans, dejavu sans, luxi sans, lucida + * + * Courier: + * monospace, fixed, courier, courier new, lucida console, lucida sans typewriter, freeMono, + * fixed, terminal, dejavu sans mono, liberation mono, luxi mono + */ + +?> \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/log.htm b/application/third_party/dompdf/lib/fonts/log.htm new file mode 100644 index 00000000..8d5bb5cc --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/log.htm @@ -0,0 +1 @@ +6,144 KB 408.7529 ms
\ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/mustRead.html b/application/third_party/dompdf/lib/fonts/mustRead.html new file mode 100644 index 00000000..b9f4ba2a --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/mustRead.html @@ -0,0 +1,17 @@ + + + + + Core 14 AFM Files - ReadMe + + + or + + + + + +
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. Col
+

Source http://www.adobe.com/devnet/font/#pcfi

+ + \ No newline at end of file diff --git a/application/third_party/dompdf/lib/res/broken_image.png b/application/third_party/dompdf/lib/res/broken_image.png new file mode 100644 index 00000000..eda02feb Binary files /dev/null and b/application/third_party/dompdf/lib/res/broken_image.png differ diff --git a/application/third_party/dompdf/lib/res/html.css b/application/third_party/dompdf/lib/res/html.css new file mode 100644 index 00000000..d8aa95f9 --- /dev/null +++ b/application/third_party/dompdf/lib/res/html.css @@ -0,0 +1,427 @@ +/** + * DOMPDF - PHP5 HTML to PDF renderer + * + * File: $RCSfile: html.css,v $ + * Created on: 2004-08-04 + * + * Copyright (c) 2004 - Benj Carson + * 1998 - Netscape Communications Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Originally from mozilla (http://www.mozilla.org). Original code was + * licensed under the NPL, with the option of release under the GPL or LGPL. + * This file is hence released under the LGPL. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Blake Ross + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + * @version 0.3 + */ + +/* $Id: html.css,v 1.4 2006-04-05 20:09:00 benjcarson Exp $ */ + +@page { + margin: 1.2cm; +} + +html { + display: -dompdf-page; + counter-increment: page; +} + +/* blocks */ + +div, map, dt, isindex { + display: block; +} + +body { + page-break-before: avoid; + display: block; +} + +p, dl, multicol { + display: block; + margin: 1em 0; +} + +dd { + display: block; + margin-left: 40px; +} + +blockquote { + display: block; + margin: 1em 40px; +} + +address { + display: block; + font-style: italic; +} + +center { + display: block; + text-align: center; +} + +blockquote[type=cite] { + display: block; + margin: 1em 0px; + padding-left: 1em; + border-left: solid; + border-color: blue; + border-width: thin; +} + +h1, h2, h3, h4, h5, h6 { + display: block; + font-weight: bold; +} + +h1 { + font-size: 2em; + margin: .67em 0; +} + +h2 { + font-size: 1.5em; + margin: .83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4 { + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +listing { + display: block; + font-family: fixed; + font-size: medium; + white-space: pre; + margin: 1em 0; +} + +plaintext, xmp, pre { + display: block; + font-family: fixed; + white-space: pre; + margin: 1em 0; +} + +/* tables */ + +table { + display: table; + border-spacing: 2px; + border-collapse: separate; + margin-top: 0; + margin-bottom: 0; + text-indent: 0; + text-align: left; /* quirk */ +} + +table[border] { + border-style: outset; + border-color: gray; +} + +/* This won't work (???) */ +/* +table[border] td, +table[border] th { + border: 1pt solid grey; +}*/ + +/* make sure backgrounds are inherited in tables -- see bug 4510 */ +td, th, tr { + background: inherit; +} + +/* caption inherits from table not table-outer */ +caption { + display: table-caption; + text-align: center; +} + +tr { + display: table-row; + vertical-align: inherit; +} + +col { + display: table-column; +} + +colgroup { + display: table-column-group; +} + +tbody { + display: table-row-group; + vertical-align: middle; +} + +thead { + display: table-header-group; + vertical-align: middle; +} + +tfoot { + display: table-footer-group; + vertical-align: middle; +} + +/* To simulate tbody auto-insertion */ +table > tr { + vertical-align: middle; +} + +td { + display: table-cell; + vertical-align: inherit; + text-align: inherit; + padding: 1px; +} + +th { + display: table-cell; + vertical-align: inherit; + font-weight: bold; + padding: 1px; + text-align: center; +} + +/* inlines */ +q { + quotes: '"' '"' "'" "'"; /* FIXME only the first level is used */ +} + +q:before { + content: open-quote; +} + +q:after { + content: close-quote; +} + +a:link { + color: #00c; + text-decoration: underline; +} + +b, strong { + font-weight: bolder; +} + +i, cite, em, var, dfn { + font-style: italic; +} + +tt, code, kbd, samp { + font-family: fixed; +} + +u, ins { + text-decoration: underline; +} + +s, strike, del { + text-decoration: line-through; +} + +blink { + text-decoration: blink; +} + +big { + font-size: larger; +} + +small { + font-size: smaller; +} + +sub { + vertical-align: sub; + font-size: smaller; + line-height: normal; +} + +sup { + vertical-align: super; + font-size: smaller; + line-height: normal; +} + +nobr { + white-space: nowrap; +} + +/* lists */ + +ul, menu, dir { + display: block; + list-style-type: disc; + margin: 1em 0; + padding-left: 40px; +} + +ol { + display: block; + list-style-type: decimal; + margin: 1em 0; + padding-left: 40px; +} + +li { + display: list-item; +} + +/* nested lists have no top/bottom margins */ +ul ul, ul ol, ul dir, ul menu, ul dl, +ol ul, ol ol, ol dir, ol menu, ol dl, +dir ul, dir ol, dir dir, dir menu, dir dl, +menu ul, menu ol, menu dir, menu menu, menu dl, +dl ul, dl ol, dl dir, dl menu, dl dl { + margin-top: 0; + margin-bottom: 0; +} + +/* 2 deep unordered lists use a circle */ +ol ul, ul ul, menu ul, dir ul, +ol menu, ul menu, menu menu, dir menu, +ol dir, ul dir, menu dir, dir dir { + list-style-type: circle; +} + +/* 3 deep (or more) unordered lists use a square */ +ol ol ul, ol ul ul, ol menu ul, ol dir ul, +ol ol menu, ol ul menu, ol menu menu, ol dir menu, +ol ol dir, ol ul dir, ol menu dir, ol dir dir, +ul ol ul, ul ul ul, ul menu ul, ul dir ul, +ul ol menu, ul ul menu, ul menu menu, ul dir menu, +ul ol dir, ul ul dir, ul menu dir, ul dir dir, +menu ol ul, menu ul ul, menu menu ul, menu dir ul, +menu ol menu, menu ul menu, menu menu menu, menu dir menu, +menu ol dir, menu ul dir, menu menu dir, menu dir dir, +dir ol ul, dir ul ul, dir menu ul, dir dir ul, +dir ol menu, dir ul menu, dir menu menu, dir dir menu, +dir ol dir, dir ul dir, dir menu dir, dir dir dir { + list-style-type: square; +} + +/* forms */ + +/* +input[type=text] { + border: 1pt solid black; + background-color: white; +} + +input[type=text]:before { + content: attr(value); +}*/ + +fieldset { + display: block; + margin-left: 2px; + margin-right: 2px; + padding: 0.35em 0.625em 0.75em; + border: 1pt groove #666; +} + +fieldset > legend { + padding-left: 2px; + padding-right: 2px; + min-width: 1em; + max-width: none; + height: auto; + min-height: 0; + max-height: none; + white-space: nowrap; + margin-top: -1.0em; + background: white; +} + +legend { + display: inline-block; +} + + +/* leafs */ + +hr { + display: block; + height: 2px; + border: 1px inset; + margin: 0.5em auto 0.5em auto; +} + +iframe { + border: 2px inset; +} + +noframes { + display: none; +} + +br { + display: -dompdf-br; +} + +img, img_generated { + display: -dompdf-image; +} + +dompdf_generated { + display: inline; +} + +/* hidden elements */ +area, base, basefont, head, meta, script, style, title, +noembed, noscript, param { + display: none; +} \ No newline at end of file diff --git a/application/third_party/dompdf/lib/ttf2ufm/README.TXT b/application/third_party/dompdf/lib/ttf2ufm/README.TXT new file mode 100644 index 00000000..be9839b6 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/README.TXT @@ -0,0 +1,24 @@ +To embed TrueType fonts (.TTF) files, you need to extract the font metrics and +build the required tables using the provided utility (/fonts/ttf2ufm). + +TTF2UFM is a modified version of Mark Heath's TTF 2 PT1 converter +(http://ttf2pt1.sourceforge.net/) by Steven Wittens +(http://www.acko.net/blog/ufpdf). ttf2ufm, is included in /ttf2ufm-src. +The /fonts/ttf2ufm folder contains a compiled Windows binary. +TTF 2 UFM is identical to TTF 2 PT1 except that it also generates a .ufm file +for usage with makefontuni.php. + + +Setting up a Truetype font for usage with TCPDF: + 1) Generate the font's .ufm metrics file by processing it with the provided + ttf2ufm program (modified ttf2pt1). For example: + $ ttf2ufm -a -F myfont.ttf + 2) Run makefontuni.php with the .ttf and .ufm filenames as argument: + $ php -q makefontuni.php myfont.ttf myfont.ufm + 3) Copy the resulting .php, .z and .ctg.z file to the TCPDF font directory. + 4) Rename php font files variations for bold and italic using the following schema: + [basic-font-name]b.php for bold variation + [basic-font-name]i.php for oblique variation + [basic-font-name]bi.php for bold oblique variation + 5) Convert all fonts filenames to lowercase. + \ No newline at end of file diff --git a/application/third_party/dompdf/lib/ttf2ufm/bin/ttf2ufm.exe b/application/third_party/dompdf/lib/ttf2ufm/bin/ttf2ufm.exe new file mode 100644 index 00000000..ad623592 Binary files /dev/null and b/application/third_party/dompdf/lib/ttf2ufm/bin/ttf2ufm.exe differ diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/CHANGES b/application/third_party/dompdf/lib/ttf2ufm/src/CHANGES new file mode 100644 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/CHANGES.html b/application/third_party/dompdf/lib/ttf2ufm/src/CHANGES.html new file mode 100644 index 00000000..c638b6d4 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/CHANGES.html @@ -0,0 +1,815 @@ + + + +TTF2PT1 - CHANGES history + + + +

+TTF2PT1 - CHANGES history +

+ + + +

+3.4.4 -- December 31, 2003 +

+ + +New features: +
    +
  • Improved the auto-vectoring (-OV) alrogithm. +
  • Allow use of any encoding table of format 4 in the ttf parser. +
  • Take the first available format 4 encoding table if no known + table is found in the ttf parser. +
  • The ttf parser lists the available encodings if no supported + encoding table is found. This can be used to list the encodings in + any font by specifying a bogus explicit PID/EID, such as + with option -l plane+pid=50,eid=50. +
+ +Bug fixes: +
    +
  • Fix to build all the features on Windows MS C++, by Tomoo Amano. +
  • Fix for a null pointer in the encodings, bad inner loop variable. +
  • Unified the parsing of font name strings and improved the checks + against invalid characters. +
+ +

+3.4.3 -- December 2, 2002 +

+ + +New features: +
    +
  • scripts/forceiso got an optional argument to select the + format of the names for glyphs without standard Latin-1 names. +
+ +Bug fixes: +
    +
  • Changed the glyph names in scripts/forceiso to match those in ttf2pt1. +
  • Included the missing directory app/TeX. +
+ +

+3.4.2 -- August 30, 2002 +

+ + +New features: +
    +
  • New map for T2A_compat encoding (for Cyrillic LaTeX) by Mikhail + Umorin. +
  • Scripts supporting font conversion for CJK-LaTeX, by Mike Fabian + from SuSE. +
+ +Bug fixes: +
    +
  • Explicit owner/group/permissions are used to install directories. +
  • In scripts/convert fixed the addition of encoding name to the font + name for the external encoding maps, was missing "/" at the start. +
  • Fixed the divergence between two copies of UniqueID. +
  • Fixed the recovery after defective empty contours. +
+ +

+3.4.1 -- June 13, 2002 +

+ + +New features: +
    +
  • Added Autotrace support for the bitmap fonts (-OZ). It's horrible. +
  • Added vectorization of bitmap fonts (-OV) - functionally the same thing as + autotrace but home-grown. Works mostly decently but still with large + space for impprovement. +
  • Relaxed the conditions for warnings about long glyphs. +
+ +Bug fixes: +
    +
  • Fix by Rob Kolstad for a crash in the new outline smoothing + code (on small thin contours) and diagnostic for another crash. +
  • Fix by Holger Huesing for a crash on degenerate contours. +
  • Fix for bitmaps of zero dimensions. +
  • The BDF reader does not fail on redefintion of the properties. +
  • Fix for reading of BDF glyphs with 0 size. +
  • Fix for a hang when guessing the boldness of some fonts. +
  • Fix by Adriano Konzen for scaling coefficients in composite glyphs. +
+ +

+3.4.0 -- November 24, 2001 +

+ + +New features: +
    +
  • Parser for the BDF bitmap fonts. +
  • Vastly improved the smoothing of the outlines. +
  • The options are saved as a comment in the output file. +
  • New script other/showdf for visual comparison of the fonts. +
  • New option -G to select the file types to generate. +
  • Creation of the dvips encoding files (by Rigel). +
  • More glyphs in the Chinese maps (by Rigel). +
  • Made the assignment of ISO8859/1 glyph names to the glyphs in the + fonts without PostScript names in them dependent on the original + encoding: no change for the 8-bit encodings, for the Unicode encoding + the names are assigned to the glyph with the codes 0-255 in Unicode, + and for the other 16-bit encodings the 8859/1 names are not assigned + at all. +
+ +Bug fixes: +
    +
  • Added a check for spaces in the PostScript font name in the FreeType + parser. +
  • Made "-" a valid character in the glyph names. +
  • Fixed handling of the Unicode names returned by FreeType, though + not perfectly. +
  • Changed the build for FreeType-2.0.4. +
  • Fixed the handling and printing of bad glyph names. +
  • Fixed the bug with duplicated glyph names when more than 256 glyphs are + extracted from a font that has no PostScript glyph names defined. +
  • Added ability to map a glyph to more than one code when unisng the + native parser (-pttf). +
+ +

+3.3.5 -- September 12, 2001 +

+ + +Packaged by Sergey Babkin. +

+ +Bug fixes: +

    +
  • Fixed the scaling of Ascender and Descender in the AFM file. +
  • Fixed the brekage of "-l adobestd". +
+ +

+3.3.4 -- June 4, 2001 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Cyrillic (full set of glyphs) language tables (by Zvezdan Petkovic). + Now the languages "russian" and "bulgarian" are provided for compatibility + only, use the common language "cyrillic" instead. +
  • More information in FONTS on using Cyrillic fonts with + Netscape (by Zvezdan Petkovic) +
  • In the Netscape print filter added removal of the clipping path command: + otherwise Netscape tends to cut off a large piece of the rightmost column + of the tables. +
  • One more script for printing from Netscape (by Zvezdan Petkovic). +
  • Added selection of the base TTF encoding by pid/eid in the external maps. +
  • Improved the recognition of substituted stems for intersecting contours. +
  • Improved the substituted hints to make the horizontal positioning of + the points at the same height more uniform at small pixel sizes. +
  • Made the algorithm for calculation of standard stem widths more + selective. +
  • Added link to the GnuWin32 project. +
+ +Bug fixes: +
    +
  • TH: Print out metrics of un-encoded glyphs even without "-a" option. +
  • Added missing "/" in Fontmap generation in convert (by Zvezdan Petkovic). +
  • Removed unneccessary "\n" in messages in x2gs. +
  • Removed the broken overoptimisation of "0 0 rmoveto". +
  • Removed the useless warnings about multiple codes for a glyph. +
  • Changed the FreeType2 include directory in the Makefile to match the + FreeType's default. +
+ +

+3.3.3 -- March 4, 2001 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • TH: Added printing of front-end parser in the header of the font file. +
  • Tested build with FreeType 2.0 Release. +
+ +Bug fixes: +
    +
  • Changed the installation script which on some versions of bash + copied all files into the share directory. +
  • Fixed the close sequences of html2man comments in the HTML files, + now they should display correctly with lynx. +
  • Restored the ability to include un-encoded characters into the + customised maps (those with codes over 255). +
  • Fixed the Unicode mapping of the Cyrillic letters "YO" and "yo" + (by Yuri Shemanin). +
  • Fixed the spurious aborts when the conversion-by-plane function + gets called for auto-guessing of encoding. +
+ +

+3.3.2 -- November 20, 2000 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Added generation of man pages. +
  • Added "make install" and "make uninstall". +
  • Added language option "-l plane". +
  • In other/showg added better support of comparison files: +
      +
    • printing of the comparison file legend; +
    • guessing of missing glyph names in a comparison file by code; +
    • bounding boxes of all comparison files are used for page layout. +
    +
  • Added ability to use external t1asm instead of compiling it in. +
  • Renamed the fonts installation guide from INSTALL*html to FONTS*html + to avoid confusion with installation of ttf2pt1 itself. +
+ +Bug fixes: +
    +
  • Removed erroneous extra fclose(pfa_file). +
  • Fixed random memory corruption that manifested with crash on Linux + when converting fonts not containing glyph names. +
  • Removed from the output file the comments that confused dvips. Changed + other/showg to work without them. +
  • In other/showg added better checks for missing glyphs, now it + gives warnings about them and the output file does not crash PostScript. +
+ +Other: +
    +
  • ttf2pfa is no longer included, people interested in history + should look for it in the older versions. +
+ +

+3.3.1 -- October 22, 2000 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Added front-end parser based on the FreeType-2 library. See Makefile +for build instructions. +
  • Changed the handling of encodings to accomodate the FreeType model. +
  • Further cleaned up the front-end parser interface. +
+ +Bug fixes: +
    +
  • Fixed a bug that caused core dump on Alpha machines. +
  • Fixed a bug in the outline smoothing that occasionally caused core dump. +
  • Cleaned up warnings from picky compilers +
  • Fixed more bugs in the Windows port (by Stefan Bauer). +
  • Fixed the RPM spec file (suggested by Brian Armstrong). +
+

+ +

+3.3.0 -- September 22, 2000 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Converted most of the outlines' processing to floating point +arithmetic. +
  • Added splitting of curves crossing the quadrant boundaries (no gross +damage is done any more to the Marvosym font and others like it). +
  • Added modular interface for front-end font parsers and option to control +their selection at run time. +
  • Grouped the outline processing control options into one to reduce the +options namespace pollution. +
  • Thomas moved the Chinese maps into a separate module, chinese-maps. +
  • Thomas added option -V to print version number. In addition, the version +number is put in the header of the font file. +
  • Added long option names (suggested by Thomas). +
  • Added support for multi-level composite glyphs. +
  • TH: Made <fontname> command-line argument optional; default to <ttf-file> +with suffix replaced. +
  • In other/showg added more ways to specify glyphs and the comparison option. +
+ +Bug fixes: +
    +
  • Fixed the VC++ batch file, added batch file for Cygnus GCC on Windows. +
  • Removed parentheses from the Version string in AFM files because it does +not help StarOffice anyway. StarOffice 5.2 has been reported to have this +bug fixed. Added paragraph on StarOffice in FONTS.html. +
  • Made messages on the '?' option parameter more meaningful (by Johan Vromans). +
  • Changed the latin1 encoding table to include the Euro sign, Z and z with +caron (by Thomas Henlich). +
  • Improved the smoothing code which occasionally had problems with +joining curves. Also fixed a few minor bugs in it. +
+ +

+3.22 -- May 23, 2000 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Included windows support by Frank Siegert (somewhat amended) +
  • Added control over verbosity of warnings. +
  • Added arguments and initialization functions to the language +translation routines. +
  • Added support of planes determined by arguments to the external +maps. +
  • Added compact external maps format (primarily for Eastern fonts). +
  • Added external maps for Chinese GBK and Big5 encodings (converted +from ttf2pfb) as well as maps for other Chinese encodings by Wang Lei. +
  • Added the idea of buckets to speed up the search in external maps. +
  • Changed the grouping algorithm for substituted hints: now it creates +a bit bigger files but requires smaller hint stack when being rendered. +
  • Added maximal limit of hint stack depth, glyphs requiring bigger +stack get generation of substituted hints disabled. This makes substituted +hints safe to use, no more lost glyphs due to hint stack overflow. +
  • Added the font dump program other/dumpf. +
  • Changed the testing HTML generator other/lst.pl to use tables. +
  • Added debugging script other/cntstems.pl to count required hint +stack depth for the glyphs. +
+ +Bug fixes: +
    +
  • Fixed printing of UID in script/trans. Changed the auto-generated UID to +be in range 4000000-4999999 which is reserved by Adobe for private use. +
  • Fixed handling of "cleartomark" in built-in t1asm. +
  • Added handling of "can't happen" case in straighten() routine +which actually happened on strange fonts and caused failure on assertion. +
  • Made it always include the glyph .notdef in the resulting font. +
  • Placed the version string in AFM file in parentheses, hopefully +that would fix the problem with StarOffice. +
  • Improved the smoothing code which occasionally had problems with +joining curves. +
+ +

+3.21 -- March 1, 2000 +

+ + +Sergey Babkin: committed the changes by Petr Titera and +my bugfixes. +

+ +New features: +

    +
  • New Unicode map format with glyph names, by Petr Titera. +
  • Option to force the Unicode encoding by Petr Titera + (I changed it to work on any MS encoding, not only Symbol). +
  • Slightly tweaked the calculation of hints, should be better now. +
+ +Bug fixes: +
    +
  • The unicode-sample.map with description of the map formats + was lost in the release process, restored and enhanced. +
  • Renamed the table ISOLatin1Encoding to Fmt3Encoding to reflect + the way it is used. Saved the original one for reference + purposes. In the new table renamed "quoteright" to "quotesingle" + as Thomas Henlich suggested (and he were right). +
  • In the ISOLatinEncoding table renamed the glyph "grave" + at octal 0140 to "quoteleft", "quotesingle" at octal 047 to + "quoteright" to conform to the standard as suggested by + Martin Trautner). +
  • Fixed bug in scripts/trans that corrupted the UniqueID record + in the translated fonts. +
  • Fixed bug in interaction of substituted hints with BlueZones. + Now the fonts with hint substitution seem to be always at least + not worse than without it (well, when they fit in the X11 + file size limit). +
+ + +

+3.2 -- January 15, 2000 +

+ + +Sergey Babkin: combined my changes with the changes by +Thomas Henlich. The result deserves a not-so-minor version +increase. +

+ +New features: +

    +
  • Support of the external Unicode re-encoding maps + (by Thomas). +
  • Support for inclusion of all the glyphs from the + source file into the resulting file (inspired by + Thomas but I re-implemented it to remove the limitation + of his implementation: not more than 1024 glyphs). +
  • The hints substitution. It's an experimental feature + yet and needs further work. +
  • Support for UniqueID and its auto-generation. +
  • Support for the name-based conversions from Unicode + in general and the adobestd "language" in particular. +
  • Started the split of the source code into multiple + files. This needs more work to do it in a cleaner + way. +
  • Better framework for the debugging printout + in the converter. +
  • Utilities to install the fonts in Netscape + Navigator/Communicator 4.x. +
  • Patches for bigger font files in the X11 rasterizer. +
  • Linux RPM spec-file (by Johan Vromans). +
  • Added the COPYRIGHT file (BSD-style, as we discussed + on the mailing list earlier) and the CHANGES file. +
  • Creation of the .pfb files from the convert + script. +
  • Changed the .notdef-s in the built-in + ISOLatin1Encoding table to some valid names (by Thomas). + Thomas also suggested replacing `quoteright' by + `quotesingle' but this seems to be against the + Adobe ISOLatin1 table. +
  • New aliases windows-1251 and cp-866 for + the Russian encodings: those are expected by Netscape + navigator. +
  • The font comparison program other/cmpf. +
  • The "magnifying glass" program for glyph outlines: + other/showg. +
  • Other updates of the tools in the `other' subdirectory. +
  • Added a link to T1LIB in README. +
  • A few new options in convert.cfg. +
+ +Bux fixes: +
    +
  • A bug in the outline smoothing code that corrupted some + of the fonts (for example, Microsoft Verdana). +
  • Added explicit `cleartomark' to the end of file, + this seems to be compatible with both old and new version + of t1asm (suggested by Thomas). +
  • Added the FontEncoding statement to the AFM files + (techincally this was not a bug because this statement + is optional but some programs want it). +
  • A coredump when the converter tried to print a warning + (rather ironically) about a weird glyph width. +
  • Changed the underscores in the font names to dashes (this + has been proposed long time ago by Johan Vromans). +
  • No more glyph names of font names staring with a digit. +
  • The names of the fonts in font and AFM files are now the + same as in the generated Ghostscript Fontmap file.
    + Warning: the names in Fontmap have been + changed. +
  • The forceiso script does not corrupt the character + and kerning pairs counts any more, and is optional at all. +
  • Fix for a loop going to 254 instead of 255 (by Thomas). +
  • Added ':' in the font header (by Thomas). +
  • A coredump when wrong language name is given (this was + also fixed by Thomas but I noticed it too late, after + I already fixed it by myself). +
  • Fixed the links to the Adobe documents in README. +
+ + +

+3.13 -- October 18, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • New option -v for automatic re-scaling based on the vertical size of the font +
  • Changed the code to use getopt() instead of a home-made version of it. +
  • Latin2 language support by Szalay Tamas. +
+ +Bux fixes: +
    +
  • Fix for the bug that made possible calls of malloc(0). +
  • Refinement of the option -w to prevent extra wide spacing +
+ +

+3.12 -- October 2, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Added support for the Bulgarian language (actually, for now just an alias +of Russian). +
  • Added option -w that tries to make sure that the character widths are not +too narrow. +
  • Added the concept of aliased encodings. +
  • Now the conversion scripts create and install the .afm files too. +
  • The conversion script removes the intermediate files after installation. +
  • Added tunables to the conversion script. +
  • Installation of the Ghostscript fonts can now be done automatically +together with the X11 fonts. +
+ +Bux fixes: +
    +
  • (FINALLY!!!) A correct fix for the infamous Red Hat 6.0 stdio "feature". +
  • A number of little bugs discovered by a picky SGI compiler (well, maybe +some day I'll try to run it through the UnixWare lint and see what happens). +
  • A diagnostic message about the empty encodings in the convert script was +made less cryptic and a bug in the awk sub-script was fixed. +
  • The .afm creation code now considers the option -t. +
+ +

+3.11 -- May 24, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • It includes the Turkish (Latin5, ISO8859/9) +language support by Turgut Uyar and Baltic (ISO8859/4) languages support by +Rihardas Hepas. +
  • Also the installation script got updated: the configuration parameters +are moved to a separate file and the generated fonts.dir files should now be +compatible with Xfsft. +
+ +

+3.1 -- March 28, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Improved the interaction of the character-level hints and font-level hints +
+ + +

+3.0 -- March 6, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Added HTML documents. +
+ +

+3.0beta2 -- February 14, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Added ability to print the .afm file instead of the font to STDOUT. +
  • Added the guessing of the /ForceBold parameter that proved to be useful. +
+ +Bux fixes: +
    +
  • Removed the force-fixed option that proved to be troublesome. +
+ +

+3.0beta1 -- December 11, 1998 +

+ + +By Andrew Weeks. +

+ +New features: +

    +
  • Added option (passed to t1asm) to create a compressed binary +version of the font (A PFB file). +
+ +Bux fixes: +
    +
  • Versions of handle_post and handle_cmap that deal with some +problems with buggy fonts. +
  • Minor Bug Fixes. +
+ +

+3.0beta-afm -- December 5, 1998 +

+ + +By Thomas Henlich. +

+ +New features: +

    +
  • Integration of AFM file creation. +
+ +

+3.0beta -- November 15, 1998 +

+ + +By Sergey Babkin. +

+ +New features: +

    +
  • Added the auto-calculation of the italic angle. +
+ +Bux fixes: +
    +
  • Fixed a couple of bugs. +
+ +

+3.0alpha -- October 19, 1998 +

+ + +By Sergey Babkin. +

+ +New features: +

    +
  • Improved (although still not perfect) handling of +scaling in composite glyphs +
  • Automatic correction of outlines to make them more +smooth (to correct both rounding errors introduced +during conversion and present in the original font) +
  • Automatic generation of hints (still has lots of +space for improvement) +
  • Automatic generation of BlueValues etc. +
+ +Bux fixes: +
    +
  • Scaling of fonts to 1000x1000 M-square required by +Type1 standard +
  • Printing out the contours in reverse direction, because +TTF directions are different from Type1 ones (that was +the major reason why the fonts generated by +version 2.2 were rendered so badly in small sizes) +
+ +

+June 22, 1998 (AKA 2.2) +

+ + +By Thomas Henlich. +

+ +Bux fixes: +

    +
  • "width" should be "short int" because otherwise: +characters with negative widths (e.g. -4) become *very* wide (65532) +
  • The number of /CharStrings is numglyphs and not numglyphs+1 +
+ +

+February 13, 1998 +

+ + +By Mark Heath. +

+ +Bux fixes: +

    +
  • An original Bug Reported by Frank, which was just incorrect syntax in the +Type 1 header, managed to creep back into the Feb 04 Version. This has been +Fixed in the Feb 13 Version. +
+ +

+February 4, 1998 +

+ + +By Mark Heath. +

+ +Bux fixes: +

    +
  • A workaround was implemented in ttf2pfa by altering the matrix. I suspect +I will have to calculate the correct values, as matrix ops are probably not +allowed in Type 1 format. +
+ + +

+The older history seems to be lost. +

+ + +(S.B.: The story how we got the version numbers is rather funny. Initially +there were no version umbers, the releases were marked by dates. The version +from June 22 1998 untarred itself into a directory "ttf2pt1-22". When I +made my changes to it I assumed that this was the version number meaning +version 2.2. Since Mark asked me to send him a complete archive I supposed +that I have to bump the version number. And I bumped it to 3.0 because the +changes were rather extensive. Mark silently agreed and released the new +version as 3.0. And that's the end of the story about how we got this +Microsoft-like high version number.) + + + + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/COPYRIGHT b/application/third_party/dompdf/lib/ttf2ufm/src/COPYRIGHT new file mode 100644 index 00000000..75e8f38e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/COPYRIGHT @@ -0,0 +1,87 @@ +The following copyright notice applies to all the files provided +in this distribution unless explicitly noted otherwise +(the most notable exception being t1asm.c). + + Copyright (c) 1997-2003 by the AUTHORS: + Andrew Weeks + Frank M. Siegert + Mark Heath + Thomas Henlich + Sergey Babkin , + Turgut Uyar + Rihardas Hepas + Szalay Tamas + Johan Vromans + Petr Titera + Lei Wang + Chen Xiangyang + Zvezdan Petkovic + Rigel + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + 3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the TTF2PT1 Project + and its contributors. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS 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 AUTHORS 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. + +For the approximate list of the AUTHORS' responsibilities see the +project history. + +Other contributions to the project are: + +Turgut Uyar + The Unicode translation table for the Turkish language. + +Rihardas Hepas + The Unicode translation table for the Baltic languages. + +Szalay Tamas + The Unicode translation table for the Central European languages. + +Johan Vromans + The RPM file. + +Petr Titera + The Unicode map format with names, the forced Unicode option. + +Frank M. Siegert + Port to Windows + +Lei Wang +Chen Xiangyang + Translation maps for Chinese fonts. + +Zvezdan Petkovic + The Unicode translation tables for the Cyrillic alphabet. + +Rigel + Generation of the dvips encoding files, modification to the Chinese maps. + +I. Lee Hetherington + The Type1 assembler (from the package 't1utils'), its full copyright + notice: + Copyright (c) 1992 by I. Lee Hetherington, all rights reserved. + Permission is hereby granted to use, modify, and distribute this program + for any purpose provided this copyright notice and the one below remain + intact. + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/FONTS b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS new file mode 100644 index 00000000..dc28cc0d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS @@ -0,0 +1,462 @@ +Sergey A. Babkin + or +(Do not edit this file, it is generated from FONTS.html!!!) + +THE FONT INSTALLATION GUIDE +for the TTF to Type1 converter and fonts generated by it +======================================================== + +There is historically a number of problems with the support of the 8-bit +character encodings. This installation guide pays a lot of attention +to the 8-bit issues, because these issues are responsible for the +most of troubles during the installation of fonts. But they are +not the only things covered in this guide, so it's worth reading +even if all you need is plain ASCII. For convenience of reading +I have marked the paragraphs dealing solely with 8-bit problems +with characters *8*. + +To simplify this installation the distribution package of the +converter contains a number of scripts written in shell and +Perl. So, to run them you will need a shell interpreter (Bourne-shell, +POSIX-shell, Korn-shell are OK, ba-shell is probably also OK but not +tested yet). The Perl scripts were tested with Perl5 but probably +should work with Perl4 too. All the scripts are located in the +`scripts' subdirectory. + +This guide considers the following issues of installation of the +fonts: + +- X11 +- Ghostscript +- MS Windows +- Netscape Navigator/Communicator +- Linux RPM package +- FrameMaker +- StarOffice + +X11 +=== + +To simplify the conversion a set of scripts is provided with ttf2pt1. +They are collected in the `scripts' subdirectory. + +`Convert' is the master conversion script provided with ttf2pt1. +When installed into a public directory it's named `ttf2pt1_convert' +to avoid name collisions with the other programs. + +It's called as: + + convert [config-file] + +If the configuration file is not specified as an argument then the file +`convert.cfg' in the current directory is used. This file contains +a set of configuration variables. The distribution contains a sample file +file `convert.cfg.sample'. Please copy it to `convert.cfg', +look inside it and change the configuration variables. The more stable +configuration variables, such as the path names of the scripts and +encoding files are located in `convert' itself, they are +automatically updated when installing ttf2pt1. + +Put all the TTF fonts you want to convert into some directory (this +may be just the directory that already contains all the Windows +fonts on a mounted FAT filesystem). If you have fonts in different +source encoding then put the fonts in each of the encodings +into a separate directory. Up to 10 source directories are +supported. If you (in a rather unlikely case) have more source +directories then you can make two separate runs of the converter, +converting up to 10 directories at a time. + +The variables in the configuration file are: + +SRCDIRS - the list of directories (with absolute paths) with + TTF fonts. Each line contains at least 3 fields: the name of the directory, + the language of the fonts in it (if you have fonts for different + languages you have to put them into the separate directories) and the + encoding of the fonts. Again, if you have some of the TTF typefaces in + one encoding, and some in another (say, CP-1251 and KOI-8), you have + to put them into the separate source directories. Some lines may contain + 4 fields. Then the fourth field is the name of the external map to + convert the Unicode fonts into the desirable encoding. This map is + used instead of the built-in map for the specified language. + +*8* +An interesting thing is that some languages have more than one +widely used character encodings. For example, the widely used +encodings for Russian are IBM CP-866 (MS-DOS and Unix), KOI-8 +(Unix and VAX, also the standard Internet encoding), IBM CP-1251 (MS Windows). +That's why I have provided the means to generate the converted fonts +in more than one encoding. See the file encodings/README for +details about the encoding tables. Actually, if you plan to use +these fonts with Netscape Navigator better use the aliases +cp-866 instead of ibm-866 and windows-1251 instead of ibm-1251 +because that's what Netscape wants. + +DSTDIR - directory for the resulting Type1 fonts. Be careful! + This directory gets completely wiped out before conversion, + so don't use any already existing directory for this purpose. + +DSTENC{language} - the list of encodings in which the destination + fonts will be generated for each language. Each font of that + language will be generated in each of the specified + encodings. If you don't want any translation, just specify both + SRCENC and DSTENC as iso8859-1 (or if you want any other encoding + specified in the fonts.dir, copy the description of 8859-1 with + new name and use this new name for SRCENC and DSTENC). + +FOUNDRY - the foundry name to be used in the fonts.dir file. I have + set it to `fromttf' to avoid name conflicts with any existing font for + sure. But this foundry name is not registered in X11 standards and + if you want to get the full standard compliance or have a font server + that enforces such a compliance, use `misc'. + +The next few parameters control the general behavior of the converter. +They default values are set to something reasonable. + +CORRECTWIDTH - if the value is set to YES then use the + converter option -w, otherwise don't use it. See the description of + this option in the README file. + +REMOVET1A - if the value is set to YES then after + conversion remove the un-encoded .t1a font files and the + intermediate .xpfa font metric files. + +INSTALLFONTMAP - a Ghostscript parameter, if the value is set to + YES then install the entries for the new fonts + right into the main Fontmap file. Otherwise just leave + the file Fontmap.ttf in the Ghostscript configuration + directory. + +HINTSUBST - if the value is set to YES use the option + -H, otherwise don't use it. This option enables the + hint substitution technique. If you have not installed the X11 patch + described above, use this option with great caution. See further + description of this option in the README file. + +ENFORCEISO - if the value is set to YES then + disguise the resulting fonts as the fonts in ISOLatin1 encoding. Historically + this was neccessary due to the way the installer scripts created the + X11 font configuration files. It is not neccessary any more for this + purpose. But if you plan to use these fonts with some other application + that expects ISOLatin1 encoding then better enable this option. + +ALLGLYPHS - if the value is set to YES then + include all the glyphs from the source fonts into the resulting fonts, even + if these glyphs are inaccessible. If it's set to NO then + include only the glyphs which have codes assigned to them. The glyphs + without codes can not be used directly. But some clever programs, + such as the Type 1 library from XFree86 3.9 and higher can change + the encoding on the fly and use another set of glyphs. If you have not + installed the X11 patch described above, use this option with great + caution. See further description of the option option -a in the + README file. + +GENUID - if the value is set to YES then use + the option -uA of the converter to generate UniqueIDs for + the converted fonts. The standard X11 Type 1 library does not use + this ID, so it may only be neccessary for the other applications. + The script is clever enough to generate different UniqueID for the + same font converted to multiple encodings. Also after conversion it + checks all the fonts generacted during the session for duplicated + UniqueID and shows those. Still, this does not quarantee that these + UniqueIDs won't overlap with some other fonts. The UniqueIDs are + generated as hash values from the font names, so it's guaranteed + that if the `convert' script runs multiple times it will + generate the same UniqueIDs during each run. See further description + of this option in the README file. + +GENUID - if the value is set to YES then create + the .pfb files, otherwise the .pfa files. The .pfb + files are more compact but contain binary data, so you may experience some + troubles when transferring them through the network. + +The following parameters are used to locate the other scripts and +configuration files. By default the scripts do a bit of guessing for them: +they search in the ttf2pt1 installation directory if ttf2pt1 +was installed or otherwise suppose that you are running `convert' with +`scripts' subdirectory being the current directory. + +ENCDIR - directory containing the descriptions of encodings +MAPDIR - directory containing the external map files + +Besides that a few parameters are built into the `convert' script itself. +You probably won't need to change them: + +T1ASM, TTF2PT1, TRANS, T1FDIR, FORCEISO - paths to the other script + +Also there are a few parameters controlling the installation of +fonts for Ghostscript. Please look at their description in the +Ghostscript section of documentation or in the ttf2pt1_x2gs(1) +manual page before running `convert'. If these parameters are +set, `convert' will call the `x2gs' script automatically +to install the newly converted fonts in Ghostscript. + +After creating the configuration file run the `convert' script. Look at +the result and the log file in DSTDIR. + +Add the directory with newly converted fonts to the configuration +of X server or font server. For most of the systems this step is +very straightforward. For HP-UX it's rather tricky and poorly +documented, so the file FONTS.hpux gives a short description. + +If you don't have the privileges of the root user, you still can +configure your private font server. Just use some non-standard +port number (see FONTS.hpux for an example, exept that you won't +need all the HP-related stuff on any other system). + +Known Problems +-------------- + +- One catch is that the X11 Type 1 font library has a rather low limit + on the font size. Because of this the fonts with more complicated + outlines and the enabled hint substitution may not fit into + this limit. The same applies to the fonts with very complicated + outlines or with very many glyphs (especially the fonts with + over 256 glyphs). So you will need to excercise caution with + these options if you plan using these fonts with X11. Some vendors + such as HP provide the Type 1 implementation licensed from Adobe + which should have no such problem. + + But there is a solution even for the generic X11. A patch located + in the subdirectory `app/X11' fixes this problem as well + as some other minor problems. Its description is provided in + app/X11/README. + + To fix the X11 font library, you have to get the X11 sources. I + can recommend the ftp sites of the XFree86 project ftp://ftp.xfree86.org + or of the Open Group ftp://ftp.x.org. This patch was made on the sources + of XFree86 so you may have better success with applying it to the + XFree86 distribution. After you have got the sources, make sure + that you can compile them. Then apply the patch as described. + Make sure that it was applied properly. Compile the sources again + (actually, you need only the fonts library, the fonts server, and + possibly the X server). It would be prudent now to save your old + font library, font server and, possibly, X server. Then install + the new recently compiled versions of these files. Of course, + if you know someone who already has compiled these files for the + same OS as yours, you can just copy the binary fles from him. + + Alas, building the X11 system from the source code is not the + easiest thing in the world and if you have no experience it + can be quite difficult. In this case just avoid the aforementioned + features or check each converted font to make sure that it + works properly. + +- The Type1 font library from the standard X11 distribution + does not work on HP-UX (at least, up to 10.01). The font server + supplied with HP-UX up to 10.01 is also broken. Starting from + HP-UX 10.20 (I don't know about 10.10) they supply a proprietary font + library and the converted fonts work fine with it, provided that + they are configured properly (see the file FONTS.hpux). + +- The fonts.scale files created by the older versions of the + ttf2pt1 installation program (up to release 3.1) have conflicted + with the language definitions of the Xfsft font server and + parts of it included into XFree86. To overcome this incompatibility + the never versions creats the fonts.scale file describing all the + fonts as belonging to the adobe-fontspecific encoding and + the fonts.alias file with the proper names. The drawback of + this solution is that xlsfonts gives the list of twice more + fonts. But as a side effect the option ENFORCEISO in + `convert.cfg' is not required for X11 any more. + +- The conversion script has no support for Eastern multi-plane fonts. + Contribution of such a support would be welcome. + +Ghostscript +=========== + +The fonts generated with ttf2pt1 work fine with Ghostscript by +themselves. The script `x2gs' (or `ttf2pt1_x2gs' when installed +into a public directory, to avoid name conflicts with other +programs) links the font files from the X11 direcotry into the Ghostscript +directory and automatically creates the description file (Fontmap) +in Ghostscript format. + +It's called as: + + x2gs [config-file] + +If the configuration file is not specified as an argument then the file +`convert.cfg' in the current directory is used, just like the +`convert' script does. Indeed, this configuration file is used for +both scripts. + +The Ghostscript-related parameters in the configuration file are: + +DSTDIR - the X11 font directory used by `x2gs' as the + source of the fonts. This parameter is common with the X11 + configuration. + +GSDIR - the base directory of Ghostsript. If this + parameter is set to an empty string then `convert' won't + call `x2gs'. So if you want to get only the X11 fonts + installed then set this parameter to an empty string. This + directory may vary on various system, so please check your + system and set this value accordingly before running the script. + +GSFONTDIR - the font directory of Ghostscript. In the standard + Ghostscript installation it's a subdirectory of GSDIR + but some systems may use completely different directories. + +GSCONFDIR - the configuration subdirectory of Ghostscript + that contains the Fontmap file. + +INSTALLFONTMAP - if the value is set to YES then + install the entries for the new fonts right into the main + Fontmap file. Otherwise just leave the file Fontmap.ttf + in the Ghostscript configuration directory. + + +After preparing the configuration file run the script. It symbolicaly links +all the font files and creates the description file Fontmap.ttf in +GSCONDFIR. After that there are two choices. + +If the option INSTALLFONTMAP was set to YES then +the font descriptions are also automatically installed into the +master Fontmap file. The script is clever enough to +detect if it was run multiple times with the same directories +and if so it replaces the old Fontmap entries with +the new ones instead of just accumulating all of them. You +may also run it multiple times for multiple X11 directories +and all the results will be properly collected in the Fontmap. +But it's your responsibility to watch that the names of the +font files don't overlap. If the X11 font directory gets +renamed then you have to remove its font entries from the +Fontmap and only after that re-run `x2gs' +for the new directory. + +On the other hand if the option INSTALLFONTMAP was set to +NO then go to the GSCONFDIR directory and insert the +contents of Fontmap.ttf into the Fontmap file +manually. This step may be left manual to make the installation +a little bit more safe. + +After that you may also want to redefine some of the aliases in +Fontmap to refer to the newly installed fonts. +But the redefinition of the aliases may be dangerous if the width of +characters in the new font will be different from the old font. +Alas, there is no visible solution of this problem yet. + +MS Windows +=========== + +Ttf2pt1 can be built on Windows either with native compiler or in +POSIX emulation mode. + +Native MS Windows compilers require a different way to build the converter +instead of the Makefile (their make programs commonly are quite weird +and limited in capabilities). An example of batch file winbuild.bat +is provided for MS Visual C/C++. Probably it can be easily adapted for other +32-bit Windows and DOS compilers. The important part is to define the +preprocessor symbol WINDOWS during compilation. + +Cygnus make almost supports full Makefiles but not quite. Seems +like its POSIX support is also of the same quality "almost but not quite". +So another command file cygbuild.sh is provided for Cygnus GNU C, also +with the preprocessor symbol WINDOWS defined. It is intended to be run from +the Cygnus BASH shell. To run the programs produced by the Cygnus compiler +the Cygnus library file CYGWIN1.DLL should be copied first into +C:\WINDOWS. + +To run the accompanying scripts Perl for Windows will be required as well as +other tools from the Cygnus set. + +The Windows support was not particularly tested, so in case of problems with +building or running the converter please let us know. + +The pre-built code (possibly of an older version) of ttf2pt1 for MS Windows is +available from the GnuWin32 project from + +http://gnuwin32.sourceforge.net/packages/ttf2pt1.htm + +Netscape Navigator/Communicator +=============================== + +Basically, the biggest problem with Netscape Navigator is that +it has built-in fixed PostScript font names and built-in fixed +glyph tables for them. Oh, no, that's two! Let's start over: +basically the two biggest problems of Netscape Navigator are +that (one)it has built-in fixed PostScript font names and (two) +built-in fixed glyph tables for them and (three) it always +assumes that the fonts have ISOLatin1 encoding. OK, let's +start over again: basically the three biggest problems of Netscape +Navigator are that (one) it has built-in fixed PostScript font names, +(two) built-in fixed glyph tables for them and (three) it always +assumes that the fonts have ISOLatin1 encoding and (four) it +does not remember the scaled font size between the sessions. +You did not expect such a Spanish Inquisition, did you ? (*) + +Luckily, we have solutions for all of these problems. They are +located in the subdirectory `app/netscape' and described +in app/netscape/README. + + ------- + *) See Monty Python's Flying Circus, episode 15 + +*8* +Netscape and cyrillic fonts +--------------------------- +(courtesy of Zvezdan Petkovic) + +If you use TrueType fonts in your X, as I do, and you always get +KOI8-R encoded pages, then your Netscape does not recognise windows-1251 +encoding. Microsoft TrueType fonts simply declare all encodings they +can support including KOI8-R. For some reason, KOI8-R always wins over +ISO-8859-5 in Netscape under X. If you are reading other cyrillic +languages besides Russian, you might want to either erase KOI8-R entries +from the fonts.dir and fonts.scale files, or alternatively fix Netscape. +I put this line in my .Xdefaults. + + Netscape*documentFonts.charset*koi8-r: iso-8859-5 + +Notice that you can still read Russian sites without trouble because +Netscape translates KOI8-R to ISO-8859-5 on the fly. I read both Russian +and Serbian sites with no trouble. + +Note: If anybody knows the way to tell Netscape under Unix how to +recognise {windows,ibm,cp}-1251 encoded fonts, I'd like to hear about that. + +Linux RPM package +================= + +The spec file for the creation of a Linux RPM package is located in +app/RPM. It has been contributed by Johan Vromans. When +make all is ran in the main directory it among the other +things creates the version of itself adapted to Linux in app/RPM, +you may want to copy that version back to the main directory. + +Warning: Please note that the install section is incomplete, and +the installed scripts won't work until the paths inside them +are corrected. + +FrameMaker +========== + +The fonts and AFM files generated by the version 3.2 and higher +should work with Framemaker without problems. The AFM files +generated by the previous versions of the converter require a +line added to them: + + EncodingScheme FontSpecific + +And the underscores in the font names of the font and AFM files +generated by the older versions may need to be changed to dashes. + +NOTE by Jason Baietto: Ignore the directions in the Frame on-line docs +that say to put a "serverdict begin 0 exitserver" line in the pfa files. +Doing this caused both my printer and ghostscript to choke on the resulting +output from FrameMaker, so I would not advise doing this (though your +mileage may vary). + +StarOffice +========== + +StarOffice 5.1x has been reported to crash if the .afm file contains +spaces in the values of such statements as Version, Weight etc. +These spaces are permitted by the Adobe spec, so this is a problem of +StarOffice. The easiest way to fix these .afm files for StarOffice +is to remove spaces in these strings or remove these strings (in case if +they are optional) at all. This can be done automatically with a sed +script. It seems that StarOffice 5.2 has this problem fixed, so we decided to +spend no efforts on providing workarounds for 5.1 with ttf2pt1. + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux new file mode 100644 index 00000000..585f7943 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux @@ -0,0 +1,107 @@ +Sergey A. Babkin + or +(Do not edit this file, it is generated from FONTS.hpux.html!!!) + +How to install new Type1 fonts on an HP-UX 10.20 machine +-------------------------------------------------------- + +1. Add the font files to /usr/lib/X11/fonts/type1.st/typefaces. + +2. Add the font descriptions to +/usr/lib/X11/fonts/type1.st/typefaces/fonts.scale. Run `mkfontdir' +in /usr/lib/X11/fonts/type1.st/typefaces. In the descriptions +you have to specify the font manufacturer as `misc', like: + + -misc-courier-... + +3. Copy /usr/lib/X11/fonts/type1.st/typefaces/fonts.dir to +/usr/lib/X11/fonts/type1.st/licenses/STSYSTEM/DISPLAYS/fonts.dir. +Better yet, create a symbolic link. + +4. For each font encoding you are going to use create a description +file in /usr/lib/X11/fonts/stadmin/type1/charsets. Of course, if you +are going to use the same fonts in several encodings, the best way +would be to create fair descriptions of charsets and really store +only one encoding in typefaces, all the others will be produced +automatically. That's not difficult at all. +But the simplest way is to just copy the file cp.iso8859-1 +to cp., like cp.koi8-r. + +5. Restart you X server and/or font server. + +What if you don't have the `root' privileges ? +---------------------------------------------- + +You still can run the font server and configure your X server +to get the fonts from it. + +Further let's suppose that the name on which you are going +to run the font server is named `somehost'. Login to it +and configure the font server. + +First, choose some unused port. Numbers around 9000 are a good +choice. Verify that this port is not used by somebody else +by entering + + netstat -naf inet |grep 9000 + +and look what happens. If you get nothing, that's good, this +port is unused. If you get some lines of data, try abother port. + +Go to you home directory $HOME and create some directory for +your font server, say, $HOME/fs. Copy the directory structure +of /usr/lib/X11/fonts/type1.st into $HOME/fs, so that in result +you get $HOME/fs/type1.st/. Copy the directory +structure of /usr/lib/X11/fonts/stadmin/type1/charsets into $HOME/fs, +so that in result you get $HOME/fs/charsets/. +Install the new fonts in these directorues as described above. + +Then create the fontserver configuration file, say, $HOME/fs/xfs.cfg. +The sample contents (supposing that my $HOME is equal to /home/babkin) +is: + +--------------8<----------- cut here ----------------------------- +# font server configuration file +# $XConsortium: config.cpp,v 1.7 91/08/22 11:39:59 rws Exp $ + +rasterizers = /usr/lib/X11/fs/ufstrast.sl,/usr/lib/X11/fs/iforast.sl + +clone-self = off +use-syslog = off +catalogue = /home/babkin/fs/type1.st +# in decipoints +default-point-size = 120 +default-resolutions = 100,100,75,75 +port=9000 +error-file=/home/babkin/fs/fs.err +--------------8<----------- cut here ----------------------------- + +Then create the script to start your font server, say, $HOME/fs/runme: + +--------------8<----------- cut here ----------------------------- +TYPE1_CODEPAGE_DIR=$HOME/fs/charsets +export TYPE1_CODEPAGE_DIR +kill `ps -ef | grep $HOME/\[f\]s/xfs.cfg | awk '{print $2}'`; +nohup xfs -config $HOME/fs/xfs.cfg & +--------------8<----------- cut here ----------------------------- + +Don't forget to make $HOME/fs/runme executable. Then you can +execute it manually or from you .profile. + +After you get your font server running, just execute the following +command (with proper host name and port number) in your X session + + xset fp+ tcp/somehost:9000 + +to get the access to your private font server. You can add this +information to the configuration data of your X server or just +put it also into your .profile. In the latter case the best way +to do that would be like: + +--------------8<----------- cut here ----------------------------- +... +$HOME/fs/runme +sleep 2 # give it some time to start +xset fp+ tcp/somehost:9000 +... +--------------8<----------- cut here ----------------------------- diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux.html b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux.html new file mode 100644 index 00000000..80889cae --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux.html @@ -0,0 +1,197 @@ + + + +How to install new Type1 fonts on an HP-UX 10.20 machine + + + +Sergey A. Babkin +
+ +<babkin@bellatlantic.net> or <sab123@hotmail.com> +

+ + +

+How to install new Type1 fonts on an HP-UX 10.20 machine +

+ + +1. Add the font files to /usr/lib/X11/fonts/type1.st/typefaces. +

+ +2. Add the font descriptions to +/usr/lib/X11/fonts/type1.st/typefaces/fonts.scale. Run `mkfontdir' +in /usr/lib/X11/fonts/type1.st/typefaces. In the descriptions +you have to specify the font manufacturer as `misc', like: +

+ + +  -misc-courier-... + +

+ +3. Copy /usr/lib/X11/fonts/type1.st/typefaces/fonts.dir to +/usr/lib/X11/fonts/type1.st/licenses/STSYSTEM/DISPLAYS/fonts.dir. +Better yet, create a symbolic link. +

+ +4. For each font encoding you are going to use create a description +file in /usr/lib/X11/fonts/stadmin/type1/charsets. Of course, if you +are going to use the same fonts in several encodings, the best way +would be to create fair descriptions of charsets and really store +only one encoding in typefaces, all the others will be produced +automatically. That's not difficult at all. +But the simplest way is to just copy the file cp.iso8859-1 +to cp.<your-encoding-name>, like cp.koi8-r. +

+ +5. Restart you X server and/or font server. +

+ +

+What if you don't have the `root' privileges ? +

+ + +You still can run the font server and configure your X server +to get the fonts from it. +

+ +Further let's suppose that the name on which you are going +to run the font server is named `somehost'. Login to it +and configure the font server. +

+ +First, choose some unused port. Numbers around 9000 are a good +choice. Verify that this port is not used by somebody else +by entering +

+ +

+ netstat -naf inet |grep 9000 +
+ +and look what happens. If you get nothing, that's good, this +port is unused. If you get some lines of data, try abother port. +

+ +Go to you home directory $HOME and create some directory for +your font server, say, $HOME/fs. Copy the directory structure +of /usr/lib/X11/fonts/type1.st into $HOME/fs, so that in result +you get $HOME/fs/type1.st/<whatever was there>. Copy the directory +structure of /usr/lib/X11/fonts/stadmin/type1/charsets into $HOME/fs, +so that in result you get $HOME/fs/charsets/<whatever was there>. +Install the new fonts in these directorues as described above. +

+ +Then create the fontserver configuration file, say, $HOME/fs/xfs.cfg. +The sample contents (supposing that my $HOME is equal to /home/babkin) +is: +

+ + +


+ +# font server configuration file +
+# $XConsortium: config.cpp,v 1.7 91/08/22 11:39:59 rws Exp $ +
+ +
+rasterizers = /usr/lib/X11/fs/ufstrast.sl,/usr/lib/X11/fs/iforast.sl +
+ +
+clone-self = off +
+use-syslog = off +
+catalogue = /home/babkin/fs/type1.st +
+# in decipoints +
+default-point-size = 120 +
+default-resolutions = 100,100,75,75 +
+port=9000 +
+error-file=/home/babkin/fs/fs.err +
+
+ +

+ +Then create the script to start your font server, say, $HOME/fs/runme: +

+ + +


+ +TYPE1_CODEPAGE_DIR=$HOME/fs/charsets +
+export TYPE1_CODEPAGE_DIR +
+kill `ps -ef | grep $HOME/\[f\]s/xfs.cfg | awk '{print $2}'`; +
+nohup xfs -config $HOME/fs/xfs.cfg & +
+
+ +

+ +Don't forget to make $HOME/fs/runme executable. Then you can +execute it manually or from you .profile. +

+ +After you get your font server running, just execute the following +command (with proper host name and port number) in your X session +

+ +

+ xset fp+ tcp/somehost:9000 +
+ +to get the access to your private font server. You can add this +information to the configuration data of your X server or just +put it also into your .profile. In the latter case the best way +to do that would be like: +

+ + +


+ +... +
+$HOME/fs/runme +
+sleep 2 # give it some time to start +
+xset fp+ tcp/somehost:9000 +
+... +
+
+ +

+ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.html b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.html new file mode 100644 index 00000000..352bd069 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.html @@ -0,0 +1,708 @@ + + + +The ttf2pt1 font installation guide + + + +Sergey A. Babkin +
+ +<babkin@bellatlantic.net> or <sab123@hotmail.com> +

+ + + + +

+THE FONT INSTALLATION GUIDE +
+for the TTF to Type1 converter and fonts generated by it +

+ + +There is historically a number of problems with the support of the 8-bit +character encodings. This installation guide pays a lot of attention +to the 8-bit issues, because these issues are responsible for the +most of troubles during the installation of fonts. But they are +not the only things covered in this guide, so it's worth reading +even if all you need is plain ASCII. For convenience of reading +I have marked the paragraphs dealing solely with 8-bit problems +with characters *8*. +

+ +To simplify this installation the distribution package of the +converter contains a number of scripts written in shell and +Perl. So, to run them you will need a shell interpreter (Bourne-shell, +POSIX-shell, Korn-shell are OK, ba-shell is probably also OK but not +tested yet). The Perl scripts were tested with Perl5 but probably +should work with Perl4 too. All the scripts are located in the +`scripts' subdirectory. +

+ +This guide considers the following issues of installation of the +fonts: +

+ + +

+

+ + +

+X11 +

+ + + + + +To simplify the conversion a set of scripts is provided with ttf2pt1. +They are collected in the `scripts' subdirectory. +

+ + +`Convert' is the master conversion script provided with ttf2pt1. +When installed into a public directory it's named `ttf2pt1_convert' +to avoid name collisions with the other programs. +

+ + +It's called as: +

+ + + + +

+ convert [config-file] +
+ + +If the configuration file is not specified as an argument then the file +`convert.cfg' in the current directory is used. This file contains +a set of configuration variables. The distribution contains a sample file +file `convert.cfg.sample'. Please copy it to `convert.cfg', +look inside it and change the configuration variables. The more stable +configuration variables, such as the path names of the scripts and +encoding files are located in `convert' itself, they are +automatically updated when installing ttf2pt1. +

+ +Put all the TTF fonts you want to convert into some directory (this +may be just the directory that already contains all the Windows +fonts on a mounted FAT filesystem). If you have fonts in different +source encoding then put the fonts in each of the encodings +into a separate directory. Up to 10 source directories are +supported. If you (in a rather unlikely case) have more source +directories then you can make two separate runs of the converter, +converting up to 10 directories at a time. +

+ +The variables in the configuration file are: +

+ + + +SRCDIRS - the list of directories (with absolute paths) with + TTF fonts. Each line contains at least 3 fields: the name of the directory, + the language of the fonts in it (if you have fonts for different + languages you have to put them into the separate directories) and the + encoding of the fonts. Again, if you have some of the TTF typefaces in + one encoding, and some in another (say, CP-1251 and KOI-8), you have + to put them into the separate source directories. Some lines may contain + 4 fields. Then the fourth field is the name of the external map to + convert the Unicode fonts into the desirable encoding. This map is + used instead of the built-in map for the specified language. +

+ +*8* +An interesting thing is that some languages have more than one +widely used character encodings. For example, the widely used +encodings for Russian are IBM CP-866 (MS-DOS and Unix), KOI-8 +(Unix and VAX, also the standard Internet encoding), IBM CP-1251 (MS Windows). +That's why I have provided the means to generate the converted fonts +in more than one encoding. See the file encodings/README for +details about the encoding tables. Actually, if you plan to use +these fonts with Netscape Navigator better use the aliases +cp-866 instead of ibm-866 and windows-1251 instead of ibm-1251 +because that's what Netscape wants. +

+ + +DSTDIR - directory for the resulting Type1 fonts. Be careful! + This directory gets completely wiped out before conversion, + so don't use any already existing directory for this purpose. +

+ + +DSTENC{language} - the list of encodings in which the destination + fonts will be generated for each language. Each font of that + language will be generated in each of the specified + encodings. If you don't want any translation, just specify both + SRCENC and DSTENC as iso8859-1 (or if you want any other encoding + specified in the fonts.dir, copy the description of 8859-1 with + new name and use this new name for SRCENC and DSTENC). +

+ + +FOUNDRY - the foundry name to be used in the fonts.dir file. I have + set it to `fromttf' to avoid name conflicts with any existing font for + sure. But this foundry name is not registered in X11 standards and + if you want to get the full standard compliance or have a font server + that enforces such a compliance, use `misc'. +

+ + +The next few parameters control the general behavior of the converter. +They default values are set to something reasonable. +

+ + + +CORRECTWIDTH - if the value is set to YES then use the + converter option -w, otherwise don't use it. See the description of + this option in the README file. +

+ + +REMOVET1A - if the value is set to YES then after + conversion remove the un-encoded .t1a font files and the + intermediate .xpfa font metric files. +

+ + +INSTALLFONTMAP - a Ghostscript parameter, if the value is set to + YES then install the entries for the new fonts + right into the main Fontmap file. Otherwise just leave + the file Fontmap.ttf in the Ghostscript configuration + directory. +

+ + +HINTSUBST - if the value is set to YES use the option + -H, otherwise don't use it. This option enables the + hint substitution technique. If you have not installed the X11 patch + described above, use this option with great caution. See further + description of this option in the README file. +

+ + +ENFORCEISO - if the value is set to YES then + disguise the resulting fonts as the fonts in ISOLatin1 encoding. Historically + this was neccessary due to the way the installer scripts created the + X11 font configuration files. It is not neccessary any more for this + purpose. But if you plan to use these fonts with some other application + that expects ISOLatin1 encoding then better enable this option. +

+ + +ALLGLYPHS - if the value is set to YES then + include all the glyphs from the source fonts into the resulting fonts, even + if these glyphs are inaccessible. If it's set to NO then + include only the glyphs which have codes assigned to them. The glyphs + without codes can not be used directly. But some clever programs, + such as the Type 1 library from XFree86 3.9 and higher can change + the encoding on the fly and use another set of glyphs. If you have not + installed the X11 patch described above, use this option with great + caution. See further description of the option option -a in the + README file. +

+ + +GENUID - if the value is set to YES then use + the option -uA of the converter to generate UniqueIDs for + the converted fonts. The standard X11 Type 1 library does not use + this ID, so it may only be neccessary for the other applications. + The script is clever enough to generate different UniqueID for the + same font converted to multiple encodings. Also after conversion it + checks all the fonts generacted during the session for duplicated + UniqueID and shows those. Still, this does not quarantee that these + UniqueIDs won't overlap with some other fonts. The UniqueIDs are + generated as hash values from the font names, so it's guaranteed + that if the `convert' script runs multiple times it will + generate the same UniqueIDs during each run. See further description + of this option in the README file. +

+ + +GENUID - if the value is set to YES then create + the .pfb files, otherwise the .pfa files. The .pfb + files are more compact but contain binary data, so you may experience some + troubles when transferring them through the network. +

+ + +The following parameters are used to locate the other scripts and +configuration files. By default the scripts do a bit of guessing for them: +they search in the ttf2pt1 installation directory if ttf2pt1 +was installed or otherwise suppose that you are running `convert' with +`scripts' subdirectory being the current directory. +

+ + + +ENCDIR - directory containing the descriptions of encodings +
+ +MAPDIR - directory containing the external map files +

+ + +Besides that a few parameters are built into the `convert' script itself. +You probably won't need to change them: +

+ + + +T1ASM, TTF2PT1, TRANS, T1FDIR, FORCEISO - paths to the other script +

+ + +Also there are a few parameters controlling the installation of +fonts for Ghostscript. Please look at their description in the +Ghostscript section of documentation or in the ttf2pt1_x2gs(1) +manual page before running `convert'. If these parameters are +set, `convert' will call the `x2gs' script automatically +to install the newly converted fonts in Ghostscript. +

+ +After creating the configuration file run the `convert' script. Look at +the result and the log file in DSTDIR. +

+ +Add the directory with newly converted fonts to the configuration +of X server or font server. For most of the systems this step is +very straightforward. For HP-UX it's rather tricky and poorly +documented, so the file FONTS.hpux gives a short description. +

+ +If you don't have the privileges of the root user, you still can +configure your private font server. Just use some non-standard +port number (see FONTS.hpux for an example, exept that you won't +need all the HP-related stuff on any other system). +

+ + +

+Known Problems +

+ + + + +
    +
  • One catch is that the X11 Type 1 font library has a rather low limit + on the font size. Because of this the fonts with more complicated + outlines and the enabled hint substitution may not fit into + this limit. The same applies to the fonts with very complicated + outlines or with very many glyphs (especially the fonts with + over 256 glyphs). So you will need to excercise caution with + these options if you plan using these fonts with X11. Some vendors + such as HP provide the Type 1 implementation licensed from Adobe + which should have no such problem. +

    + + But there is a solution even for the generic X11. A patch located + in the subdirectory `app/X11' fixes this problem as well + as some other minor problems. Its description is provided in + app/X11/README. +

    + + To fix the X11 font library, you have to get the X11 sources. I + can recommend the ftp sites of the XFree86 project ftp://ftp.xfree86.org + or of the Open Group ftp://ftp.x.org. This patch was made on the sources + of XFree86 so you may have better success with applying it to the + XFree86 distribution. After you have got the sources, make sure + that you can compile them. Then apply the patch as described. + Make sure that it was applied properly. Compile the sources again + (actually, you need only the fonts library, the fonts server, and + possibly the X server). It would be prudent now to save your old + font library, font server and, possibly, X server. Then install + the new recently compiled versions of these files. Of course, + if you know someone who already has compiled these files for the + same OS as yours, you can just copy the binary fles from him. +

    + + Alas, building the X11 system from the source code is not the + easiest thing in the world and if you have no experience it + can be quite difficult. In this case just avoid the aforementioned + features or check each converted font to make sure that it + works properly. +

    + +

  • The Type1 font library from the standard X11 distribution + does not work on HP-UX (at least, up to 10.01). The font server + supplied with HP-UX up to 10.01 is also broken. Starting from + HP-UX 10.20 (I don't know about 10.10) they supply a proprietary font + library and the converted fonts work fine with it, provided that + they are configured properly (see the file FONTS.hpux). +

    + +

  • The fonts.scale files created by the older versions of the + ttf2pt1 installation program (up to release 3.1) have conflicted + with the language definitions of the Xfsft font server and + parts of it included into XFree86. To overcome this incompatibility + the never versions creats the fonts.scale file describing all the + fonts as belonging to the adobe-fontspecific encoding and + the fonts.alias file with the proper names. The drawback of + this solution is that xlsfonts gives the list of twice more + fonts. But as a side effect the option ENFORCEISO in + `convert.cfg' is not required for X11 any more. +

    + +

  • The conversion script has no support for Eastern multi-plane fonts. + Contribution of such a support would be welcome. +

    +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Ghostscript +

+ + + + + + +The fonts generated with ttf2pt1 work fine with Ghostscript by +themselves. The script `x2gs' (or `ttf2pt1_x2gs' when installed +into a public directory, to avoid name conflicts with other +programs) links the font files from the X11 direcotry into the Ghostscript +directory and automatically creates the description file (Fontmap) +in Ghostscript format. + + +It's called as: +

+ + + + +

+ x2gs [config-file] +
+ + +If the configuration file is not specified as an argument then the file +`convert.cfg' in the current directory is used, just like the +`convert' script does. Indeed, this configuration file is used for +both scripts. +

+ +The Ghostscript-related parameters in the configuration file are: +

+ +DSTDIR - the X11 font directory used by `x2gs' as the + source of the fonts. This parameter is common with the X11 + configuration. +

+ +GSDIR - the base directory of Ghostsript. If this + parameter is set to an empty string then `convert' won't + call `x2gs'. So if you want to get only the X11 fonts + installed then set this parameter to an empty string. This + directory may vary on various system, so please check your + system and set this value accordingly before running the script. +

+ +GSFONTDIR - the font directory of Ghostscript. In the standard + Ghostscript installation it's a subdirectory of GSDIR + but some systems may use completely different directories. +

+ +GSCONFDIR - the configuration subdirectory of Ghostscript + that contains the Fontmap file. +

+ +INSTALLFONTMAP - if the value is set to YES then + install the entries for the new fonts right into the main + Fontmap file. Otherwise just leave the file Fontmap.ttf + in the Ghostscript configuration directory. +

+ + +After preparing the configuration file run the script. It symbolicaly links +all the font files and creates the description file Fontmap.ttf in +GSCONDFIR. After that there are two choices. +

+ +If the option INSTALLFONTMAP was set to YES then +the font descriptions are also automatically installed into the +master Fontmap file. The script is clever enough to +detect if it was run multiple times with the same directories +and if so it replaces the old Fontmap entries with +the new ones instead of just accumulating all of them. You +may also run it multiple times for multiple X11 directories +and all the results will be properly collected in the Fontmap. +But it's your responsibility to watch that the names of the +font files don't overlap. If the X11 font directory gets +renamed then you have to remove its font entries from the +Fontmap and only after that re-run `x2gs' +for the new directory. +

+ +On the other hand if the option INSTALLFONTMAP was set to +NO then go to the GSCONFDIR directory and insert the +contents of Fontmap.ttf into the Fontmap file +manually. This step may be left manual to make the installation +a little bit more safe. +

+ +After that you may also want to redefine some of the aliases in +Fontmap to refer to the newly installed fonts. +But the redefinition of the aliases may be dangerous if the width of +characters in the new font will be different from the old font. +Alas, there is no visible solution of this problem yet. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+MS Windows +

+ + +Ttf2pt1 can be built on Windows either with native compiler or in +POSIX emulation mode. +

+ +Native MS Windows compilers require a different way to build the converter +instead of the Makefile (their make programs commonly are quite weird +and limited in capabilities). An example of batch file winbuild.bat +is provided for MS Visual C/C++. Probably it can be easily adapted for other +32-bit Windows and DOS compilers. The important part is to define the +preprocessor symbol WINDOWS during compilation. +

+ +Cygnus make almost supports full Makefiles but not quite. Seems +like its POSIX support is also of the same quality "almost but not quite". +So another command file cygbuild.sh is provided for Cygnus GNU C, also +with the preprocessor symbol WINDOWS defined. It is intended to be run from +the Cygnus BASH shell. To run the programs produced by the Cygnus compiler +the Cygnus library file CYGWIN1.DLL should be copied first into +C:\WINDOWS. +

+ +To run the accompanying scripts Perl for Windows will be required as well as +other tools from the Cygnus set. +

+ +The Windows support was not particularly tested, so in case of problems with +building or running the converter please let us know. +

+ +The pre-built code (possibly of an older version) of ttf2pt1 for MS Windows is +available from the GnuWin32 project from + +http://gnuwin32.sourceforge.net/packages/ttf2pt1.htm +

+ + +

+Netscape Navigator/Communicator +

+ + +Basically, the biggest problem with Netscape Navigator is that +it has built-in fixed PostScript font names and built-in fixed +glyph tables for them. Oh, no, that's two! Let's start over: +basically the two biggest problems of Netscape Navigator are +that (one)it has built-in fixed PostScript font names and (two) +built-in fixed glyph tables for them and (three) it always +assumes that the fonts have ISOLatin1 encoding. OK, let's +start over again: basically the three biggest problems of Netscape +Navigator are that (one) it has built-in fixed PostScript font names, +(two) built-in fixed glyph tables for them and (three) it always +assumes that the fonts have ISOLatin1 encoding and (four) it +does not remember the scaled font size between the sessions. +You did not expect such a Spanish Inquisition, did you ? (*) +

+ +Luckily, we have solutions for all of these problems. They are +located in the subdirectory `app/netscape' and described +in app/netscape/README. +

+ + +  -------
+  *) See Monty Python's Flying Circus, episode 15
+

+ +*8* +

+Netscape and cyrillic fonts
+ +(courtesy of Zvezdan Petkovic) +

+ +If you use TrueType fonts in your X, as I do, and you always get +KOI8-R encoded pages, then your Netscape does not recognise windows-1251 +encoding. Microsoft TrueType fonts simply declare all encodings they +can support including KOI8-R. For some reason, KOI8-R always wins over +ISO-8859-5 in Netscape under X. If you are reading other cyrillic +languages besides Russian, you might want to either erase KOI8-R entries +from the fonts.dir and fonts.scale files, or alternatively fix Netscape. +I put this line in my .Xdefaults. +

+ +

+ Netscape*documentFonts.charset*koi8-r: iso-8859-5 +
+

+ +Notice that you can still read Russian sites without trouble because +Netscape translates KOI8-R to ISO-8859-5 on the fly. I read both Russian +and Serbian sites with no trouble. +

+ +Note: If anybody knows the way to tell Netscape under Unix how to +recognise {windows,ibm,cp}-1251 encoded fonts, I'd like to hear about that. +

+ + +

+Linux RPM package +

+ + +The spec file for the creation of a Linux RPM package is located in +app/RPM. It has been contributed by Johan Vromans. When +make all is ran in the main directory it among the other +things creates the version of itself adapted to Linux in app/RPM, +you may want to copy that version back to the main directory. +

+ +Warning: Please note that the install section is incomplete, and +the installed scripts won't work until the paths inside them +are corrected. +

+ + +

+FrameMaker +

+ + +The fonts and AFM files generated by the version 3.2 and higher +should work with Framemaker without problems. The AFM files +generated by the previous versions of the converter require a +line added to them: +

+ +  EncodingScheme FontSpecific +

+ +And the underscores in the font names of the font and AFM files +generated by the older versions may need to be changed to dashes. +

+ +NOTE by Jason Baietto: Ignore the directions in the Frame on-line docs +that say to put a "serverdict begin 0 exitserver" line in the pfa files. +Doing this caused both my printer and ghostscript to choke on the resulting +output from FrameMaker, so I would not advise doing this (though your +mileage may vary). +

+ + +

+StarOffice +

+ + +StarOffice 5.1x has been reported to crash if the .afm file contains +spaces in the values of such statements as Version, Weight etc. +These spaces are permitted by the Adobe spec, so this is a problem of +StarOffice. The easiest way to fix these .afm files for StarOffice +is to remove spaces in these strings or remove these strings (in case if +they are optional) at all. This can be done automatically with a sed +script. It seems that StarOffice 5.2 has this problem fixed, so we decided to +spend no efforts on providing workarounds for 5.1 with ttf2pt1. +

+ + + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/Makefile b/application/third_party/dompdf/lib/ttf2ufm/src/Makefile new file mode 100644 index 00000000..3a81cdc8 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/Makefile @@ -0,0 +1,279 @@ + +# This file should be configured before running `make'. +# Uncomment or change the values that are relevant for your OS. + +# The preferred C compiler (by default use the OS-specific default value). +# For BSD/OS, FreeBSD, Linux (all flavors), NetBSD, OpenBSD the default +# compiler is GNU C. +# (Note please the politically correct ordering by alphabet ! :-) +# +# Use GNU C even if it's not the default compiler +# +#CC=gcc +# +# Use the standard ANSI C compiler on HP-UX even if it's not default +# +#CC=c89 + +# +# The system-dependent flags for the C compiler +# +# Default + +CFLAGS_SYS= -g + +# For GNU C +# +#CFLAGS_SYS= -O2 +# +# For GNU C with long options support library (Linux etc.) +# +#CFLAGS_SYS= -O2 -D_GNU_SOURCE +# +# For GNU C on HP-UX/PA-RISC 1.1 +# +#CFLAGS_SYS= -O2 -Wa,-w +# +# For the standard ANSI C on HP-UX +# +#CFLAGS_SYS= +O2 -D_HPUX_SOURCE + +# +# The system-dependent libraries +# +# Defalut (for the BSD-style OSes) + +LIBS_SYS= -lm + +# For SystemV (such as SCO, UnixWare, Solaris, but _NOT_ Linux or HP-UX) +# +#LIBS_SYS= -lm -lsocket + +# +# The flags for C compiler for the FreeType-2 library (disabled by default). +# This WON'T BUILD with FT2-beta8, use the FreeType release 2.0.4 +# http://download.sourceforge.net/freetype/freetype-2.0.4.tar.gz + +#CFLAGS_FT= + +# To enable use of the FreeType-2 library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment LIBS_FT +# +CFLAGS_FT = -DUSE_FREETYPE -I/usr/include/freetype2 -I/usr/include + +# +# The FreeType-2 library flags (disabled by default) + +#LIBS_FT= + +# To enable use of the FreeType-2 library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment CFLAGS_FT +# +LIBS_FT= -L/usr/lib -lfreetype + +# +# The flags for C compiler for the Autotrace library (disabled by default). +# USE OF THIS FEATURE IS STRONGLY DISCOURAGED, THE BUILT-IN TRACING +# (AKA VECTORIZATION) PROVIDES MUCH BETTER RESULTS. +# The tested version is 0.29a (and the fonts produced with it are +# absolutely not usable). +# http://download.sourceforge.net/autotrace/autotrace-0.29.tar.gz + +CFLAGS_AT= + +# To enable use of the Autotrace library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment LIBS_AT +# +#CFLAGS_AT = -DUSE_AUTOTRACE -I/usr/local/include + +# +# The Autotrace library flags (disabled by default) + +LIBS_AT= + +# To enable use of the Autotrace library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment CFLAGS_AT +# +#LIBS_AT= -L/usr/local/lib -lautotrace + +# +# Preference of front-ends if multiple parsers match a file +# (by default the build-in front-end takes preference over FreeType) + +CFLAGS_PREF= + +# To prefer FreeType (if enabled): +# +#CFLAGS_PREF= -DPREFER_FREETYPE + +# Uncomment the second line to not compile t1asm into ttf2pt1 +CFLAGS_EXTT1ASM= +#CFLAGS_EXTT1ASM= -DEXTERNAL_T1ASM + +CFLAGS= $(CFLAGS_SYS) $(CFLAGS_FT) $(CFLAGS_AT) $(CFLAGS_PREF) +LIBS= $(LIBS_SYS) $(LIBS_FT) $(LIBS_AT) + +# Installation-related stuff +# +# The base dir for installation and subdirs in it +INSTDIR = /usr/local +# for binaries +BINDIR = $(INSTDIR)/bin +# for binaries of little general interest +LIBXDIR = $(INSTDIR)/libexec/ttf2pt1 +# for scripts, maps/encodings etc. +SHAREDIR = $(INSTDIR)/share/ttf2pt1 +MANDIR = $(INSTDIR)/man + +# owner and group of installed files +OWNER = root +GROUP = bin + +# After you have configured the Makefile, comment out the following +# definition: +warning: docs + @echo >&2 + @echo " You have to configure the Makefile before running make!" >&2 + @echo "(or if you are lazy and hope that it will work as is run \`make all')">&2 + @echo >&2 + +DOCS=CHANGES README FONTS FONTS.hpux encodings/README other/README \ + app/X11/README app/netscape/README app/TeX/README + +SUBDIRS = app encodings maps scripts other +TXTFILES = README* FONTS* CHANGES* COPYRIGHT + +MANS1=ttf2pt1.1 ttf2pt1_convert.1 ttf2pt1_x2gs.1 +MANS=$(MANS1) $(MANS5) + +all: t1asm ttf2pt1 docs mans rpm + +docs: $(DOCS) + +mans: $(MANS) + +clean: + rm -f t1asm ttf2pt1 *.o app/RPM/Makefile app/RPM/*.spec *.core core.* core + ( cd other && make clean; ) + ( cd app/netscape && make clean; ) + +veryclean: clean + rm -f $(DOCS) $(MANS) + +rpm: app/RPM/Makefile app/RPM/ttf2pt1.spec + +ttf2pt1.1: README.html + scripts/html2man . . app/RPM/Makefile + +app/RPM/ttf2pt1.spec: app/RPM/ttf2pt1.spec.src version.h + sed 's/^Version:.*/Version: '`grep TTF2PT1_VERSION version.h| cut -d\" -f2`'/' $@ + +t1asm: t1asm.c + $(CC) $(CFLAGS) -o t1asm -DSTANDALONE t1asm.c $(LIBS) + +ttf2pt1.o: ttf2pt1.c ttf.h pt1.h global.h version.h + $(CC) $(CFLAGS) -c ttf2pt1.c + +pt1.o: pt1.c ttf.h pt1.h global.h + $(CC) $(CFLAGS) -c pt1.c + +ttf.o: ttf.c ttf.h pt1.h global.h + $(CC) $(CFLAGS) -c ttf.c + +ft.o: ft.c pt1.h global.h + $(CC) $(CFLAGS) -c ft.c + +bdf.o: bdf.c pt1.h global.h + $(CC) $(CFLAGS) -c bdf.c + +bitmap.o: bitmap.c pt1.h global.h + $(CC) $(CFLAGS) -c bitmap.c + +runt1asm.o: runt1asm.c global.h + $(CC) $(CFLAGS) $(CFLAGS_EXTT1ASM) -c runt1asm.c + +ttf2pt1: ttf2pt1.o pt1.o runt1asm.o ttf.o ft.o bdf.o bitmap.o + $(CC) $(CFLAGS) -o ttf2pt1 ttf2pt1.o pt1.o runt1asm.o ttf.o ft.o bdf.o bitmap.o $(LIBS) + +CHANGES: CHANGES.html + scripts/unhtml CHANGES + +README: README.html + scripts/unhtml README + +encodings/README: encodings/README.html + scripts/unhtml encodings/README + +other/README: other/README.html + scripts/unhtml other/README + +app/X11/README: app/X11/README.html + scripts/unhtml app/X11/README + +app/netscape/README: app/netscape/README.html + scripts/unhtml app/netscape/README + +app/TeX/README: app/TeX/README.html + scripts/unhtml app/TeX/README + +FONTS: FONTS.html + scripts/unhtml FONTS + +FONTS.hpux: FONTS.hpux.html + scripts/unhtml FONTS.hpux + +install: all + scripts/inst_dir $(BINDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(LIBXDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(SHAREDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(MANDIR)/man1 $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(MANDIR)/man5 $(OWNER) $(GROUP) 0755 + cp -R $(TXTFILES) $(SUBDIRS) $(SHAREDIR) + chown -R $(OWNER) $(SHAREDIR) + chgrp -R $(GROUP) $(SHAREDIR) + chmod -R go-w $(SHAREDIR) + scripts/inst_file ttf2pt1 $(BINDIR)/ttf2pt1 $(OWNER) $(GROUP) 0755 + [ -f $(BINDIR)/t1asm ] || scripts/inst_file t1asm $(LIBXDIR)/t1asm $(OWNER) $(GROUP) 0755 + sed -e 's|^TTF2PT1_BINDIR=$$|TTF2PT1_BINDIR=$(BINDIR)|;' \ + -e 's|^TTF2PT1_LIBXDIR=$$|TTF2PT1_LIBXDIR=$(LIBXDIR)|;' \ + -e 's|^TTF2PT1_SHAREDIR=$$|TTF2PT1_SHAREDIR=$(SHAREDIR)|;' cvt.tmp + scripts/inst_file cvt.tmp $(BINDIR)/ttf2pt1_convert $(OWNER) $(GROUP) 0755 + scripts/inst_file cvt.tmp $(SHAREDIR)/scripts/convert $(OWNER) $(GROUP) 0755 + rm cvt.tmp + scripts/inst_file scripts/x2gs $(BINDIR)/ttf2pt1_x2gs $(OWNER) $(GROUP) 0755 + for i in $(MANS1); do { \ + sed -e 's|TTF2PT1_BINDIR|$(BINDIR)|;' \ + -e 's|TTF2PT1_LIBXDIR|$(LIBXDIR)|;' \ + -e 's|TTF2PT1_SHAREDIR|$(SHAREDIR)|;' <$$i >$(MANDIR)/man1/$$i \ + && chown $(OWNER) $(MANDIR)/man1/$$i \ + && chgrp $(GROUP) $(MANDIR)/man1/$$i \ + && chmod 0644 $(MANDIR)/man1/$$i \ + || exit 1; \ + } done + +uninstall: + rm -f $(BINDIR)/ttf2pt1 $(BINDIR)/ttf2pt1_convert $(BINDIR)/ttf2pt1_x2gs + rm -rf $(LIBXDIR) + rm -rf $(SHAREDIR) + for i in $(MANS1); do { \ + rm -f $(MANDIR)/man1/$$i $(MANDIR)/man1/$$i.gz; \ + } done + + +# targets for automatic generation of releases and snapshots + +snapshot: + scripts/mkrel snapshot + +release: + scripts/mkrel release diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/README b/application/third_party/dompdf/lib/ttf2ufm/src/README new file mode 100644 index 00000000..f1cf5b67 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/README @@ -0,0 +1,814 @@ +TTF2PT1 - A True Type to PostScript Type 1 Font Converter + +(Do not edit this file, it is generated from README.html!!!) +[ + Based on ttf2pfa by Andrew Weeks, and help from Frank Siegert. + Modification by Mark Heath. + Further modification by Sergey Babkin. + The Type1 assembler by I. Lee Hetherington with modifications by + Kai-Uwe Herbing. +] + +Ever wanted to install a particular font on your XServer but only could find +the font you are after in True Type Format? + +Ever asked comp.fonts for a True Type to Type 1 converter and got a List +of Commercial software that doesn't run on your Operating System? + +Well, this program should be the answer. This program is written in C (so it +should be portable) and therefore should run on any OS. The only limitation +is that the program requires some method of converting Big endian integers into +local host integers so the network functions ntohs and ntohl are used. These +can be replaced by macros if your platform doesn't have them. +Of course the target platform requires a C compiler and command line ability. + +Ttf2pt1 is a font converter from the True Type format (and some other formats +supported by the FreeType library as well) to the Adobe Type1 format. + +The versions 3.0 and later got rather extensive post-processing algorithm that +brings the converted fonts to the requirements of the Type1 standard, tries to +correct the rounding errors introduced during conversions and some simple +kinds of bugs that are typical for the public domain TTF fonts. It +also generates the hints that enable much better rendering of fonts in +small sizes that are typical for the computer displays. But everything +has its price, and some of the optimizations may not work well for certain +fonts. That's why the options were added to the converter, to control +the performed optimizations. + +The converter is simple to run, just: + + ttf2pt1 [-options] ttffont.ttf [Fontname] +or + ttf2pt1 [-options] ttffont.ttf - + +The first variant creates the file Fontname.pfa (or Fontname.pfb if the +option '-b' was used) with the converted font and Fontname.afm with the +font metrics, the second one prints the font or another file (if the option +'-G' was used) on the standard output from where it can be immediately +piped through some filter. If no Fontname is specified for the first +variant, the name is generated from ttffont by replacing the .ttf +filename suffix. + +Most of the time no options are neccessary (with a possible exception +of '-e'). But if there are some troubles with the resulting font, they +may be used to control the conversion. +The options are: + +-a - Include all the glyphs from the source file into the converted + file. If this option is not specified then only the glyphs that have + been assigned some encoding are included, because the rest of glyphs + would be inaccessible anyway and would only consume the disk space. + But some applications are clever enough to change the encoding on + the fly and thus use the other glyphs, in this case they could + benefit from using this option. But there is a catch: the X11 library + has rather low limit for the font size. Including more glyphs increases + the file size and thus increases the chance of hitting this limit. + See app/X11/README for the description of a + patch to X11 which fixes this problem. + +-b - Encode the resulting font to produce a ready .pfb file. + +-d suboptions - Debugging options. The suboptions are: + + a - Print out the absolute coordinates of dots in outlines. Such + a font can not be used by any program (that's why this option is + incompatible with '-e') but it has proven to be a valuable debuging + information. + + r - Do not reverse the direction of outlines. The TTF fonts have + the standard direction of outlines opposite to the Type1 fonts. So + they should be reversed during proper conversion. This option + may be used for debugging or to handle a TTF font with wrong + direction of outlines (possibly, converted in a broken way from + a Type1 font). The first signs of the wrong direction are the + letters like "P" or "B" without the unpainted "holes" inside. + +-e - Assemble the resulting font to produce a ready .pfa file. + [ S.B.: Personally I don't think that this option is particularly useful. + The same result may be achieved by piping the unassembled data + through t1asm, the Type 1 assembler. And, anyways, it's good to + have the t1utils package handy. But Mark and many users think that + this functionality is good and it took not much time to add this option. ] + +-F - Force the Unicode encoding: any type of MS encoding specified + in the font is ignored and the font is treated like it has Unicode + encoding. WARNING: this option is intended for buggy fonts + which actually are in Unicode but are marked as something else. The + effect on the other fonts is unpredictable. + +-G suboptions - File generation options. The suboptions may be lowercase + or uppercase, the lowercase ones disable the generation of particular + files, the corresponding uppercase suboptions enable the generation of the + same kind of files. If the result of ttf2pt1 is requested to be printed on + the standard output, the last enabling suboption of -G determines + which file will be written to the standard output and the rest of files + will be discarded. For example, -G A will request the AFM file. + The suboptions to disable/enable the generation of the files are: + + f/F - The font file. Depending on the other options this file + will have one of the suffixes .t1a, .pfa or .pfb. If the conversion result + is requested on the standard output ('-' is used as the output file name) + then the font file will also be written there by default, if not overwritten + by another suboption of -G. + Default: enabled + + a/A - The Adobe font metrics file (.afm). + Default: enabled + + e/E - The dvips encoding file (.enc). + Default: disabled + + +-l language[+argument] - Extract the fonts for the specified language from a + multi-language Unicode font. If this option is not used the converter + tries to guess the language by the values of the shell variable LANG. + If it is not able to guess the language by LANG it tries all the + languages in the order they are listed. + + After the plus sign an optional argument for the language extractor + may be specified. The format of the argument is absolutely up to + the particular language converter. The primary purpose of the + argument is to support selection of planes for the multi-plane + Eastern encodings but it can also be used in any other way. The + language extractor may decide to add the plane name in some form + to the name of the resulting font. None of the currently supported + languages make any use of the argument yet. + + As of now the following languages are supported: + latin1 - for all the languages using the Latin-1 encoding + latin2 - for the Central European languages + latin4 - for the Baltic languages + latin5 - for the Turkish language + cyrillic - for the languages with Cyrillic alphabet + russian - historic synonym for cyrillic + bulgarian - historic synonym for cyrillic + adobestd - for the AdobeStandard encoding used by TeX + plane+argument - to select one plane from a multi-byte encoding + + The argument of the "plane" language may be in one of three forms: + plane+pid=,eid= + plane+pid=,eid=, + plane+ + + Pid (TTF platform id) and eid (TTF encoding id) select a particular + TTF encoding table in the original font. They are specified as decimal + numbers. If this particular encoding table is not present in the font + file then the conversion fails. The native ("ttf") front-end parser supports + only pid=3 (Windows platform), the FreeType-based ("ft") front-end supports + any platform. If pid/eid is not specified then the TTF encoding table is + determined as usual: Unicode encoding if it's first or an 8-bit encoding + if not (and for an 8-bit encoding the plane number is silently ignored). + To prevent the converter from falling back to an 8-bit encoding, specify + the Unicode pid/eid value explicitly. + + Plane_number is a hexadecimal (if starts with "0x") or decimal number. + It gives the values of upper bytes for which 256 characters will be + selected. If not specified, defaults to 0. It is also used as a font + name suffix (the leading "0x" is not included into the suffix). + + NOTE: + It seems that many Eastern fonts use features of the TTF format that are + not supported by the ttf2pt1's built-in front-end parser. Because of + this for now we recommend using the FreeType-based parser (option + '-p ft') with the "plane" language. + + NOTE: + You may notice that the language names are not uniform: some are the + names of particular languages and some are names of encodings. This + is because of the different approaches. The original idea was to + implement a conversion from Unicode to the appropriate Windows + encoding for a given language. And then use the translation tables + to generate the fonts in whatever final encodings are needed. This + would allow to pile together the Unicode fonts and the non-Unicode + Windows fonts for that language and let the program to sort them out + automatically. And then generate fonts in all the possible encodings + for that language. An example of this approach is the Russian language + support. But if there is no multiplicity of encodings used for some + languages and if the non-Unicode fonts are not considered important + by the users, another way would be simpler to implement: just provide + only one table for extraction of the target encoding from Unicode + and don't bother with the translation tables. The latin* "languages" + are examples of this approach. If somebody feels that he needs the + Type1 fonts both in Latin-* and Windows encodings he or she is absolutely + welcome to submit the code to implement it. + + WARNING: + Some of the glyphs included into the AdobeStandard encoding are not + included into the Unicode standard. The most typical examples of such + glyphs are ligatures like 'fi', 'fl' etc. Because of this the font + designers may place them at various places. The converter tries to + do its best, if the glyphs have honest Adobe names and/or are + placed at the same codes as in the Microsoft fonts they will be + picked up. Otherwise a possible solution is to use the option '-L' + with an external map. + +-L file[+[pid=,eid=,][plane]] - Extract the fonts for the specified + language from a multi-language font using the map from this file. This is + rather like the option '-l' but the encoding map is not + compiled into the program, it's taken from that file, so it's + easy to edit. Examples of such files are provided in + maps/adobe-standard-encoding.map, CP1250.map. (NOTE: + the 'standard encoding' map does not include all the glyphs of the + AdobeStandard encoding, it's provided only as an example.) The + description of the supported map formats is in the file + maps/unicode-sample.map. + + Likewise to '-l', an argument may be specified after the map file + name. But in this case the argument has fixed meaning: it selects the + original TTF encoding table (the syntax is the same as in '-l plane') + and/or a plane of the map file. The plane name also gets added after dash + to the font name. The plane is a concept used in the Eastern fonts with big + number of glyphs: one TTF font gets divided into multiple Type1 fonts, + each containing one plane of up to 256 glyphs. But with a little + creativity this concept may be used for other purposes of combining + multiple translation maps into one file. To extract multiple planes + from a TTF font ttf2pt1 must be run multiple times, each time with + a different plane name specified. + + The default original TTF encoding table used for the option '-L' is + Unicode. The map files may include directives to specify different original + TTF encodings. However if the pid/eid pair is specified with + it overrides any original encoding specified in the map file. + +-m type=value - Set maximal or minimal limits of resources. + These limits control the the font generation by limiting the resources + that the font is permitted to require from the PostScript interpreter. + The currently supported types of limits are: + + h - the maximal hint stack depth for the substituted hints. + The default value is 128, according to the limitation in X11. This seems to + be the lowest (and thus the safest) widespread value. To display the + hint stack depth required by each glyph in a .t1a file use the script + scripts/cntstems.pl. + +-O suboptions - Outline processing options. The suboptions + may be lowercase or uppercase, the lowercase ones disable the features, + the corresponding uppercase suboptions enable the same features. + The suboptions to disable/enable features are: + + b/B - Guessing of the ForceBold parameter. This parameter helps + the Type1 engine to rasterize the bold fonts properly at small sizes. + But the algorithm used to guess the proper value of this flag makes + that guess based solely on the font name. In rare cases that may cause + errors, in these cases you may want to disable this guessing. + Default: enabled + + h/H - Autogeneration of hints. The really complex outlines + may confuse the algorithm, so theoretically it may be useful + sometimes to disable them. Although up to now it seems that + even bad hints are better than no hints at all. + Default: enabled + + u/U - Hint substitution. Hint substitution is a technique + permitting generation of more detailed hints for the rasterizer. It allows + to use different sets of hints for different parts of a glyph and change + these sets as neccessary during rasterization (that's why "substituted"). + So it should improve the quality of the fonts rendered at small sizes. + But there are two catches: First, the X11 library has rather low limit for + the font size. More detailed hints increase the file size and thus increase + the chance of hitting this limit (that does not mean that you shall hit it + but you may if your fonts are particularly big). This is especially + probable for Unicode fonts converted with option '-a', so you may want to + use '-a' together with '-Ou'. See app/X11/README for the description of + a patch to X11 which fixes this problem. Second, some rasterizers (again, + X11 is the typical example) have a limitation for total number of hints + used when drawing a glyph (also known as the hint stack depth). If that + stack overflows the glyph is ignored. Starting from version 3.22 ttf2pt1 + uses algorithms to minimizing this depth, with the trade-off of slightly + bigger font files. The glyphs which still exceed the limit set by option + '-mh' have all the substituted hints removed and only base hints left. + The algorithms seem to have been refined far enough to make the fonts with + substituted hints look better than the fonts without them or at least the + same. Still if the original fonts are not well-designed the detailed + hinting may emphasize the defects of the design, such as non-even thickness + of lines. So provided that you are not afraid of the X11 bug the best idea + would be to generate a font with this feature and without it, then compare + the results using the program other/cmpf (see the description + in other/README) and decide which one looks better. + Default: enabled + + o/O - Space optimization of the outlines' code. This kind of optimization + never hurts, and the only reason to disable this feature is for comparison + of the generated fonts with the fonts generated by the previous versions of + converter. Well, it _almost_ never hurts. As it turned out there exist + some brain-damaged printers which don't understand it. Actually this + feature does not change the outlines at all. The Type 1 font manual + provides a set of redundant operators that make font description shorter, + such as '10 hlineto' instead of '0 10 rlineto' to describe a horizontal + line. This feature enables use of these operators. + Default: enabled + + s/S - Smoothing of outlines. If the font is broken in some + way (even the ones that are not easily noticeable), such smoothing + may break it further. So disabling this feature is the first thing to be + tried if some font looks odd. But with smoothing off the hint generation + algorithms may not work properly too. + Default: enabled + + t/T - Auto-scaling to the 1000x1000 Type1 standard matrix. The + TTF fonts are described in terms of an arbitrary matrix up to + 4000x4000. The converted fonts must be scaled to conform to + the Type1 standard. But the scaling introduces additional rounding + errors, so it may be curious sometimes to look at the font in its + original scale. + Default: enabled + + v/V - Do vectorization on the bitmap fonts. Functionally + "vectorization" is the same thing as "autotracing", a different word is + used purely to differentiate it from the Autotrace library. It tries to + produce nice smooth outlines from bitmaps. This feature is still a work + in progress though the results are already mostly decent. + Default: disabled + + w/W - Glyphs' width corection. This option is designed to be + used on broken fonts which specify too narrow widths for the + letters. You can tell that a font can benefit from this option + if you see that the characters are smashed together without + any whitespace between them. This option causes the converter + to set the character widths to the actual width of this character + plus the width of a typical vertical stem. But on the other hand + the well-designed fonts may have characters that look better if + their widths are set slightly narrower. Such well-designed fonts + will benefit from disabling this feature. You may want to convert + a font with and without this feature, compare the results and + select the better one. This feature may be used only on proportional + fonts, it has no effect on the fixed-width fonts. + Default: disabled + + z/Z - Use the Autotrace library on the bitmap fonts. The results + are horrible and the use of this option is not recommended. This option is + present for experimental purposes. It may change or be removed in the + future. The working tracing can be achieved with option -OV. + Default: disabled + +-p parser_name - Use the specified front-end parser to read the font file. + If this option is not used, ttf2pt1 selects the parser automatically based + on the suffix of the font file name, it uses the first parser in its + list that supports this font type. Now two parsers are supported: + + ttf - built-in parser for the ttf files (suffix .ttf) + bdf - built-in parser for the BDF files (suffix .bdf) + ft - parser based on the FreeType-2 library (suffixes .ttf, + .otf, .pfa, .pfb) + + The parser ft is NOT linked in by default. See Makefile + for instructions how to enable it. We do no support this parser on + Windows: probably it will work but nobody tried and nobody knows how + to build it. + + The conversion of the bitmap fonts (such as BDF) is simplistic yet, + producing jagged outlines. When converting such fonts, it might be + a good idea to turn off the hint substitution (using option -Ou) + because the hints produced will be huge but not adding much to the + quality of the fonts. + +-u number - Mark the font with this value as its + UniqueID. The UniqueID is used by the printers with the hard disks + to cache the rasterized characters and thus significantly + speed-up the printing. Some of those printers just can't + store the fonts without UniqueID on their disk.The problem + is that the ID is supposed to be unique, as it name says. And + there is no easy way to create a guaranteed unique ID. Adobe specifies + the range 4000000-4999999 for private IDs but still it's difficult + to guarantee the uniqueness within it. So if you don't really need the + UniqueID don't use it, it's optional. Luckily there are a few millions of + possible IDs, so the chances of collision are rather low. + If instead of the number a special value 'A' is given + then the converter generates the value of UniqueID automatically, + as a hash of the font name. (NOTE: in the version 3.22 the + algorithm for autogeneration of UniqueID was changed to fit the values + into the Adobe-spacified range. This means that if UniqueIDs were used + then the printer's cache may need to be flushed before replacing the + fonts converted by an old version with fonts converted by a newer version). + A simple way to find if any of the fonts in a given directory have + duplicated UniqueIDs is to use the command: + + cat *.pf[ab] | grep UniqueID | sort | uniq -c | grep -v ' 1 ' + + Or if you use scripts/convert it will do that for you automatically + plus it will also give the exact list of files with duplicate UIDs. + +-v size - Re-scale the font to get the size of a typical uppercase + letter somewhere around the specified size. Actually, it re-scales + the whole font to get the size of one language-dependent letter to be + at least of the specified size. Now this letter is "A" in all the + supported languages. The size is specified in the points of the + Type 1 coordinate grids, the maximal value is 1000. This is an + experimental option and should be used with caution. It tries to + increase the visible font size for a given point size and thus make + the font more readable. But if overused it may cause the fonts to + look out of scale. As of now the interesting values of size for + this option seem to be located mostly between 600 and 850. This + re-scaling may be quite useful but needs more experience to + understand the balance of its effects. + +-W level - Select the verbosity level of the warnings. + Currently the levels from 0 to 4 are supported. Level 0 means no warnings + at all, level 4 means all the possible warnings. The default level is 3. + Other levels may be added in the future, so using the level number 99 is + recommended to get all the possible warnings. Going below level 2 is + not generally recommended because you may miss valuable information about + the problems with the fonts being converted. + +Obsolete option: +-A - Print the font metrics (.afm file) instead of the font on STDOUT. + Use -GA instead. + +Very obsolete option: + The algorithm that implemented the forced fixed width had major + flaws, so it was disabled. The code is still in the program and + some day it will be refined and returned back. Meanwhile the + option name '-f' was reused for another option. The old version was: +-f - Don't try to force the fixed width of font. Normally the converter + considers the fonts in which the glyph width deviates by not more + than 5% as buggy fixed width fonts and forces them to have really + fixed width. If this is undesirable, it can be disabled by this option. + +The .pfa font format supposes that the description of the characters +is binary encoded and encrypted. This converter does not encode or +encrypt the data by default, you have to specify the option '-e' +or use the t1asm program to assemble (that means, encode and +encrypt) the font program. The t1asm program that is included with +the converter is actually a part of the t1utils package, rather old +version of which may be obtained from + + http://ttf2pt1.sourceforge.net/t1utils.tar.gz + +Note that t1asm from the old version of that package won't work properly +with the files generated by ttf2pt1 version 3.20 and later. Please use +t1asm packaged with ttf2pt1 or from the new version t1utils +instead. For a newer version of t1utils please look at + + http://www.lcdf.org/~eddietwo/type/ + +So, the following command lines: + + ttf2pt1 -e ttffont.ttf t1font + ttf2pt1 ttffont.ttf - | t1asm >t1font.pfa + +represent two ways to get a working font. The benefit of the second form +is that other filters may be applied to the font between the converter +and assembler. + +Installation and deinstallation of the converter +------------------------------------------------ + +The converter may be easily installed systemwide with + + make install + +and uninstalled with + + make uninstall + +By default the Makefile is configured to install in the hierarchy +of directory /usr/local. This destination directory as well as +the structure of the hierarchy may be changed by editing the Makefile. + +Installation of the fonts +------------------------- + +Running the converter manually becomes somewhat boring if it has to +be applied to a few hundreds of fonts and then you have to generate the +fonts.scale and/or Fontmap files. The FONTS file describes how to use +the supplied scripts to handle such cases easily. It also discusses +the installation of the fonts for a few widespread programs. + +Other utilities +--------------- + +A few other small interesting programs that allow a cloase look at +the fonts are located in the subdirectory 'other'. They +are described shortly in others/README. + +Optional packages +----------------- + +Some auxiliary files are not needed by everyone and are big enough that +moving them to a separate package speeds up the downloads of the main +package significantly. As of now we have one such optional package: + + ttf2pt1-chinese - contains the Chinese conversion maps + +The general versioning policy for the optional packages is the following: +These packages may have no direct dependency on the ttf2pt1 version. +But they may be updated in future, as well as some versions of optional +packages may have dependencies on certain versions of ttf2pt1. +To avoid unneccessary extra releases on one hand and keep the updates in +sync with the ttf2pt1 itself on the other hand, a new version of an optional +package will be released only if there are any changes to it and it will be +given the same version number as ttf2pt1 released at the same time. So not +every release of ttf2pt1 would have a corresponding release of all optional +packages. For example, to get the correct version of optional packages for an +imaginary release 8.3.4 of ttf2pt1 you would need to look for optional +packages of the highest version not higher than (but possibly equal to) 8.3.4. + +TO DO: +------ + +- Improve hinting. +- Improve the auto-tracing of bitmaps. +- Implement the family-level hints. +- Add generation of CID-fonts. +- Handle the composite glyphs with relative base points. +- Preserve the relative width of stems during scaling to 1000x1000 matrix. +- Add support for bitmap TTF fonts. +- Implement better support of Asian encodings. +- Implement automatic creation of ligatures. + +TROUBLESHOOTING AND BUG REPORTS +------------------------------- + +Have problems with conversion of some font ? The converter dumps core ? Or your +printer refuses to understand the converted fonts ? Or some characters are +missing ? Or some characters look strange ? + +Send the bug reports to the ttf2pt1 development mailing list at +ttf2pt1-devel@lists.sourceforge.net. + +Try to collect more information about the problem and include it into +the bug report. (Of course, even better if you would provide a ready +fix, but just a detailed bug report is also good). Provide detailed +information about your problem, this will speed up the response greatly. +Don't just write "this font looks strange after conversion" but describe +what's exactly wrong with it: for example, what characters look wrong +and what exactly is wrong about their look. Providing a link to the +original font file would be also a good idea. Try to do a little +troublehooting and report its result. This not only would help with +the fix but may also give you a temporary work-around for the bug. + +First, enable full warnings with option '-W99', save them to +a file and read carefully. Sometimes the prolem is with a not implemented +feature which is reported in the warnings. Still, reporting about such +problems may be a good idea: some features were missed to cut corners, +in hope that no real font is using them. So a report about a font using +such a feature may motivate someone to implement it. Of course, you +may be the most motivated person: after all, you are the one wishing +to convert that font. ;-) Seriously, the philosophy "scrath your own itch" +seems to be the strongest moving force behind the Open Source software. + +The next step is playing with the options. This serves a dual purpose: +on one hand, it helps to localize the bug, on the other hand you may be +able to get a working version of the font for the meantime while the +bug is being fixed. The typical options to try out are: first '-Ou', if +it does not help then '-Os', then '-Oh', then '-Oo'. +They are described in a bit more detail above. Try them one by one +and in combinations. See if with them the resulting fonts look better. + +On some fonts ttf2pt1 just crashes. Commonly that happens because the +font being converted is highly defective (although sometimes the bug +is in ttf2pt1 itself). In any case it should not crash, so the reports +about such cases will help to handle these defects properly in future. + +We try to respond to the bug reports in a timely fashion but alas, this +may not always be possible, especially if the problem is complex. +This is a volunteer project and its resources are limited. Because +of this we would appreciate bug reports as detailed as possible, +and we would appreciate the ready fixes and contributions even more. + +CONTACTS +-------- + +ttf2pt1-announce@lists.sourceforge.net + The mailing list with announcements about ttf2pt1. It is a moderated mailing + with extremely low traffic. Everyone is encouraged to subscribe to keep in + touch with the current status of project. To subscribe use the Web interface + at http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-announce. + If you have only e-mail access to the Net then send a subscribe request to + the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody + will help you with subscription. + +ttf2pt1-devel@lists.sourceforge.net +ttf2pt1-users@lists.sourceforge.net + The ttf2pt1 mailing lists for development and users issues. They have not + that much traffic either. To subscribe use the Web interface at + http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-devel + and http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-users. + If you have only e-mail access to the Net then send a subscribe request to + the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody + will help you with subscription. + +mheath@netspace.net.au + Mark Heath + +A.Weeks@mcc.ac.uk + Andrew Weeks + +babkin@users.sourceforge.net (preferred) +sab123@hotmail.com +http://members.bellatlantic.net/~babkin + Sergey Babkin + +SEE ALSO +-------- + +http://ttf2pt1.sourceforge.net + The main page of the project. + +http://www.netspace.net.au/~mheath/ttf2pt1/ + The old main page of the project. + +http://sourceforge.net/projects/gnuwin32 + Precompiled binaries for Windows. + +http://www.lcdf.org/~eddietwo/type/ + The home page of the Type 1 utilities package. + +http://www.rightbrain.com/pages/books.html + The first book about PostScript on the Web, "Thinking in PostScript". + +http://fonts.apple.com/TTRefMan/index.html + The True Type reference manual. + +http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf + Adobe PostScript reference manual. + +http://partners.adobe.com/asn/developer/PDFS/TN/T1_SPEC.PDF + Specification of the Type 1 font format. + +http://partners.adobe.com/asn/developer/PDFS/TN/5015.Type1_Supp.pdf + The Type 1 font format supplement. + +http://partners.adobe.com/asn/developer/PDFS/TN/5004.AFM_Spec.pdf + Specification of the Adobe font metrics file format. + +http://www.cs.wpi.edu/~matt/courses/cs563/talks/surface/bez_surf.html +http://www.cs.wpi.edu/~matt/courses/cs563/talks/curves.html + Information about the Bezier curves. + +http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html + A stand-alone library supporting the Type1 fonts. Is neccessary + to compile the programs other/cmpf and other/dmpf. + +http://www.freetype.org + A library supporting the TTF fonts. Also many useful TTF programs + are included with it. + +http://heliotrope.homestead.com/files/printsoft.html + Moses Gold's collection of links to printing software. + +http://linuxartist.org/fonts/ + Collection of font-related links. + +---------------------------------------------------------------------- +---------------------------------------------------------------------- + +Following is the Readme of ttf2pfa (true type to type 3 font converter) It +covers other issues regarding the use of this software. Please note that +although ttf2pfa is a public domain software, ttf2pt1 +is instead covered by an Open Source license. See the COPYRIGHT +file for details. + +Please note also that ttf2pfa has not been maintained for a long time. +All of its functionality has been integrated into ttf2pt1 and all the +development moved to ttf2pt1, including Andrew Weeks, the author of +ttf2pfa. Ttf2pfa is provided for historical reasons only. Please use +ttf2pt1 instead. + +---------------------------------------------------------------------- + +True Type to Postscript Font converter +-------------------------------------- + +My mind is still reeling from the discovery that I was able to write +this program. What it does is it reads a Microsoft TrueType font and +creates a Postscript font. '_A_ postscript font', that is, not necessarily +the same font, you understand, but a fair imitation. + +Run it like this: + + ttf2pfa fontfile.ttf fontname + +The first parameter is the truetype filename, the second is a stem for +the output file names. The program will create a fontname.pfa containing +the Postscript font and a fontname.afm containing the metrics. + +The motivation behind this is that in Linux if you do not have a +Postscript printer, but only some other printer, you can only print +Postscript by using Ghostscript. But the fonts that come with +Ghostscript are very poor (they are converted from bitmaps and look +rather lumpy). This is rather frustrating as the PC running Linux +probably has MS-Windows as well and will therefore have truetype fonts, +but which are quite useless with Linux, X or Ghostscript. + +The program has been tested on over a hundred different TrueType fonts +from various sources, and seems to work fairly well. The converted +characters look OK, and the program doesn't seem to crash any more. I'm +not sure about the AFM files though, as I have no means to test them. + +The fonts generated will not work with X, as the font rasterizer that +comes with X only copes with Type 1 fonts. If I have the time I may +modify ttf2pfa to generate Type 1s. + +Copyright issues +---------------- + +I am putting this program into the public domain, so don't bother +sending me any money, I'd only have to declare it for income tax. + +Copyright on fonts, however, is a difficult legal question. Any +copyright statements found in a font will be preserved in the output. +Whether you are entitled to translate them at all I don't know. + +If you have a license to run a software package, like say MS-Windows, on +your PC, then you probably have a right to use any part of it, including +fonts, on that PC, even if not using that package for its intended +purpose. + +I am not a lawyer, however, so this is not a legal opinion, and may be +garbage. + +There shouldn't be a any problem with public domain fonts. + +About the Program +----------------- + +It was written in C on a IBM PC running Linux. + +The TrueType format was originally developed by Apple for the MAC, which +has opposite endianness to the PC, so to ensure compatibility 16 and 32 +bit fields are the wrong way round from the PC's point of view. This is +the reason for all the 'ntohs' and 'ntohl' calls. Doing it this way +means the program will also work on big-endian machines like Suns. + +I doubt whether it will work on a DOS-based PC though. + +The program produces what technically are Type 3 rather than Type 1 +fonts. They are not compressed or encrypted and are plain text. This is +so I (and you) can see what's going on, and (if you're a Postscript guru +and really want to) can alter the outlines. + +I only translate the outlines, not the 'instructions' that come with +them. This latter task is probably virtually impossible anyway. TrueType +outlines are B-splines rather than the Bezier curves that Postscript +uses. I believe that my conversion algorithm is reasonably correct, if +nothing else because the characters look right. + +Problems that may occur +----------------------- + +Most seriously, very complex characters (with lots of outline segments) +can make Ghostscript releases 2.x.x fail with a 'limitcheck' error. It +is possible that this may happen with some older Postscript printers as +well. Such characters will be flagged by the program and there are +basically two things you can do. First is to edit the .pfa file to +simplify or remove the offending character. This is not really +recommended. The second is to use Ghostscript release 3, if you can get +it. This has much larger limits and does not seem to have any problems +with complex characters. + +Then there are buggy fonts (yes, a font can have bugs). I try to deal +with these in as sane a manner as possible, but it's not always +possible. + +Encodings +--------- + +A postscript font must have a 256 element array, called an encoding, +each element of which is a name, which is also the name of a procedure +contained within the font. The 'BuildChar' command takes a byte and uses +it to index the encoding array to find a character name, and then looks +that up in the font's procedure table find the commands to draw the +glyph. However, not all characters need be in the encoding array. Those +that are not cannot be drawn (at least not using 'show'), however it is +possible to 're-encode' the font to enable these characters. There are +several standard encodings: Adobe's original, ISO-Latin1 and Symbol +being the most commonly encountered. + +TrueType fonts are organised differently. As well as the glyph +descriptions there are a number of tables. One of these is a mapping +from a character set into the glyph array, and another is a mapping from +the glyph array into a set of Postscript character names. The problems +are: + 1) Microsoft uses Unicode, a 16-bit system, to encode the font. + 2) that more than one glyph is given the same Postscript name. + +I deal with (1) by assuming a Latin1 encoding. The MS-Windows and +Unicode character sets are both supersets of ISO-8859-1. This usually +means that most characters will be properly encoded, but you should be +warned that some software may assume that fonts have an Adobe encoding. +Symbol, or Dingbat, fonts are in fact less of a problem, as they have +private encodings starting at 0xF000. It is easy to just lose the top +byte. + +Postscript fonts can be re-encoded, either manually, or by software. +Groff, for example, generates postscript that re-encodes fonts with the +Adobe encoding. The problem here is that not all characters in the Adobe +set are in the MS-Windows set. In particular there are no fi and fl +ligatures. This means that conversions of the versions of +Times-New-Roman and Arial that come with MS-Windows cannot be used +blindly as replacements for Adobe Times-Roman and Helvetica. You can get +expanded versions of MS fonts from Microsoft's web site which do contain +these ligatures (and a lot else besides). + +I deal with (2) by creating new character names. This can be error-prone +because I do not know which of them is the correct glyph to give the +name to. Some (buggy) fonts have large numbers of blank glyphs, all with +the same name. + +(almost every TrueType font has three glyphs called .notdef, one of them +is usually an empty square shape, one has no outline and has zero width, +and one has no outline and a positive width. This example is not really +a problem with well formed fonts since the .notdef characters are only +used for unprintable characters, which shouldn't occur in your documents +anyway). diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/README.FIRST b/application/third_party/dompdf/lib/ttf2ufm/src/README.FIRST new file mode 100644 index 00000000..f89db201 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/README.FIRST @@ -0,0 +1,4 @@ +To get the plain-text README and installation guides run: + + make docs + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/README.html b/application/third_party/dompdf/lib/ttf2ufm/src/README.html new file mode 100644 index 00000000..b1d6c9c2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/README.html @@ -0,0 +1,1182 @@ + + + +TTF2PT1 - A True Type to PostScript Type 1 Converter + + + + +

+ +TTF2PT1 - A True Type to PostScript Type 1 Font Converter + +

+ + + +[ +
+ + Based on ttf2pfa by Andrew Weeks, and help from Frank Siegert. +
+ Modification by Mark Heath. +
+ Further modification by Sergey Babkin. +
+ The Type1 assembler by I. Lee Hetherington with modifications by + Kai-Uwe Herbing. + +
+] +
+

+ +Ever wanted to install a particular font on your XServer but only could find +the font you are after in True Type Format? +

+ +Ever asked comp.fonts for a True Type to Type 1 converter and got a List +of Commercial software that doesn't run on your Operating System? +

+ +Well, this program should be the answer. This program is written in C (so it +should be portable) and therefore should run on any OS. The only limitation +is that the program requires some method of converting Big endian integers into +local host integers so the network functions ntohs and ntohl are used. These +can be replaced by macros if your platform doesn't have them. +Of course the target platform requires a C compiler and command line ability. +

+ + +Ttf2pt1 is a font converter from the True Type format (and some other formats +supported by the FreeType library as well) to the Adobe Type1 format. +

+ +The versions 3.0 and later got rather extensive post-processing algorithm that +brings the converted fonts to the requirements of the Type1 standard, tries to +correct the rounding errors introduced during conversions and some simple +kinds of bugs that are typical for the public domain TTF fonts. It +also generates the hints that enable much better rendering of fonts in +small sizes that are typical for the computer displays. But everything +has its price, and some of the optimizations may not work well for certain +fonts. That's why the options were added to the converter, to control +the performed optimizations. +

+ + +The converter is simple to run, just: +

+ + +

+ ttf2pt1 [-options] ttffont.ttf [Fontname] +
+or +
+ ttf2pt1 [-options] ttffont.ttf - +
+ +

+ + +The first variant creates the file Fontname.pfa (or Fontname.pfb if the +option '-b' was used) with the converted font and Fontname.afm with the +font metrics, the second one prints the font or another file (if the option +'-G' was used) on the standard output from where it can be immediately +piped through some filter. If no Fontname is specified for the first +variant, the name is generated from ttffont by replacing the .ttf +filename suffix. +

+ +Most of the time no options are neccessary (with a possible exception +of '-e'). But if there are some troubles with the resulting font, they +may be used to control the conversion. +The options are: +

+ + + +-a - Include all the glyphs from the source file into the converted + file. If this option is not specified then only the glyphs that have + been assigned some encoding are included, because the rest of glyphs + would be inaccessible anyway and would only consume the disk space. + But some applications are clever enough to change the encoding on + the fly and thus use the other glyphs, in this case they could + benefit from using this option. But there is a catch: the X11 library + has rather low limit for the font size. Including more glyphs increases + the file size and thus increases the chance of hitting this limit. + See app/X11/README for the description of a + patch to X11 which fixes this problem. +

+ + +-b - Encode the resulting font to produce a ready .pfb file. +

+ + +-d suboptions - Debugging options. The suboptions are: +

+ +

+ a - Print out the absolute coordinates of dots in outlines. Such + a font can not be used by any program (that's why this option is + incompatible with '-e') but it has proven to be a valuable debuging + information. +

+ + r - Do not reverse the direction of outlines. The TTF fonts have + the standard direction of outlines opposite to the Type1 fonts. So + they should be reversed during proper conversion. This option + may be used for debugging or to handle a TTF font with wrong + direction of outlines (possibly, converted in a broken way from + a Type1 font). The first signs of the wrong direction are the + letters like "P" or "B" without the unpainted "holes" inside. +

+

+ + +-e - Assemble the resulting font to produce a ready .pfa file. + + [ S.B.: Personally I don't think that this option is particularly useful. + The same result may be achieved by piping the unassembled data + through t1asm, the Type 1 assembler. And, anyways, it's good to + have the t1utils package handy. But Mark and many users think that + this functionality is good and it took not much time to add this option. ] + +

+ + +-F - Force the Unicode encoding: any type of MS encoding specified + in the font is ignored and the font is treated like it has Unicode + encoding. WARNING: this option is intended for buggy fonts + which actually are in Unicode but are marked as something else. The + effect on the other fonts is unpredictable. +

+ + +-G suboptions - File generation options. The suboptions may be lowercase + or uppercase, the lowercase ones disable the generation of particular + files, the corresponding uppercase suboptions enable the generation of the + same kind of files. If the result of ttf2pt1 is requested to be printed on + the standard output, the last enabling suboption of -G determines + which file will be written to the standard output and the rest of files + will be discarded. For example, -G A will request the AFM file. + The suboptions to disable/enable the generation of the files are: +

+ +

+ f/F - The font file. Depending on the other options this file + will have one of the suffixes .t1a, .pfa or .pfb. If the conversion result + is requested on the standard output ('-' is used as the output file name) + then the font file will also be written there by default, if not overwritten + by another suboption of -G. + Default: enabled +

+ + a/A - The Adobe font metrics file (.afm). + Default: enabled +

+ + e/E - The dvips encoding file (.enc). + Default: disabled +

+ +

+ + +-l language[+argument] - Extract the fonts for the specified language from a + multi-language Unicode font. If this option is not used the converter + tries to guess the language by the values of the shell variable LANG. + If it is not able to guess the language by LANG it tries all the + languages in the order they are listed. +

+ + After the plus sign an optional argument for the language extractor + may be specified. The format of the argument is absolutely up to + the particular language converter. The primary purpose of the + argument is to support selection of planes for the multi-plane + Eastern encodings but it can also be used in any other way. The + language extractor may decide to add the plane name in some form + to the name of the resulting font. None of the currently supported + languages make any use of the argument yet. +

+ + As of now the following languages are supported: +
+   latin1 - for all the languages using the Latin-1 encoding +
+   latin2 - for the Central European languages +
+   latin4 - for the Baltic languages +
+   latin5 - for the Turkish language +
+   cyrillic - for the languages with Cyrillic alphabet +
+   russian - historic synonym for cyrillic +
+   bulgarian - historic synonym for cyrillic +
+   adobestd - for the AdobeStandard encoding used by TeX +
+   plane+argument - to select one plane from a multi-byte encoding +

+ + The argument of the "plane" language may be in one of three forms: +

+   plane+pid=<pid>,eid=<eid> +
+   plane+pid=<pid>,eid=<eid>,<plane_number> +
+   plane+<plane_number> +

+ + Pid (TTF platform id) and eid (TTF encoding id) select a particular + TTF encoding table in the original font. They are specified as decimal + numbers. If this particular encoding table is not present in the font + file then the conversion fails. The native ("ttf") front-end parser supports + only pid=3 (Windows platform), the FreeType-based ("ft") front-end supports + any platform. If pid/eid is not specified then the TTF encoding table is + determined as usual: Unicode encoding if it's first or an 8-bit encoding + if not (and for an 8-bit encoding the plane number is silently ignored). + To prevent the converter from falling back to an 8-bit encoding, specify + the Unicode pid/eid value explicitly. +

+ + Plane_number is a hexadecimal (if starts with "0x") or decimal number. + It gives the values of upper bytes for which 256 characters will be + selected. If not specified, defaults to 0. It is also used as a font + name suffix (the leading "0x" is not included into the suffix). +

+ + + NOTE: + + It seems that many Eastern fonts use features of the TTF format that are + not supported by the ttf2pt1's built-in front-end parser. Because of + this for now we recommend using the FreeType-based parser (option + '-p ft') with the "plane" language. +

+ + + + + NOTE: + You may notice that the language names are not uniform: some are the + names of particular languages and some are names of encodings. This + is because of the different approaches. The original idea was to + implement a conversion from Unicode to the appropriate Windows + encoding for a given language. And then use the translation tables + to generate the fonts in whatever final encodings are needed. This + would allow to pile together the Unicode fonts and the non-Unicode + Windows fonts for that language and let the program to sort them out + automatically. And then generate fonts in all the possible encodings + for that language. An example of this approach is the Russian language + support. But if there is no multiplicity of encodings used for some + languages and if the non-Unicode fonts are not considered important + by the users, another way would be simpler to implement: just provide + only one table for extraction of the target encoding from Unicode + and don't bother with the translation tables. The latin* "languages" + are examples of this approach. If somebody feels that he needs the + Type1 fonts both in Latin-* and Windows encodings he or she is absolutely + welcome to submit the code to implement it. +

+ + WARNING: + Some of the glyphs included into the AdobeStandard encoding are not + included into the Unicode standard. The most typical examples of such + glyphs are ligatures like 'fi', 'fl' etc. Because of this the font + designers may place them at various places. The converter tries to + do its best, if the glyphs have honest Adobe names and/or are + placed at the same codes as in the Microsoft fonts they will be + picked up. Otherwise a possible solution is to use the option '-L' + with an external map. +

+ + +-L file[+[pid=<pid>,eid=<eid>,][plane]] - Extract the fonts for the specified + language from a multi-language font using the map from this file. This is + rather like the option '-l' but the encoding map is not + compiled into the program, it's taken from that file, so it's + easy to edit. Examples of such files are provided in + maps/adobe-standard-encoding.map, CP1250.map. (NOTE: + the 'standard encoding' map does not include all the glyphs of the + AdobeStandard encoding, it's provided only as an example.) The + description of the supported map formats is in the file + maps/unicode-sample.map. +

+ + Likewise to '-l', an argument may be specified after the map file + name. But in this case the argument has fixed meaning: it selects the + original TTF encoding table (the syntax is the same as in '-l plane') + and/or a plane of the map file. The plane name also gets added after dash + to the font name. The plane is a concept used in the Eastern fonts with big + number of glyphs: one TTF font gets divided into multiple Type1 fonts, + each containing one plane of up to 256 glyphs. But with a little + creativity this concept may be used for other purposes of combining + multiple translation maps into one file. To extract multiple planes + from a TTF font ttf2pt1 must be run multiple times, each time with + a different plane name specified. +

+ + The default original TTF encoding table used for the option '-L' is + Unicode. The map files may include directives to specify different original + TTF encodings. However if the pid/eid pair is specified with + it overrides any original encoding specified in the map file. +

+ + +-m type=value - Set maximal or minimal limits of resources. + These limits control the the font generation by limiting the resources + that the font is permitted to require from the PostScript interpreter. + The currently supported types of limits are: +

+ +

+ h - the maximal hint stack depth for the substituted hints. + The default value is 128, according to the limitation in X11. This seems to + be the lowest (and thus the safest) widespread value. To display the + hint stack depth required by each glyph in a .t1a file use the script + scripts/cntstems.pl. +

+

+ + +-O suboptions - Outline processing options. The suboptions + may be lowercase or uppercase, the lowercase ones disable the features, + the corresponding uppercase suboptions enable the same features. + The suboptions to disable/enable features are: +

+ +

+ b/B - Guessing of the ForceBold parameter. This parameter helps + the Type1 engine to rasterize the bold fonts properly at small sizes. + But the algorithm used to guess the proper value of this flag makes + that guess based solely on the font name. In rare cases that may cause + errors, in these cases you may want to disable this guessing. + Default: enabled +

+ + h/H - Autogeneration of hints. The really complex outlines + may confuse the algorithm, so theoretically it may be useful + sometimes to disable them. Although up to now it seems that + even bad hints are better than no hints at all. + Default: enabled +

+ + u/U - Hint substitution. Hint substitution is a technique + permitting generation of more detailed hints for the rasterizer. It allows + to use different sets of hints for different parts of a glyph and change + these sets as neccessary during rasterization (that's why "substituted"). + So it should improve the quality of the fonts rendered at small sizes. + But there are two catches: First, the X11 library has rather low limit for + the font size. More detailed hints increase the file size and thus increase + the chance of hitting this limit (that does not mean that you shall hit it + but you may if your fonts are particularly big). This is especially + probable for Unicode fonts converted with option '-a', so you may want to + use '-a' together with '-Ou'. See app/X11/README for the description of + a patch to X11 which fixes this problem. Second, some rasterizers (again, + X11 is the typical example) have a limitation for total number of hints + used when drawing a glyph (also known as the hint stack depth). If that + stack overflows the glyph is ignored. Starting from version 3.22 ttf2pt1 + uses algorithms to minimizing this depth, with the trade-off of slightly + bigger font files. The glyphs which still exceed the limit set by option + '-mh' have all the substituted hints removed and only base hints left. + The algorithms seem to have been refined far enough to make the fonts with + substituted hints look better than the fonts without them or at least the + same. Still if the original fonts are not well-designed the detailed + hinting may emphasize the defects of the design, such as non-even thickness + of lines. So provided that you are not afraid of the X11 bug the best idea + would be to generate a font with this feature and without it, then compare + the results using the program other/cmpf (see the description + in other/README) and decide which one looks better. + Default: enabled +

+ + o/O - Space optimization of the outlines' code. This kind of optimization + never hurts, and the only reason to disable this feature is for comparison + of the generated fonts with the fonts generated by the previous versions of + converter. Well, it _almost_ never hurts. As it turned out there exist + some brain-damaged printers which don't understand it. Actually this + feature does not change the outlines at all. The Type 1 font manual + provides a set of redundant operators that make font description shorter, + such as '10 hlineto' instead of '0 10 rlineto' to describe a horizontal + line. This feature enables use of these operators. + Default: enabled +

+ + s/S - Smoothing of outlines. If the font is broken in some + way (even the ones that are not easily noticeable), such smoothing + may break it further. So disabling this feature is the first thing to be + tried if some font looks odd. But with smoothing off the hint generation + algorithms may not work properly too. + Default: enabled +

+ + t/T - Auto-scaling to the 1000x1000 Type1 standard matrix. The + TTF fonts are described in terms of an arbitrary matrix up to + 4000x4000. The converted fonts must be scaled to conform to + the Type1 standard. But the scaling introduces additional rounding + errors, so it may be curious sometimes to look at the font in its + original scale. + Default: enabled +

+ + v/V - Do vectorization on the bitmap fonts. Functionally + "vectorization" is the same thing as "autotracing", a different word is + used purely to differentiate it from the Autotrace library. It tries to + produce nice smooth outlines from bitmaps. This feature is still a work + in progress though the results are already mostly decent. + Default: disabled +

+ + w/W - Glyphs' width corection. This option is designed to be + used on broken fonts which specify too narrow widths for the + letters. You can tell that a font can benefit from this option + if you see that the characters are smashed together without + any whitespace between them. This option causes the converter + to set the character widths to the actual width of this character + plus the width of a typical vertical stem. But on the other hand + the well-designed fonts may have characters that look better if + their widths are set slightly narrower. Such well-designed fonts + will benefit from disabling this feature. You may want to convert + a font with and without this feature, compare the results and + select the better one. This feature may be used only on proportional + fonts, it has no effect on the fixed-width fonts. + Default: disabled +

+ + z/Z - Use the Autotrace library on the bitmap fonts. The results + are horrible and the use of this option is not recommended. This option is + present for experimental purposes. It may change or be removed in the + future. The working tracing can be achieved with option -OV. + Default: disabled +

+

+ + +-p parser_name - Use the specified front-end parser to read the font file. + If this option is not used, ttf2pt1 selects the parser automatically based + on the suffix of the font file name, it uses the first parser in its + list that supports this font type. Now two parsers are supported: +

+ +   ttf - built-in parser for the ttf files (suffix .ttf) +
+   bdf - built-in parser for the BDF files (suffix .bdf) +
+   ft - parser based on the FreeType-2 library (suffixes .ttf, + .otf, .pfa, .pfb) +

+ + The parser ft is NOT linked in by default. See Makefile + for instructions how to enable it. We do no support this parser on + Windows: probably it will work but nobody tried and nobody knows how + to build it. +

+ + The conversion of the bitmap fonts (such as BDF) is simplistic yet, + producing jagged outlines. When converting such fonts, it might be + a good idea to turn off the hint substitution (using option -Ou) + because the hints produced will be huge but not adding much to the + quality of the fonts. +

+ + +-u number - Mark the font with this value as its + UniqueID. The UniqueID is used by the printers with the hard disks + to cache the rasterized characters and thus significantly + speed-up the printing. Some of those printers just can't + store the fonts without UniqueID on their disk.The problem + is that the ID is supposed to be unique, as it name says. And + there is no easy way to create a guaranteed unique ID. Adobe specifies + the range 4000000-4999999 for private IDs but still it's difficult + to guarantee the uniqueness within it. So if you don't really need the + UniqueID don't use it, it's optional. Luckily there are a few millions of + possible IDs, so the chances of collision are rather low. + If instead of the number a special value 'A' is given + then the converter generates the value of UniqueID automatically, + as a hash of the font name. (NOTE: in the version 3.22 the + algorithm for autogeneration of UniqueID was changed to fit the values + into the Adobe-spacified range. This means that if UniqueIDs were used + then the printer's cache may need to be flushed before replacing the + fonts converted by an old version with fonts converted by a newer version). + A simple way to find if any of the fonts in a given directory have + duplicated UniqueIDs is to use the command: +

+ +   cat *.pf[ab] | grep UniqueID | sort | uniq -c | grep -v ' 1 ' +

+ + Or if you use scripts/convert it will do that for you automatically + plus it will also give the exact list of files with duplicate UIDs. +

+ + +-v size - Re-scale the font to get the size of a typical uppercase + letter somewhere around the specified size. Actually, it re-scales + the whole font to get the size of one language-dependent letter to be + at least of the specified size. Now this letter is "A" in all the + supported languages. The size is specified in the points of the + Type 1 coordinate grids, the maximal value is 1000. This is an + experimental option and should be used with caution. It tries to + increase the visible font size for a given point size and thus make + the font more readable. But if overused it may cause the fonts to + look out of scale. As of now the interesting values of size for + this option seem to be located mostly between 600 and 850. This + re-scaling may be quite useful but needs more experience to + understand the balance of its effects. +

+ + +-W level - Select the verbosity level of the warnings. + Currently the levels from 0 to 4 are supported. Level 0 means no warnings + at all, level 4 means all the possible warnings. The default level is 3. + Other levels may be added in the future, so using the level number 99 is + recommended to get all the possible warnings. Going below level 2 is + not generally recommended because you may miss valuable information about + the problems with the fonts being converted. +

+ + +Obsolete option: +-A - Print the font metrics (.afm file) instead of the font on STDOUT. + Use -GA instead. +

+ + +Very obsolete option: +
+ The algorithm that implemented the forced fixed width had major + flaws, so it was disabled. The code is still in the program and + some day it will be refined and returned back. Meanwhile the + option name '-f' was reused for another option. The old version was: +
+-f - Don't try to force the fixed width of font. Normally the converter + considers the fonts in which the glyph width deviates by not more + than 5% as buggy fixed width fonts and forces them to have really + fixed width. If this is undesirable, it can be disabled by this option. +

+ + +The .pfa font format supposes that the description of the characters +is binary encoded and encrypted. This converter does not encode or +encrypt the data by default, you have to specify the option '-e' +or use the t1asm program to assemble (that means, encode and +encrypt) the font program. The t1asm program that is included with +the converter is actually a part of the t1utils package, rather old +version of which may be obtained from +

+ +

+ + http://ttf2pt1.sourceforge.net/t1utils.tar.gz + +
+

+ +Note that t1asm from the old version of that package won't work properly +with the files generated by ttf2pt1 version 3.20 and later. Please use +t1asm packaged with ttf2pt1 or from the new version t1utils +instead. For a newer version of t1utils please look at +

+ +

+ + http://www.lcdf.org/~eddietwo/type/ + +
+

+ + + +So, the following command lines: +

+ +

+ ttf2pt1 -e ttffont.ttf t1font +
+ ttf2pt1 ttffont.ttf - | t1asm >t1font.pfa +
+

+ +represent two ways to get a working font. The benefit of the second form +is that other filters may be applied to the font between the converter +and assembler. +

+ + +

+Installation and deinstallation of the converter +

+ + +The converter may be easily installed systemwide with + +
+ make install +
+ +and uninstalled with + +
+ make uninstall +
+ +By default the Makefile is configured to install in the hierarchy +of directory /usr/local. This destination directory as well as +the structure of the hierarchy may be changed by editing the Makefile. + +

+Installation of the fonts +

+ + +Running the converter manually becomes somewhat boring if it has to +be applied to a few hundreds of fonts and then you have to generate the +fonts.scale and/or Fontmap files. The FONTS file describes how to use +the supplied scripts to handle such cases easily. It also discusses +the installation of the fonts for a few widespread programs. +

+ +

+Other utilities +

+ + +A few other small interesting programs that allow a cloase look at +the fonts are located in the subdirectory 'other'. They +are described shortly in others/README. +

+ +

+Optional packages +

+ + +Some auxiliary files are not needed by everyone and are big enough that +moving them to a separate package speeds up the downloads of the main +package significantly. As of now we have one such optional package: +

+ +  ttf2pt1-chinese - contains the Chinese conversion maps +

+ +The general versioning policy for the optional packages is the following: +These packages may have no direct dependency on the ttf2pt1 version. +But they may be updated in future, as well as some versions of optional +packages may have dependencies on certain versions of ttf2pt1. +To avoid unneccessary extra releases on one hand and keep the updates in +sync with the ttf2pt1 itself on the other hand, a new version of an optional +package will be released only if there are any changes to it and it will be +given the same version number as ttf2pt1 released at the same time. So not +every release of ttf2pt1 would have a corresponding release of all optional +packages. For example, to get the correct version of optional packages for an +imaginary release 8.3.4 of ttf2pt1 you would need to look for optional +packages of the highest version not higher than (but possibly equal to) 8.3.4. +

+ +

+TO DO: +

+ + +
    +
  • Improve hinting. +
  • Improve the auto-tracing of bitmaps. +
  • Implement the family-level hints. +
  • Add generation of CID-fonts. +
  • Handle the composite glyphs with relative base points. +
  • Preserve the relative width of stems during scaling to 1000x1000 matrix. +
  • Add support for bitmap TTF fonts. +
  • Implement better support of Asian encodings. +
  • Implement automatic creation of ligatures. +
+ +

+TROUBLESHOOTING AND BUG REPORTS +

+ + + + +Have problems with conversion of some font ? The converter dumps core ? Or your +printer refuses to understand the converted fonts ? Or some characters are +missing ? Or some characters look strange ? +

+ +Send the bug reports to the ttf2pt1 development mailing list at +ttf2pt1-devel@lists.sourceforge.net. +

+ +Try to collect more information about the problem and include it into +the bug report. (Of course, even better if you would provide a ready +fix, but just a detailed bug report is also good). Provide detailed +information about your problem, this will speed up the response greatly. +Don't just write "this font looks strange after conversion" but describe +what's exactly wrong with it: for example, what characters look wrong +and what exactly is wrong about their look. Providing a link to the +original font file would be also a good idea. Try to do a little +troublehooting and report its result. This not only would help with +the fix but may also give you a temporary work-around for the bug. +

+ +First, enable full warnings with option '-W99', save them to +a file and read carefully. Sometimes the prolem is with a not implemented +feature which is reported in the warnings. Still, reporting about such +problems may be a good idea: some features were missed to cut corners, +in hope that no real font is using them. So a report about a font using +such a feature may motivate someone to implement it. Of course, you +may be the most motivated person: after all, you are the one wishing +to convert that font. ;-) Seriously, the philosophy "scrath your own itch" +seems to be the strongest moving force behind the Open Source software. +

+ +The next step is playing with the options. This serves a dual purpose: +on one hand, it helps to localize the bug, on the other hand you may be +able to get a working version of the font for the meantime while the +bug is being fixed. The typical options to try out are: first '-Ou', if +it does not help then '-Os', then '-Oh', then '-Oo'. +They are described in a bit more detail above. Try them one by one +and in combinations. See if with them the resulting fonts look better. +

+ +On some fonts ttf2pt1 just crashes. Commonly that happens because the +font being converted is highly defective (although sometimes the bug +is in ttf2pt1 itself). In any case it should not crash, so the reports +about such cases will help to handle these defects properly in future. +

+ +We try to respond to the bug reports in a timely fashion but alas, this +may not always be possible, especially if the problem is complex. +This is a volunteer project and its resources are limited. Because +of this we would appreciate bug reports as detailed as possible, +and we would appreciate the ready fixes and contributions even more. +

+ + + + + + + + + + + + + + + + + + +

+CONTACTS +

+ + + + + + + + + + + + +ttf2pt1-announce@lists.sourceforge.net +
+ The mailing list with announcements about ttf2pt1. It is a moderated mailing + with extremely low traffic. Everyone is encouraged to subscribe to keep in + touch with the current status of project. To subscribe use the Web interface + at http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-announce. + If you have only e-mail access to the Net then send a subscribe request to + the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody + will help you with subscription. +

+ + + +ttf2pt1-devel@lists.sourceforge.net +
+ +ttf2pt1-users@lists.sourceforge.net +
+ The ttf2pt1 mailing lists for development and users issues. They have not + that much traffic either. To subscribe use the Web interface at + http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-devel + and http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-users. + If you have only e-mail access to the Net then send a subscribe request to + the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody + will help you with subscription. +

+ + + +mheath@netspace.net.au +
+ Mark Heath +

+ + +A.Weeks@mcc.ac.uk +
+ Andrew Weeks +

+ + +babkin@users.sourceforge.net (preferred)
+ +sab123@hotmail.com +
+ +http://members.bellatlantic.net/~babkin +
+ Sergey Babkin +

+ +

+SEE ALSO +

+ + + + + +http://ttf2pt1.sourceforge.net +
+ The main page of the project. +

+ + +http://www.netspace.net.au/~mheath/ttf2pt1/ +
+ The old main page of the project. +

+ + + + +http://sourceforge.net/projects/gnuwin32 +
+ Precompiled binaries for Windows. +

+ + +http://www.lcdf.org/~eddietwo/type/ +
+ The home page of the Type 1 utilities package. +

+ + +http://www.rightbrain.com/pages/books.html +
+ The first book about PostScript on the Web, "Thinking in PostScript". +

+ + +http://fonts.apple.com/TTRefMan/index.html +
+ The True Type reference manual. +

+ + +http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf +
+ Adobe PostScript reference manual. +

+ + +http://partners.adobe.com/asn/developer/PDFS/TN/T1_SPEC.PDF +
+ Specification of the Type 1 font format. +

+ + +http://partners.adobe.com/asn/developer/PDFS/TN/5015.Type1_Supp.pdf +
+ The Type 1 font format supplement. +

+ + +http://partners.adobe.com/asn/developer/PDFS/TN/5004.AFM_Spec.pdf +
+ Specification of the Adobe font metrics file format. +

+ + +http://www.cs.wpi.edu/~matt/courses/cs563/talks/surface/bez_surf.html +
+ +http://www.cs.wpi.edu/~matt/courses/cs563/talks/curves.html +
+ Information about the Bezier curves. +

+ + +http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html +
+ A stand-alone library supporting the Type1 fonts. Is neccessary + to compile the programs other/cmpf and other/dmpf. +

+ + +http://www.freetype.org +
+ A library supporting the TTF fonts. Also many useful TTF programs + are included with it. +

+ + +http://heliotrope.homestead.com/files/printsoft.html +
+ Moses Gold's collection of links to printing software. +

+ + +http://linuxartist.org/fonts/ +
+ Collection of font-related links. +

+ +


+
+ + +Following is the Readme of ttf2pfa (true type to type 3 font converter) It +covers other issues regarding the use of this software. Please note that +although ttf2pfa is a public domain software, ttf2pt1 +is instead covered by an Open Source license. See the COPYRIGHT +file for details. +

+ +Please note also that ttf2pfa has not been maintained for a long time. +All of its functionality has been integrated into ttf2pt1 and all the +development moved to ttf2pt1, including Andrew Weeks, the author of +ttf2pfa. Ttf2pfa is provided for historical reasons only. Please use +ttf2pt1 instead. + +


+ + +

+True Type to Postscript Font converter +

+ + +My mind is still reeling from the discovery that I was able to write +this program. What it does is it reads a Microsoft TrueType font and +creates a Postscript font. '_A_ postscript font', that is, not necessarily +the same font, you understand, but a fair imitation. +

+ +Run it like this: +

+ +

+ ttf2pfa fontfile.ttf fontname +
+

+ +The first parameter is the truetype filename, the second is a stem for +the output file names. The program will create a fontname.pfa containing +the Postscript font and a fontname.afm containing the metrics. +

+ +The motivation behind this is that in Linux if you do not have a +Postscript printer, but only some other printer, you can only print +Postscript by using Ghostscript. But the fonts that come with +Ghostscript are very poor (they are converted from bitmaps and look +rather lumpy). This is rather frustrating as the PC running Linux +probably has MS-Windows as well and will therefore have truetype fonts, +but which are quite useless with Linux, X or Ghostscript. +

+ +The program has been tested on over a hundred different TrueType fonts +from various sources, and seems to work fairly well. The converted +characters look OK, and the program doesn't seem to crash any more. I'm +not sure about the AFM files though, as I have no means to test them. +

+ +The fonts generated will not work with X, as the font rasterizer that +comes with X only copes with Type 1 fonts. If I have the time I may +modify ttf2pfa to generate Type 1s. +

+ +

+Copyright issues +

+ + +I am putting this program into the public domain, so don't bother +sending me any money, I'd only have to declare it for income tax. +

+ +Copyright on fonts, however, is a difficult legal question. Any +copyright statements found in a font will be preserved in the output. +Whether you are entitled to translate them at all I don't know. +

+ +If you have a license to run a software package, like say MS-Windows, on +your PC, then you probably have a right to use any part of it, including +fonts, on that PC, even if not using that package for its intended +purpose. +

+ +I am not a lawyer, however, so this is not a legal opinion, and may be +garbage. +

+ +There shouldn't be a any problem with public domain fonts. +

+ +

+About the Program +

+ + +It was written in C on a IBM PC running Linux. +

+ +The TrueType format was originally developed by Apple for the MAC, which +has opposite endianness to the PC, so to ensure compatibility 16 and 32 +bit fields are the wrong way round from the PC's point of view. This is +the reason for all the 'ntohs' and 'ntohl' calls. Doing it this way +means the program will also work on big-endian machines like Suns. +

+ +I doubt whether it will work on a DOS-based PC though. +

+ +The program produces what technically are Type 3 rather than Type 1 +fonts. They are not compressed or encrypted and are plain text. This is +so I (and you) can see what's going on, and (if you're a Postscript guru +and really want to) can alter the outlines. +

+ +I only translate the outlines, not the 'instructions' that come with +them. This latter task is probably virtually impossible anyway. TrueType +outlines are B-splines rather than the Bezier curves that Postscript +uses. I believe that my conversion algorithm is reasonably correct, if +nothing else because the characters look right. +

+ +

+Problems that may occur +

+ + +Most seriously, very complex characters (with lots of outline segments) +can make Ghostscript releases 2.x.x fail with a 'limitcheck' error. It +is possible that this may happen with some older Postscript printers as +well. Such characters will be flagged by the program and there are +basically two things you can do. First is to edit the .pfa file to +simplify or remove the offending character. This is not really +recommended. The second is to use Ghostscript release 3, if you can get +it. This has much larger limits and does not seem to have any problems +with complex characters. +

+ +Then there are buggy fonts (yes, a font can have bugs). I try to deal +with these in as sane a manner as possible, but it's not always +possible. +

+ +

+Encodings +

+ + +A postscript font must have a 256 element array, called an encoding, +each element of which is a name, which is also the name of a procedure +contained within the font. The 'BuildChar' command takes a byte and uses +it to index the encoding array to find a character name, and then looks +that up in the font's procedure table find the commands to draw the +glyph. However, not all characters need be in the encoding array. Those +that are not cannot be drawn (at least not using 'show'), however it is +possible to 're-encode' the font to enable these characters. There are +several standard encodings: Adobe's original, ISO-Latin1 and Symbol +being the most commonly encountered. +

+ +TrueType fonts are organised differently. As well as the glyph +descriptions there are a number of tables. One of these is a mapping +from a character set into the glyph array, and another is a mapping from +the glyph array into a set of Postscript character names. The problems +are: +

+ 1) Microsoft uses Unicode, a 16-bit system, to encode the font. +
+ 2) that more than one glyph is given the same Postscript name. +

+ +I deal with (1) by assuming a Latin1 encoding. The MS-Windows and +Unicode character sets are both supersets of ISO-8859-1. This usually +means that most characters will be properly encoded, but you should be +warned that some software may assume that fonts have an Adobe encoding. +Symbol, or Dingbat, fonts are in fact less of a problem, as they have +private encodings starting at 0xF000. It is easy to just lose the top +byte. +

+ +Postscript fonts can be re-encoded, either manually, or by software. +Groff, for example, generates postscript that re-encodes fonts with the +Adobe encoding. The problem here is that not all characters in the Adobe +set are in the MS-Windows set. In particular there are no fi and fl +ligatures. This means that conversions of the versions of +Times-New-Roman and Arial that come with MS-Windows cannot be used +blindly as replacements for Adobe Times-Roman and Helvetica. You can get +expanded versions of MS fonts from Microsoft's web site which do contain +these ligatures (and a lot else besides). +

+ +I deal with (2) by creating new character names. This can be error-prone +because I do not know which of them is the correct glyph to give the +name to. Some (buggy) fonts have large numbers of blank glyphs, all with +the same name. +

+ +(almost every TrueType font has three glyphs called .notdef, one of them +is usually an empty square shape, one has no outline and has zero width, +and one has no outline and a positive width. This example is not really +a problem with well formed fonts since the .notdef characters are only +used for unprintable characters, which shouldn't occur in your documents +anyway). +

+ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/Makefile b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/Makefile new file mode 100644 index 00000000..02a33b4d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/Makefile @@ -0,0 +1,279 @@ + +# This file should be configured before running `make'. +# Uncomment or change the values that are relevant for your OS. + +# The preferred C compiler (by default use the OS-specific default value). +# For BSD/OS, FreeBSD, Linux (all flavors), NetBSD, OpenBSD the default +# compiler is GNU C. +# (Note please the politically correct ordering by alphabet ! :-) +# +# Use GNU C even if it's not the default compiler +# +CC=gcc +# +# Use the standard ANSI C compiler on HP-UX even if it's not default +# +#CC=c89 + +# +# The system-dependent flags for the C compiler +# +# Default + +CFLAGS_SYS= -O2 -D_GNU_SOURCE + +# For GNU C +# +CFLAGS_SYS= -O2 -D_GNU_SOURCE +# +# For GNU C with long options support library (Linux etc.) +# +CFLAGS_SYS= -O2 -D_GNU_SOURCE +# +# For GNU C on HP-UX/PA-RISC 1.1 +# +#CFLAGS_SYS= -O2 -Wa,-w +# +# For the standard ANSI C on HP-UX +# +#CFLAGS_SYS= +O2 -D_HPUX_SOURCE + +# +# The system-dependent libraries +# +# Defalut (for the BSD-style OSes) + +LIBS_SYS= -lm + +# For SystemV (such as SCO, UnixWare, Solaris, but _NOT_ Linux or HP-UX) +# +#LIBS_SYS= -lm -lsocket + +# +# The flags for C compiler for the FreeType-2 library (disabled by default). +# This WON'T BUILD with FT2-beta8, use the FreeType release 2.0.4 +# http://download.sourceforge.net/freetype/freetype-2.0.4.tar.gz + +CFLAGS_FT= + +# To enable use of the FreeType-2 library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment LIBS_FT +# +#CFLAGS_FT = -DUSE_FREETYPE -I/usr/include/freetype2 -I/usr/include + +# +# The FreeType-2 library flags (disabled by default) + +LIBS_FT= + +# To enable use of the FreeType-2 library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment CFLAGS_FT +# +#LIBS_FT= -L/usr/lib -lfreetype + +# +# The flags for C compiler for the Autotrace library (disabled by default). +# USE OF THIS FEATURE IS STRONGLY DISCOURAGED, THE BUILT-IN TRACING +# (AKA VECTORIZATION) PROVIDES MUCH BETTER RESULTS. +# The tested version is 0.29a (and the fonts produced with it are +# absolutely not usable). +# http://download.sourceforge.net/autotrace/autotrace-0.29.tar.gz + +CFLAGS_AT= + +# To enable use of the Autotrace library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment LIBS_AT +# +#CFLAGS_AT = -DUSE_AUTOTRACE -I/usr/local/include + +# +# The Autotrace library flags (disabled by default) + +LIBS_AT= + +# To enable use of the Autotrace library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment CFLAGS_AT +# +#LIBS_AT= -L/usr/local/lib -lautotrace + +# +# Preference of front-ends if multiple parsers match a file +# (by default the build-in front-end takes preference over FreeType) + +CFLAGS_PREF= + +# To prefer FreeType (if enabled): +# +#CFLAGS_PREF= -DPREFER_FREETYPE + +# Uncomment the second line to not compile t1asm into ttf2pt1 +CFLAGS_EXTT1ASM= +#CFLAGS_EXTT1ASM= -DEXTERNAL_T1ASM + +CFLAGS= $(CFLAGS_SYS) $(CFLAGS_FT) $(CFLAGS_AT) $(CFLAGS_PREF) +LIBS= $(LIBS_SYS) $(LIBS_FT) $(LIBS_AT) + +# Installation-related stuff +# +# The base dir for installation and subdirs in it +INSTDIR = /home/eclecticgeek/apps +# for binaries +BINDIR = $(INSTDIR)/bin +# for binaries of little general interest +LIBXDIR = $(INSTDIR)/libexec/ttf2pt1 +# for scripts, maps/encodings etc. +SHAREDIR = $(INSTDIR)/share/ttf2pt1 +MANDIR = $(INSTDIR)/man + +# owner and group of installed files +OWNER = eclecticgeek +GROUP = pg1755828 + +# After you have configured the Makefile, comment out the following +# definition: +##warning: docs +## @echo >&2 +## @echo " You have to configure the Makefile before running make!" >&2 +## @echo "(or if you are lazy and hope that it will work as is run \`make all')">&2 +## @echo >&2 +# +DOCS=CHANGES README FONTS FONTS.hpux encodings/README other/README \ + app/X11/README app/netscape/README app/TeX/README + +SUBDIRS = app encodings maps scripts other +TXTFILES = README* FONTS* CHANGES* COPYRIGHT + +MANS1=ttf2pt1.1 ttf2pt1_convert.1 ttf2pt1_x2gs.1 +MANS=$(MANS1) $(MANS5) + +all: t1asm ttf2pt1 docs mans rpm + +docs: $(DOCS) + +mans: $(MANS) + +clean: + rm -f t1asm ttf2pt1 *.o app/RPM/Makefile app/RPM/*.spec *.core core.* core + ( cd other && make clean; ) + ( cd app/netscape && make clean; ) + +veryclean: clean + rm -f $(DOCS) $(MANS) + +rpm: app/RPM/Makefile app/RPM/ttf2pt1.spec + +ttf2pt1.1: README.html + scripts/html2man . . app/RPM/Makefile +# +app/RPM/ttf2pt1.spec: app/RPM/ttf2pt1.spec.src version.h + sed 's/^Version:.*/Version: '`grep TTF2PT1_VERSION version.h| cut -d\" -f2`'/' $@ + +t1asm: t1asm.c + $(CC) $(CFLAGS) -o t1asm -DSTANDALONE t1asm.c $(LIBS) + +ttf2pt1.o: ttf2pt1.c ttf.h pt1.h global.h version.h + $(CC) $(CFLAGS) -c ttf2pt1.c + +pt1.o: pt1.c ttf.h pt1.h global.h + $(CC) $(CFLAGS) -c pt1.c + +ttf.o: ttf.c ttf.h pt1.h global.h + $(CC) $(CFLAGS) -c ttf.c + +ft.o: ft.c pt1.h global.h + $(CC) $(CFLAGS) -c ft.c + +bdf.o: bdf.c pt1.h global.h + $(CC) $(CFLAGS) -c bdf.c + +bitmap.o: bitmap.c pt1.h global.h + $(CC) $(CFLAGS) -c bitmap.c + +runt1asm.o: runt1asm.c global.h + $(CC) $(CFLAGS) $(CFLAGS_EXTT1ASM) -c runt1asm.c + +ttf2pt1: ttf2pt1.o pt1.o runt1asm.o ttf.o ft.o bdf.o bitmap.o + $(CC) $(CFLAGS) -o ttf2pt1 ttf2pt1.o pt1.o runt1asm.o ttf.o ft.o bdf.o bitmap.o $(LIBS) + +CHANGES: CHANGES.html + scripts/unhtml CHANGES + +README: README.html + scripts/unhtml README + +encodings/README: encodings/README.html + scripts/unhtml encodings/README + +other/README: other/README.html + scripts/unhtml other/README + +app/X11/README: app/X11/README.html + scripts/unhtml app/X11/README + +app/netscape/README: app/netscape/README.html + scripts/unhtml app/netscape/README + +app/TeX/README: app/TeX/README.html + scripts/unhtml app/TeX/README + +FONTS: FONTS.html + scripts/unhtml FONTS + +FONTS.hpux: FONTS.hpux.html + scripts/unhtml FONTS.hpux + +install: all + scripts/inst_dir $(BINDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(LIBXDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(SHAREDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(MANDIR)/man1 $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(MANDIR)/man5 $(OWNER) $(GROUP) 0755 + cp -R $(TXTFILES) $(SUBDIRS) $(SHAREDIR) + chown -R $(OWNER) $(SHAREDIR) + chgrp -R $(GROUP) $(SHAREDIR) + chmod -R go-w $(SHAREDIR) + scripts/inst_file ttf2pt1 $(BINDIR)/ttf2pt1 $(OWNER) $(GROUP) 0755 + [ -f $(BINDIR)/t1asm ] || scripts/inst_file t1asm $(LIBXDIR)/t1asm $(OWNER) $(GROUP) 0755 + sed -e 's|^TTF2PT1_BINDIR=$$|TTF2PT1_BINDIR=$(BINDIR)|;' \ + -e 's|^TTF2PT1_LIBXDIR=$$|TTF2PT1_LIBXDIR=$(LIBXDIR)|;' \ + -e 's|^TTF2PT1_SHAREDIR=$$|TTF2PT1_SHAREDIR=$(SHAREDIR)|;' cvt.tmp + scripts/inst_file cvt.tmp $(BINDIR)/ttf2pt1_convert $(OWNER) $(GROUP) 0755 + scripts/inst_file cvt.tmp $(SHAREDIR)/scripts/convert $(OWNER) $(GROUP) 0755 + rm cvt.tmp + scripts/inst_file scripts/x2gs $(BINDIR)/ttf2pt1_x2gs $(OWNER) $(GROUP) 0755 + for i in $(MANS1); do { \ + sed -e 's|TTF2PT1_BINDIR|$(BINDIR)|;' \ + -e 's|TTF2PT1_LIBXDIR|$(LIBXDIR)|;' \ + -e 's|TTF2PT1_SHAREDIR|$(SHAREDIR)|;' <$$i >$(MANDIR)/man1/$$i \ + && chown $(OWNER) $(MANDIR)/man1/$$i \ + && chgrp $(GROUP) $(MANDIR)/man1/$$i \ + && chmod 0644 $(MANDIR)/man1/$$i \ + || exit 1; \ + } done + +uninstall: + rm -f $(BINDIR)/ttf2pt1 $(BINDIR)/ttf2pt1_convert $(BINDIR)/ttf2pt1_x2gs + rm -rf $(LIBXDIR) + rm -rf $(SHAREDIR) + for i in $(MANS1); do { \ + rm -f $(MANDIR)/man1/$$i $(MANDIR)/man1/$$i.gz; \ + } done + + +# targets for automatic generation of releases and snapshots + +snapshot: + scripts/mkrel snapshot + +release: + scripts/mkrel release diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec new file mode 100644 index 00000000..73a658d5 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec @@ -0,0 +1,40 @@ +Summary: TrueType to Adobe Type 1 font converter +Name: ttf2pt1 +Version: 3.4.4 +Release: 1jv +Source: %{name}-%{version}.tgz +Copyright: Distributable +Group: Utilities/Printing +BuildRoot: /var/tmp/ttf2pt1 + +%description + * True Type Font to Adobe Type 1 font converter + * By Mark Heath + * Based on ttf2pfa by Andrew Weeks + * With help from Frank M. Siegert + +%prep +%setup + +%build +make all + +%install +rm -fr $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/usr/local/bin +mkdir -p $RPM_BUILD_ROOT/usr/local/share/%{name} +mkdir -p $RPM_BUILD_ROOT/usr/local/doc + +install -s -m 0555 ttf2pt1 $RPM_BUILD_ROOT/usr/local/bin +install -m 0555 scripts/* $RPM_BUILD_ROOT/usr/local/share/%{name} +chmod 0444 $RPM_BUILD_ROOT/usr/local/share/%{name}/convert.cfg.sample + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(644, root, root, 755) +%doc README README.html INSTALL INSTALL.html +/usr/local/bin/ttf2pt1 +/usr/local/share/%{name} + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec.src b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec.src new file mode 100644 index 00000000..31fc9843 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec.src @@ -0,0 +1,40 @@ +Summary: TrueType to Adobe Type 1 font converter +Name: ttf2pt1 +Version: XXX +Release: 1jv +Source: %{name}-%{version}.tgz +Copyright: Distributable +Group: Utilities/Printing +BuildRoot: /var/tmp/ttf2pt1 + +%description + * True Type Font to Adobe Type 1 font converter + * By Mark Heath + * Based on ttf2pfa by Andrew Weeks + * With help from Frank M. Siegert + +%prep +%setup + +%build +make all + +%install +rm -fr $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/usr/local/bin +mkdir -p $RPM_BUILD_ROOT/usr/local/share/%{name} +mkdir -p $RPM_BUILD_ROOT/usr/local/doc + +install -s -m 0555 ttf2pt1 $RPM_BUILD_ROOT/usr/local/bin +install -m 0555 scripts/* $RPM_BUILD_ROOT/usr/local/share/%{name} +chmod 0444 $RPM_BUILD_ROOT/usr/local/share/%{name}/convert.cfg.sample + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(644, root, root, 755) +%doc README README.html INSTALL INSTALL.html +/usr/local/bin/ttf2pt1 +/usr/local/share/%{name} + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/README b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/README new file mode 100644 index 00000000..cffad647 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/README @@ -0,0 +1,51 @@ +Scripts to support CJK-LaTeX + +by Mike Fabian + + +The tiny Perl-script 'sfd2map' converts .sfd files (as used by +CJK-LaTeX) to .map files (as used by ttf2pt1). + +Actually I currently don't use that script stand-alone for performance +reasons. + +Currently I use such a conversion in another small script 'cjk-latex-config' +(attached as well) which creates .tfm files usable with CJK-LaTeX +from TrueType fonts as listed in /etc/ttf2pk/ttfonts.map. When called like + cjk-latex-config --type1 +this script will use ttf2pt1 to generate .pfb files as well from these TrueType +fonts to be used with CJK-LaTeX. + +The .sfd files cannot be directly used as input to ttf2pt1 because the +format of the .map files which ttf2pt1 expects is slightly different, +therefore I made the 'sfd2map' converter script. + +But then I noticed that I would have to parse the generated map file +*again* to get a list of the plane numbers to use. That seemed to be a +bit wastful because I had just parsed the .sfd file to convert it to +.map, therefore I included sfd2map as a function in 'cjk-latex-config' +as well and collected the plane numbers during the conversion. + +But 'cjk-latex-config' is maybe a little bit SuSE specific, therefore +I kept 'sfd2map' also as a standalong script. Use it if you like. + +'cjk-latex-config' calls another small script 'cjk-latex-t1mapgen' +to generate a cjk-latex.map file containing something like + cyberb00 BitstreamCyberbit-Roman-00 + + +Scripts to support CJK-LaTeX + + + +

+Scripts to support CJK-LaTeX +

+ +by Mike Fabian +<mfabian@suse.de> +

+ +The tiny Perl-script 'sfd2map' converts .sfd files (as used by +CJK-LaTeX) to .map files (as used by ttf2pt1). +

+ +Actually I currently don't use that script stand-alone for performance +reasons. +

+ +Currently I use such a conversion in another small script 'cjk-latex-config' +(attached as well) which creates .tfm files usable with CJK-LaTeX +from TrueType fonts as listed in /etc/ttf2pk/ttfonts.map. When called like +
+  cjk-latex-config --type1 +
+this script will use ttf2pt1 to generate .pfb files as well from these TrueType +fonts to be used with CJK-LaTeX. +

+ +The .sfd files cannot be directly used as input to ttf2pt1 because the +format of the .map files which ttf2pt1 expects is slightly different, +therefore I made the 'sfd2map' converter script. +

+ +But then I noticed that I would have to parse the generated map file +*again* to get a list of the plane numbers to use. That seemed to be a +bit wastful because I had just parsed the .sfd file to convert it to +.map, therefore I included sfd2map as a function in 'cjk-latex-config' +as well and collected the plane numbers during the conversion. +

+ +But 'cjk-latex-config' is maybe a little bit SuSE specific, therefore +I kept 'sfd2map' also as a standalong script. Use it if you like. +

+ +'cjk-latex-config' calls another small script 'cjk-latex-t1mapgen' +to generate a cjk-latex.map file containing something like +
+  cyberb00 BitstreamCyberbit-Roman-00 <cyberb00.pfb +
+  cyberb01 BitstreamCyberbit-Roman-01 <cyberb01.pfb +
+  cyberb02 BitstreamCyberbit-Roman-02 <cyberb02.pfb +
+  [...] +
+after all .pfb files have been generated. +

+ +Maybe this is also SuSE specific, I'm not sure about in what +directories the relevant files are stored on other Linux-like systems. +

+ +I'm not yet sure whether they work on other systems beside SuSE Linux. +They have hard coded path names where to find the TrueType fonts, +ttfonts.map, the TeX fonts etc and cjk-latex-config checks +whether freetype-tools.rpm is installed. freetype-tools.rpm might +have another name for other distributions and for distributions +which don't use rpm this check can't work anyway. +

+ +These are small details and it should not be difficult to adapt the +scripts for other Linux-like systems though. +

+ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-config b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-config new file mode 100644 index 00000000..4ee30e28 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-config @@ -0,0 +1,352 @@ +#!/usr/bin/perl -w +# +# Copyright (c) 2002 SuSE Linux AG, Nuernberg, Germany. All rights reserved. +# +# Author: Mike Fabian , 2002 +# + +use English; +use Getopt::Long; + +# check if we are started as root +# only one of UID and USER must be set correctly + +if ($UID != 0 && $ENV{USER} !~ /root/) { + print "You must be root to start $0\n"; + exit 1; +} + +if (system ("rpm -q freetype-tools >/dev/null 2>&1") != 0) { + print "freetype-tools package missing, exiting.\n"; + exit 1; +} + + +sub usage { + print "Usage: cjk-latex-config [--verbose|v] [--force|f] [--type1|t]\n"; + exit 1; +} + +# Process command line options +my %opt; +unless (GetOptions(\%opt, + 'verbose|v', \$OPT_VERBOSE, + 'force|f', \$OPT_FORCE, + 'type1|t', \$OPT_TYPE1, + )) { + &usage(); + exit 1; +} + +# to make sure ttf2tfm finds the .sdf files: +system("texhash"); + +$tfm_created = 0; +$type1_created = 0; + +system("mkdir -p /usr/share/texmf/fonts/truetype/"); + +open (TTFONTS_MAP, "/etc/ttf2pk/ttfonts.map"); + +while () { + + chomp($ARG); + + if ($ARG =~ /\@[a-zA-Z0-9\/]+\@/) { + + if($OPT_VERBOSE) { + print "----------------------------------------------------------------------\n"; + print "$ARG\n"; + } + + @fields = split(/\s+/, $ARG); + + $tt_dir = "/usr/X11R6/lib/X11/fonts/truetype/"; + $tt_basename = $fields[1]; + + if ($fields[0] =~ /([^\s]+)\@[a-zA-Z0-9\/]+\@/) { + $latex_font_name = $1; + } else { + print "can't find latex font name.\n"; + exit 1 + } + + if ($fields[0] =~ /\@([a-zA-Z0-9\/]+)\@/) { + $sfd_name = $1; + $sfd_name =~ /.*\/([a-zA-Z0-9]+)/; + $sfd_basename = $1; + } else { + print "can't find sfd_name.\n"; + exit 1 + } + + if ($ARG =~ /Pid=([0-9]+)/) { + $pid = "$1"; + } else { + $pid = "3"; + } + + if ($ARG =~ /Eid=([0-9]+)/) { + $eid = "$1"; + } else { + $eid = "1"; + } + + if ($ARG =~ /Slant=([0-9.]+)/) { + $slant = $1; + $slant_opt = "-s $1"; + } else { + $slant = 0; + $slant_opt = "-s 0"; + } + + if ($ARG =~ /Rotate=(Yes)/) { + $rotate = 1; + $rotate_opt = "-x"; + } else { + $rotate = 0; + $rotate_opt = ""; + } + + if (-e "$tt_dir/$tt_basename") { + symlink("$tt_dir/$tt_basename", + "/usr/share/texmf/fonts/truetype/$tt_basename"); + $tfm_dir = "/usr/share/texmf/fonts/tfm/cjk-latex/"; + $type1_dir = "/usr/share/texmf/fonts/type1/cjk-latex/"; + + if (0 != create_or_update_tfm ()) { + print "creating .tfm failed.\n"; + } + if ($OPT_TYPE1 && $slant == 0 && $rotate == 0) { + if (0 != create_or_update_type1 ()) { + print "creating type1 font failed.\n"; + } + } + } + } +} + +if ($type1_created) { + $command = "cjk-latex-t1mapgen $type1_dir"; + if (0 != system ($command)) { + print "$command failed.\n"; + exit 1; + } +} + +if ($tfm_created || $type1_created) { + system("texhash"); +} + + +exit 0; + + +###################################################################### + +sub create_or_update_tfm { + + if ($OPT_FORCE || + mtime_differs_or_missing ("$tt_dir/$tt_basename", + "$tfm_dir/$sfd_basename/$latex_font_name/")) { + + if (0 != system ("mkdir -p $tfm_dir/$sfd_basename/$latex_font_name/")) { + print "mkdir -p $tfm_dir/$sfd_basename/$latex_font_name/ failed.\n"; + exit 1; + } + if (! chdir ("$tfm_dir/$sfd_basename/$latex_font_name/")) { + print "can't chdir to $tfm_dir/$sfd_basename/$latex_font_name/\n"; + exit 1; + } + + $command = "ttf2tfm $tt_dir/$tt_basename "; + unless ($OPT_VERBOSE) { + $command .= " -q"; + } + $command .= " -P $pid -E $eid $rotate_opt $slant_opt $latex_font_name\@$sfd_name\@"; + if ($OPT_VERBOSE) { + print "$command\n"; + } else { + $command .= " > /dev/null 2>&1"; + print "$latex_font_name\@$sfd_name\@: calling ttf2tfm ...\n"; + } + if (0 != system($command)) { + print "$command failed.\n"; + return 1; + } + + # success, mark this by giving the created directory the same time stamp + # as the TT-font: + system("touch -r $tt_dir/$tt_basename $tfm_dir/$sfd_basename/$latex_font_name/"); + $tfm_created = 1; + return 0; + } + +} + +###################################################################### + +sub create_or_update_type1 { + + if ($OPT_FORCE || + mtime_differs_or_missing ("$tt_dir/$tt_basename", + "$type1_dir/$sfd_basename/$latex_font_name/")) { + + if (0 != system ("mkdir -p $type1_dir/$sfd_basename/$latex_font_name/")) { + print "mkdir -p $type1_dir/$sfd_basename/$latex_font_name/ failed.\n"; + exit 1; + } + if (! chdir ("$type1_dir/$sfd_basename/$latex_font_name/")) { + print "can't chdir to $type1_dir/$sfd_basename/$latex_font_name/\n"; + exit 1; + } + + if (grep(/$tt_basename/,("wadalab-gothic.ttf","watanabe-mincho.ttf"))) { + print "$tt_basename does not work with ttf2pt1, skipping ...\n"; + return 0; + } + + # disable smoothing of outlines for broken fonts + # (for details see 'man ttf2pt1'): + my $smoothing_opt = " "; + if (grep(/$tt_basename/,("kochi-gothic.ttf"))) { + print "$tt_basename broken, disabling smoothing of outlines.\n"; + $smoothing_opt = " -O s "; + } + + $sfd_file = "/usr/share/texmf/ttf2tfm/$sfd_basename.sfd"; + $map_file = `mktemp /tmp/cjk-latex-config-map.XXXXXX`; + chomp $map_file; + if ($map_file eq "") { + print "mktemp /tmp/cjk-latex-config-map.XXXXXX failed.\n"; + } + + @planes = sfd2map($sfd_file,$map_file); + if ($#planes == -1) { + print "sfd2map($sfd_file,$map_file) failed.\n"; + return 1; + } + + for my $plane (@planes) { + if ($OPT_VERBOSE) { + $command = "ttf2pt1 -W 99 "; + } else { + $command = "ttf2pt1 -W 0 "; + } + $command .= $smoothing_opt; + $command .= " -p ft -b -G a -m h=5000 "; + $command .= " -L $map_file+pid=$pid,eid=$eid,$plane "; + $command .= " $tt_dir/$tt_basename $latex_font_name$plane"; + if ($OPT_VERBOSE) { + print "$command\n"; + } else { + $command .= " > /dev/null 2>&1"; + print "$latex_font_name\@$sfd_name\@, plane=$plane: calling ttf2pt1 ...\n"; + } + if (0 != system($command)) { + print "$command failed.\n"; + return 1; + } + } + + unlink $map_file; + + # success, mark this by giving the created directory the same time stamp + # as the TT-font: + system("touch -r $tt_dir/$tt_basename $type1_dir/$sfd_basename/$latex_font_name/"); + $type1_created = 1; + return 0; + } +} + +###################################################################### + +sub sfd2map { + my($sfd_file,$map_file) = @_; + if (! open (SFD, "<$sfd_file")) { + print "cannot open $sfd_file\n"; + return (); + } + if (! open (MAP, ">$map_file")) { + print "cannot open $map_file\n"; + close (SFD); + return (); + } + + my(@planes) = (); + + while () { + + if ( ! ($ARG =~ /^[[:space:]]*\#/)) { # skip comment lines + + # handle plane numbers: + if ( $ARG =~ /^([[:xdigit:]]{2})[[:space:]]*/ ) { + $ARG =~ s/^([[:xdigit:]]{2})[[:space:]]*/ /; + print MAP "plane $1\n"; + print MAP "at 0x00\n"; + $planes[$#planes + 1] = $1; + } + + # remove continuation chars '\': + $ARG =~ s/\\$//; + + $ARG =~ s/(0x[[:xdigit:]]{1,4})/$1,/g; + # handle ranges like 0xF800_0xF8FF + $ARG =~ s/(0x[[:xdigit:]]{1,4}),_/$1-/g; + } + + print MAP $ARG; + + } + + close (MAP); + close (SFD); + return @planes; +} + + +# Returns true if the modification time of $f1 differs from +# the modification time of $f2 +sub mtime_differs { + my($f1,$f2) = @_; + if( -e $f1 && -e $f2) { + local (@f1s) = stat ($f1); + local (@f2s) = stat ($f2); + return ($f1s[9] != $f2s[9]); + } else { + return 0; + } +} + +# Returns true if the modification time of $f1 differs from +# the modification time of $f2 or if one of the files is missing +sub mtime_differs_or_missing { + my($f1,$f2) = @_; + if (! -e $f1 || ! -e $f2 || mtime_differs($f1,$f2)) { + return 1; + } else { + return 0; + } +} + +# Returns true if $f1 is newer than $f2 +sub newer { + my($f1,$f2) = @_; + if( -e $f1 && -e $f2) { + local (@f1s) = stat ($f1); + local (@f2s) = stat ($f2); + return ($f1s[9] > $f2s[9]); + } else { + return 0; + } +} + +# Returns true if $f1 is newer than $f2 or if one of the files is missing +sub newer_or_missing { + my($f1,$f2) = @_; + if (! -e $f1 || ! -e $f2 || newer($f1,$f2)) { + return 1; + } else { + return 0; + } +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-t1mapgen b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-t1mapgen new file mode 100644 index 00000000..5b79b45e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-t1mapgen @@ -0,0 +1,60 @@ +#!/bin/sh +# +# Copyright (c) 2002 SuSE Linux AG, Nuernberg, Germany. All rights reserved. +# +# Author: Mike Fabian , 2002 +# + +TYPE1_DIR=$1 +if [ -z $TYPE1_DIR ] ; then + TYPE1_DIR=/usr/share/texmf/fonts/type1/cjk-latex/ +fi + +CJK_LATEX_TYPE1_MAP_FILE=/var/lib/texmf/dvips/config/cjk-latex.map + +echo "creating $CJK_LATEX_TYPE1_MAP_FILE ..." + +TMPFILE=`mktemp /tmp/cjk-latex-t1mapgen.XXXXXX` + +if [ -d $TYPE1_DIR ] ; then + for FILE in $( find $TYPE1_DIR -name "*.pfb" ) + do + BASENAME_WITHOUT_EXT=$( basename $FILE ) + BASENAME_WITHOUT_EXT=${BASENAME_WITHOUT_EXT%.pfb} + FONT_NAME=$( grep -a "/FontName.*def" ${FILE} | perl -pe "s%/FontName /([^ ]+) def%\1%" ) + echo "${BASENAME_WITHOUT_EXT} ${FONT_NAME} <${BASENAME_WITHOUT_EXT}.pfb" >> $TMPFILE + done +fi + +mv $TMPFILE $CJK_LATEX_TYPE1_MAP_FILE +chmod 644 $CJK_LATEX_TYPE1_MAP_FILE + +# add entries for PostScript font map files used by CJK-LaTeX +# to 'pdftex.cfg' and 'config.ps': + +PDFTEX_CFG=/var/lib/texmf/pdftex/config/pdftex.cfg +CONFIG_PS=/var/lib/texmf/dvips/config/config.ps + +for MAP in cjk-latex.map +do + if [ -f /var/lib/texmf/dvips/config/$MAP ] ; then + egrep "^p \+$MAP" $CONFIG_PS > /dev/null + if [ $? = 1 ] ; then + echo "p +$MAP" >> $CONFIG_PS + fi + egrep "^map \+$MAP" $PDFTEX_CFG > /dev/null + if [ $? = 1 ] ; then + echo "map +$MAP" >> $PDFTEX_CFG + fi + fi +done + +# pdflatex seems to prefer pk fonts if they exist. That seems strange +# but I couldn't find out how to change this. +# Deleting all the pk fonts from /var/cache/fonts/pk/* is probably a bit overkill +# but it helps. 'dvips' will regenerate the pk fonts as needed but will not +# regenerate pk fonts for the pfb fonts listed in the map file generated above. +# Therefore, deleting /var/cache/fonts/pk/* makes sure that all available pfb +# fonts are used: + +rm -rf /var/cache/fonts/pk/* \ No newline at end of file diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/sfd2map b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/sfd2map new file mode 100644 index 00000000..671a7fb8 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/sfd2map @@ -0,0 +1,68 @@ +#!/usr/bin/perl -w +# +# Copyright (c) 2002 Mike Fabian +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +use English; +use Getopt::Long; + +sub usage { + print "Usage: sfd2map [-debug|d]\n\n"; + print "Converts a .sfd files in the format used by ttf2pk and ttf2tfm\n"; + print "into .map files in the format expected by ttf2pt1. For example:\n\n"; + print " sfd2map < UJIS.sfd > UJIS.map \n\n"; + exit 1; +} + +# Process command line options +my %opt; +unless (GetOptions(\%opt, + '-debug|d' , \$OPT_DEBUG + )) { + &usage(); + exit 1; +} + +if($OPT_DEBUG) { +} + +open (MAP, ">&STDOUT"); +open (SFD, "<&STDIN"); + +print MAP "# generated from a .sfd file by sfd2map to make it usable with ttf2pt1\n"; +print MAP "#\n"; + +while () { + + if ( ! ($ARG =~ /^[[:space:]]*\#/)) { # skip comment lines + + # handle plane numbers: + if ( $ARG =~ /^([[:xdigit:]]{2})[[:space:]]*/ ) { + $ARG =~ s/^([[:xdigit:]]{2})[[:space:]]*/ /; + print MAP "plane $1\n"; + print MAP "at 0x00\n"; + } + + # remove continuation chars '\': + $ARG =~ s/\\$//; + + $ARG =~ s/(0x[[:xdigit:]]{1,4})/$1,/g; + # handle ranges like 0xF800_0xF8FF + $ARG =~ s/(0x[[:xdigit:]]{1,4}),_/$1-/g; + + } + + print MAP $ARG; + +} + + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README new file mode 100644 index 00000000..c07c7998 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README @@ -0,0 +1,24 @@ +Recommended patches for the X11 font library + +by Sergey Babkin +, + +These are patches for XFree86 versions 3.3.4 and 3.9 +to fix a few known problems with big Type1 fonts and +with strange handling of the standard stem width table. +The patch for XFree86 3.3.4 probably may be easily +installed on any other distribution of X11. +They are supposed to be installed in the subdirectory + + xc/lib/font/Type1 + +of the X11 source tree and after that the font library, +font server and X server should be rebuilt. + +Sorry that the description has so little details but if +you know how to build X11 then this is enough, otherwise +any more details won't help much. + +The patches have been submitted to the XFree86 project, +hope they will be included in some next release of XFree86 +and X11. diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README.html b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README.html new file mode 100644 index 00000000..322a01e9 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README.html @@ -0,0 +1,41 @@ + + + +Recommended patches for the X11 font library + + + +

+Recommended patches for the X11 font library +

+ +by Sergey Babkin +<babkin@bellatlantic.net>, <sab123@hotmail.com> +

+ +These are patches for XFree86 versions 3.3.4 and 3.9 +to fix a few known problems with big Type1 fonts and +with strange handling of the standard stem width table. +The patch for XFree86 3.3.4 probably may be easily +installed on any other distribution of X11. +They are supposed to be installed in the subdirectory +
+ +  xc/lib/font/Type1 +
+ +of the X11 source tree and after that the font library, +font server and X server should be rebuilt. +

+ +Sorry that the description has so little details but if +you know how to build X11 then this is enough, otherwise +any more details won't help much. +

+ +The patches have been submitted to the XFree86 project, +hope they will be included in some next release of XFree86 +and X11. +

+ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.334.patch b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.334.patch new file mode 100644 index 00000000..31e98e2d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.334.patch @@ -0,0 +1,199 @@ +*** fontfcn.c 2000/01/02 18:55:56 1.1 +--- fontfcn.c 2000/01/02 19:00:17 +*************** +*** 33,38 **** +--- 33,39 ---- + #include + #include "t1imager.h" + #include "util.h" ++ #include "t1stdio.h" + #include "fontfcn.h" + #include "fontmisc.h" + +*************** +*** 117,132 **** + resetFont(env); + /* This will load the font into the FontP */ + rcode = scan_font(FontP); +! if (rcode == SCAN_OUT_OF_MEMORY) { + /* free the memory and start again */ + xfree(vm_base); + if (!(initFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetFont(env); + rcode = scan_font(FontP); +- /* only double the memory once, then report error */ + } + return(rcode); + } +--- 118,151 ---- + resetFont(env); + /* This will load the font into the FontP */ + rcode = scan_font(FontP); +! if (rcode != SCAN_OUT_OF_MEMORY) +! return rcode; +! +! if (T1FileSize > VM_SIZE) { +! /* use the file size as estimation */ +! + /* free the memory and start again */ + xfree(vm_base); ++ if (!(initFont(T1FileSize))) { ++ /* we are really out of memory */ ++ return(SCAN_OUT_OF_MEMORY); ++ } ++ resetFont(env); ++ rcode = scan_font(FontP); ++ if (rcode != SCAN_OUT_OF_MEMORY) ++ return rcode; ++ } ++ ++ /* if still not enough, increase up to maximum */ ++ while (rcode == SCAN_OUT_OF_MEMORY ++ && vm_size <= VM_SIZE_MAX/2 ) { ++ xfree(vm_base); + if (!(initFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetFont(env); + rcode = scan_font(FontP); + } + return(rcode); + } +*** paths.c 2000/01/02 18:55:56 1.1 +--- paths.c 2000/01/02 18:56:27 +*************** +*** 584,590 **** + CONCAT(before, r); + r = before; + } +! else + r->context = after->context; + if (after != NULL) + CONCAT(r, after); +--- 584,590 ---- + CONCAT(before, r); + r = before; + } +! else if (after != NULL) + r->context = after->context; + if (after != NULL) + CONCAT(r, after); +*** scanfont.c 2000/01/02 18:55:56 1.1 +--- scanfont.c 2000/01/02 18:56:26 +*************** +*** 1383,1388 **** +--- 1383,1390 ---- + /* point to name and search for leading blanks */ + nameP= FontP->FontFileName.data.nameP; + namelen = FontP->FontFileName.len; ++ if (namelen > (128-1) ) /* prevent getting out of filename[] */ ++ namelen = (128-1); + while (nameP[0] == ' ') { + nameP++; + namelen--; +*** t1io.c 2000/01/02 18:55:56 1.1 +--- t1io.c 2000/01/02 18:56:32 +*************** +*** 54,59 **** +--- 54,62 ---- + /* Our single FILE structure and buffer for this package */ + STATIC F_FILE TheFile; + STATIC unsigned char TheBuffer[F_BUFSIZ]; ++ ++ /* the size of the file we read */ ++ int T1FileSize; + + /* Our routines */ + F_FILE *T1Open(), *T1Eexec(); +*************** +*** 87,92 **** +--- 90,96 ---- + of->flags = 0; + of->error = 0; + haveextrach = 0; ++ T1FileSize = 0; + return &TheFile; + } /* end Open */ + +*************** +*** 165,171 **** +--- 169,181 ---- + int T1Close(f) /* Close the file */ + F_FILE *f; /* Stream descriptor */ + { ++ int rc; ++ + if (f->b_base == NULL) return 0; /* already closed */ ++ ++ while ( (rc = read(f->fd, f->b_base, F_BUFSIZ)) >0) ++ T1FileSize += rc; /* count the rest of the file */ ++ + f->b_base = NULL; /* no valid stream */ + return close(f->fd); + } /* end Close */ +*************** +*** 289,294 **** +--- 299,305 ---- + } + } + f->b_ptr = f->b_base; ++ T1FileSize += rc; /* remember how many bytes we have */ + if (Decrypt) rc = T1Decrypt(f->b_base, rc); + return rc; + } /* end Fill */ +*** type1.c 2000/01/02 18:55:56 1.1 +--- type1.c 2000/01/02 18:56:27 +*************** +*** 365,378 **** + /* ADJUST STEM WIDTHS */ + /**********************/ + +! widthdiff = 0.0; + + /* Find standard stem with smallest width difference from this stem */ + if (stems[stemno].vertical) { /* vertical stem */ + if (blues->StdVW != 0) /* there is an entry for StdVW */ + widthdiff = blues->StdVW - stemwidth; + for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ +! if (blues->StemSnapV[i] - stemwidth < widthdiff) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapV[i] - stemwidth; + } +--- 365,380 ---- + /* ADJUST STEM WIDTHS */ + /**********************/ + +! /* a big value to not compete with StemSnap */ +! /* if there is no StemSnap it will be caught later */ +! widthdiff = onepixel*2; + + /* Find standard stem with smallest width difference from this stem */ + if (stems[stemno].vertical) { /* vertical stem */ + if (blues->StdVW != 0) /* there is an entry for StdVW */ + widthdiff = blues->StdVW - stemwidth; + for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ +! if ( FABS(blues->StemSnapV[i] - stemwidth) < FABS(widthdiff) ) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapV[i] - stemwidth; + } +*************** +*** 380,386 **** + if (blues->StdHW != 0) /* there is an entry for StdHW */ + widthdiff = blues->StdHW - stemwidth; + for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ +! if (blues->StemSnapH[i] - stemwidth < widthdiff) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapH[i] - stemwidth; + } +--- 382,388 ---- + if (blues->StdHW != 0) /* there is an entry for StdHW */ + widthdiff = blues->StdHW - stemwidth; + for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ +! if ( FABS(blues->StemSnapH[i] - stemwidth) < FABS(widthdiff) ) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapH[i] - stemwidth; + } diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.39.patch b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.39.patch new file mode 100644 index 00000000..44d32ce5 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.39.patch @@ -0,0 +1,252 @@ +*** scanfont.c 1999/12/27 00:34:02 1.1 +--- scanfont.c 1999/12/27 00:35:34 +*************** +*** 2234,2239 **** +--- 2234,2241 ---- + /* point to name and search for leading blanks */ + nameP= FontP->FontFileName.data.nameP; + namelen = FontP->FontFileName.len; ++ if (namelen > (128-1) ) /* prevent getting out of filename[] */ ++ namelen = (128-1); + while (nameP[0] == ' ') { + nameP++; + namelen--; +*** paths.c 1999/12/27 00:37:01 1.1 +--- paths.c 1999/12/27 00:37:43 +*************** +*** 583,589 **** + CONCAT(before, r); + r = before; + } +! else + r->context = after->context; + if (after != NULL) + CONCAT(r, after); +--- 583,589 ---- + CONCAT(before, r); + r = before; + } +! else if (after != NULL) + r->context = after->context; + if (after != NULL) + CONCAT(r, after); +*** type1.c 1999/12/27 00:38:16 1.1 +--- type1.c 1999/12/27 01:08:02 +*************** +*** 399,412 **** + /* ADJUST STEM WIDTHS */ + /**********************/ + +! widthdiff = 0.0; + + /* Find standard stem with smallest width difference from this stem */ + if (stems[stemno].vertical) { /* vertical stem */ + if (blues->StdVW != 0) /* there is an entry for StdVW */ + widthdiff = blues->StdVW - stemwidth; + for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ +! if (blues->StemSnapV[i] - stemwidth < widthdiff) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapV[i] - stemwidth; + } +--- 399,414 ---- + /* ADJUST STEM WIDTHS */ + /**********************/ + +! /* a big value to not compete with StemSnap */ +! /* if there is no StemSnap it will be caught later */ +! widthdiff = onepixel*2; + + /* Find standard stem with smallest width difference from this stem */ + if (stems[stemno].vertical) { /* vertical stem */ + if (blues->StdVW != 0) /* there is an entry for StdVW */ + widthdiff = blues->StdVW - stemwidth; + for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ +! if ( FABS(blues->StemSnapV[i] - stemwidth) < FABS(widthdiff) ) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapV[i] - stemwidth; + } +*************** +*** 414,420 **** + if (blues->StdHW != 0) /* there is an entry for StdHW */ + widthdiff = blues->StdHW - stemwidth; + for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ +! if (blues->StemSnapH[i] - stemwidth < widthdiff) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapH[i] - stemwidth; + } +--- 416,422 ---- + if (blues->StdHW != 0) /* there is an entry for StdHW */ + widthdiff = blues->StdHW - stemwidth; + for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ +! if ( FABS(blues->StemSnapH[i] - stemwidth) < FABS(widthdiff) ) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapH[i] - stemwidth; + } +*** t1io.c 2000/01/01 00:41:44 1.1 +--- t1io.c 2000/01/01 01:23:38 +*************** +*** 78,83 **** +--- 78,86 ---- + /* Our single FILE structure and buffer for this package */ + STATIC F_FILE TheFile; + STATIC unsigned char TheBuffer[F_BUFSIZ]; ++ ++ /* the size of the file we read */ ++ int T1FileSize; + + /* Our routines */ + F_FILE *T1Open(), *T1Eexec(); +*************** +*** 118,123 **** +--- 121,127 ---- + of->flags = 0; + of->error = 0; + haveextrach = 0; ++ T1FileSize = 0; + return &TheFile; + } /* end Open */ + +*************** +*** 196,202 **** +--- 200,212 ---- + int T1Close(f) /* Close the file */ + F_FILE *f; /* Stream descriptor */ + { ++ int rc; ++ + if (f->b_base == NULL) return 0; /* already closed */ ++ ++ while ( (rc = read(f->fd, f->b_base, F_BUFSIZ)) >0) ++ T1FileSize += rc; /* count the rest of the file */ ++ + f->b_base = NULL; /* no valid stream */ + return close(f->fd); + } /* end Close */ +*************** +*** 381,386 **** +--- 391,397 ---- + } + } + f->b_ptr = f->b_base; ++ T1FileSize += rc; /* remember how many bytes we have */ + if (Decrypt) rc = T1Decrypt(f->b_base, rc); + return rc; + } /* end Fill */ +*** t1stdio.h 2000/01/01 00:43:38 1.1 +--- t1stdio.h 2000/01/01 01:24:19 +*************** +*** 73,78 **** +--- 73,79 ---- + + extern FILE *T1Open(), *T1eexec(); + extern int T1Close(), T1Ungetc(), T1Read(); ++ extern int T1FileSize; + + #undef fclose + #undef fopen +*** fontfcn.c 2000/01/01 00:07:54 1.1 +--- fontfcn.c 2000/01/01 01:36:02 +*************** +*** 57,62 **** +--- 57,63 ---- + #endif + #include "t1imager.h" + #include "util.h" ++ #include "t1stdio.h" + #ifdef BUILDCID + #include "range.h" + #include "fontmisc.h" +*************** +*** 300,333 **** + resetFont(env); + /* This will load the font into the FontP */ + rcode = scan_font(FontP); +! if (rcode == SCAN_OUT_OF_MEMORY) { + /* free the memory and start again */ + #ifdef BUILDCID + /* xfree(vm_base); */ + #else + xfree(vm_base); + #endif + if (!(initFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetFont(env); + rcode = scan_font(FontP); +- #ifdef BUILDCID +- /* only double the memory twice, then report error */ +- if (rcode == SCAN_OUT_OF_MEMORY) { +- /* free the memory and start again */ +- /* xfree(vm_base) */ +- if (!(initFont(vm_size * 2))) { +- /* we are really out of memory */ +- return(SCAN_OUT_OF_MEMORY); +- } +- resetFont(env); +- rcode = scan_font(FontP); +- } +- #else +- /* only double the memory once, then report error */ +- #endif + } + return(rcode); + } +--- 301,342 ---- + resetFont(env); + /* This will load the font into the FontP */ + rcode = scan_font(FontP); +! if (rcode != SCAN_OUT_OF_MEMORY) +! return rcode; +! +! if (T1FileSize > VM_SIZE) { +! /* use the file size as estimation */ +! + /* free the memory and start again */ + #ifdef BUILDCID + /* xfree(vm_base); */ + #else + xfree(vm_base); + #endif ++ if (!(initFont(T1FileSize))) { ++ /* we are really out of memory */ ++ return(SCAN_OUT_OF_MEMORY); ++ } ++ resetFont(env); ++ rcode = scan_font(FontP); ++ if (rcode != SCAN_OUT_OF_MEMORY) ++ return rcode; ++ } ++ ++ /* if still not enough, increase up to maximum */ ++ while (rcode == SCAN_OUT_OF_MEMORY ++ && vm_size <= VM_SIZE_MAX/2 ) { ++ #ifdef BUILDCID ++ /* xfree(vm_base); */ ++ #else ++ xfree(vm_base); ++ #endif + if (!(initFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetFont(env); + rcode = scan_font(FontP); + } + return(rcode); + } +*** util.h 2000/01/01 00:40:11 1.1 +--- util.h 2000/01/01 01:29:18 +*************** +*** 83,88 **** +--- 83,92 ---- + #else + #define VM_SIZE (50*1024) + #endif ++ ++ /* this is the maximal permitted memory size */ ++ #define VM_SIZE_MAX (1024*1024) ++ + /***================================================================***/ + + #ifndef MIN diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/Makefile b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/Makefile new file mode 100644 index 00000000..2c69599b --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/Makefile @@ -0,0 +1,5 @@ +nsfix: nsfix.c + $(CC) $(CFLAGS) -o nsfix nsfix.c $(LDFLAGS) + +clean: + rm -f *.o core *.core core.* nsfix diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README new file mode 100644 index 00000000..d57c1cd5 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README @@ -0,0 +1,180 @@ +Installing the fonts in Netscape Navigator + +by Sergey Babkin +, + +This is a collection of supplements to Netscape 4.x on +Unix. Probably they will also work with Netscape 3.x, +possilby with minor modifications. + + Makefile + nsfix.c + psfonts.cf + +This is a program that allows to substitute the font metrics +of any PostScript font in Netscape. + +When Netscape prints the files to PostScript format it uses a +built-in table of character widths. It prints all the fixed-width +characters in the typeface "Courier" and all the variable-width +characters in the typeface "Times". And if the PostScript printer +has these fonts by Adobe then everything goes fine because +the tables inside Netscape are generated from the Adobe fonts. +But if the fonts are different (say, those supplied with Ghostscripts +or the fonts with non-latin characters) then the result is quite +ugly. This program allows to replace the width tables inside +the Netscape executable with the tables for any given font. +The only problem is that Netscape can hold only one set of tables +at once. So if you want to print with different fonts (say, +for different languages or encodings) you will have to make +multiple copies of the executable, tune each of them for its +font and then run them separately. + +I tried to make the program as machine-independent as possible. +But because it patches the binary files it still has the dependencies +on hardware. The default version as supplied was designed for +Intel x86 machines but it should work OK on any machine +with 32-bit CPU and 4Kbyte (or less) page size. If it can't +find the tables matching the font names on some other architecture +the first thing to try would be reduce the `PAGEBITS' definition +in the source code. On the machines with non-page-aligned structure +of executables it won't work at all. I don't know whether would +it work on the 64-bit machines. This may depend on whether the +Netscape executable was compiled in 32-bit or 64-bit mode. For +the 64-bit executables it may be neccessary to change the definition +of the type `tptr' to an 8-byte integer type (probably `long' +or `long long'). Also must be re-compiled for patching of the +Netscape binary for each particular machine architecture because +it assumes the byte order of the current machine. + +It might be possible to create a program that would patch +a running Netscape binary on the fly, that would allow +changing the printing fonts as neccessary when Netscape is +running. But this would be even more platform-dependent, +so I don't feel any enthusiasm about doing that. + +I have tested the program on the Intel machines, Netscape +4.08 and 4.7, OS FreeBSD (both a.out and ELF formats of the +Netscape binary) and UnixWare. + +After all these scary issues are resolved the compiling +is easy: just run `make'. + +To command to patch the Netscape is: + ./nsfix + +Please make a copy of the original Netscape binary before +patching in case anything goes wrong. Patch the copy, test +that it works OK and only then install it. The configuration +file describes the fonts that are to be used. An example +is provided in the file psfonts.cf. + +Each line in the configuration file consists of 4 +columns: + + + +For example, the following line from my configuration file: + +Courier /usr/lib/X11/fonts/ttf/cokoi8n.koi8-r .afm .pfa + +says that the font `Courier' will be replaced with the +font taken from the file `/usr/lib/X11/fonts/ttf/cokoi8n.koi8-r.pfa' +and the metrics for that font will be taken from the file +`/usr/lib/X11/fonts/ttf/cokoi8n.koi8-r.afm' . + +One more caveat: the new font must have a proper encoding +table. Some fonts contain characters for multiple encodings +hoping that the program wil re-encode them as neccessary. +This won't work in this case, only the primary encoding table +of the font will be used. + + nsfilter + nsprint + psfonts.cf + +These are the filters for printing from Netscape. + +Changing the metrics is not the end of the story. This will +provide proper placement of the characters but not the +characters themselves. There are a few ways to provide +the characters: + +First, if you use GhostScript you may configure proper +aliases in the GhostScript configuration file. We will +consider this variant trivial and won't discuss it furter +except for one caveat: Netscape tries to re-encode the +fonts per the ISO Latin-1 encoding. If the primary encoding +of the font is different this cause unexpected effects. +So you still may consider using the filters (at least in a +simplified form) to solve this problem. + +Second, load the fonts right into your printer. This is +very much like configuring GhostScript. + +Third, use the provided filters. The script `nsfilter' +reads the output of Netscape on its standard input and +puts the result to its standard output. It uses the same +configuration file `psfonts.cf' as `nsfix'. First it +looks for the configuration file in the user's home +directory ($HOME/.netscape/psfonts.cf) and if the +file it not there then the second guess is the system-wide +configuration file /usr/local/etc/psfonts.cf. The +script inserts the fonts into the output and also +removes the Netscape's experiments with the encodings. + +`nsfilter' is generally intended to be ran by user, not by the +printing subsystem. The reason is that the user may have +changed fonts in his Netscape and the printing subsystem +would have no way to access user's configuration file. +But if all the users are using the same fonts then it +may be incorporated into the printing subsystem and use +the system-wide configuration file. + +The script `nsprint' is purely for convenience, to type it +as a printing command in the Netscape printing window. +It just pipelines the data through `nsfilter' to the +printing program which also gets all the arguments. Please +note that the SystemV-style and BSD-style systems use different +printing programs (although they commonly provide compatibility +with the other style too). The script tries to guess the +type of system and use its native print program, `lp' or +`lpr'. But in case it guesses wrong you may want +to change this in the script. Also if the printer does not support +PostScript directly this script may be a good place to +insert a call to GhostScript. + + notscape + fontsz.cf + +Netscape on Unix has a very annoying "feature", it does +not remember the desired base size of the scalable screen +fonts and always resets it to 12.0 points. Even if the size +is changed manually in its preferences file, Netscape +forgets it after it exits. + +So my solution was to write a program which would change +the size to my favorite one every time right before +starting Netscape. `notscape' is exactly such a program, +it sets the font sizes an then transparently executes +netscape. It takes the font sizes from the file +`$HOME/.netscape/fontsz.cf' . An example of such file +is provided. The format of the file is quite self-explanatory, +for example the lines + +fixed-koi8-r 140 +prop-koi8-r 150 + +mean "set the size of the fixed-width screen font in the +encoding koi8-r to 14.0 points; set the size of the proportional +(variable-width) font in the encoding koi8-r to 15.0 points". + + + nspr +by Zvezdan Petkovic + +To print from Netscape, I usually print to the Postscript file first. +Then I use this small script to change the names of Times and Courier fonts +in the file and remove `/Encoding' lines. After that the file can be +sent to printer. + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README.html b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README.html new file mode 100644 index 00000000..1e8961bb --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README.html @@ -0,0 +1,242 @@ + + + +Installing the fonts in Netscape Navigator + + + +

+Installing the fonts in Netscape Navigator +

+ + +by Sergey Babkin +<babkin@bellatlantic.net>, <sab123@hotmail.com> + +

+ +This is a collection of supplements to Netscape 4.x on +Unix. Probably they will also work with Netscape 3.x, +possilby with minor modifications. +

+ +

+  Makefile
+  nsfix.c
+  psfonts.cf +

+

+ +This is a program that allows to substitute the font metrics +of any PostScript font in Netscape. +

+ +When Netscape prints the files to PostScript format it uses a +built-in table of character widths. It prints all the fixed-width +characters in the typeface "Courier" and all the variable-width +characters in the typeface "Times". And if the PostScript printer +has these fonts by Adobe then everything goes fine because +the tables inside Netscape are generated from the Adobe fonts. +But if the fonts are different (say, those supplied with Ghostscripts +or the fonts with non-latin characters) then the result is quite +ugly. This program allows to replace the width tables inside +the Netscape executable with the tables for any given font. +The only problem is that Netscape can hold only one set of tables +at once. So if you want to print with different fonts (say, +for different languages or encodings) you will have to make +multiple copies of the executable, tune each of them for its +font and then run them separately. +

+ +I tried to make the program as machine-independent as possible. +But because it patches the binary files it still has the dependencies +on hardware. The default version as supplied was designed for +Intel x86 machines but it should work OK on any machine +with 32-bit CPU and 4Kbyte (or less) page size. If it can't +find the tables matching the font names on some other architecture +the first thing to try would be reduce the `PAGEBITS' definition +in the source code. On the machines with non-page-aligned structure +of executables it won't work at all. I don't know whether would +it work on the 64-bit machines. This may depend on whether the +Netscape executable was compiled in 32-bit or 64-bit mode. For +the 64-bit executables it may be neccessary to change the definition +of the type `tptr' to an 8-byte integer type (probably `long' +or `long long'). Also must be re-compiled for patching of the +Netscape binary for each particular machine architecture because +it assumes the byte order of the current machine. +

+ +It might be possible to create a program that would patch +a running Netscape binary on the fly, that would allow +changing the printing fonts as neccessary when Netscape is +running. But this would be even more platform-dependent, +so I don't feel any enthusiasm about doing that. +

+ +I have tested the program on the Intel machines, Netscape +4.08 and 4.7, OS FreeBSD (both a.out and ELF formats of the +Netscape binary) and UnixWare. +

+ +After all these scary issues are resolved the compiling +is easy: just run `make'. +

+ +To command to patch the Netscape is: +

+ +  ./nsfix <netscape-binary> <config-file> + +

+ +Please make a copy of the original Netscape binary before +patching in case anything goes wrong. Patch the copy, test +that it works OK and only then install it. The configuration +file describes the fonts that are to be used. An example +is provided in the file psfonts.cf. +

+ +Each line in the configuration file consists of 4 +columns: +

+ + +<PS_font_name> <font_base_file> <suffix_afm> <suffix_font> + +

+ +For example, the following line from my configuration file: +

+ + +Courier /usr/lib/X11/fonts/ttf/cokoi8n.koi8-r .afm .pfa + +

+ +says that the font `Courier' will be replaced with the +font taken from the file `/usr/lib/X11/fonts/ttf/cokoi8n.koi8-r.pfa' +and the metrics for that font will be taken from the file +`/usr/lib/X11/fonts/ttf/cokoi8n.koi8-r.afm' . +

+ +One more caveat: the new font must have a proper encoding +table. Some fonts contain characters for multiple encodings +hoping that the program wil re-encode them as neccessary. +This won't work in this case, only the primary encoding table +of the font will be used. +

+ +

+  nsfilter
+  nsprint
+  psfonts.cf +

+

+ +These are the filters for printing from Netscape. +

+ +Changing the metrics is not the end of the story. This will +provide proper placement of the characters but not the +characters themselves. There are a few ways to provide +the characters: +

+ +First, if you use GhostScript you may configure proper +aliases in the GhostScript configuration file. We will +consider this variant trivial and won't discuss it furter +except for one caveat: Netscape tries to re-encode the +fonts per the ISO Latin-1 encoding. If the primary encoding +of the font is different this cause unexpected effects. +So you still may consider using the filters (at least in a +simplified form) to solve this problem. +

+ +Second, load the fonts right into your printer. This is +very much like configuring GhostScript. +

+ +Third, use the provided filters. The script `nsfilter' +reads the output of Netscape on its standard input and +puts the result to its standard output. It uses the same +configuration file `psfonts.cf' as `nsfix'. First it +looks for the configuration file in the user's home +directory ($HOME/.netscape/psfonts.cf) and if the +file it not there then the second guess is the system-wide +configuration file /usr/local/etc/psfonts.cf. The +script inserts the fonts into the output and also +removes the Netscape's experiments with the encodings. +

+ +`nsfilter' is generally intended to be ran by user, not by the +printing subsystem. The reason is that the user may have +changed fonts in his Netscape and the printing subsystem +would have no way to access user's configuration file. +But if all the users are using the same fonts then it +may be incorporated into the printing subsystem and use +the system-wide configuration file. +

+ +The script `nsprint' is purely for convenience, to type it +as a printing command in the Netscape printing window. +It just pipelines the data through `nsfilter' to the +printing program which also gets all the arguments. Please +note that the SystemV-style and BSD-style systems use different +printing programs (although they commonly provide compatibility +with the other style too). The script tries to guess the +type of system and use its native print program, `lp' or +`lpr'. But in case it guesses wrong you may want +to change this in the script. Also if the printer does not support +PostScript directly this script may be a good place to +insert a call to GhostScript. +

+ +

+  notscape
+  fontsz.cf +

+

+ +Netscape on Unix has a very annoying "feature", it does +not remember the desired base size of the scalable screen +fonts and always resets it to 12.0 points. Even if the size +is changed manually in its preferences file, Netscape +forgets it after it exits. +

+ +So my solution was to write a program which would change +the size to my favorite one every time right before +starting Netscape. `notscape' is exactly such a program, +it sets the font sizes an then transparently executes +netscape. It takes the font sizes from the file +`$HOME/.netscape/fontsz.cf' . An example of such file +is provided. The format of the file is quite self-explanatory, +for example the lines +

+ + +fixed-koi8-r 140
+prop-koi8-r 150 +
+

+ +mean "set the size of the fixed-width screen font in the +encoding koi8-r to 14.0 points; set the size of the proportional +(variable-width) font in the encoding koi8-r to 15.0 points". +

+ + +

+  nspr +
+by Zvezdan Petkovic

+

+ +To print from Netscape, I usually print to the Postscript file first. +Then I use this small script to change the names of Times and Courier fonts +in the file and remove `/Encoding' lines. After that the file can be +sent to printer. +

+ + + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/fontsz.cf b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/fontsz.cf new file mode 100644 index 00000000..acce79c2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/fontsz.cf @@ -0,0 +1,8 @@ +fixed-koi8-r 150 +prop-koi8-r 150 +fixed-iso-8859-5 150 +prop-iso-8859-5 150 +fixed-iso-8859-1 150 +prop-iso-8859-1 150 +fixed-x-user-defined 150 +prop-x-user-defined 150 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/notscape b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/notscape new file mode 100644 index 00000000..67d87bcb --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/notscape @@ -0,0 +1,25 @@ +#!/bin/sh + +NDIR=$HOME/.netscape +PFILE=$NDIR/preferences.js +CFFILE=$NDIR/fontsz.cf +TMPFILE=$NDIR/fontsz.sed + +die() { + echo "notscape: can't $*" >&2 + exit 1 +} + +[ -r $CFFILE ] && { +awk '{ printf("/intl.font_spec_list/s/-[^-]*-\\([^-]*\\)-%s,/-%s-\\1-%s,/\n", \ + $1, $2, $1); }' <$CFFILE >$TMPFILE + +cp $PFILE $PFILE.old || die "save old pref file" +sed -f $TMPFILE <$PFILE.old >$PFILE.new || die "create new pref file" +[ -s $PFILE.new ] || die "create new pref file" + +mv $PFILE.new $PFILE || die "install new pref file" + +} + +exec netscape -no-about-splash "$@" diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfilter b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfilter new file mode 100644 index 00000000..77b5b64b --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfilter @@ -0,0 +1,24 @@ +#!/bin/sh +CONFLOCAL=$HOME/.netscape/psfonts.cf +CONFGLOBAL=/usr/local/etc/nspsfonts.cf + +if [ -r "$CONFLOCAL" ] +then + CONF="$CONFLOCAL" +else + CONF="$CONFGLOBAL" +fi + +grep -v "^#" <$CONF | grep -v "^$" | while : +do { + read nsname base afm pfa x + [ -z "$nsname" ] && break; + + fname=`awk '/^FontName/ {print $2;}' <$base$afm` + + cat $base$pfa + echo "/$nsname /$fname findfont definefont" + +} done + +grep -v "^ /Encoding isolatin1encoding def$" | egrep -v '^newpath .* closepath clip newpath$' diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfix.c b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfix.c new file mode 100644 index 00000000..6aa47c91 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfix.c @@ -0,0 +1,469 @@ +/* + * Fix the Netscape executable for specified font widths + * + * (c) 1999 Copyright by Sergey Babkin + * see COPYRIGHT + */ + +#include +#include +#include +#include +#include + +/************************** DEFINES *************************/ + +#undef DEBUG + +/* we can handle at most this many fonts */ +#define MAXFONTS 20 + +/* maximal line buffer size */ +#define MAXLINE 512 + +/* there may be multiple strings with the same contents */ +#define MAXDUPS 10 + +/* file read buffer size */ +#define FILEBF 40960 + +/* bits in the hardware page offset */ +#define BITSPERPAGE 12 + +/* size of page in bytes */ +#define PAGESIZE (1< \n"); +} + + +/************************** readconfig **********************/ + +void +readconfig(fn) + char *fn; +{ + char s[MAXLINE]; + char afmsuffix[MAXLINE], pfasuffix[MAXLINE]; + int lineno=0; + FILE *f; + + if(( f=fopen(fn, "r") )==NULL) { + sprintf(msg,"nsfix: open %s",fn); + perror(msg); + exit(1); + } + + while( fgets(s, MAXLINE, f) ) { + lineno++; + if(s[0]=='#' || s[0]=='\n') + continue; + + if(nfonts>=MAXFONTS) { + fprintf(stderr, "nsfix: only %d fonts are supported at once\n", + MAXFONTS); + exit(1); + } + + if( sscanf(s, "%s %s %s %s", font[nfonts].nsname, + font[nfonts].afmname, afmsuffix, pfasuffix) != 4 ) { + fprintf(stderr, "nsfix: syntax error at line %d of %s\n", + lineno, fn); + exit(1); + } + strcpy(font[nfonts].pfaname, font[nfonts].afmname); + strcat(font[nfonts].afmname, afmsuffix); + strcat(font[nfonts].pfaname, pfasuffix); + nfonts++; + } + + if(nfonts==0) { + fprintf(stderr, "nsfix: no fonts are defined in %s\n", fn); + exit(1); + } + fclose(f); +} + +/************************** readmetrics *********************/ + +void +readmetrics(void) +{ + int i; + char s[MAXLINE]; + FILE *f; + int n; + int lineno; + int code, width, llx, lly, urx, ury; + char gn[MAXLINE]; + struct glyphmetrics *gm; + + for(i=0; i=32 && code<=255) { + font[i].metrics.glyphs[code].width=width; + font[i].metrics.glyphs[code].bbox.llx=llx; + font[i].metrics.glyphs[code].bbox.lly=lly; + font[i].metrics.glyphs[code].bbox.urx=urx; + font[i].metrics.glyphs[code].bbox.ury=ury; + } + } + } + fclose(f); + } + +#ifdef DEBUG + for(i=0; iwidth, + gm->bbox.llx, gm->bbox.lly, gm->bbox.urx, gm->bbox.ury); + printf(" w=0x%04x [0x%04x 0x%04x 0x%04x 0x%04x]\n", gm->width & 0xffff, + gm->bbox.llx & 0xffff, gm->bbox.lly & 0xffff, gm->bbox.urx & 0xffff, gm->bbox.ury & 0xffff); + } + } + + exit(0); +#endif + +} + +/************************** replacefonts ********************/ + +void +replacefonts(fn) + char *fn; +{ + int f; /* don't use stdio */ + char bf[FILEBF]; + char *bfend, *p; + int len; + off_t pos; + + off_t zerooff[MAXFONTS*MAXDUPS]; /* offset of zero strings */ + tptr nameaddr[MAXFONTS*MAXDUPS]; /* name pointers before these zero strings */ + int zeroid[MAXFONTS*MAXDUPS]; /* font number for this zero block */ + int nzeroes; + short matched[MAXFONTS]; /* counters how many matches we have for each requested font */ + struct fontmetrics *fp; + + struct { + int noff; + int nz; + off_t off[MAXDUPS]; /* there may be multiple strings with the same contents */ + } o[MAXFONTS]; + int maxnlen; + int i, j, k, n; + + static struct glyphmetrics gm[32]; /* 0-initialized */ + + + if(( f=open(fn, O_RDWR) )<0) { + sprintf(msg,"nsfix: open %s",fn); + perror(msg); + exit(1); + } + + + /* get the maximal font name length */ + maxnlen=0; + for(i=0; imaxnlen) + maxnlen=len; + } + + /* fprintf(stderr,"maxnlen= 0x%x\n", maxnlen); /* */ + /* try to find the literal strings of the font names */ + pos=0; bfend=bf; + while(( len=read(f, bfend, FILEBF-(bfend-bf)) )>=0 ) { + /* fprintf(stderr,"looking at 0x%lx\n", (long)pos); /* */ + /* the last position to check */ + if(len>=maxnlen) + /* leave the rest with the next block */ + bfend+= len-maxnlen; + else { + /* we are very near to the end of file, check + * up to the very last byte */ + bfend+= len-2; + memset(bfend+2, 0, maxnlen); + } + + for(p=bf; p<=bfend; p++) + for(i=0; i pos + PAGESIZE/2) { /* bad */ + fprintf(stderr, "eliminated %s at 0x%lx\n", font[j].nsname, (long)o[j].off[k] ); + for(n=k+1; n=0 ) { + /* fprintf(stderr,"looking at 0x%lx\n", (long)pos); /* */ + /* the last position to check */ + bfend+= len-maxnlen; /* don't look beyond the EOF */ + + for(p=bf; p<=bfend; p+=4 /* 4-byte aligned */ ) { + fp=(struct fontmetrics *)p; + if(fp->name==0) + continue; + if( memcmp(gm, fp->glyphs, sizeof gm) ) + continue; + + /* OK, looks like it, see if we can match it to any name */ + n= fp->name & PAGEMASK; + for(i=0; iname; + zeroid[nzeroes]=i; + o[i].nz++; + fprintf(stderr, "matched %s at 0x%lx\n", + font[i].nsname, (long) zerooff[nzeroes]); + nzeroes++; + matched[i]++; + break; + } + } + + } + + if(len==0) + break; + + memmove(bf, bfend, maxnlen); + pos+= (bfend-bf); + bfend= (bf+maxnlen); + } + if(len<0) { + sprintf(msg,"nsfix: read %s",fn); + perror(msg); + exit(1); + } + fprintf(stderr,"---\n"); + + /* make sure that all the fonts got one match */ + k=0; /* flag: have non-matched fonts */ n=0; /* flag: have ambiguities */ + for(i=0; i1) + n=1; + + if(k) { + fprintf(stderr,"nsfix: can't find match for some of the fonts\n"); + fprintf(stderr,"nsfix: maybe wrong byte order, aborting\n"); + exit(1); + } + if(n) { + fprintf(stderr,"nsfix: got multiple matches for some of the fonts\n"); + fprintf(stderr,"nsfix: can't resolve, aborting\n"); + exit(1); + } + + /* now finally write the updated tables */ + for(i=0; i/dev/null +then + LPR=lpr +else + LPR=lp +fi + +nsfilter | $LPR "$@" diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/psfonts.cf b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/psfonts.cf new file mode 100644 index 00000000..19b4d712 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/psfonts.cf @@ -0,0 +1,11 @@ +# PS_font_name font_base_file suffix_afm suffix_font + +Courier /usr/lib/X11/fonts/ttf/cokoi8n.koi8-r .afm .pfa +Courier-Bold /usr/lib/X11/fonts/ttf/cokoi8b.koi8-r .afm .pfa +Courier-Oblique /usr/lib/X11/fonts/ttf/cokoi8i.koi8-r .afm .pfa +Courier-BoldOblique /usr/lib/X11/fonts/ttf/cokoi8bi.koi8-r .afm .pfa + +Times-Roman /usr/lib/X11/fonts/ttf/kudriash.koi8-r .afm .pfa +Times-Bold /usr/lib/X11/fonts/ttf/kudrias1.koi8-r .afm .pfa +Times-Italic /usr/lib/X11/fonts/ttf/kudrias3.koi8-r .afm .pfa +Times-BoldItalic /usr/lib/X11/fonts/ttf/kudrias2.koi8-r .afm .pfa diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/bdf.c b/application/third_party/dompdf/lib/ttf2ufm/src/bdf.c new file mode 100644 index 00000000..a27fc911 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/bdf.c @@ -0,0 +1,661 @@ +/* + * The font parser for the BDF files + * + * Copyright (c) 2001 by the TTF2PT1 project + * Copyright (c) 2001 by Sergey Babkin + * + * see COPYRIGHT for the full copyright notice + */ + +#include +#include +#include +#include +#include "pt1.h" +#include "global.h" + +/* prototypes of call entries */ +static void openfont(char *fname, char *arg); +static void closefont( void); +static int getnglyphs ( void); +static int glnames( GLYPH *glyph_list); +static void readglyphs( GLYPH *glyph_list); +static int glenc( GLYPH *glyph_list, int *encoding, int *unimap); +static void fnmetrics( struct font_metrics *fm); +static void glpath( int glyphno, GLYPH *glyph_list); +static void kerning( GLYPH *glyph_list); + +/* globals */ + +/* front-end descriptor */ +struct frontsw bdf_sw = { + /*name*/ "bdf", + /*descr*/ "BDF bitmapped fonts", + /*suffix*/ { "bdf" }, + /*open*/ openfont, + /*close*/ closefont, + /*nglyphs*/ getnglyphs, + /*glnames*/ glnames, + /*glmetrics*/ readglyphs, + /*glenc*/ glenc, + /*fnmetrics*/ fnmetrics, + /*glpath*/ glpath, + /*kerning*/ kerning, +}; + +/* statics */ + +#define MAXLINE 10240 /* maximal line length in the input file */ + +static int lineno; /* line number */ + +#define GETLEN(s) s, (sizeof(s)-1) +#define LENCMP(str, txt) strncmp(str, txt, sizeof(txt)-1) + +static FILE *bdf_file; +static int nglyphs; +static struct font_metrics fmet; + +/* many BDF fonts are of small pixel size, so we better try + * to scale them by an integer to keep the dimensions in + * whole pixels. However if the size is too big and a non- + * integer scaling is needed, we use the standard ttf2pt1's + * scaling abilities. + */ +static int pixel_size; +static int scale; +static int scale_external; + +static char *slant; +static char xlfdname[201]; +static char *spacing; +static char *charset_reg; +static char *charset_enc; +static char *fnwidth; +static int is_unicode = 0; + +/* tempoary storage for returning data to ttf2pt1 later on request */ +static int maxenc = 0; +static int *fontenc; +static GENTRY **glpaths; + +static int got_glyphs = 0; +static GLYPH *glyphs; +static int curgl; + +static int readfile(FILE *f, int (*strfunc)(int len, char *str)); + +/* + * Read the file and parse each string with strfunc(), + * until strfunc() returns !=0 or the end of file happens. + * Returns -1 on EOF or strfunc() returning <0, else 0 + */ + +static int +readfile( + FILE *f, + int (*strfunc)(int len, char *str) +) +{ + static char str[MAXLINE]; /* input line, maybe should be dynamic ? */ + char *s; + int len, c, res; + + len=0; + while(( c=getc(f) )!=EOF) { + if(c=='\n') { + str[len]=0; + + res = strfunc(len, str); + lineno++; + if(res<0) + return -1; + else if(res!=0) + return 0; + + len=0; + } else if(len%d)\n", lineno, MAXLINE-1); + exit(1); + } + } + return -1; /* EOF */ +} + +/* + * Parse the header of the font file. + * Stop after the line CHARS is encountered. Ignore the unknown lines. + */ + +struct line { + char *name; /* property name with trailing space */ + int namelen; /* length of the name string */ + enum { + ALLOW_REPEAT = 0x01, /* this property may be repeated in multiple lines */ + IS_SEEN = 0x02, /* this property has been seen already */ + MUST_SEE = 0x04, /* this property must be seen */ + IS_LAST = 0x08 /* this is the last property to be read */ + } flags; + char *fmt; /* format string for the arguments, NULL means a string arg */ + int nvals; /* number of values to be read by sscanf */ + void *vp[4]; /* pointers to values to be read */ +}; + +static struct line header[] = { + { GETLEN("FONT "), 0, " %200s", 1, {&xlfdname} }, + { GETLEN("SIZE "), MUST_SEE, " %d", 1, {&pixel_size} }, + { GETLEN("FONTBOUNDINGBOX "), MUST_SEE, " %hd %hd %hd %hd", 4, + {&fmet.bbox[2], &fmet.bbox[3], &fmet.bbox[0], &fmet.bbox[1]} }, + { GETLEN("FAMILY_NAME "), MUST_SEE, NULL, 1, {&fmet.name_family} }, + { GETLEN("WEIGHT_NAME "), MUST_SEE, NULL, 1, {&fmet.name_style} }, + { GETLEN("COPYRIGHT "), 0, NULL, 1, {&fmet.name_copyright} }, + { GETLEN("SLANT "), MUST_SEE, NULL, 1, {&slant} }, + { GETLEN("SPACING "), 0, NULL, 1, {&spacing} }, + { GETLEN("SETWIDTH_NAME "), 0, NULL, 1, {&fnwidth} }, + { GETLEN("CHARSET_REGISTRY "), 0, NULL, 1, {&charset_reg} }, + { GETLEN("CHARSET_ENCODING "), 0, NULL, 1, {&charset_enc} }, + { GETLEN("FONT_ASCENT "), 0, " %hd", 1, {&fmet.ascender} }, + { GETLEN("FONT_DESCENT "), 0, " %hd", 1, {&fmet.descender} }, + + /* these 2 must go in this order for post-processing */ + { GETLEN("UNDERLINE_THICKNESS "), 0, " %hd", 1, {&fmet.underline_thickness} }, + { GETLEN("UNDERLINE_POSITION "), 0, " %hd", 1, {&fmet.underline_position} }, + + { GETLEN("CHARS "), MUST_SEE|IS_LAST, " %d", 1, {&nglyphs} }, + { NULL, 0, 0 } /* end mark: name==NULL */ +}; + +static int +handle_header( + int len, + char *str +) +{ + struct line *cl; + char *s, *p; + char bf[2000]; + int c; + +#if 0 + fprintf(stderr, "line: %s\n", str); +#endif + for(cl = header; cl->name != 0; cl++) { + if(strncmp(str, cl->name, cl->namelen)) + continue; +#if 0 + fprintf(stderr, "match: %s\n", cl->name); +#endif + if(cl->flags & IS_SEEN) { + if(cl->flags & ALLOW_REPEAT) + continue; + + fprintf(stderr, "**** input line %d redefines the property %s\n", lineno, cl->name); + exit(1); + } + cl->flags |= IS_SEEN; + if(cl->fmt == 0) { + if(len - cl->namelen + 1 > sizeof bf) + len = sizeof bf; /* cut it down */ + + s = bf; /* a temporary buffer to extract the value */ + + /* skip until a quote */ + for(p = str+cl->namelen; len!=0 && (c = *p)!=0; p++, len--) { + if(c == '"') { + p++; + break; + } + } + for(; len!=0 && (c = *p)!=0; p++, len--) { + if(c == '"') { + c = *++p; + if(c == '"') + *s++ = c; + else + break; + } else + *s++ = c; + } + *s = 0; /* end of line */ + + *((char **)(cl->vp[0])) = dupcnstring(bf, s-bf); + } else { + c = sscanf(str+cl->namelen, cl->fmt, cl->vp[0], cl->vp[1], cl->vp[2], cl->vp[3]); + if(c != cl->nvals) { + fprintf(stderr, "**** property %s at input line %d must have %d arguments\n", + cl->name, lineno, cl->nvals); + exit(1); + } + } + if(cl->flags & IS_LAST) + return 1; + else + return 0; + } + return 0; +} + +/* + * Parse the description of the glyphs + */ + +static int +handle_glyphs( + int len, + char *str +) +{ + static int inbmap=0; + static char *bmap; + static int xsz, ysz, xoff, yoff; + static int curln; + int i, c; + char *p, *plim, *psz; + + if(!LENCMP(str, "ENDFONT")) { + if(curgl < nglyphs) { + fprintf(stderr, "**** unexpected end of font file after %d glyphs\n", curgl); + exit(1); + } else + return 1; + } + if(curgl >= nglyphs) { + fprintf(stderr, "**** file contains more glyphs than advertised (%d)\n", nglyphs); + exit(1); + } + if(!LENCMP(str, "STARTCHAR")) { + /* sizeof will count \0 instead of ' ' */ + for(i=sizeof("STARTCHAR"); str[i] == ' '; i++) + {} + + glyphs[curgl].name = strdup(str + i); + if(glyphs[curgl].name == 0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + } else if(!LENCMP(str, "ENCODING")) { + if(sscanf(str, "ENCODING %d", &fontenc[curgl])!=1) { + fprintf(stderr,"**** weird ENCODING statement at line %d\n", lineno); + exit(1); + } + if(fontenc[curgl] == -1) /* compatibility format */ + sscanf(str, "ENCODING -1 %d", &fontenc[curgl]); + if(fontenc[curgl] > maxenc) + maxenc = fontenc[curgl]; + } else if(!LENCMP(str, "DWIDTH")) { + if(sscanf(str, "DWIDTH %d %d", &xsz, &ysz)!=2) { + fprintf(stderr,"**** weird DWIDTH statement at line %d\n", lineno); + exit(1); + } + glyphs[curgl].width = xsz*scale; + } else if(!LENCMP(str, "BBX")) { + if(sscanf(str, "BBX %d %d %d %d", &xsz, &ysz, &xoff, &yoff)!=4) { + fprintf(stderr,"**** weird BBX statement at line %d\n", lineno); + exit(1); + } + bmap=malloc(xsz*ysz); + if(bmap==0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + glyphs[curgl].lsb = -xoff*scale; + glyphs[curgl].xMin = -xoff*scale; + glyphs[curgl].xMax = (xsz-xoff)*scale; + glyphs[curgl].yMin = -yoff*scale; + glyphs[curgl].yMax = (ysz-xoff)*scale; + } else if(!LENCMP(str, "BITMAP")) { + inbmap=1; + curln=ysz-1; /* the lowest line has index 0 */ + } else if(!LENCMP(str, "ENDCHAR")) { + inbmap=0; + if(bmap) { + glyphs[curgl].lastentry = 0; + glyphs[curgl].path = 0; + glyphs[curgl].entries = 0; + bmp_outline(&glyphs[curgl], scale, bmap, xsz, ysz, xoff, yoff); + free(bmap); + /* remember in a static table or it will be erased */ + glpaths[curgl] = glyphs[curgl].entries; + glyphs[curgl].entries = 0; + + if(glpaths[curgl]) + glyphs[curgl].ttf_pathlen = 1; + else + glyphs[curgl].ttf_pathlen = 0; + } + curgl++; + } else if(inbmap) { + if(curln<0) { + fprintf(stderr,"**** bitmap is longer than %d lines at line %d\n", ysz, lineno); + exit(1); + } + + i=0; + p=&bmap[curln*xsz]; psz=p+xsz; + while(ilsb = 0; + g->width = fmet.bbox[2]; + g->xMin = 0; + g->yMin = 0; + } + g = &glyphs[0]; + g->name = ".notdef"; + g->xMax = fmet.bbox[2]*4/5; + g->yMax = fmet.bbox[3]*4/5; + g->entries = g->path = g->lastentry = 0; + /* make it look as a black square */ + fg_rmoveto(g, 0.0, 0.0); + fg_rlineto(g, 0.0, (double)g->yMax); + fg_rlineto(g, (double)g->xMax, (double)g->yMax); + fg_rlineto(g, (double)g->xMax, 0.0); + fg_rlineto(g, 0.0, 0.0); + g_closepath(g); + glpaths[0] = g->entries; + g->entries = 0; + g->ttf_pathlen = 4; + + g = &glyphs[1]; + g->name = ".null"; + g->xMax = g->yMax = 0; + g->ttf_pathlen = 0; + + if(readfile(bdf_file, handle_glyphs) < 0) { + fprintf(stderr, "**** file does not contain the ENDFONT line\n"); + exit(1); + } + got_glyphs = 1; +} + +/* + * Open font and prepare to return information to the main driver. + * May print error and warning messages. + * Exit on error. + */ + +static void +openfont( + char *fname, + char *arg /* unused now */ +) +{ + struct line *cl; + int i, l; + + if ((bdf_file = fopen(fname, "r")) == NULL) { + fprintf(stderr, "**** Cannot open file '%s'\n", fname); + exit(1); + } else { + WARNING_2 fprintf(stderr, "Processing file %s\n", fname); + } + + lineno = 1; + + for(cl = header; cl->name != 0; cl++) + cl->flags &= ~IS_SEEN; + if(readfile(bdf_file, handle_header) < 0) { + fprintf(stderr, "**** file does not contain the CHARS definition\n"); + exit(1); + } + for(cl = header; cl->name != 0; cl++) { + if( (cl->flags & MUST_SEE) && !(cl->flags & IS_SEEN) ) { + fprintf(stderr, "**** mandatory property %sis not found in the input line\n", + cl->name); /* cl->name has a space at the end */ + exit(1); + } + + /* set a few defaults */ + if( !(cl->flags & IS_SEEN) ) { + if(cl->vp[0] == &fmet.underline_thickness) { + fmet.underline_thickness = 1; + } else if(cl->vp[0] == &fmet.underline_position) { + fmet.underline_position = fmet.bbox[1] + fmet.underline_thickness + - (pixel_size - fmet.bbox[3]); + } else if(cl->vp[0] == &fmet.ascender) { + fmet.ascender = fmet.bbox[2] + fmet.bbox[0]; + } else if(cl->vp[0] == &fmet.descender) { + fmet.descender = fmet.bbox[0]; + } + } + } + + nglyphs += 2; /* add empty glyph and .notdef */ + + /* postprocessing to compensate for the differences in the metric formats */ + fmet.bbox[2] += fmet.bbox[0]; + fmet.bbox[3] += fmet.bbox[1]; + + scale = 1000/pixel_size; /* XXX ? */ + if(scale*pixel_size < 950) { + scale = 1; + scale_external = 1; + fmet.units_per_em = pixel_size; + } else { + scale_external = 0; + fmet.units_per_em = scale*pixel_size; + + fmet.underline_position *= scale; + fmet.underline_thickness *= scale; + fmet.ascender *= scale; + fmet.descender *= scale; + for(i=0; i<4; i++) + fmet.bbox[i] *= scale; + } + + fmet.italic_angle = 0.0; + if(spacing == 0 /* possibly an old font */ + || toupper(spacing[0]) != 'P') /* or anything non-proportional */ + fmet.is_fixed_pitch = 1; + else + fmet.is_fixed_pitch = 0; + + if(fmet.name_copyright==NULL) + fmet.name_copyright = ""; + + /* create the full name */ + l = strlen(fmet.name_family) + + (fmet.name_style? strlen(fmet.name_style) : 0) + + (fnwidth? strlen(fnwidth) : 0) + + strlen("Oblique") + 1; + + if(( fmet.name_full = malloc(l) )==NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + strcpy(fmet.name_full, fmet.name_family); + if(fnwidth && strcmp(fnwidth, "Normal")) { + strcat(fmet.name_full, fnwidth); + } + if(fmet.name_style && strcmp(fmet.name_style, "Medium")) { + strcat(fmet.name_full, fmet.name_style); + } + switch(toupper(slant[0])) { + case 'O': + strcat(fmet.name_full, "Oblique"); + break; + case 'I': + strcat(fmet.name_full, "Italic"); + break; + } + + fmet.name_ps = fmet.name_full; + fmet.name_version = "1.0"; + + if(charset_reg && charset_enc + && !strcmp(charset_reg, "iso10646") && !strcmp(charset_enc, "1")) + is_unicode = 1; + + if(( fontenc = calloc(nglyphs, sizeof *fontenc) )==NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + for(i=0; i=0 && e 255) + return 2; + else + return 0; +} + +/* + * Get the font metrics + */ +static void +fnmetrics( + struct font_metrics *fm +) +{ + *fm = fmet; +} + +/* + * Get the path of contrours for a glyph. + */ + +static void +glpath( + int glyphno, + GLYPH *glyf_list +) +{ + readglyphs(glyf_list); + glyf_list[glyphno].entries = glpaths[glyphno]; + glpaths[glyphno] = 0; +} + +/* + * Get the kerning data. + */ + +static void +kerning( + GLYPH *glyph_list +) +{ + return; /* no kerning in BDF */ +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/bitmap.c b/application/third_party/dompdf/lib/ttf2ufm/src/bitmap.c new file mode 100644 index 00000000..d2334e43 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/bitmap.c @@ -0,0 +1,2633 @@ +/* + * Handling of the bitmapped glyphs + * + * Copyright (c) 2001 by the TTF2PT1 project + * Copyright (c) 2001 by Sergey Babkin + * + * see COPYRIGHT for the full copyright notice + */ + +#include +#include +#include +#include "pt1.h" +#include "global.h" + +/* possible values of limits */ +#define L_NONE 0 /* nothing here */ +#define L_ON 1 /* black is on up/right */ +#define L_OFF 2 /* black is on down/left */ + +static int warnedhints = 0; + + +#ifdef USE_AUTOTRACE +#include + +/* + * Produce an autotraced outline from a bitmap. + * scale - factor to scale the sizes + * bmap - array of dots by lines, xsz * ysz + * xoff, yoff - offset of the bitmap's lower left corner + * from the logical position (0,0) + */ + +static void +autotraced_bmp_outline( + GLYPH *g, + int scale, + char *bmap, + int xsz, + int ysz, + int xoff, + int yoff +) +{ + at_bitmap_type atb; + at_splines_type *atsp; + at_fitting_opts_type *atoptsp; + at_spline_list_type *slp; + at_spline_type *sp; + int i, j, k; + double lastx, lasty; + double fscale; + char *xbmap; + + fscale = (double)scale; + + /* provide a white margin around the bitmap */ + xbmap = malloc((ysz+2)*(xsz+2)); + if(xbmap == 0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + memset(xbmap, 0, xsz+2); /* top margin */ + for(i=0, j=xsz+2; ilength; i++) { + slp = &atsp->data[i]; +#if 0 + fprintf(stderr, "%s: contour %d: %d entries clockwise=%d color=%02X%02X%02X\n", + g->name, i, slp->length, slp->clockwise, slp->color.r, slp->color.g, slp->color.b); +#endif + if(slp->length == 0) + continue; +#if 0 + if(slp->color.r + slp->color.g + slp->color.b == 0) + continue; +#endif + fg_rmoveto(g, fscale*(slp->data[0].v[0].x+xoff), fscale*(slp->data[0].v[0].y+yoff)); + for(j=0; jlength; j++) { +#if 0 + fprintf(stderr, " "); + for(k=0; k<4; k++) + fprintf(stderr, "(%g %g) ", + fscale*(slp->data[j].v[k].x+xoff), + fscale*(ysz-slp->data[j].v[k].y+yoff) + ); + fprintf(stderr, "\n"); +#endif + fg_rrcurveto(g, + fscale*(slp->data[j].v[1].x+xoff), fscale*(slp->data[j].v[1].y+yoff), + fscale*(slp->data[j].v[2].x+xoff), fscale*(slp->data[j].v[2].y+yoff), + fscale*(slp->data[j].v[3].x+xoff), fscale*(slp->data[j].v[3].y+yoff) ); + } + g_closepath(g); + } + + at_splines_free(atsp); + at_fitting_opts_free(atoptsp); + free(xbmap); +} + +#endif /*USE_AUTOTRACE*/ + +/* an extension of gentry for description of the fragments */ +typedef struct gex_frag GEX_FRAG; +struct gex_frag { + /* indexes to len, the exact values and order are important */ +#define GEXFI_NONE -1 +#define GEXFI_CONVEX 0 +#define GEXFI_CONCAVE 1 +#define GEXFI_LINE 2 /* a line with steps varying by +-1 pixel */ +#define GEXFI_EXACTLINE 3 /* a line with exactly the same steps */ +#define GEXFI_SERIF 4 /* small serifs at the ends of stemsi - must be last */ +#define GEXFI_COUNT 5 /* maximal index + 1 */ + unsigned short len[GEXFI_COUNT]; /* length of various fragment types starting here */ + unsigned short lenback[GEXFI_COUNT]; /* length back to the start of curve */ + + signed char ixstart; /* index of the frag type that starts here */ + signed char ixcont; /* index of the frag type that continues here */ + + short flags; +#define GEXFF_HLINE 0x0001 /* the exact line is longer in "horizontal" dimension */ +#define GEXFF_EXTR 0x0002 /* this gentry is an extremum in some direction */ +#define GEXFF_CIRC 0x0004 /* the joint at this gentry is for a circular curve */ +#define GEXFF_DRAWCURVE 0x0008 /* vect[] describes a curve to draw */ +#define GEXFF_DRAWLINE 0x0010 /* vect[] describes a line to draw */ +#define GEXFF_SPLIT 0x0020 /* is a result of splitting a line */ +#define GEXFF_SYMNEXT 0x0040 /* this subfrag is symmetric with next one */ +#define GEXFF_DONE 0x0080 /* this subfrag has been vectorized */ +#define GEXFF_LONG 0x0100 /* this gentry is longer than 1 pixel */ + + unsigned short aidx; /* index of gentry in the array representing the contour */ + + unsigned short vectlen; /* number of gentries represented by vect[] */ + + /* coordinates for vectored replacement of this fragment */ + /* (already scaled because it's needed for curve approximation) */ + double vect[4 /*ref.points*/][2 /*X,Y*/]; + + double bbox[2 /*X,Y*/]; /* absolute sizes of bounding box of a subfragment */ + + /* used when splitting the curved frags into subfrags */ + GENTRY *prevsub; /* to gentries describing neighboring subfrags */ + GENTRY *nextsub; + GENTRY *ordersub; /* single-linked list describing the order of calculation */ + + int sublen; /* length of this subfrag */ + /* the symmetry across the subfrags */ + int symaxis; /* the symmetry axis, with next subfrag */ + int symxlen; /* min length of adjacent symmetric frags */ + /* the symmetry within this subfrag (the axis is always diagonal) */ + GENTRY *symge; /* symge->i{x,y}3 is the symmetry point of symge==0 if none */ + +}; +#define X_FRAG(ge) ((GEX_FRAG *)((ge)->ext)) + +/* various interesting tables related to GEX_FRAG */ +static char *gxf_name[GEXFI_COUNT] = {"Convex", "Concave", "Line", "ExLine", "Serif"}; +static int gxf_cvk[2] = {-1, 1}; /* coefficients of concaveness */ + +/* + * Dump the contents of X_EXT()->len and ->lenback for a contour + */ +static void +gex_dump_contour( + GENTRY *ge, + int clen +) +{ + int i, j; + + for(j = 0; j < GEXFI_COUNT; j++) { + fprintf(stderr, "%-8s", gxf_name[j]); + for(i = 0; i < clen; i++, ge = ge->frwd) + fprintf(stderr, " %2d", X_FRAG(ge)->len[j]); + fprintf(stderr, " %p\n (back) ", ge); + for(i = 0; i < clen; i++, ge = ge->frwd) + fprintf(stderr, " %2d", X_FRAG(ge)->lenback[j]); + fprintf(stderr, "\n"); + } +} + +/* + * Calculate values of X_EXT()->lenback[] for all entries in + * a contour. The contour is identified by: + * ge - any gentry of the contour + * clen - contour length + */ + +static void +gex_calc_lenback( + GENTRY *ge, + int clen +) +{ + int i, j; + int end; + GEX_FRAG *f; + int len[GEXFI_COUNT]; /* length of the most recent fragment */ + int count[GEXFI_COUNT]; /* steps since beginning of the fragment */ + + for(j = 0; j < GEXFI_COUNT; j++) + len[j] = count[j] = 0; + + end = clen; + for(i = 0; i < end; i++, ge = ge->frwd) { + f = X_FRAG(ge); + for(j = 0; j < GEXFI_COUNT; j++) { + if(len[j] != count[j]) { + f->lenback[j] = count[j]++; + } else + f->lenback[j] = 0; + if(f->len[j] != 0) { + len[j] = f->len[j]; + count[j] = 1; /* start with the next gentry */ + /* if the fragment will wrap over the start, process to its end */ + if(i < clen && i + len[j] > end) + end = i + len[j]; + } + } + } + gex_dump_contour(ge, clen); +} + +/* Limit a curve to not exceed the given coordinates + * at its given side + */ + +static void +limcurve( + double curve[4][2 /*X,Y*/], + double lim[2 /*X,Y*/], + int where /* 0 - start, 3 - end */ +) +{ + int other = 3-where; /* the other end */ + int sgn[2 /*X,Y*/]; /* sign for comparison */ + double t, from, to, nt, t2, nt2, tt[4]; + double val[2 /*X,Y*/]; + int i; + + for(i=0; i<2; i++) + sgn[i] = fsign(curve[other][i] - curve[where][i]); + +#if 0 + fprintf(stderr, " limit (%g,%g)-(%g,%g) at %d by (%g,%g), sgn(%d,%d)\n", + curve[0][0], curve[0][1], curve[3][0], curve[3][1], + where, lim[0], lim[1], sgn[0], sgn[1]); +#endif + /* a common special case */ + if( sgn[0]*(curve[where][0] - lim[0]) >= 0. + && sgn[1]*(curve[where][1] - lim[1]) >= 0. ) + return; /* nothing to do */ + + if(other==0) { + from = 0.; + to = 1.; + } else { + from = 1.; + to = 0.; + } +#if 0 + fprintf(stderr, "t="); +#endif + while( fabs(from-to) > 0.00001 ) { + t = 0.5 * (from+to); + t2 = t*t; + nt = 1.-t; + nt2 = nt*nt; + tt[0] = nt2*nt; + tt[1] = 3*nt2*t; + tt[2] = 3*nt*t2; + tt[3] = t*t2; + for(i=0; i<2; i++) + val[i] = curve[0][i]*tt[0] + curve[1][i]*tt[1] + + curve[2][i]*tt[2] + curve[3][i]*tt[3]; +#if 0 + fprintf(stderr, "%g(%g,%g) ", t, val[0], val[1]); +#endif + if(fabs(val[0] - lim[0]) < 0.1 + || fabs(val[1] - lim[1]) < 0.1) + break; + + if(sgn[0] * (val[0] - lim[0]) < 0. + || sgn[1] * (val[1] - lim[1]) < 0.) + to = t; + else + from = t; + } + /* now t is the point of splitting */ +#define SPLIT(pt1, pt2) ( (pt1) + t*((pt2)-(pt1)) ) /* order is important! */ + for(i=0; i<2; i++) { + double v11, v12, v13, v21, v22, v31; /* intermediate points */ + + v11 = SPLIT(curve[0][i], curve[1][i]); + v12 = SPLIT(curve[1][i], curve[2][i]); + v13 = SPLIT(curve[2][i], curve[3][i]); + v21 = SPLIT(v11, v12); + v22 = SPLIT(v12, v13); + v31 = SPLIT(v21, v22); + if(other==0) { + curve[1][i] = v11; + curve[2][i] = v21; + curve[3][i] = fabs(v31 - lim[i]) < 0.1 ? lim[i] : v31; + } else { + curve[0][i] = fabs(v31 - lim[i]) < 0.1 ? lim[i] : v31; + curve[1][i] = v22; + curve[2][i] = v13; + } + } +#undef SPLIT +#if 0 + fprintf(stderr, "\n"); +#endif +} + +/* + * Vectorize a subfragment of a curve fragment. All the data has been already + * collected by this time + */ + +static void +dosubfrag( + GLYPH *g, + int fti, /* fragment type index */ + GENTRY *firstge, /* first gentry of fragment */ + GENTRY *ge, /* first gentry of subfragment */ + double fscale +) +{ + GENTRY *gel, *gei; /* last gentry of this subfrag */ + GEX_FRAG *f, *ff, *lf, *pf, *xf; + /* maximal amount of space that can be used at the beginning and the end */ + double fixfront[2], fixend[2]; /* fixed points - used to show direction */ + double mvfront[2], mvend[2]; /* movable points */ + double limfront[2], limend[2]; /* limit of movement for movabel points */ + double sympt; + int outfront, outend; /* the beginning/end is going outwards */ + int symfront, symend; /* a ready symmetric fragment is present at front/end */ + int drnd[2 /*X,Y*/]; /* size of the round part */ + int i, j, a1, a2, ndots; + double avg2, max2; /* squared distances */ + struct dot_dist *dots, *usedots; + + ff = X_FRAG(firstge); + f = X_FRAG(ge); + gel = f->nextsub; + lf = X_FRAG(gel); + if(f->prevsub != 0) + pf = X_FRAG(f->prevsub); + else + pf = 0; + + for(i=0; i<2; i++) + drnd[i] = gel->bkwd->ipoints[i][2] - ge->ipoints[i][2]; + + if(f->prevsub==0 && f->ixcont == GEXFI_NONE) { + /* nothing to join with : may use the whole length */ + for(i = 0; i < 2; i++) + limfront[i] = ge->bkwd->ipoints[i][2]; + } else { + /* limit to a half */ + for(i = 0; i < 2; i++) + limfront[i] = 0.5 * (ge->ipoints[i][2] + ge->bkwd->ipoints[i][2]); + } + if( (ge->ix3 == ge->bkwd->ix3) /* vert */ + ^ (isign(ge->bkwd->ix3 - ge->frwd->ix3)==isign(ge->bkwd->iy3 - ge->frwd->iy3)) + ^ (fti == GEXFI_CONCAVE) /* counter-clockwise */ ) { + /* the beginning is not a flat 90-degree end */ + outfront = 1; + for(i = 0; i < 2; i++) + fixfront[i] = ge->frwd->ipoints[i][2]; + } else { + outfront = 0; + for(i = 0; i < 2; i++) + fixfront[i] = ge->ipoints[i][2]; + } + + if(lf->nextsub==0 && lf->ixstart == GEXFI_NONE) { + /* nothing to join with : may use the whole length */ + for(i = 0; i < 2; i++) + limend[i] = gel->ipoints[i][2]; + } else { + /* limit to a half */ + for(i = 0; i < 2; i++) + limend[i] = 0.5 * (gel->ipoints[i][2] + gel->bkwd->ipoints[i][2]); + } + gei = gel->bkwd->bkwd; + if( (gel->ix3 == gel->bkwd->ix3) /* vert */ + ^ (isign(gel->ix3 - gei->ix3)==isign(gel->iy3 - gei->iy3)) + ^ (fti == GEXFI_CONVEX) /* clockwise */ ) { + /* the end is not a flat 90-degree end */ + outend = 1; + for(i = 0; i < 2; i++) + fixend[i] = gel->bkwd->bkwd->ipoints[i][2]; + } else { + outend = 0; + for(i = 0; i < 2; i++) + fixend[i] = gel->bkwd->ipoints[i][2]; + } + + for(i = 0; i < 2; i++) { + fixfront[i] *= fscale; + limfront[i] *= fscale; + fixend[i] *= fscale; + limend[i] *= fscale; + } + + fprintf(stderr, " %d out(%d[%d %d %d],%d[%d %d %d]) drnd(%d, %d)\n", + fti, + outfront, + (ge->ix3 == ge->bkwd->ix3), + (isign(ge->bkwd->ix3 - ge->frwd->ix3)==isign(ge->bkwd->iy3 - ge->frwd->iy3)), + (fti == GEXFI_CONCAVE), + outend, + (gel->ix3 == gel->bkwd->ix3), + (isign(gel->ix3 - gei->ix3)==isign(gel->iy3 - gei->iy3)), + (fti == GEXFI_CONVEX), + drnd[0], drnd[1]); + + /* prepare to calculate the distances */ + ndots = f->sublen - 1; + dots = malloc(sizeof(*dots) * ndots); + if(dots == 0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + for(i = 0, gei = ge; i < ndots; i++, gei = gei->frwd) { + for(a1 = 0; a1 < 2; a1++) + dots[i].p[a1] = fscale * gei->ipoints[a1][2]; + } + + /* see if we can mirror a ready symmetric curve */ + + /* check symmetry with the fragment before this */ + symfront = (pf != 0 && (pf->flags & GEXFF_SYMNEXT) && (pf->flags & GEXFF_DONE) + && ( outend && f->sublen <= pf->sublen + || ( pf->sublen == f->sublen + && (lf->sublen == 0 + || ( abs(limfront[0]-limend[0]) >= abs(pf->vect[0][0]-pf->vect[3][0]) + && abs(limfront[1]-limend[1]) >= abs(pf->vect[0][1]-pf->vect[3][1]) )) + ) + ) + ); + /* check symmetry with the fragment after this */ + symend = ( (f->flags & GEXFF_SYMNEXT) && (lf->flags & GEXFF_DONE) + && ( outfront && f->sublen <= lf->sublen + || ( lf->sublen == f->sublen + && (pf == 0 + || ( abs(limfront[0]-limend[0]) >= abs(lf->vect[0][0]-lf->vect[3][0]) + && abs(limfront[1]-limend[1]) >= abs(lf->vect[0][1]-lf->vect[3][1]) )) + ) + ) + ); + if(symfront || symend) { + /* mirror the symmetric neighbour subfrag */ + if(symfront) { + a1 = (ge->ix3 != ge->bkwd->ix3); /* the symmetry axis */ + a2 = !a1; /* the other axis (goes along the extremum gentry) */ + + /* the symmetry point on a2 */ + sympt = fscale * 0.5 * (ge->ipoints[a2][2] + ge->bkwd->ipoints[a2][2]); + xf = pf; /* the symmetric fragment */ + } else { + a1 = (gel->ix3 != gel->bkwd->ix3); /* the symmetry axis */ + a2 = !a1; /* the other axis (goes along the extremum gentry) */ + + /* the symmetry point on a2 */ + sympt = fscale * 0.5 * (gel->ipoints[a2][2] + gel->bkwd->ipoints[a2][2]); + xf = lf; /* the symmetric fragment */ + } + fprintf(stderr, " sym with %p f=%d(%p) e=%d(%p) a1=%c a2=%c sympt=%g\n", + xf, symfront, pf, symend, lf, + a1 ? 'Y': 'X', a2 ? 'Y': 'X', sympt + ); + for(i=0; i<4; i++) { + f->vect[3-i][a1] = xf->vect[i][a1]; + f->vect[3-i][a2] = sympt - (xf->vect[i][a2]-sympt); + } + if(symfront) { + if(outend || lf->sublen==0) + limcurve(f->vect, limend, 3); + } else { + if(outfront || pf == 0) + limcurve(f->vect, limfront, 0); + } + avg2 = fdotcurvdist2(f->vect, dots, ndots, &max2); + fprintf(stderr, " avg=%g max=%g fscale=%g\n", sqrt(avg2), sqrt(max2), fscale); + if(max2 <= fscale*fscale) { + f->flags |= (GEXFF_DONE | GEXFF_DRAWCURVE); + f->vectlen = f->sublen; + free(dots); + return; + } + } + + if( !outfront && !outend && f->symge != 0) { + /* a special case: try a circle segment as an approximation */ + double lenfront, lenend, len, maxlen; + + /* coefficient for a Bezier approximation of a circle */ +#define CIRCLE_FRAC 0.55 + + a1 = (ge->ix3 == ge->bkwd->ix3); /* get the axis along the front */ + a2 = !a1; /* axis along the end */ + + lenfront = fixfront[a1] - limfront[a1]; + lenend = fixend[a2] - limend[a2]; + if(fabs(lenfront) < fabs(lenend)) + len = fabs(lenfront); + else + len = fabs(lenend); + + /* make it go close to the round shape */ + switch(f->sublen) { + case 2: + maxlen = fscale; + break; + case 4: + case 6: + maxlen = fscale * 2.; + break; + default: + maxlen = fscale * abs(ge->frwd->frwd->ipoints[a1][2] + - ge->ipoints[a1][2]); + break; + } + if(len > maxlen) + len = maxlen; + + mvfront[a1] = fixfront[a1] - fsign(lenfront) * len; + mvfront[a2] = limfront[a2]; + mvend[a2] = fixend[a2] - fsign(lenend) * len; + mvend[a1] = limend[a1]; + + for(i=0; i<2; i++) { + f->vect[0][i] = mvfront[i]; + f->vect[3][i] = mvend[i]; + } + f->vect[1][a1] = mvfront[a1] + CIRCLE_FRAC*(mvend[a1]-mvfront[a1]); + f->vect[1][a2] = mvfront[a2]; + f->vect[2][a1] = mvend[a1]; + f->vect[2][a2] = mvend[a2] + CIRCLE_FRAC*(mvfront[a2]-mvend[a2]); + + avg2 = fdotcurvdist2(f->vect, dots, ndots, &max2); + fprintf(stderr, " avg=%g max=%g fscale=%g\n", sqrt(avg2), sqrt(max2), fscale); + if(max2 <= fscale*fscale) { + f->flags |= (GEXFF_DONE | GEXFF_DRAWCURVE); + f->vectlen = f->sublen; + free(dots); + return; + } +#undef CIRCLE_FRAC + } + for(i=0; i<2; i++) { + f->vect[0][i] = limfront[i]; + f->vect[1][i] = fixfront[i]; + f->vect[2][i] = fixend[i]; + f->vect[3][i] = limend[i]; + } + usedots = dots; + if(outfront) { + usedots++; ndots--; + } + if(outend) + ndots--; + if( fcrossrayscv(f->vect, NULL, NULL) == 0) { + fprintf(stderr, "**** Internal error: rays must cross but don't at %p-%p\n", + ge, gel); + fprintf(stderr, " (%g, %g) (%g, %g) (%g, %g) (%g, %g)\n", + limfront[0], limfront[1], + fixfront[0], fixfront[1], + fixend[0], fixend[1], + limend[0], limend[1] + ); + dumppaths(g, NULL, NULL); + exit(1); + } else { + if(ndots != 0) + fapproxcurve(f->vect, usedots, ndots); + f->flags |= (GEXFF_DONE | GEXFF_DRAWCURVE); + f->vectlen = f->sublen; + } + free(dots); +} + +/* + * Subtract a list of gentries (covered by a fragment of higher + * priority) from the set of fragments of a given + * type. + * + * An example is subtraction of the long exact line fragments + * from the curve fragments which get overridden. + */ + +static void +frag_subtract( + GLYPH *g, + GENTRY **age, /* array of gentries for this contour */ + int clen, /* length of the contour */ + GENTRY *ge, /* first gentry to be subtracted */ + int slen, /* number of gentries in the list to be subtracted */ + int d /* type of fragments from which to subtract, as in GEXFI_... */ +) +{ + GENTRY *pge; + GEX_FRAG *f, *pf; + int len, i, j; + + f = X_FRAG(ge); + len = slen; + + /* check if we overlap the end of some fragment */ + if(f->lenback[d]) { + /* chop off the end of conflicting fragment */ + len = f->lenback[d]; + pge = age[(f->aidx + clen - len)%clen]; + pf = X_FRAG(pge); + if(pf->len[d] == clen+1 && pf->flags & GEXFF_CIRC) { + /* the conflicting fragment is self-connected */ + + pf->len[d] = 0; + /* calculate the new value for lenback */ + len = clen+1 - slen; + for(pge = ge; len > 0; pge = pge->bkwd, len--) + X_FRAG(pge)->lenback[d] = len; + /* now pge points to the last entry of the line, + * which is also the new first entry of the curve + */ + X_FRAG(pge)->len[d] = clen+2 - slen; + /* clean lenback of gentries covered by the line */ + for(pge = ge->frwd, j = slen-1; j > 0; pge = pge->frwd, j--) + X_FRAG(pge)->lenback[d] = 0; + fprintf(stderr, " cut %s circular frag to %p-%p\n", + gxf_name[d], pge, ge); + gex_dump_contour(ge, clen); + } else { + /* when we chop off a piece of fragment, we leave the remaining + * piece(s) overlapping with the beginning and possibly the end + * of the line fragment under consideration + */ + fprintf(stderr, " cut %s frag at %p from len=%d to len=%d (end %p)\n", + gxf_name[d], pge, pf->len[d], len+1, ge); + j = pf->len[d] - len - 1; /* how many gentries are chopped off */ + pf->len[d] = len + 1; + i = slen - 1; + for(pge = ge->frwd; j > 0 && i > 0; j--, i--, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = 0; + gex_dump_contour(ge, clen); + + if(j != 0) { + /* the conflicting fragment is split in two by this line + * fragment, fix up its tail + */ + + fprintf(stderr, " end of %s frag len=%d %p-", + gxf_name[d], j+1, pge->bkwd); + X_FRAG(pge->bkwd)->len[d] = j+1; /* the overlapping */ + for(i = 1; j > 0; j--, i++, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = i; + fprintf(stderr, "%p\n", pge->bkwd); + gex_dump_contour(ge, clen); + } + } + } + /* check if we overlap the beginning of some fragments */ + i = slen-1; /* getntries remaining to consider */ + j = 0; /* gentries remaining in the overlapping fragment */ + for(pge = ge; i > 0; i--, pge = pge->frwd) { + if(j > 0) { + X_FRAG(pge)->lenback[d] = 0; + j--; + } + /* the beginning of one fragment may be the end of another + * fragment, in this case if j-- above results in 0, that will + * cause it to check the same gentry for the beginning + */ + if(j == 0) { + pf = X_FRAG(pge); + j = pf->len[d]; + if(j != 0) { + fprintf(stderr, " removed %s frag at %p len=%d\n", + gxf_name[d], pge, j); + gex_dump_contour(ge, clen); + pf->len[d] = 0; + j--; + } + } + } + /* pge points at the last gentry of the line fragment */ + if(j > 1) { /* we have the tail of a fragment left */ + fprintf(stderr, " end of %s frag len=%d %p-", + gxf_name[d], j, pge); + X_FRAG(pge)->len[d] = j; /* the overlapping */ + for(i = 0; j > 0; j--, i++, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = i; + fprintf(stderr, "%p\n", pge->bkwd); + gex_dump_contour(ge, clen); + } else if(j == 1) { + X_FRAG(pge)->lenback[d] = 0; + } +} + +/* + * Produce an outline from a bitmap. + * scale - factor to scale the sizes + * bmap - array of dots by lines, xsz * ysz + * xoff, yoff - offset of the bitmap's lower left corner + * from the logical position (0,0) + */ + +void +bmp_outline( + GLYPH *g, + int scale, + char *bmap, + int xsz, + int ysz, + int xoff, + int yoff +) +{ + char *hlm, *vlm; /* arrays of the limits of outlines */ + char *amp; /* map of ambiguous points */ + int x, y; + char *ip, *op; + double fscale; + + if(xsz==0 || ysz==0) + return; + +#ifdef USE_AUTOTRACE + if(use_autotrace) { + autotraced_bmp_outline(g, scale, bmap, xsz, ysz, xoff, yoff); + return; + } +#endif /*USE_AUTOTRACE*/ + + fscale = (double)scale; + g->flags &= ~GF_FLOAT; /* build it as int first */ + + if(!warnedhints) { + warnedhints = 1; + if(hints && subhints) { + WARNING_2 fprintf(stderr, + "Use of hint substitution on bitmap fonts is not recommended\n"); + } + } + +#if 0 + printbmap(bmap, xsz, ysz, xoff, yoff); +#endif + + /* now find the outlines */ + hlm=calloc( xsz, ysz+1 ); /* horizontal limits */ + vlm=calloc( xsz+1, ysz ); /* vertical limits */ + amp=calloc( xsz, ysz ); /* ambiguous points */ + + if(hlm==0 || vlm==0 || amp==0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + + /* + * hlm and vlm represent a grid of horisontal and + * vertical lines. Each pixel is surrounded by the grid + * from all the sides. The values of [hv]lm mark the + * parts of grid where the pixel value switches from white + * to black and back. + */ + + /* find the horizontal limits */ + ip=bmap; op=hlm; + /* 1st row */ + for(x=0; x0; y--) + for(x=xsz-1; x>0; x--) { + if(bmap[y*xsz+x]) { + if( !bmap[y*xsz+x-1] && !bmap[y*xsz-xsz+x] && bmap[y*xsz-xsz+x-1] ) + amp[y*xsz+x]=1; + } else { + if( bmap[y*xsz+x-1] && bmap[y*xsz-xsz+x] && !bmap[y*xsz-xsz+x-1] ) + amp[y*xsz+x]=1; + } + } + +#if 0 + printlimits(hlm, vlm, amp, xsz, ysz); +#endif + + /* generate the vectored (stepping) outline */ + + while(1) { + int found = 0; + int outer; /* flag: this is an outer contour */ + int hor, newhor; /* flag: the current contour direction is horizontal */ + int dir; /* previous direction of the coordinate, 1 - L_ON, 0 - L_OFF */ + int startx, starty; /* start of a contour */ + int firstx, firsty; /* start of the current line */ + int newx, newy; /* new coordinates to try */ + char *lm, val; + int maxx, maxy, xor; + + for(y=ysz; !found && y>0; y--) + for(x=0; x L_NONE) + goto foundcontour; + break; /* have no contours left */ + + foundcontour: + ig_rmoveto(g, x+xoff, y+yoff); /* intermediate as int */ + + startx = firstx = x; + starty = firsty = y; + + if(hlm[y*xsz+x] == L_OFF) { + outer = 1; dir = 0; + hlm[y*xsz+x] = -hlm[y*xsz+x]; /* mark as seen */ + hor = 1; x++; + } else { + outer = 0; dir = 0; + hor = 0; y--; + vlm[y*(xsz+1)+x] = -vlm[y*(xsz+1)+x]; /* mark as seen */ + } + + while(x!=startx || y!=starty) { +#if 0 + printf("trace (%d, %d) outer=%d hor=%d dir=%d\n", x, y, outer, hor, dir); +#endif + + /* initialization common for try1 and try2 */ + if(hor) { + lm = vlm; maxx = xsz+1; maxy = ysz; newhor = 0; + } else { + lm = hlm; maxx = xsz; maxy = ysz+1; newhor = 1; + } + xor = (outer ^ hor ^ dir); + + try1: + /* first we try to change axis, to keep the + * contour as long as possible + */ + + newx = x; newy = y; + if(!hor && (!outer ^ dir)) + newx--; + if(hor && (!outer ^ dir)) + newy--; + + if(newx < 0 || newx >= maxx || newy < 0 || newy >= maxy) + goto try2; + + if(!xor) + val = L_ON; + else + val = L_OFF; +#if 0 + printf("try 1, want %d have %d at %c(%d, %d)\n", val, lm[newy*maxx + newx], + (newhor ? 'h':'v'), newx, newy); +#endif + if( lm[newy*maxx + newx] == val ) + goto gotit; + + try2: + /* try to change the axis anyway */ + + newx = x; newy = y; + if(!hor && (outer ^ dir)) + newx--; + if(hor && (outer ^ dir)) + newy--; + + if(newx < 0 || newx >= maxx || newy < 0 || newy >= maxy) + goto try3; + + if(xor) + val = L_ON; + else + val = L_OFF; +#if 0 + printf("try 2, want %d have %d at %c(%d, %d)\n", val, lm[newy*maxx + newx], + (newhor ? 'h':'v'), newx, newy); +#endif + if( lm[newy*maxx + newx] == val ) + goto gotit; + + try3: + /* try to continue in the old direction */ + + if(hor) { + lm = hlm; maxx = xsz; maxy = ysz+1; + } else { + lm = vlm; maxx = xsz+1; maxy = ysz; + } + newhor = hor; + newx = x; newy = y; + if(hor && dir) + newx--; + if(!hor && !dir) + newy--; + + if(newx < 0 || newx >= maxx || newy < 0 || newy >= maxy) + goto badtry; + + if(dir) + val = L_ON; + else + val = L_OFF; +#if 0 + printf("try 3, want %d have %d at %c(%d, %d)\n", val, lm[newy*maxx + newx], + (newhor ? 'h':'v'), newx, newy); +#endif + if( lm[newy*maxx + newx] == val ) + goto gotit; + + badtry: + fprintf(stderr, "**** Internal error in the contour detection code at (%d, %d)\n", x, y); + fprintf(stderr, "glyph='%s' outer=%d hor=%d dir=%d\n", g->name, outer, hor, dir); + fflush(stdout); + exit(1); + + gotit: + if(hor != newhor) { /* changed direction, end the previous line */ + ig_rlineto(g, x+xoff, y+yoff); /* intermediate as int */ + firstx = x; firsty = y; + } + lm[newy*maxx + newx] = -lm[newy*maxx + newx]; + hor = newhor; + dir = (val == L_ON); + if(newhor) + x -= (dir<<1)-1; + else + y += (dir<<1)-1; + } +#if 0 + printf("trace (%d, %d) outer=%d hor=%d dir=%d\n", x, y, outer, hor, dir); +#endif + ig_rlineto(g, x+xoff, y+yoff); /* intermediate as int */ + g_closepath(g); + } + + + /* try to vectorize the curves and sloped lines in the bitmap */ + if(vectorize) { + GENTRY *ge, *pge, *cge, *loopge; + int i; + int skip; + + dumppaths(g, NULL, NULL); + + /* allocate the extensions */ + for(cge=g->entries; cge!=0; cge=cge->next) { + cge->ext = calloc(1, sizeof(GEX_FRAG) ); + if(cge->ext == 0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + } + + for(cge=g->entries; cge!=0; cge=cge->next) { + if(cge->type != GE_MOVE) + continue; + + /* we've found the beginning of a contour */ + { + int d, vert, count, stepmore, delaystop; + int vdir, hdir, fullvdir, fullhdir, len; + int dx, dy, lastdx, lastdy; + int k1, k2, reversal, smooth, good; + int line[2 /*H,V*/], maxlen[2 /*H,V*/], minlen[2 /*H,V*/]; + GENTRY **age; /* array of gentries in a contour */ + int clen; /* contour length, size of ths array */ + int i, j; + GEX_FRAG *f; + + /* we know that all the contours start at the top-left corner, + * so at most it might be before/after the last element of + * the last/first fragment + */ + + ge = cge->next; + pge = ge->bkwd; + if(ge->ix3 == pge->ix3) { /* a vertical line */ + /* we want to start always from a horizontal line because + * then we always start from top and that is quaranteed to be a + * fragment boundary, so move the start point of the contour + */ + pge->prev->next = pge->next; + pge->next->prev = pge->prev; + cge->next = pge; + pge->prev = cge; + pge->next = ge; + ge->prev = pge; + ge = pge; pge = ge->bkwd; + cge->ix3 = pge->ix3; cge->iy3 = pge->iy3; + } + + /* fill the array of gentries */ + clen = 1; + for(ge = cge->next->frwd; ge != cge->next; ge = ge->frwd) + clen++; + age = (GENTRY **)malloc(sizeof(*age) * clen); + ge = cge->next; + count = 0; + do { + age[count] = ge; + X_FRAG(ge)->aidx = count++; + + /* and by the way find the extremums */ + for(i=0; i<2; i++) { + if( isign(ge->frwd->ipoints[i][2] - ge->ipoints[i][2]) + * isign(ge->bkwd->bkwd->ipoints[i][2] - ge->bkwd->ipoints[i][2]) == 1) { + X_FRAG(ge)->flags |= GEXFF_EXTR; + fprintf(stderr, " %s extremum at %p\n", (i?"vert":"hor"), ge); + } + if(abs(ge->ipoints[i][2] - ge->bkwd->ipoints[i][2]) > 1) + X_FRAG(ge)->flags |= GEXFF_LONG; + } + + ge = ge->frwd; + } while(ge != cge->next); + + /* Find the serif fragments, looking as either of: + * -+ | + * | | + * +-+ +-+ + * | | + * +--... +--... + * with the thickness of serifs being 1 pixel. We make no + * difference between serifs on vertical and horizontal stems. + */ + + ge = cge->next; + do { + GENTRY *nge; + int pdx, pdy, ndx, ndy; + + /* two gentries of length 1 mean a potential serif */ + pge = ge->bkwd; + nge = ge->frwd; + + dx = nge->ix3 - pge->ix3; + dy = nge->iy3 - pge->iy3; + + if(abs(dx) != 1 || abs(dy) != 1) /* 2 small ones */ + continue; + + if( + (!(X_FRAG(ge)->flags & GEXFF_EXTR) + || !(X_FRAG(ge->bkwd)->flags & GEXFF_EXTR)) + && (!(X_FRAG(ge->frwd)->flags & GEXFF_EXTR) + || !(X_FRAG(ge->frwd->frwd)->flags & GEXFF_EXTR)) + ) + continue; /* either side must be a couple of extremums */ + + pdx = pge->ix3 - pge->bkwd->ix3; + pdy = pge->iy3 - pge->bkwd->iy3; + ndx = nge->frwd->ix3 - nge->ix3; + ndy = nge->frwd->iy3 - nge->iy3; + + if(pdx*dx + pdy*dy > 0 && ndx*dx + ndy*dy > 0) + continue; /* definitely not a serif but a round corner */ + + if(abs(pdx) + abs(pdy) == 1 || abs(ndx) + abs(ndy) == 1) + continue; + + /* we've found a serif including this and next gentry */ + X_FRAG(ge)->len[GEXFI_SERIF] = 2; + + } while( (ge = ge->frwd) != cge->next ); + + + /* Find the convex and concave fragments, defined as: + * convex (clockwise): dy/dx <= dy0/dx0, + * or a reversal: dy/dx == - dy0/dx0 && abs(dxthis) == 1 && dy/dx > 0 + * concave (counter-clockwise): dy/dx >= dy0/dx0, + * or a reversal: dy/dx == - dy0/dx0 && abs(dxthis) == 1 && dy/dx < 0 + * + * Where dx and dy are measured between the end of this gentry + * and the start of the previous one (dx0 and dy0 are the same + * thing calculated for the previous gentry and its previous one), + * dxthis is between the end and begginning of this gentry. + * + * A reversal is a situation when the curve changes its direction + * along the x axis, so it passes through a momentary vertical + * direction. + */ + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + ge = cge->next; + pge = ge->bkwd; /* the beginning of the fragment */ + count = 1; + lastdx = pge->ix3 - pge->bkwd->bkwd->ix3; + lastdy = pge->iy3 - pge->bkwd->bkwd->iy3; + +#define CHKCURVCONN(ge, msg) do { \ + dx = (ge)->ix3 - (ge)->bkwd->bkwd->ix3; \ + dy = (ge)->iy3 - (ge)->bkwd->bkwd->iy3; \ + if(0 && msg) { \ + fprintf(stderr, " %p: dx=%d dy=%d dx0=%d dy0=%d ", \ + (ge), dx, dy, lastdx, lastdy); \ + } \ + k1 = X_FRAG(ge)->flags; \ + k2 = X_FRAG((ge)->bkwd)->flags; \ + if(0 && msg) { \ + fprintf(stderr, "fl=%c%c%c%c ", \ + (k1 & GEXFF_EXTR) ? 'X' : '-', \ + (k1 & GEXFF_LONG) ? 'L' : '-', \ + (k2 & GEXFF_EXTR) ? 'X' : '-', \ + (k2 & GEXFF_LONG) ? 'L' : '-' \ + ); \ + } \ + if( (k1 & GEXFF_EXTR) && (k2 & GEXFF_LONG) \ + || (k2 & GEXFF_EXTR) && (k1 & GEXFF_LONG) ) { \ + smooth = 0; \ + good = reversal = -1; /* for debugging */ \ + } else { \ + k1 = dy * lastdx; \ + k2 = lastdy * dx; \ + smooth = (abs(dx)==1 || abs(dy)==1); \ + good = (k1 - k2)*gxf_cvk[d] >= 0; \ + if(smooth && !good) { \ + reversal = (k1 == -k2 && abs((ge)->ix3 - (ge)->bkwd->ix3)==1 \ + && dy*dx*gxf_cvk[d] < 0); \ + } else \ + reversal = 0; \ + } \ + if(0 && msg) { \ + fprintf(stderr, "k1=%d k2=%d pge=%p count=%d %s good=%d rev=%d\n", \ + k1, k2, pge, count, gxf_name[d], good, reversal); \ + } \ + } while(0) + + do { + CHKCURVCONN(ge, 1); + + if(smooth && (good || reversal) ) + count++; + else { + /* can't continue */ +#if 0 + if(count >= 4) { /* worth remembering */ + fprintf(stderr, " %s frag %p-%p count=%d\n", gxf_name[d], pge, ge->bkwd, count); + } +#endif + X_FRAG(pge)->len[d] = count; + if(smooth) { + pge = ge->bkwd; + count = 2; + } else { + pge = ge; + count = 1; + } + } + lastdx = dx; lastdy = dy; + ge = ge->frwd; + } while(ge != cge->next); + + /* see if we can connect the last fragment to the first */ + CHKCURVCONN(ge, 1); + + if(smooth && (good || reversal) ) { + /* -1 to avoid ge->bkwd being counted twice */ + if( X_FRAG(ge->bkwd)->len[d] >= 2 ) + count += X_FRAG(ge->bkwd)->len[d] - 1; + else if(count == clen+1) { + /* we are joining a circular (closed) curve, check whether it + * can be joined at any point or whether it has a discontinuity + * at the point where we join it now + */ + lastdx = dx; lastdy = dy; + CHKCURVCONN(ge->frwd, 0); + + if(smooth && (good || reversal) ) { + /* yes, the curve is truly a circular one and can be + * joined at any point + */ + +#if 0 + fprintf(stderr, " found a circular joint point at %p\n", pge); +#endif + /* make sure that in a circular fragment we start from an extremum */ + while( ! (X_FRAG(pge)->flags & GEXFF_EXTR) ) + pge = pge->frwd; + X_FRAG(pge)->flags |= GEXFF_CIRC; + } + } +#if 0 + fprintf(stderr, " %s joined %p to %p count=%d bk_count=%d\n", gxf_name[d], pge, ge->bkwd, + count, X_FRAG(ge->bkwd)->len[d] ); +#endif + X_FRAG(ge->bkwd)->len[d] = 0; + } + X_FRAG(pge)->len[d] = count; +#if 0 + if(count >= 4) { /* worth remembering */ + fprintf(stderr, " %s last frag %p-%p count=%d\n", gxf_name[d], pge, ge->bkwd, count); + } +#endif +#undef CHKCURVCONN + + /* do postprocessing */ + ge = cge->next; + do { + f = X_FRAG(ge); + len = f->len[d]; +#if 0 + fprintf(stderr, " %p %s len=%d clen=%d\n", ge, gxf_name[d], len, clen); +#endif + if(len < 3) /* get rid of the fragments that are too short */ + f->len[d] = 0; + else if(len == 3) { + /* _ + * drop the |_| - shaped fragments, leave alone the _| - shaped + * (and even those only if not too short in pixels), + * those left alone are further filtered later + */ + k1 = (ge->ix3 == ge->bkwd->ix3); /* axis of the start */ + if(isign(ge->ipoints[k1][2] - ge->bkwd->ipoints[k1][2]) + != isign(ge->frwd->ipoints[k1][2] - ge->frwd->frwd->ipoints[k1][2]) + && abs(ge->frwd->frwd->ipoints[k1][2] - ge->bkwd->ipoints[k1][2]) > 2) { +#if 0 + fprintf(stderr, " %s frag %p count=%d good shape\n", + gxf_name[d], ge, count); +#endif + } else + f->len[d] = 0; + } else if(len == clen+1) + break; /* a closed fragment, nothing else interesting */ + else { /* only for open fragments */ + GENTRY *gem, *gex, *gei, *ges; + + ges = ge; /* the start entry */ + gem = age[(f->aidx + f->len[d])%clen]; /* entry past the end of the fragment */ + + gei = ge->frwd; + if( (ge->ix3 == ge->bkwd->ix3) /* vert */ + ^ (isign(ge->bkwd->ix3 - gei->ix3)==isign(ge->bkwd->iy3 - gei->iy3)) + ^ !(d == GEXFI_CONVEX) /* counter-clockwise */ ) { + +#if 0 + fprintf(stderr, " %p: %s potential spurious start\n", ge, gxf_name[d]); +#endif + /* the beginning may be a spurious entry */ + + gex = 0; /* the extremum closest to the beginning - to be found */ + for(gei = ge->frwd; gei != gem; gei = gei->frwd) { + if(X_FRAG(gei)->flags & GEXFF_EXTR) { + gex = gei; + break; + } + } + if(gex == 0) + gex = gem->bkwd; + + /* A special case: ignore the spurious ends on small curves that + * either enclose an 1-pixel-wide extremum or are 1-pixel deep. + * Any 5-or-less-pixel-long curve with extremum 2 steps away + * qualifies for that. + */ + + if(len <= 5 && gex == ge->frwd->frwd) { + good = 0; +#if 0 + fprintf(stderr, " E"); +#endif + } else { + good = 1; /* assume that ge is not spurious */ + + /* gei goes backwards, gex goes forwards from the extremum */ + gei = gex; + /* i is the symmetry axis, j is the other axis (X=0 Y=1) */ + i = (gex->ix3 != gex->bkwd->ix3); + j = !i; + for( ; gei!=ge && gex!=gem; gei=gei->bkwd, gex=gex->frwd) { + if( gei->bkwd->ipoints[i][2] != gex->ipoints[i][2] + || gei->bkwd->ipoints[j][2] - gei->ipoints[j][2] + != gex->bkwd->ipoints[j][2] - gex->ipoints[j][2] + ) { + good = 0; /* no symmetry - must be spurious */ +#if 0 + fprintf(stderr, " M(%p,%p)(%d %d,%d)(%d %d,%d)", + gei, gex, + i, gei->bkwd->ipoints[i][2], gex->ipoints[i][2], + j, gei->bkwd->ipoints[j][2] - gei->ipoints[j][2], + gex->bkwd->ipoints[j][2] - gex->ipoints[j][2] ); +#endif + break; + } + } + if(gex == gem) { /* oops, the other side is too short */ + good = 0; +#if 0 + fprintf(stderr, " X"); +#endif + } + if(good && gei == ge) { + if( isign(gei->bkwd->ipoints[j][2] - gei->ipoints[j][2]) + != isign(gex->bkwd->ipoints[j][2] - gex->ipoints[j][2]) ) { + good = 0; /* oops, goes into another direction */ +#if 0 + fprintf(stderr, " D"); +#endif + } + } + } + if(!good) { /* it is spurious, drop it */ +#if 0 + fprintf(stderr, " %p: %s spurious start\n", ge, gxf_name[d]); +#endif + f->len[d] = 0; + ges = ge->frwd; + len--; + X_FRAG(ges)->len[d] = len; + } + } + + gei = gem->bkwd->bkwd->bkwd; + if( (gem->ix3 != gem->bkwd->ix3) /* gem->bkwd is vert */ + ^ (isign(gem->bkwd->ix3 - gei->ix3)==isign(gem->bkwd->iy3 - gei->iy3)) + ^ (d == GEXFI_CONVEX) /* clockwise */ ) { + +#if 0 + fprintf(stderr, " %p: %s potential spurious end\n", gem->bkwd, gxf_name[d]); +#endif + /* the end may be a spurious entry */ + + gex = 0; /* the extremum closest to the end - to be found */ + for(gei = gem->bkwd->bkwd; gei != ges->bkwd; gei = gei->bkwd) { + if(X_FRAG(gei)->flags & GEXFF_EXTR) { + gex = gei; + break; + } + } + if(gex == 0) + gex = ges; + + good = 1; /* assume that gem->bkwd is not spurious */ + /* gei goes backwards, gex goes forwards from the extremum */ + gei = gex; + /* i is the symmetry axis, j is the other axis (X=0 Y=1) */ + i = (gex->ix3 != gex->bkwd->ix3); + j = !i; + for( ; gei!=ges->bkwd && gex!=gem->bkwd; gei=gei->bkwd, gex=gex->frwd) { + if( gei->bkwd->ipoints[i][2] != gex->ipoints[i][2] + || gei->bkwd->ipoints[j][2] - gei->ipoints[j][2] + != gex->bkwd->ipoints[j][2] - gex->ipoints[j][2] + ) { + good = 0; /* no symmetry - must be spurious */ +#if 0 + fprintf(stderr, " M(%p,%p)(%d %d,%d)(%d %d,%d)", + gei, gex, + i, gei->bkwd->ipoints[i][2], gex->ipoints[i][2], + j, gei->bkwd->ipoints[j][2] - gei->ipoints[j][2], + gex->bkwd->ipoints[j][2] - gex->ipoints[j][2] ); +#endif + break; + } + } + if(gei == ges->bkwd) { /* oops, the other side is too short */ + good = 0; +#if 0 + fprintf(stderr, " X"); +#endif + } + if(good && gex == gem->bkwd) { + if( isign(gei->bkwd->ipoints[j][2] - gei->ipoints[j][2]) + != isign(gex->bkwd->ipoints[j][2] - gex->ipoints[j][2]) ) { + good = 0; /* oops, goes into another direction */ +#if 0 + fprintf(stderr, " D"); +#endif + } + } + if(!good) { /* it is spurious, drop it */ +#if 0 + fprintf(stderr, " %p: %s spurious end\n", gem->bkwd, gxf_name[d]); +#endif + X_FRAG(ges)->len[d] = --len; + } + } + if(len < 4) { + X_FRAG(ges)->len[d] = 0; +#if 0 + fprintf(stderr, " %p: %s frag discarded, too small now\n", ge, gxf_name[d]); +#endif + } + if(ges != ge) { + if(ges == cge->next) + break; /* went around the loop */ + else { + ge = ges->frwd; /* don't look at this fragment twice */ + continue; + } + } + } + + ge = ge->frwd; + } while(ge != cge->next); + } + + /* Find the straight line fragments. + * Even though the lines are sloped, they are called + * "vertical" or "horizontal" according to their longer + * dimension. All the steps in the shother dimension must + * be 1 pixel long, all the steps in the longer dimension + * must be within the difference of 1 pixel. + */ + for(d = GEXFI_LINE; d<= GEXFI_EXACTLINE; d++) { + ge = cge->next; + pge = ge->bkwd; /* the beginning of the fragment */ + count = 1; + delaystop = 0; + do { + int h; + + stepmore = 0; + hdir = isign(ge->ix3 - ge->bkwd->ix3); + vdir = isign(ge->iy3 - ge->bkwd->iy3); + vert = (hdir == 0); + if(count==1) { + /* at this point pge==ge->bkwd */ + /* account for the previous gentry, which was !vert */ + if(!vert) { /* prev was vertical */ + maxlen[0] = minlen[0] = 0; + maxlen[1] = minlen[1] = abs(pge->iy3 - pge->bkwd->iy3); + line[0] = (maxlen[1] == 1); + line[1] = 1; + fullhdir = hdir; + fullvdir = isign(pge->iy3 - pge->bkwd->iy3); + } else { + maxlen[0] = minlen[0] = abs(pge->ix3 - pge->bkwd->ix3); + maxlen[1] = minlen[1] = 0; + line[0] = 1; + line[1] = (maxlen[0] == 1); + fullhdir = isign(pge->ix3 - pge->bkwd->ix3); + fullvdir = vdir; + } + } + h = line[0]; /* remember the prevalent direction */ +#if 0 + fprintf(stderr, " %p: v=%d(%d) h=%d(%d) vl(%d,%d,%d) hl=(%d,%d,%d) %s count=%d ", + ge, vdir, fullvdir, hdir, fullhdir, + line[1], minlen[1], maxlen[1], + line[0], minlen[0], maxlen[0], + gxf_name[d], count); +#endif + if(vert) { + if(vdir != fullvdir) + line[0] = line[1] = 0; + len = abs(ge->iy3 - ge->bkwd->iy3); + } else { + if(hdir != fullhdir) + line[0] = line[1] = 0; + len = abs(ge->ix3 - ge->bkwd->ix3); + } +#if 0 + fprintf(stderr, "len=%d\n", len); +#endif + if(len != 1) /* this is not a continuation in the short dimension */ + line[!vert] = 0; + + /* can it be a continuation in the long dimension ? */ + if( line[vert] ) { + if(maxlen[vert]==0) + maxlen[vert] = minlen[vert] = len; + else if(maxlen[vert]==minlen[vert]) { + if(d == GEXFI_EXACTLINE) { + if(len != maxlen[vert]) + line[vert] = 0; /* it can't */ + } else if(len < maxlen[vert]) { + if(len < minlen[vert]-1) + line[vert] = 0; /* it can't */ + else + minlen[vert] = len; + } else { + if(len > maxlen[vert]+1) + line[vert] = 0; /* it can't */ + else + maxlen[vert] = len; + } + } else if(len < minlen[vert] || len > maxlen[vert]) + line[vert] = 0; /* it can't */ + } + + if(line[0] == 0 && line[1] == 0) { +#if 0 + if(count >= 3) + fprintf(stderr, " %s frag %p-%p count=%d\n", gxf_name[d], pge, ge->bkwd, count); +#endif + X_FRAG(pge)->len[d] = count; + if(d == GEXFI_EXACTLINE && h) { + X_FRAG(pge)->flags |= GEXFF_HLINE; + } + if(count == 1) + pge = ge; + else { + stepmore = 1; /* may reconsider the 1st gentry */ + pge = ge = ge->bkwd; + count = 1; + } + } else + count++; + + ge = ge->frwd; + if(ge == cge->next && !stepmore) + delaystop = 1; /* consider the first gentry again */ + } while(stepmore || ge != cge->next ^ delaystop); + /* see if there is an unfinished line left */ + if(count != 1) { +#if 0 + if(count >= 3) + fprintf(stderr, " %s frag %p-%p count=%d\n", gxf_name[d], pge, ge->bkwd, count); +#endif + X_FRAG(ge->bkwd->bkwd)->len[d] = 0; + X_FRAG(pge)->len[d] = count; + } + } + + /* do postprocessing of the lines */ +#if 0 + fprintf(stderr, "Line postprocessing\n"); + gex_dump_contour(cge->next, clen); +#endif + + /* the non-exact line frags are related to exact line frags sort + * of like to individual gentries: two kinds of exact frags + * must be interleaved, with one kind having the size of 3 + * and the other kind having the size varying within +-2. + */ + + ge = cge->next; + do { + GEX_FRAG *pf, *lastf1, *lastf2; + int len1, len2, fraglen; + + f = X_FRAG(ge); + + fraglen = f->len[GEXFI_LINE]; + if(fraglen >= 4) { + + vert = 0; /* vert is a pseudo-directon */ + line[0] = line[1] = 1; + maxlen[0] = minlen[0] = maxlen[1] = minlen[1] = 0; + lastf2 = lastf1 = f; + len2 = len1 = 0; + for(pge = ge, i = 1; i < fraglen; i++, pge=pge->frwd) { + pf = X_FRAG(pge); + len = pf->len[GEXFI_EXACTLINE]; +#if 0 + fprintf(stderr, " pge=%p i=%d of %d ge=%p exLen=%d\n", pge, i, + f->len[GEXFI_LINE], ge, len); +#endif + len1++; len2++; + if(len==0) { + continue; + } + vert = !vert; /* alternate the pseudo-direction */ + if(len > 3) + line[!vert] = 0; + if(maxlen[vert] == 0) + maxlen[vert] = minlen[vert] = len; + else if(maxlen[vert]-2 >= len && minlen[vert]+2 <= len) { + if(len > maxlen[vert]) + maxlen[vert] = len; + else if(len < minlen[vert]) + minlen[vert] = len; + } else + line[vert] = 0; + if(line[0] == 0 && line[1] == 0) { +#if 0 + fprintf(stderr, " Line breaks at %p %c(%d, %d) %c(%d, %d) len=%d fl=%d l2=%d l1=%d\n", + pge, (!vert)?'*':' ', minlen[0], maxlen[0], + vert?'*':' ', minlen[1], maxlen[1], len, fraglen, len2, len1); +#endif + if(lastf2 != lastf1) { + lastf2->len[GEXFI_LINE] = len2-len1; + } + lastf1->len[GEXFI_LINE] = len1+1; + pf->len[GEXFI_LINE] = fraglen+1 - i; +#if 0 + gex_dump_contour(pge, clen); +#endif + + /* continue with the line */ + vert = 0; /* vert is a pseudo-directon */ + line[0] = line[1] = 1; + maxlen[0] = minlen[0] = maxlen[1] = minlen[1] = 0; + lastf2 = lastf1 = f; + len2 = len1 = 0; + } else { + lastf1 = pf; + len1 = 0; + } + } + } + + ge = ge->frwd; + } while(ge != cge->next); +#if 0 + fprintf(stderr, "Line postprocessing part 2\n"); + gex_dump_contour(cge->next, clen); +#endif + + ge = cge->next; + do { + f = X_FRAG(ge); + + if(f->len[GEXFI_LINE] >= 4) { + len = f->len[GEXFI_EXACTLINE]; + /* if a non-exact line covers precisely two exact lines, + * split it + */ + if(len > 0 && f->len[GEXFI_LINE] >= len+1) { + GEX_FRAG *pf; + pge = age[(f->aidx + len - 1)%clen]; /* last gentry of exact line */ + pf = X_FRAG(pge); + if(f->len[GEXFI_LINE] + 1 == len + pf->len[GEXFI_EXACTLINE]) { + f->len[GEXFI_LINE] = len; + f->flags |= GEXFF_SPLIT; + pf->len[GEXFI_LINE] = pf->len[GEXFI_EXACTLINE]; + pf->flags |= GEXFF_SPLIT; + } + } + } + + ge = ge->frwd; + } while(ge != cge->next); +#if 0 + fprintf(stderr, "Line postprocessing part 2a\n"); + gex_dump_contour(cge->next, clen); +#endif + ge = cge->next; + do { + f = X_FRAG(ge); + + /* too small lines are of no interest */ + if( (f->flags & GEXFF_SPLIT)==0 && f->len[GEXFI_LINE] < 4) + f->len[GEXFI_LINE] = 0; + + len = f->len[GEXFI_EXACTLINE]; + /* too small exact lines are of no interest */ + if(len < 3) /* exact lines may be shorter */ + f->len[GEXFI_EXACTLINE] = 0; + /* get rid of inexact additions to the end of the exact lines */ + else if(f->len[GEXFI_LINE] == len+1) + f->len[GEXFI_LINE] = len; + /* same at the beginning */ + else { + int diff = X_FRAG(ge->bkwd)->len[GEXFI_LINE] - len; + + if(diff == 1 || diff == 2) { + X_FRAG(ge->bkwd)->len[GEXFI_LINE] = 0; + f->len[GEXFI_LINE] = len; + } + } + + ge = ge->frwd; + } while(ge != cge->next); +#if 0 + fprintf(stderr, "Line postprocessing is completed\n"); + gex_dump_contour(cge->next, clen); +#endif + + gex_calc_lenback(cge->next, clen); /* prepare data */ + + /* resolve conflicts between lines and curves */ + + /* + * the short (3-gentry) curve frags must have one of the ends + * coinciding with another curve frag of the same type + */ + + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + ge = cge->next; + do { + f = X_FRAG(ge); + + if(f->len[d] == 3) { + pge = age[(f->aidx + 2)%clen]; /* last gentry of this frag */ + if(f->lenback[d] == 0 && X_FRAG(pge)->len[d] == 0) { + fprintf(stderr, " discarded small %s at %p-%p\n", gxf_name[d], ge, pge); + f->len[d] = 0; + X_FRAG(ge->frwd)->lenback[d] = 0; + X_FRAG(ge->frwd->frwd)->lenback[d] = 0; + } + } + ge = ge->frwd; + } while(ge != cge->next); + } + + /* the serifs take priority over everything else */ + ge = cge->next; + do { + f = X_FRAG(ge); + + len = f->len[GEXFI_SERIF]; + if(len == 0) + continue; + + if(len != 2) { /* this is used in the code below */ + fprintf(stderr, "Internal error at %s line %d: serif frags len is %d\n", + __FILE__, __LINE__, len); + exit(1); + } + + for(d = 0; d < GEXFI_SERIF; d++) { + /* serifs may not have common ends with the other fragments, + * this is expressed as extending them by 1 gentry on each side + */ + frag_subtract(g, age, clen, ge->bkwd, len+2, d); + } + } while( (ge = ge->frwd) != cge->next); + + /* + * longer exact lines take priority over curves; shorter lines + * and inexact lines are resolved with convex/concave conflicts + */ + ge = cge->next; + do { + f = X_FRAG(ge); + + len = f->len[GEXFI_EXACTLINE]; + + if(len < 6) { /* line is short */ + ge = ge->frwd; + continue; + } + + fprintf(stderr, " line at %p len=%d\n", ge, f->len[GEXFI_EXACTLINE]); + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + frag_subtract(g, age, clen, ge, len, d); + } + + ge = ge->frwd; + } while(ge != cge->next); + + /* + * The exact lines take priority over curves that coincide + * with them or extend by only one gentry on either side + * (but not both sides). By this time it applies only to the + * small exact lines. + * + * An interesting general case is when a curve matches more + * than one exact line going diamond-like. + */ + + ge = cge->next; + do { + int done, len2; + int sharpness; + GEX_FRAG *pf; + + f = X_FRAG(ge); + + /* "sharpness" shows how a group of exact line frags is connected: if the gentries + * of some of them overlap, the curve matching requirement is loosened: it may + * extend up to 1 gentry beyond each end of the group of exact line frags + * (sharpness=2); otherwise it may extend to only one end (sharpness=1) + */ + sharpness = 1; + + len = f->len[GEXFI_EXACTLINE]; + if(len >= 4) { + while(len < clen) { + done = 0; + pf = X_FRAG(ge->bkwd); + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + if(f->len[d] == len || f->len[d] == len+1) { + + fprintf(stderr, " removed %s frag at %p len=%d linelen=%d\n", + gxf_name[d], ge, f->len[d], len); + pge = ge->frwd; + for(i = f->len[d]; i > 1; i--, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = 0; + f->len[d] = 0; + gex_dump_contour(ge, clen); + done = 1; + } else if(pf->len[d] == len+1 || pf->len[d] == len+sharpness) { + fprintf(stderr, " removed %s frag at %p len=%d next linelen=%d\n", + gxf_name[d], ge->bkwd, pf->len[d], len); + pge = ge; + for(i = pf->len[d]; i > 1; i--, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = 0; + pf->len[d] = 0; + gex_dump_contour(ge, clen); + done = 1; + } + } + if(done) + break; + + /* is there any chance to match a sequence of exect lines ? */ + if(f->len[GEXFI_CONVEX] < len && f->len[GEXFI_CONCAVE] < len + && pf->len[GEXFI_CONVEX] < len && pf->len[GEXFI_CONCAVE] < len) + break; + + done = 1; + /* check whether the line is connected to another exact line at an extremum */ + pge = age[(f->aidx + len - 1)%clen]; /* last gentry of exact line */ + len2 = X_FRAG(pge)->len[GEXFI_EXACTLINE]; + if(len2 > 0) { + if( len2 >= 4 && (X_FRAG(pge)->flags & GEXFF_EXTR) ) { + len += len2 - 1; + sharpness = 2; + done = 0; + } + } else { + /* see if the extremum is between two exact lines */ + pge = pge->frwd; + if(X_FRAG(pge)->flags & GEXFF_EXTR) { + pge = pge->frwd; + len2 = X_FRAG(pge)->len[GEXFI_EXACTLINE]; + if(len2 >= 4) { + len += len2 + 1; + done = 0; + } + } + } + if(done) + break; + } + } + + ge = ge->frwd; + } while(ge != cge->next); + + /* + * The lines may cover only whole curves (or otherwise empty space), + * so cut them where they overlap parts of the curves. If 2 or less + * gentries are left in the line, remove the line. + * If a line and a curve fully coincide, remove the line. Otherwise + * remove the curves that are completely covered by the lines. + */ + + ge = cge->next; + do { + f = X_FRAG(ge); + + reconsider_line: + len = f->len[GEXFI_LINE]; + + if(len == 0) { + ge = ge->frwd; + continue; + } + + if(f->len[GEXFI_CONVEX] >= len + || f->len[GEXFI_CONCAVE] >= len) { + line_completely_covered: + fprintf(stderr, " removed covered Line frag at %p len=%d\n", + ge, len); + f->len[GEXFI_LINE] = 0; + for(pge = ge->frwd; len > 1; len--, pge = pge->frwd) + X_FRAG(pge)->lenback[GEXFI_LINE] = 0; + gex_dump_contour(ge, clen); + ge = ge->frwd; + continue; + } + + k1 = 0; /* how much to cut at the front */ + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + if(f->lenback[d]) { + pge = age[(f->aidx + clen - f->lenback[d])%clen]; + i = X_FRAG(pge)->len[d] - f->lenback[d] - 1; + if(i > k1) + k1 = i; + } + } + + k2 = 0; /* how much to cut at the end */ + pge = age[(f->aidx + len)%clen]; /* gentry after the end */ + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + i = X_FRAG(pge)->lenback[d] - 1; + if(i > k2) + k2 = i; + } + + if(k1+k2 > 0 && k1+k2 >= len-3) { + fprintf(stderr, " k1=%d k2=%d\n", k1, k2); + goto line_completely_covered; + } + + + if(k2 != 0) { /* cut the end */ + len -= k2; + f->len[GEXFI_LINE] = len; + /* pge still points after the end */ + for(i = k2, pge = pge->bkwd; i > 0; i--, pge = pge->bkwd) + X_FRAG(pge)->lenback[GEXFI_LINE] = 0; + } + if(k1 != 0) { /* cut the beginning */ + len -= k1; + f->len[GEXFI_LINE] = 0; + for(i = 1, pge = ge->frwd; i < k1; i++, pge = pge->frwd) + X_FRAG(pge)->lenback[GEXFI_LINE] = 0; + X_FRAG(pge)->len[GEXFI_LINE] = len; + for(i = 0; i < len; i++, pge = pge->frwd) + X_FRAG(pge)->lenback[GEXFI_LINE] = i; + } + if(k1 != 0 || k2 != 0) { + fprintf(stderr, " cut Line frag at %p by (%d,%d) to len=%d\n", + ge, k1, k2, len); + gex_dump_contour(ge, clen); + + goto reconsider_line; /* the line may have to be cut again */ + } + pge = age[(f->aidx + k1)%clen]; /* new beginning */ + good = 1; /* flag: no need do do a debugging dump */ + for(i=1; ifrwd) + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + if(X_FRAG(pge)->len[d]) { + fprintf(stderr, " removed %s frag at %p len=%d covered by line\n", + gxf_name[d], pge, X_FRAG(pge)->len[d], len); + good = 0; + } + X_FRAG(pge)->len[d] = 0; + } + pge = age[(f->aidx + k1 + 1)%clen]; /* next after new beginning */ + for(i=1; ifrwd) + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) + X_FRAG(pge)->lenback[d] = 0; + if(!good) + gex_dump_contour(ge, clen); + + ge = ge->frwd; + } while(ge != cge->next); + + /* Resolve conflicts between curves */ + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + dx = (GEXFI_CONVEX + GEXFI_CONCAVE) - d; /* the other type */ + ge = cge->next; + do { + GENTRY *sge; + + f = X_FRAG(ge); + len = f->len[d]; + if(len < 2) { + ge = ge->frwd; + continue; + } + sge = ge; /* the start of fragment */ + + i = f->len[dx]; + if(i != 0) { /* two curved frags starting here */ + /* should be i!=len because otherwise they would be + * covered by an exact line + */ + if(i > len) { + curve_completely_covered: + /* remove the convex frag */ + fprintf(stderr, " removed %s frag at %p len=%d covered by %s\n", + gxf_name[d], ge, len, gxf_name[dx]); + f->len[d] = 0; + for(pge = ge->frwd, j = 1; j < len; j++, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = 0; + gex_dump_contour(ge, clen); + + ge = ge->frwd; /* the frag is gone, nothing more to do */ + continue; + } else { + /* remove the concave frag */ + fprintf(stderr, " removed %s frag at %p len=%d covered by %s\n", + gxf_name[dx], ge, i, gxf_name[d]); + f->len[dx] = 0; + for(pge = ge->frwd, j = 1; j < i; j++, pge = pge->frwd) + X_FRAG(pge)->lenback[dx] = 0; + gex_dump_contour(ge, clen); + } + } + + + k1 = X_FRAG(ge->frwd)->lenback[dx]; + if(k1 != 0) { /* conflict at the front */ + GENTRY *gels, *gele, *gei; + + pge = age[(f->aidx + clen - (k1-1))%clen]; /* first gentry of concave frag */ + k2 = X_FRAG(pge)->len[dx]; /* its length */ + + i = k2 - (k1-1); /* amount of overlap */ + if(i > len) + i = len; + /* i >= 2 by definition */ + if(i >= k2-1) { /* covers the other frag - maybe with 1 gentry showing */ + fprintf(stderr, " removed %s frag at %p len=%d covered by %s\n", + gxf_name[dx], pge, k2, gxf_name[d]); + X_FRAG(pge)->len[dx] = 0; + for(pge = pge->frwd, j = 1; j < k2; j++, pge = pge->frwd) + X_FRAG(pge)->lenback[dx] = 0; + if(i >= len-1) { /* covers our frag too - maybe with 1 gentry showing */ + /* our frag will be removed as well, prepare a line to replace it */ + gels = ge; + gele = age[(f->aidx + i - 1)%clen]; + fprintf(stderr, " new Line frag at %p-%p len=%d\n", gels, gele, i); + X_FRAG(gels)->len[GEXFI_LINE] = i; + for(gei = gels->frwd, j = 1; j < i; gei = gei->frwd, j++) + X_FRAG(gei)->lenback[GEXFI_LINE] = j; + } else { + gex_dump_contour(ge, clen); + ge = ge->frwd; + continue; + } + } + if(i >= len-1) /* covers our frag - maybe with 1 gentry showing */ + goto curve_completely_covered; + + /* XXX need to do something better for the case when a curve frag + * is actually nothing but an artifact of two other curves of + * the opposite type touching each other, like on the back of "3" + */ + + /* change the overlapping part to a line */ + gels = ge; + gele = age[(f->aidx + i - 1)%clen]; + /* give preference to local extremums */ + if(X_FRAG(gels)->flags & GEXFF_EXTR) { + gels = gels->frwd; + i--; + } + if(X_FRAG(gele)->flags & GEXFF_EXTR) { + gele = gele->bkwd; + i--; + } + if(gels->bkwd == gele) { + /* Oops the line became negative. Probably should + * never happen but I can't think of any formal reasoning + * leading to that, so check just in case. Restore + * the previous state. + */ + gels = gele; gele = gels->frwd; i = 2; + } + + j = X_FRAG(gels)->lenback[dx] + 1; /* new length */ + if(j != k2) { + X_FRAG(pge)->len[dx] = j; + fprintf(stderr, " cut %s frag at %p len=%d to %p len=%d end overlap with %s\n", + gxf_name[dx], pge, k2, gels, j, gxf_name[d]); + for(gei = gels->frwd; j < k2; gei = gei->frwd, j++) + X_FRAG(gei)->lenback[dx] = 0; + } + + if(gele != ge) { + sge = gele; + f->len[d] = 0; + fprintf(stderr, " cut %s frag at %p len=%d ", gxf_name[d], ge, len); + len--; + for(gei = ge->frwd; gei != gele; gei = gei->frwd, len--) + X_FRAG(gei)->lenback[d] = 0; + X_FRAG(gele)->len[d] = len; + X_FRAG(gele)->lenback[d] = 0; + fprintf(stderr, "to %p len=%d start overlap with %s\n", + sge, len, gxf_name[dx]); + for(gei = gei->frwd, j = 1; j < len; gei = gei->frwd, j++) + X_FRAG(gei)->lenback[d] = j; + + } + if(i > 1) { + fprintf(stderr, " new Line frag at %p-%p len=%d\n", gels, gele, i); + X_FRAG(gels)->len[GEXFI_LINE] = i; + for(gei = gels->frwd, j = 1; j < i; gei = gei->frwd, j++) + X_FRAG(gei)->lenback[GEXFI_LINE] = j; + } + gex_dump_contour(ge, clen); + } + + ge = ge->frwd; + } while(ge != cge->next); + } + + /* + * Assert that there are no conflicts any more and + * for each gentry find the fragment types that start + * and continue here. + */ + ge = cge->next; + do { + f = X_FRAG(ge); + dx = GEXFI_NONE; /* type that starts here */ + dy = GEXFI_NONE; /* type that goes through here */ + /* GEXFI_EXACTLINE and GEXFI_SERIF are auxiliary and don't + * generate any actual lines/curves in the result + */ + for(d = GEXFI_CONVEX; d<= GEXFI_LINE; d++) { + if(f->len[d]) { + if(dx >= 0) { + fprintf(stderr, "**** Internal error in vectorization\n"); + fprintf(stderr, "CONFLICT in %s at %p between %s and %s\n", + g->name, ge, gxf_name[dx], gxf_name[d]); + dumppaths(g, cge->next, cge->next->bkwd); + gex_dump_contour(ge, clen); + exit(1); + } + dx = d; + } + if(f->lenback[d]) { + if(dy >= 0) { + fprintf(stderr, "**** Internal error in vectorization\n"); + fprintf(stderr, "CONFLICT in %s at %p between %s and %s\n", + g->name, ge, gxf_name[dy], gxf_name[d]); + dumppaths(g, cge->next, cge->next->bkwd); + gex_dump_contour(ge, clen); + exit(1); + } + dy = d; + } + } + f->ixstart = dx; + f->ixcont = dy; + ge = ge->frwd; + } while(ge != cge->next); + + /* + * make sure that the contour does not start in the + * middle of a fragment + */ + ge = cge->next; /* old start of the contour */ + f = X_FRAG(ge); + if(f->ixstart == GEXFI_NONE && f->ixcont != GEXFI_NONE) { + /* oops, it's mid-fragment, move the start */ + GENTRY *xge; + + xge = ge->bkwd->next; /* entry following the contour */ + + /* find the first gentry of this frag */ + pge = age[(f->aidx + clen - f->lenback[f->ixcont])%clen]; + + ge->prev = ge->bkwd; + ge->bkwd->next = ge; + + cge->next = pge; + pge->prev = cge; + + pge->bkwd->next = xge; + if(xge) + xge->prev = pge->bkwd; + + cge->ix3 = pge->bkwd->ix3; cge->iy3 = pge->bkwd->iy3; + } + + /* vectorize each fragment separately + * make 2 passes: first handle the straight lines, then + * the curves to allow the curver to be connected smoothly + * to the straights + */ + ge = cge->next; + do { /* pass 1 */ + f = X_FRAG(ge); + switch(f->ixstart) { + case GEXFI_LINE: + len = f->len[GEXFI_LINE]; + pge = age[(f->aidx + len - 1)%clen]; /* last gentry */ + + if(ge->iy3 == ge->bkwd->iy3) { /* frag starts and ends horizontally */ + k1 = 1/*Y*/ ; /* across the direction of start */ + k2 = 0/*X*/ ; /* along the direction of start */ + } else { /* frag starts and ends vertically */ + k1 = 0/*X*/ ; /* across the direction of start */ + k2 = 1/*Y*/ ; /* along the direction of start */ + } + + if(len % 2) { + /* odd number of entries in the frag */ + double halfstep, halfend; + + f->vect[0][k1] = fscale * ge->ipoints[k1][2]; + f->vect[3][k1] = fscale * pge->ipoints[k1][2]; + + halfstep = (pge->ipoints[k2][2] - ge->bkwd->ipoints[k2][2]) + * 0.5 / ((len+1)/2); + if(f->ixcont != GEXFI_NONE) { + halfend = (ge->ipoints[k2][2] - ge->bkwd->ipoints[k2][2]) * 0.5; + if(fabs(halfstep) < fabs(halfend)) /* must be at least half gentry away */ + halfstep = halfend; + } + if(X_FRAG(pge)->ixstart != GEXFI_NONE) { + halfend = (pge->ipoints[k2][2] - pge->bkwd->ipoints[k2][2]) * 0.5; + if(fabs(halfstep) < fabs(halfend)) /* must be at least half gentry away */ + halfstep = halfend; + } + f->vect[0][k2] = fscale * (ge->bkwd->ipoints[k2][2] + halfstep); + f->vect[3][k2] = fscale * (pge->ipoints[k2][2] - halfstep); + } else { + /* even number of entries */ + double halfstep, halfend; + + f->vect[0][k1] = fscale * ge->ipoints[k1][2]; + halfstep = (pge->ipoints[k2][2] - ge->bkwd->ipoints[k2][2]) + * 0.5 / (len/2); + if(f->ixcont != GEXFI_NONE) { + halfend = (ge->ipoints[k2][2] - ge->bkwd->ipoints[k2][2]) * 0.5; + if(fabs(halfstep) < fabs(halfend)) /* must be at least half gentry away */ + halfstep = halfend; + } + f->vect[0][k2] = fscale * (ge->bkwd->ipoints[k2][2] + halfstep); + + halfstep = (pge->ipoints[k1][2] - ge->bkwd->ipoints[k1][2]) + * 0.5 / (len/2); + if(X_FRAG(pge)->ixstart != GEXFI_NONE) { + halfend = (pge->ipoints[k1][2] - pge->bkwd->ipoints[k1][2]) * 0.5; + if(fabs(halfstep) < fabs(halfend)) /* must be at least half gentry away */ + halfstep = halfend; + } + f->vect[3][k1] = fscale * (pge->ipoints[k1][2] - halfstep); + f->vect[3][k2] = fscale * pge->ipoints[k2][2]; + } + f->vectlen = len; + f->flags |= GEXFF_DRAWLINE; + break; + } + } while((ge = ge->frwd) != cge->next); + + ge = cge->next; + do { /* pass 2 */ + /* data for curves */ + GENTRY *firstge, *lastge, *gef, *gel, *gei, *gex; + GENTRY *ordhd; /* head of the order list */ + GENTRY **ordlast; + int nsub; /* number of subfrags */ + GEX_FRAG *ff, *lf, *xf; + + f = X_FRAG(ge); + switch(f->ixstart) { + case GEXFI_CONVEX: + case GEXFI_CONCAVE: + len = f->len[f->ixstart]; + firstge = ge; + lastge = age[(f->aidx + len - 1)%clen]; /* last gentry */ + + nsub = 0; + gex = firstge; + xf = X_FRAG(gex); + xf->prevsub = 0; + xf->sublen = 1; + xf->flags &= ~GEXFF_DONE; + for(gei = firstge->frwd; gei != lastge; gei = gei->frwd) { + xf->sublen++; + if(X_FRAG(gei)->flags & GEXFF_EXTR) { + xf->nextsub = gei; + for(i=0; i<2; i++) + xf->bbox[i] = abs(gei->ipoints[i][2] - gex->bkwd->ipoints[i][2]); + nsub++; + xf = X_FRAG(gei); + xf->prevsub = gex; + xf->sublen = 1; + xf->flags &= ~GEXFF_DONE; + gex = gei; + } + } + xf->sublen++; + xf->nextsub = gei; + for(i=0; i<2; i++) + xf->bbox[i] = abs(gei->ipoints[i][2] - gex->bkwd->ipoints[i][2]); + nsub++; + ff = xf; /* remember the beginning of the last subfrag */ + xf = X_FRAG(gei); + xf->prevsub = gex; + if(firstge != lastge) { + xf->nextsub = 0; + xf->sublen = 0; + + /* correct the bounding box of the last and first subfrags for + * intersections with other fragments + */ + if(xf->ixstart != GEXFI_NONE) { + /* ff points to the beginning of the last subfrag */ + for(i=0; i<2; i++) + ff->bbox[i] -= 0.5 * abs(lastge->ipoints[i][2] - lastge->bkwd->ipoints[i][2]); + } + ff = X_FRAG(firstge); + if(ff->ixcont != GEXFI_NONE) { + for(i=0; i<2; i++) + ff->bbox[i] -= 0.5 * abs(firstge->ipoints[i][2] - firstge->bkwd->ipoints[i][2]); + } + } + + fprintf(stderr, " %s frag %p%s nsub=%d\n", gxf_name[f->ixstart], + ge, (f->flags&GEXFF_CIRC)?" circular":"", nsub); + + /* find the symmetry between the subfragments */ + for(gef = firstge, count=0; count < nsub; gef = ff->nextsub, count++) { + ff = X_FRAG(gef); + gex = ff->nextsub; + xf = X_FRAG(gex); + gel = xf->nextsub; + if(gel == 0) { + ff->flags &= ~GEXFF_SYMNEXT; + break; /* not a circular frag */ + } + good = 1; /* assume that we have symmetry */ + /* gei goes backwards, gex goes forwards from the extremum */ + gei = gex; + /* i is the symmetry axis, j is the other axis (X=0 Y=1) */ + ff->symaxis = i = (gex->ix3 != gex->bkwd->ix3); + j = !i; + for( ; gei!=gef && gex!=gel; gei=gei->bkwd, gex=gex->frwd) { + if( gei->bkwd->ipoints[i][2] != gex->ipoints[i][2] + || gei->bkwd->ipoints[j][2] - gei->ipoints[j][2] + != gex->bkwd->ipoints[j][2] - gex->ipoints[j][2] + ) { + good = 0; /* no symmetry */ + break; + } + } + if(good) { + if( isign(gei->bkwd->ipoints[j][2] - gei->ipoints[j][2]) + != isign(gex->bkwd->ipoints[j][2] - gex->ipoints[j][2]) ) { + good = 0; /* oops, goes into another direction */ + } + } + if(good) + ff->flags |= GEXFF_SYMNEXT; + else + ff->flags &= ~GEXFF_SYMNEXT; + } + + for(gef = firstge, count=0; count < nsub; gef = ff->nextsub, count++) { + ff = X_FRAG(gef); + if((ff->flags & GEXFF_SYMNEXT)==0) { + ff->symxlen = 0; + continue; + } + gex = ff->prevsub; + if(gex == 0 || (X_FRAG(gex)->flags & GEXFF_SYMNEXT)==0) { + ff->symxlen = 0; + continue; + } + ff->symxlen = X_FRAG(gex)->sublen; + xf = X_FRAG(ff->nextsub); + if(xf->sublen < ff->symxlen) + ff->symxlen = xf->sublen; + } + + /* find the symmetry inside the subfragments */ + for(gef = firstge, count=0; count < nsub; gef = ff->nextsub, count++) { + ff = X_FRAG(gef); + + if(ff->sublen % 2) { + /* we must have an even number of gentries for diagonal symmetry */ + ff->symge = 0; + continue; + } + + /* gei goes forwards from the front */ + gei = gef->frwd; + /* gex goes backwards from the back */ + gex = ff->nextsub->bkwd; + + /* i is the direction of gei, j is the direction of gex */ + i = (gei->iy3 != gei->bkwd->iy3); + j = !i; + for( ; gei->bkwd != gex; gei=gei->frwd, gex=gex->bkwd) { + if( abs(gei->bkwd->ipoints[i][2] - gei->ipoints[i][2]) + != abs(gex->bkwd->ipoints[j][2] - gex->ipoints[j][2]) ) + break; /* no symmetry */ + i = j; + j = !j; + } + if(gei->bkwd == gex) + ff->symge = gex; + else + ff->symge = 0; /* no symmetry */ + } + + /* find the order of calculation: + * prefer to start from long fragments that have the longest + * neighbours symmetric with them, with all being equal prefer + * the fragments that have smaller physical size + */ + ordhd = 0; + for(gef = firstge, count=0; count < nsub; gef = ff->nextsub, count++) { + ff = X_FRAG(gef); + + for(ordlast = &ordhd; *ordlast != 0; ordlast = &xf->ordersub) { + xf = X_FRAG(*ordlast); + if(ff->sublen > xf->sublen) + break; + if(ff->sublen < xf->sublen) + continue; + if(ff->symxlen > xf->symxlen) + break; + if(ff->symxlen < xf->symxlen) + continue; + if(ff->bbox[0] < xf->bbox[0] || ff->bbox[1] < xf->bbox[1]) + break; + } + + ff->ordersub = *ordlast; + *ordlast = gef; + } + + /* vectorize the subfragments */ + for(gef = ordhd; gef != 0; gef = ff->ordersub) { + + /* debugging stuff */ + ff = X_FRAG(gef); + fprintf(stderr, " %p-%p bbox[%g,%g] sym=%p %s len=%d xlen=%d\n", + gef, ff->nextsub, ff->bbox[0], ff->bbox[1], ff->symge, + (ff->flags & GEXFF_SYMNEXT) ? "symnext" : "", + ff->sublen, ff->symxlen); + + dosubfrag(g, f->ixstart, firstge, gef, fscale); + } + + break; + } + } while((ge = ge->frwd) != cge->next); + + free(age); + + } + + } + + /* all the fragments are found, extract the vectorization */ + pge = g->entries; + g->entries = g->lastentry = 0; + g->flags |= GF_FLOAT; + loopge = 0; + skip = 0; + + for(ge = pge; ge != 0; ge = ge->next) { + GEX_FRAG *f, *pf; + + switch(ge->type) { + case GE_LINE: + f = X_FRAG(ge); + if(skip == 0) { + if(f->flags & (GEXFF_DRAWLINE|GEXFF_DRAWCURVE)) { + /* draw a line to the start point */ + fg_rlineto(g, f->vect[0][0], f->vect[0][1]); + /* draw the fragment */ + if(f->flags & GEXFF_DRAWCURVE) + fg_rrcurveto(g, + f->vect[1][0], f->vect[1][1], + f->vect[2][0], f->vect[2][1], + f->vect[3][0], f->vect[3][1]); + else + fg_rlineto(g, f->vect[3][0], f->vect[3][1]); + skip = f->vectlen - 2; + } else { + fg_rlineto(g, fscale * ge->ix3, fscale * ge->iy3); + } + } else + skip--; + break; + case GE_MOVE: + fg_rmoveto(g, -1e6, -1e6); /* will be fixed by GE_PATH */ + skip = 0; + /* remember the reference to update it later */ + loopge = g->lastentry; + break; + case GE_PATH: + /* update the first MOVE of this contour */ + if(loopge) { + loopge->fx3 = g->lastentry->fx3; + loopge->fy3 = g->lastentry->fy3; + loopge = 0; + } + g_closepath(g); + break; + } + } + for(ge = pge; ge != 0; ge = cge) { + cge = ge->next; + free(ge->ext); + free(ge); + } + dumppaths(g, NULL, NULL); + + /* end of vectorization logic */ + } else { + /* convert the data to float */ + GENTRY *ge; + double x, y; + + for(ge = g->entries; ge != 0; ge = ge->next) { + ge->flags |= GEF_FLOAT; + if(ge->type != GE_MOVE && ge->type != GE_LINE) + continue; + + x = fscale * ge->ix3; + y = fscale * ge->iy3; + + ge->fx3 = x; + ge->fy3 = y; + } + g->flags |= GF_FLOAT; + } + + free(hlm); free(vlm); free(amp); +} + +#if 0 +/* print out the bitmap */ +printbmap(bmap, xsz, ysz, xoff, yoff) + char *bmap; + int xsz, ysz, xoff, yoff; +{ + int x, y; + + for(y=ysz-1; y>=0; y--) { + putchar( (y%10==0) ? y/10+'0' : ' ' ); + putchar( y%10+'0' ); + for(x=0; x=0; y--) { + for(x=0; x> 8))) +#define ntohl(x) \ + ((ULONG)((((ULONG)(x) & 0x000000ffU) << 24) | \ + (((ULONG)(x) & 0x0000ff00U) << 8) | \ + (((ULONG)(x) & 0x00ff0000U) >> 8) | \ + (((ULONG)(x) & 0xff000000U) >> 24))) +#endif diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/cygbuild.sh b/application/third_party/dompdf/lib/ttf2ufm/src/cygbuild.sh new file mode 100644 index 00000000..262c76d7 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/cygbuild.sh @@ -0,0 +1,8 @@ +: +# this file should be run from Cygnus BASH +# file to build ttf2pt1 with Cygnus GCC on Windows +# don't forget to copy CYGWIN1.DLL into C:\WINDOWS + +gcc -o ttf2pt1 -DWINDOWS ttf2pt1.c pt1.c t1asm.c ttf.c -lm +gcc -o t1asm -DWINDOWS -DSTANDALONE t1asm.c + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README new file mode 100644 index 00000000..cdcf6e4e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README @@ -0,0 +1,47 @@ +Sergey A. Babkin + or +(Do not edit this file, it is generated from README.html!!!) + +The Translation Tables +---------------------- + +These translation tables are used to translate the Type 1 fonts between +different encodings of the same language. + +The file names are supposed to have the suffix .tbl. Each file +describes one encoding, and all the tables for a given language +are stored in the same directory. + +The file format is quite simple: just a sequence of rows in +format + + + +The names do not have to conform to any standard, just the same +glyph must have the same name in all the files for a given language. + +Not all the codes need to be described in the tables, the codes that +are not mentioned in the tables are left untranslated. So a file +of zero length may be used in case when no translation is neccessary. + +The translation changes only the encoding table of the font and does not +rename the glyphs in the font file. + +Examples +-------- + +The directory `russian' contains the tables for some encodings of the +Russian language: KOI-8, IBM CP-866, IBM CP-1251 and just for fun +ISO-8859/5 (nobody uses it anyways). The tables describe both russian +letters and table graphics characters (except for CP-1251 for which +the table graphics is not defined, so the table graphics portion for +it is just copied from KOI-8). + +The file for ISO-8859/1 is just a copy of file for KOI-8. It is neccessary +because Netscape has rather weird ideas about the documents in +KOI-8 encoding. The common way to fool Netscape is to set the KOI-8 +fonts for the ISO-8859/1 encoding and set the default encoding +in Netscape to 8859/1. + +The directory `latin1' contains an empty table for ISO-8859/1 +because it does not need any translation. diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README.html b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README.html new file mode 100644 index 00000000..9a7c40c7 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README.html @@ -0,0 +1,81 @@ + + + +The INSTALLATION GUIDE + + + +Sergey A. Babkin +
+ +<babkin@bellatlantic.net> or <sab123@hotmail.com> +

+ + +

+The Translation Tables +

+ + +These translation tables are used to translate the Type 1 fonts between +different encodings of the same language. +

+ +The file names are supposed to have the suffix .tbl. Each file +describes one encoding, and all the tables for a given language +are stored in the same directory. +

+ +The file format is quite simple: just a sequence of rows in +format +

+ + +<name> <decimal code> + +

+ +The names do not have to conform to any standard, just the same +glyph must have the same name in all the files for a given language. +

+ +Not all the codes need to be described in the tables, the codes that +are not mentioned in the tables are left untranslated. So a file +of zero length may be used in case when no translation is neccessary. +

+ +The translation changes only the encoding table of the font and does not +rename the glyphs in the font file. +

+ +

+Examples +

+ + +The directory `russian' contains the tables for some encodings of the +Russian language: KOI-8, IBM CP-866, IBM CP-1251 and just for fun +ISO-8859/5 (nobody uses it anyways). The tables describe both russian +letters and table graphics characters (except for CP-1251 for which +the table graphics is not defined, so the table graphics portion for +it is just copied from KOI-8). +

+ +The file for ISO-8859/1 is just a copy of file for KOI-8. It is neccessary +because Netscape has rather weird ideas about the documents in +KOI-8 encoding. The common way to fool Netscape is to set the KOI-8 +fonts for the ISO-8859/1 encoding and set the default encoding +in Netscape to 8859/1. +

+ +The directory `latin1' contains an empty table for ISO-8859/1 +because it does not need any translation. +

+ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/adobestd/adobe-std.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/adobestd/adobe-std.tbl new file mode 100644 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/README b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/README new file mode 100644 index 00000000..08f8ce36 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/README @@ -0,0 +1,3 @@ +These files are copies of thos provided for the language "cyrillic" +and are provided for compatibility purposes only, please +use the language "cyrillic" instead. diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/encodings.alias b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/encodings.alias new file mode 100644 index 00000000..e1f29063 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/encodings.alias @@ -0,0 +1,4 @@ +# alias real-name +iso8859-1 koi8-r +windows-1251 ibm-1251 +cp-866 ibm-866 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-1251.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-1251.tbl new file mode 100644 index 00000000..3fd17bd2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-1251.tbl @@ -0,0 +1,127 @@ +cyr_DJE 128 +cyr_GJE 129 +quotesinglbase 130 +cyr_gje 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +cyr_LJE 138 +guilsinglleft 139 +cyr_NJE 140 +cyr_KJE 141 +cyr_TSHE 142 +cyr_DZHE 143 +cyr_dje 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +cyr_lje 154 +guilsinglright 155 +cyr_nje 156 +cyr_kje 157 +cyr_tshe 158 +cyr_dzhe 159 +nbspace 160 +cyr_SHORT_U 161 +cyr_short_u 162 +cyr_JE 163 +currency 164 +cyr_GHE_UPTURN 165 +brokenbar 166 +section 167 +cyr_IO 168 +copyright 169 +cyr_UKRAINIAN_IE 170 +guillemotleft 171 +notsign 172 +hyphen 173 +registered 174 +cyr_YI 175 +degree 176 +plusminus 177 +cyr_BYELORUSSIAN_UKRAINIAN_I 178 +cyr_byelorussian_ukrainian_i 179 +cyr_ghe_upturn 180 +mu 181 +paragraph 182 +periodcentered 183 +cyr_io 184 +numero 185 +cyr_ukrainian_ie 186 +guillemotright 187 +cyr_je 188 +cyr_DZE 189 +cyr_dze 190 +cyr_yi 191 +cyr_A 192 +cyr_BE 193 +cyr_VE 194 +cyr_GHE 195 +cyr_DE 196 +cyr_IE 197 +cyr_ZHE 198 +cyr_ZE 199 +cyr_I 200 +cyr_SHORT_I 201 +cyr_KA 202 +cyr_EL 203 +cyr_EM 204 +cyr_EN 205 +cyr_O 206 +cyr_PE 207 +cyr_ER 208 +cyr_ES 209 +cyr_TE 210 +cyr_U 211 +cyr_EF 212 +cyr_HA 213 +cyr_TSE 214 +cyr_CHE 215 +cyr_SHA 216 +cyr_SHCHA 217 +cyr_HARD_SIGN 218 +cyr_YERU 219 +cyr_SOFT_SIGN 220 +cyr_E 221 +cyr_YU 222 +cyr_YA 223 +cyr_a 224 +cyr_be 225 +cyr_ve 226 +cyr_ghe 227 +cyr_de 228 +cyr_ie 229 +cyr_zhe 230 +cyr_ze 231 +cyr_i 232 +cyr_short_i 233 +cyr_ka 234 +cyr_el 235 +cyr_em 236 +cyr_en 237 +cyr_o 238 +cyr_pe 239 +cyr_er 240 +cyr_es 241 +cyr_te 242 +cyr_u 243 +cyr_ef 244 +cyr_ha 245 +cyr_tse 246 +cyr_che 247 +cyr_sha 248 +cyr_shcha 249 +cyr_hard_sign 250 +cyr_yeru 251 +cyr_soft_sign 252 +cyr_e 253 +cyr_yu 254 +cyr_ya 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-866.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-866.tbl new file mode 100644 index 00000000..b0451ae9 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-866.tbl @@ -0,0 +1,128 @@ +cyr_A 128 +cyr_BE 129 +cyr_CHE 151 +cyr_DE 132 +cyr_E 157 +cyr_EF 148 +cyr_EL 139 +cyr_EM 140 +cyr_EN 141 +cyr_ER 144 +cyr_ES 145 +cyr_GHE 131 +cyr_HA 149 +cyr_HARD_SIGN 154 +cyr_I 136 +cyr_IE 133 +cyr_KA 138 +cyr_O 142 +cyr_PE 143 +cyr_SHA 152 +cyr_SHCHA 153 +cyr_SHORT_I 137 +cyr_SOFT_SIGN 156 +cyr_TE 146 +cyr_TSE 150 +cyr_U 147 +cyr_VE 130 +cyr_YA 159 +cyr_YERU 155 +cyr_IO 240 +cyr_YU 158 +cyr_ZE 135 +cyr_ZHE 134 +cyr_a 160 +cyr_be 161 +cyr_che 231 +cyr_de 164 +cyr_e 237 +cyr_ef 228 +cyr_el 171 +cyr_em 172 +cyr_en 173 +cyr_er 224 +cyr_es 225 +graphic_100pc 219 +graphic_25pc 178 +graphic_50pc 177 +graphic_75pc 176 +graphic_LD 187 +graphic_LR 205 +graphic_LRD 203 +graphic_LRT 202 +graphic_LRTD 206 +graphic_LRd 209 +graphic_LRt 207 +graphic_LRtd 216 +graphic_LT 188 +graphic_LTD 185 +graphic_Ld 184 +graphic_Lt 190 +graphic_Ltd 181 +graphic_RD 201 +graphic_RT 200 +graphic_RTD 204 +graphic_Rd 213 +graphic_Rt 212 +graphic_Rtd 198 +graphic_TD 186 +copyright 252 +degree 248 +graphic_dintegral 245 +graphic_divide 246 +graphic_equal 247 +graphic_fatdot 249 +graphic_ge 242 +graphic_lD 183 +graphic_lT 189 +graphic_lTD 182 +graphic_ld 191 +graphic_le 243 +graphic_leandot 250 +graphic_lefthalf 221 +graphic_lowerhalf 220 +graphic_lr 196 +graphic_lrD 210 +graphic_lrT 208 +graphic_lrTD 215 +graphic_lrd 194 +graphic_lrt 193 +graphic_lrtd 197 +graphic_lt 217 +graphic_ltd 180 +graphic_power2 253 +graphic_rD 214 +graphic_rT 211 +graphic_rTD 199 +graphic_rd 218 +graphic_righthalf 222 +graphic_root 251 +graphic_rt 192 +graphic_rtd 195 +nbspace 255 +graphic_square 254 +graphic_td 179 +graphic_tintegral 244 +graphic_upperhalf 223 +cyr_ghe 163 +cyr_ha 229 +cyr_hard_sign 234 +cyr_i 168 +cyr_ie 165 +cyr_ka 170 +cyr_o 174 +cyr_pe 175 +cyr_sha 232 +cyr_shcha 233 +cyr_short_i 169 +cyr_soft_sign 236 +cyr_te 226 +cyr_tse 230 +cyr_u 227 +cyr_ve 162 +cyr_ya 239 +cyr_yeru 235 +cyr_io 241 +cyr_yu 238 +cyr_ze 167 +cyr_zhe 166 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/iso8859-5.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/iso8859-5.tbl new file mode 100644 index 00000000..8e60e18f --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/iso8859-5.tbl @@ -0,0 +1,127 @@ +cyr_GHE_UPTURN 128 +cyr_ghe_upturn 129 +quotesinglbase 130 +currency 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +brokenbar 138 +guilsinglleft 139 +copyright 140 +guillemotleft 141 +notsign 142 +registered 143 +degree 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +plusminus 154 +guilsinglright 155 +mu 156 +paragraph 157 +periodcentered 158 +guillemotright 159 +nbspace 160 +cyr_IO 161 +cyr_DJE 162 +cyr_GJE 163 +cyr_UKRAINIAN_IE 164 +cyr_DZE 165 +cyr_BYELORUSSIAN_UKRAINIAN_I 166 +cyr_YI 167 +cyr_JE 168 +cyr_LJE 169 +cyr_NJE 170 +cyr_TSHE 171 +cyr_KJE 172 +hyphen 173 +cyr_SHORT_U 174 +cyr_DZHE 175 +cyr_A 176 +cyr_BE 177 +cyr_VE 178 +cyr_GHE 179 +cyr_DE 180 +cyr_IE 181 +cyr_ZHE 182 +cyr_ZE 183 +cyr_I 184 +cyr_SHORT_I 185 +cyr_KA 186 +cyr_EL 187 +cyr_EM 188 +cyr_EN 189 +cyr_O 190 +cyr_PE 191 +cyr_ER 192 +cyr_ES 193 +cyr_TE 194 +cyr_U 195 +cyr_EF 196 +cyr_HA 197 +cyr_TSE 198 +cyr_CHE 199 +cyr_SHA 200 +cyr_SHCHA 201 +cyr_HARD_SIGN 202 +cyr_YERU 203 +cyr_SOFT_SIGN 204 +cyr_E 205 +cyr_YU 206 +cyr_YA 207 +cyr_a 208 +cyr_be 209 +cyr_ve 210 +cyr_ghe 211 +cyr_de 212 +cyr_ie 213 +cyr_zhe 214 +cyr_ze 215 +cyr_i 216 +cyr_short_i 217 +cyr_ka 218 +cyr_el 219 +cyr_em 220 +cyr_en 221 +cyr_o 222 +cyr_pe 223 +cyr_er 224 +cyr_es 225 +cyr_te 226 +cyr_u 227 +cyr_ef 228 +cyr_ha 229 +cyr_tse 230 +cyr_che 231 +cyr_sha 232 +cyr_shcha 233 +cyr_hard_sign 234 +cyr_yeru 235 +cyr_soft_sign 236 +cyr_e 237 +cyr_yu 238 +cyr_ya 239 +numero 240 +cyr_io 241 +cyr_dje 242 +cyr_gje 243 +cyr_ukrainian_ie 244 +cyr_dze 245 +cyr_byelorussian_ukrainian_i 246 +cyr_yi 247 +cyr_je 248 +cyr_lje 249 +cyr_nje 250 +cyr_tshe 251 +cyr_kje 252 +section 253 +cyr_short_u 254 +cyr_dzhe 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/koi8-r.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/koi8-r.tbl new file mode 100644 index 00000000..e22775a2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/koi8-r.tbl @@ -0,0 +1,128 @@ +cyr_A 225 +cyr_BE 226 +cyr_CHE 254 +cyr_DE 228 +cyr_E 252 +cyr_EF 230 +cyr_EL 236 +cyr_EM 237 +cyr_EN 238 +cyr_ER 242 +cyr_ES 243 +cyr_GHE 231 +cyr_HA 232 +cyr_HARD_SIGN 255 +cyr_I 233 +cyr_IE 229 +cyr_KA 235 +cyr_O 239 +cyr_PE 240 +cyr_SHA 251 +cyr_SHCHA 253 +cyr_SHORT_I 234 +cyr_SOFT_SIGN 248 +cyr_TE 244 +cyr_TSE 227 +cyr_U 245 +cyr_VE 247 +cyr_YA 241 +cyr_YERU 249 +cyr_IO 179 +cyr_YU 224 +cyr_ZE 250 +cyr_ZHE 246 +cyr_a 193 +cyr_be 194 +cyr_che 222 +cyr_de 196 +cyr_e 220 +cyr_ef 198 +cyr_el 204 +cyr_em 205 +cyr_en 206 +cyr_er 210 +cyr_es 211 +graphic_100pc 141 +graphic_25pc 144 +graphic_50pc 145 +graphic_75pc 146 +graphic_LD 168 +graphic_LR 160 +graphic_LRD 184 +graphic_LRT 187 +graphic_LRTD 190 +graphic_LRd 182 +graphic_LRt 185 +graphic_LRtd 188 +graphic_LT 174 +graphic_LTD 181 +graphic_Ld 166 +graphic_Lt 172 +graphic_Ltd 178 +graphic_RD 165 +graphic_RT 171 +graphic_RTD 177 +graphic_Rd 162 +graphic_Rt 170 +graphic_Rtd 175 +graphic_TD 161 +copyright 191 +degree 156 +graphic_dintegral 155 +graphic_divide 159 +graphic_equal 151 +graphic_fatdot 149 +graphic_ge 153 +graphic_lD 167 +graphic_lT 173 +graphic_lTD 180 +graphic_ld 131 +graphic_le 152 +graphic_leandot 158 +graphic_lefthalf 142 +graphic_lowerhalf 140 +graphic_lr 128 +graphic_lrD 183 +graphic_lrT 186 +graphic_lrTD 189 +graphic_lrd 136 +graphic_lrt 137 +graphic_lrtd 138 +graphic_lt 133 +graphic_ltd 135 +graphic_power2 157 +graphic_rD 164 +graphic_rT 169 +graphic_rTD 176 +graphic_rd 130 +graphic_righthalf 143 +graphic_root 150 +graphic_rt 132 +graphic_rtd 134 +nbspace 154 +graphic_square 148 +graphic_td 129 +graphic_tintegral 147 +graphic_upperhalf 139 +cyr_ghe 199 +cyr_ha 200 +cyr_hard_sign 223 +cyr_i 201 +cyr_ie 197 +cyr_ka 203 +cyr_o 207 +cyr_pe 208 +cyr_sha 219 +cyr_shcha 221 +cyr_short_i 202 +cyr_soft_sign 216 +cyr_te 212 +cyr_tse 195 +cyr_u 213 +cyr_ve 215 +cyr_ya 209 +cyr_yeru 217 +cyr_io 163 +cyr_yu 192 +cyr_ze 218 +cyr_zhe 214 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/encodings.alias b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/encodings.alias new file mode 100644 index 00000000..e1f29063 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/encodings.alias @@ -0,0 +1,4 @@ +# alias real-name +iso8859-1 koi8-r +windows-1251 ibm-1251 +cp-866 ibm-866 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-1251.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-1251.tbl new file mode 100644 index 00000000..3fd17bd2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-1251.tbl @@ -0,0 +1,127 @@ +cyr_DJE 128 +cyr_GJE 129 +quotesinglbase 130 +cyr_gje 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +cyr_LJE 138 +guilsinglleft 139 +cyr_NJE 140 +cyr_KJE 141 +cyr_TSHE 142 +cyr_DZHE 143 +cyr_dje 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +cyr_lje 154 +guilsinglright 155 +cyr_nje 156 +cyr_kje 157 +cyr_tshe 158 +cyr_dzhe 159 +nbspace 160 +cyr_SHORT_U 161 +cyr_short_u 162 +cyr_JE 163 +currency 164 +cyr_GHE_UPTURN 165 +brokenbar 166 +section 167 +cyr_IO 168 +copyright 169 +cyr_UKRAINIAN_IE 170 +guillemotleft 171 +notsign 172 +hyphen 173 +registered 174 +cyr_YI 175 +degree 176 +plusminus 177 +cyr_BYELORUSSIAN_UKRAINIAN_I 178 +cyr_byelorussian_ukrainian_i 179 +cyr_ghe_upturn 180 +mu 181 +paragraph 182 +periodcentered 183 +cyr_io 184 +numero 185 +cyr_ukrainian_ie 186 +guillemotright 187 +cyr_je 188 +cyr_DZE 189 +cyr_dze 190 +cyr_yi 191 +cyr_A 192 +cyr_BE 193 +cyr_VE 194 +cyr_GHE 195 +cyr_DE 196 +cyr_IE 197 +cyr_ZHE 198 +cyr_ZE 199 +cyr_I 200 +cyr_SHORT_I 201 +cyr_KA 202 +cyr_EL 203 +cyr_EM 204 +cyr_EN 205 +cyr_O 206 +cyr_PE 207 +cyr_ER 208 +cyr_ES 209 +cyr_TE 210 +cyr_U 211 +cyr_EF 212 +cyr_HA 213 +cyr_TSE 214 +cyr_CHE 215 +cyr_SHA 216 +cyr_SHCHA 217 +cyr_HARD_SIGN 218 +cyr_YERU 219 +cyr_SOFT_SIGN 220 +cyr_E 221 +cyr_YU 222 +cyr_YA 223 +cyr_a 224 +cyr_be 225 +cyr_ve 226 +cyr_ghe 227 +cyr_de 228 +cyr_ie 229 +cyr_zhe 230 +cyr_ze 231 +cyr_i 232 +cyr_short_i 233 +cyr_ka 234 +cyr_el 235 +cyr_em 236 +cyr_en 237 +cyr_o 238 +cyr_pe 239 +cyr_er 240 +cyr_es 241 +cyr_te 242 +cyr_u 243 +cyr_ef 244 +cyr_ha 245 +cyr_tse 246 +cyr_che 247 +cyr_sha 248 +cyr_shcha 249 +cyr_hard_sign 250 +cyr_yeru 251 +cyr_soft_sign 252 +cyr_e 253 +cyr_yu 254 +cyr_ya 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-866.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-866.tbl new file mode 100644 index 00000000..b0451ae9 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-866.tbl @@ -0,0 +1,128 @@ +cyr_A 128 +cyr_BE 129 +cyr_CHE 151 +cyr_DE 132 +cyr_E 157 +cyr_EF 148 +cyr_EL 139 +cyr_EM 140 +cyr_EN 141 +cyr_ER 144 +cyr_ES 145 +cyr_GHE 131 +cyr_HA 149 +cyr_HARD_SIGN 154 +cyr_I 136 +cyr_IE 133 +cyr_KA 138 +cyr_O 142 +cyr_PE 143 +cyr_SHA 152 +cyr_SHCHA 153 +cyr_SHORT_I 137 +cyr_SOFT_SIGN 156 +cyr_TE 146 +cyr_TSE 150 +cyr_U 147 +cyr_VE 130 +cyr_YA 159 +cyr_YERU 155 +cyr_IO 240 +cyr_YU 158 +cyr_ZE 135 +cyr_ZHE 134 +cyr_a 160 +cyr_be 161 +cyr_che 231 +cyr_de 164 +cyr_e 237 +cyr_ef 228 +cyr_el 171 +cyr_em 172 +cyr_en 173 +cyr_er 224 +cyr_es 225 +graphic_100pc 219 +graphic_25pc 178 +graphic_50pc 177 +graphic_75pc 176 +graphic_LD 187 +graphic_LR 205 +graphic_LRD 203 +graphic_LRT 202 +graphic_LRTD 206 +graphic_LRd 209 +graphic_LRt 207 +graphic_LRtd 216 +graphic_LT 188 +graphic_LTD 185 +graphic_Ld 184 +graphic_Lt 190 +graphic_Ltd 181 +graphic_RD 201 +graphic_RT 200 +graphic_RTD 204 +graphic_Rd 213 +graphic_Rt 212 +graphic_Rtd 198 +graphic_TD 186 +copyright 252 +degree 248 +graphic_dintegral 245 +graphic_divide 246 +graphic_equal 247 +graphic_fatdot 249 +graphic_ge 242 +graphic_lD 183 +graphic_lT 189 +graphic_lTD 182 +graphic_ld 191 +graphic_le 243 +graphic_leandot 250 +graphic_lefthalf 221 +graphic_lowerhalf 220 +graphic_lr 196 +graphic_lrD 210 +graphic_lrT 208 +graphic_lrTD 215 +graphic_lrd 194 +graphic_lrt 193 +graphic_lrtd 197 +graphic_lt 217 +graphic_ltd 180 +graphic_power2 253 +graphic_rD 214 +graphic_rT 211 +graphic_rTD 199 +graphic_rd 218 +graphic_righthalf 222 +graphic_root 251 +graphic_rt 192 +graphic_rtd 195 +nbspace 255 +graphic_square 254 +graphic_td 179 +graphic_tintegral 244 +graphic_upperhalf 223 +cyr_ghe 163 +cyr_ha 229 +cyr_hard_sign 234 +cyr_i 168 +cyr_ie 165 +cyr_ka 170 +cyr_o 174 +cyr_pe 175 +cyr_sha 232 +cyr_shcha 233 +cyr_short_i 169 +cyr_soft_sign 236 +cyr_te 226 +cyr_tse 230 +cyr_u 227 +cyr_ve 162 +cyr_ya 239 +cyr_yeru 235 +cyr_io 241 +cyr_yu 238 +cyr_ze 167 +cyr_zhe 166 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/iso8859-5.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/iso8859-5.tbl new file mode 100644 index 00000000..8e60e18f --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/iso8859-5.tbl @@ -0,0 +1,127 @@ +cyr_GHE_UPTURN 128 +cyr_ghe_upturn 129 +quotesinglbase 130 +currency 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +brokenbar 138 +guilsinglleft 139 +copyright 140 +guillemotleft 141 +notsign 142 +registered 143 +degree 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +plusminus 154 +guilsinglright 155 +mu 156 +paragraph 157 +periodcentered 158 +guillemotright 159 +nbspace 160 +cyr_IO 161 +cyr_DJE 162 +cyr_GJE 163 +cyr_UKRAINIAN_IE 164 +cyr_DZE 165 +cyr_BYELORUSSIAN_UKRAINIAN_I 166 +cyr_YI 167 +cyr_JE 168 +cyr_LJE 169 +cyr_NJE 170 +cyr_TSHE 171 +cyr_KJE 172 +hyphen 173 +cyr_SHORT_U 174 +cyr_DZHE 175 +cyr_A 176 +cyr_BE 177 +cyr_VE 178 +cyr_GHE 179 +cyr_DE 180 +cyr_IE 181 +cyr_ZHE 182 +cyr_ZE 183 +cyr_I 184 +cyr_SHORT_I 185 +cyr_KA 186 +cyr_EL 187 +cyr_EM 188 +cyr_EN 189 +cyr_O 190 +cyr_PE 191 +cyr_ER 192 +cyr_ES 193 +cyr_TE 194 +cyr_U 195 +cyr_EF 196 +cyr_HA 197 +cyr_TSE 198 +cyr_CHE 199 +cyr_SHA 200 +cyr_SHCHA 201 +cyr_HARD_SIGN 202 +cyr_YERU 203 +cyr_SOFT_SIGN 204 +cyr_E 205 +cyr_YU 206 +cyr_YA 207 +cyr_a 208 +cyr_be 209 +cyr_ve 210 +cyr_ghe 211 +cyr_de 212 +cyr_ie 213 +cyr_zhe 214 +cyr_ze 215 +cyr_i 216 +cyr_short_i 217 +cyr_ka 218 +cyr_el 219 +cyr_em 220 +cyr_en 221 +cyr_o 222 +cyr_pe 223 +cyr_er 224 +cyr_es 225 +cyr_te 226 +cyr_u 227 +cyr_ef 228 +cyr_ha 229 +cyr_tse 230 +cyr_che 231 +cyr_sha 232 +cyr_shcha 233 +cyr_hard_sign 234 +cyr_yeru 235 +cyr_soft_sign 236 +cyr_e 237 +cyr_yu 238 +cyr_ya 239 +numero 240 +cyr_io 241 +cyr_dje 242 +cyr_gje 243 +cyr_ukrainian_ie 244 +cyr_dze 245 +cyr_byelorussian_ukrainian_i 246 +cyr_yi 247 +cyr_je 248 +cyr_lje 249 +cyr_nje 250 +cyr_tshe 251 +cyr_kje 252 +section 253 +cyr_short_u 254 +cyr_dzhe 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/koi8-r.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/koi8-r.tbl new file mode 100644 index 00000000..e22775a2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/koi8-r.tbl @@ -0,0 +1,128 @@ +cyr_A 225 +cyr_BE 226 +cyr_CHE 254 +cyr_DE 228 +cyr_E 252 +cyr_EF 230 +cyr_EL 236 +cyr_EM 237 +cyr_EN 238 +cyr_ER 242 +cyr_ES 243 +cyr_GHE 231 +cyr_HA 232 +cyr_HARD_SIGN 255 +cyr_I 233 +cyr_IE 229 +cyr_KA 235 +cyr_O 239 +cyr_PE 240 +cyr_SHA 251 +cyr_SHCHA 253 +cyr_SHORT_I 234 +cyr_SOFT_SIGN 248 +cyr_TE 244 +cyr_TSE 227 +cyr_U 245 +cyr_VE 247 +cyr_YA 241 +cyr_YERU 249 +cyr_IO 179 +cyr_YU 224 +cyr_ZE 250 +cyr_ZHE 246 +cyr_a 193 +cyr_be 194 +cyr_che 222 +cyr_de 196 +cyr_e 220 +cyr_ef 198 +cyr_el 204 +cyr_em 205 +cyr_en 206 +cyr_er 210 +cyr_es 211 +graphic_100pc 141 +graphic_25pc 144 +graphic_50pc 145 +graphic_75pc 146 +graphic_LD 168 +graphic_LR 160 +graphic_LRD 184 +graphic_LRT 187 +graphic_LRTD 190 +graphic_LRd 182 +graphic_LRt 185 +graphic_LRtd 188 +graphic_LT 174 +graphic_LTD 181 +graphic_Ld 166 +graphic_Lt 172 +graphic_Ltd 178 +graphic_RD 165 +graphic_RT 171 +graphic_RTD 177 +graphic_Rd 162 +graphic_Rt 170 +graphic_Rtd 175 +graphic_TD 161 +copyright 191 +degree 156 +graphic_dintegral 155 +graphic_divide 159 +graphic_equal 151 +graphic_fatdot 149 +graphic_ge 153 +graphic_lD 167 +graphic_lT 173 +graphic_lTD 180 +graphic_ld 131 +graphic_le 152 +graphic_leandot 158 +graphic_lefthalf 142 +graphic_lowerhalf 140 +graphic_lr 128 +graphic_lrD 183 +graphic_lrT 186 +graphic_lrTD 189 +graphic_lrd 136 +graphic_lrt 137 +graphic_lrtd 138 +graphic_lt 133 +graphic_ltd 135 +graphic_power2 157 +graphic_rD 164 +graphic_rT 169 +graphic_rTD 176 +graphic_rd 130 +graphic_righthalf 143 +graphic_root 150 +graphic_rt 132 +graphic_rtd 134 +nbspace 154 +graphic_square 148 +graphic_td 129 +graphic_tintegral 147 +graphic_upperhalf 139 +cyr_ghe 199 +cyr_ha 200 +cyr_hard_sign 223 +cyr_i 201 +cyr_ie 197 +cyr_ka 203 +cyr_o 207 +cyr_pe 208 +cyr_sha 219 +cyr_shcha 221 +cyr_short_i 202 +cyr_soft_sign 216 +cyr_te 212 +cyr_tse 195 +cyr_u 213 +cyr_ve 215 +cyr_ya 209 +cyr_yeru 217 +cyr_io 163 +cyr_yu 192 +cyr_ze 218 +cyr_zhe 214 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin1/iso8859-1.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin1/iso8859-1.tbl new file mode 100644 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin2/iso8859-2.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin2/iso8859-2.tbl new file mode 100644 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin4/iso8859-4 b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin4/iso8859-4 new file mode 100644 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin4/iso8859-4.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin4/iso8859-4.tbl new file mode 100644 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin5/iso8859-9 b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin5/iso8859-9 new file mode 100644 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/README b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/README new file mode 100644 index 00000000..08f8ce36 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/README @@ -0,0 +1,3 @@ +These files are copies of thos provided for the language "cyrillic" +and are provided for compatibility purposes only, please +use the language "cyrillic" instead. diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/encodings.alias b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/encodings.alias new file mode 100644 index 00000000..e1f29063 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/encodings.alias @@ -0,0 +1,4 @@ +# alias real-name +iso8859-1 koi8-r +windows-1251 ibm-1251 +cp-866 ibm-866 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-1251.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-1251.tbl new file mode 100644 index 00000000..3fd17bd2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-1251.tbl @@ -0,0 +1,127 @@ +cyr_DJE 128 +cyr_GJE 129 +quotesinglbase 130 +cyr_gje 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +cyr_LJE 138 +guilsinglleft 139 +cyr_NJE 140 +cyr_KJE 141 +cyr_TSHE 142 +cyr_DZHE 143 +cyr_dje 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +cyr_lje 154 +guilsinglright 155 +cyr_nje 156 +cyr_kje 157 +cyr_tshe 158 +cyr_dzhe 159 +nbspace 160 +cyr_SHORT_U 161 +cyr_short_u 162 +cyr_JE 163 +currency 164 +cyr_GHE_UPTURN 165 +brokenbar 166 +section 167 +cyr_IO 168 +copyright 169 +cyr_UKRAINIAN_IE 170 +guillemotleft 171 +notsign 172 +hyphen 173 +registered 174 +cyr_YI 175 +degree 176 +plusminus 177 +cyr_BYELORUSSIAN_UKRAINIAN_I 178 +cyr_byelorussian_ukrainian_i 179 +cyr_ghe_upturn 180 +mu 181 +paragraph 182 +periodcentered 183 +cyr_io 184 +numero 185 +cyr_ukrainian_ie 186 +guillemotright 187 +cyr_je 188 +cyr_DZE 189 +cyr_dze 190 +cyr_yi 191 +cyr_A 192 +cyr_BE 193 +cyr_VE 194 +cyr_GHE 195 +cyr_DE 196 +cyr_IE 197 +cyr_ZHE 198 +cyr_ZE 199 +cyr_I 200 +cyr_SHORT_I 201 +cyr_KA 202 +cyr_EL 203 +cyr_EM 204 +cyr_EN 205 +cyr_O 206 +cyr_PE 207 +cyr_ER 208 +cyr_ES 209 +cyr_TE 210 +cyr_U 211 +cyr_EF 212 +cyr_HA 213 +cyr_TSE 214 +cyr_CHE 215 +cyr_SHA 216 +cyr_SHCHA 217 +cyr_HARD_SIGN 218 +cyr_YERU 219 +cyr_SOFT_SIGN 220 +cyr_E 221 +cyr_YU 222 +cyr_YA 223 +cyr_a 224 +cyr_be 225 +cyr_ve 226 +cyr_ghe 227 +cyr_de 228 +cyr_ie 229 +cyr_zhe 230 +cyr_ze 231 +cyr_i 232 +cyr_short_i 233 +cyr_ka 234 +cyr_el 235 +cyr_em 236 +cyr_en 237 +cyr_o 238 +cyr_pe 239 +cyr_er 240 +cyr_es 241 +cyr_te 242 +cyr_u 243 +cyr_ef 244 +cyr_ha 245 +cyr_tse 246 +cyr_che 247 +cyr_sha 248 +cyr_shcha 249 +cyr_hard_sign 250 +cyr_yeru 251 +cyr_soft_sign 252 +cyr_e 253 +cyr_yu 254 +cyr_ya 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-866.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-866.tbl new file mode 100644 index 00000000..b0451ae9 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-866.tbl @@ -0,0 +1,128 @@ +cyr_A 128 +cyr_BE 129 +cyr_CHE 151 +cyr_DE 132 +cyr_E 157 +cyr_EF 148 +cyr_EL 139 +cyr_EM 140 +cyr_EN 141 +cyr_ER 144 +cyr_ES 145 +cyr_GHE 131 +cyr_HA 149 +cyr_HARD_SIGN 154 +cyr_I 136 +cyr_IE 133 +cyr_KA 138 +cyr_O 142 +cyr_PE 143 +cyr_SHA 152 +cyr_SHCHA 153 +cyr_SHORT_I 137 +cyr_SOFT_SIGN 156 +cyr_TE 146 +cyr_TSE 150 +cyr_U 147 +cyr_VE 130 +cyr_YA 159 +cyr_YERU 155 +cyr_IO 240 +cyr_YU 158 +cyr_ZE 135 +cyr_ZHE 134 +cyr_a 160 +cyr_be 161 +cyr_che 231 +cyr_de 164 +cyr_e 237 +cyr_ef 228 +cyr_el 171 +cyr_em 172 +cyr_en 173 +cyr_er 224 +cyr_es 225 +graphic_100pc 219 +graphic_25pc 178 +graphic_50pc 177 +graphic_75pc 176 +graphic_LD 187 +graphic_LR 205 +graphic_LRD 203 +graphic_LRT 202 +graphic_LRTD 206 +graphic_LRd 209 +graphic_LRt 207 +graphic_LRtd 216 +graphic_LT 188 +graphic_LTD 185 +graphic_Ld 184 +graphic_Lt 190 +graphic_Ltd 181 +graphic_RD 201 +graphic_RT 200 +graphic_RTD 204 +graphic_Rd 213 +graphic_Rt 212 +graphic_Rtd 198 +graphic_TD 186 +copyright 252 +degree 248 +graphic_dintegral 245 +graphic_divide 246 +graphic_equal 247 +graphic_fatdot 249 +graphic_ge 242 +graphic_lD 183 +graphic_lT 189 +graphic_lTD 182 +graphic_ld 191 +graphic_le 243 +graphic_leandot 250 +graphic_lefthalf 221 +graphic_lowerhalf 220 +graphic_lr 196 +graphic_lrD 210 +graphic_lrT 208 +graphic_lrTD 215 +graphic_lrd 194 +graphic_lrt 193 +graphic_lrtd 197 +graphic_lt 217 +graphic_ltd 180 +graphic_power2 253 +graphic_rD 214 +graphic_rT 211 +graphic_rTD 199 +graphic_rd 218 +graphic_righthalf 222 +graphic_root 251 +graphic_rt 192 +graphic_rtd 195 +nbspace 255 +graphic_square 254 +graphic_td 179 +graphic_tintegral 244 +graphic_upperhalf 223 +cyr_ghe 163 +cyr_ha 229 +cyr_hard_sign 234 +cyr_i 168 +cyr_ie 165 +cyr_ka 170 +cyr_o 174 +cyr_pe 175 +cyr_sha 232 +cyr_shcha 233 +cyr_short_i 169 +cyr_soft_sign 236 +cyr_te 226 +cyr_tse 230 +cyr_u 227 +cyr_ve 162 +cyr_ya 239 +cyr_yeru 235 +cyr_io 241 +cyr_yu 238 +cyr_ze 167 +cyr_zhe 166 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/iso8859-5.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/iso8859-5.tbl new file mode 100644 index 00000000..8e60e18f --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/iso8859-5.tbl @@ -0,0 +1,127 @@ +cyr_GHE_UPTURN 128 +cyr_ghe_upturn 129 +quotesinglbase 130 +currency 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +brokenbar 138 +guilsinglleft 139 +copyright 140 +guillemotleft 141 +notsign 142 +registered 143 +degree 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +plusminus 154 +guilsinglright 155 +mu 156 +paragraph 157 +periodcentered 158 +guillemotright 159 +nbspace 160 +cyr_IO 161 +cyr_DJE 162 +cyr_GJE 163 +cyr_UKRAINIAN_IE 164 +cyr_DZE 165 +cyr_BYELORUSSIAN_UKRAINIAN_I 166 +cyr_YI 167 +cyr_JE 168 +cyr_LJE 169 +cyr_NJE 170 +cyr_TSHE 171 +cyr_KJE 172 +hyphen 173 +cyr_SHORT_U 174 +cyr_DZHE 175 +cyr_A 176 +cyr_BE 177 +cyr_VE 178 +cyr_GHE 179 +cyr_DE 180 +cyr_IE 181 +cyr_ZHE 182 +cyr_ZE 183 +cyr_I 184 +cyr_SHORT_I 185 +cyr_KA 186 +cyr_EL 187 +cyr_EM 188 +cyr_EN 189 +cyr_O 190 +cyr_PE 191 +cyr_ER 192 +cyr_ES 193 +cyr_TE 194 +cyr_U 195 +cyr_EF 196 +cyr_HA 197 +cyr_TSE 198 +cyr_CHE 199 +cyr_SHA 200 +cyr_SHCHA 201 +cyr_HARD_SIGN 202 +cyr_YERU 203 +cyr_SOFT_SIGN 204 +cyr_E 205 +cyr_YU 206 +cyr_YA 207 +cyr_a 208 +cyr_be 209 +cyr_ve 210 +cyr_ghe 211 +cyr_de 212 +cyr_ie 213 +cyr_zhe 214 +cyr_ze 215 +cyr_i 216 +cyr_short_i 217 +cyr_ka 218 +cyr_el 219 +cyr_em 220 +cyr_en 221 +cyr_o 222 +cyr_pe 223 +cyr_er 224 +cyr_es 225 +cyr_te 226 +cyr_u 227 +cyr_ef 228 +cyr_ha 229 +cyr_tse 230 +cyr_che 231 +cyr_sha 232 +cyr_shcha 233 +cyr_hard_sign 234 +cyr_yeru 235 +cyr_soft_sign 236 +cyr_e 237 +cyr_yu 238 +cyr_ya 239 +numero 240 +cyr_io 241 +cyr_dje 242 +cyr_gje 243 +cyr_ukrainian_ie 244 +cyr_dze 245 +cyr_byelorussian_ukrainian_i 246 +cyr_yi 247 +cyr_je 248 +cyr_lje 249 +cyr_nje 250 +cyr_tshe 251 +cyr_kje 252 +section 253 +cyr_short_u 254 +cyr_dzhe 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/koi8-r.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/koi8-r.tbl new file mode 100644 index 00000000..e22775a2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/koi8-r.tbl @@ -0,0 +1,128 @@ +cyr_A 225 +cyr_BE 226 +cyr_CHE 254 +cyr_DE 228 +cyr_E 252 +cyr_EF 230 +cyr_EL 236 +cyr_EM 237 +cyr_EN 238 +cyr_ER 242 +cyr_ES 243 +cyr_GHE 231 +cyr_HA 232 +cyr_HARD_SIGN 255 +cyr_I 233 +cyr_IE 229 +cyr_KA 235 +cyr_O 239 +cyr_PE 240 +cyr_SHA 251 +cyr_SHCHA 253 +cyr_SHORT_I 234 +cyr_SOFT_SIGN 248 +cyr_TE 244 +cyr_TSE 227 +cyr_U 245 +cyr_VE 247 +cyr_YA 241 +cyr_YERU 249 +cyr_IO 179 +cyr_YU 224 +cyr_ZE 250 +cyr_ZHE 246 +cyr_a 193 +cyr_be 194 +cyr_che 222 +cyr_de 196 +cyr_e 220 +cyr_ef 198 +cyr_el 204 +cyr_em 205 +cyr_en 206 +cyr_er 210 +cyr_es 211 +graphic_100pc 141 +graphic_25pc 144 +graphic_50pc 145 +graphic_75pc 146 +graphic_LD 168 +graphic_LR 160 +graphic_LRD 184 +graphic_LRT 187 +graphic_LRTD 190 +graphic_LRd 182 +graphic_LRt 185 +graphic_LRtd 188 +graphic_LT 174 +graphic_LTD 181 +graphic_Ld 166 +graphic_Lt 172 +graphic_Ltd 178 +graphic_RD 165 +graphic_RT 171 +graphic_RTD 177 +graphic_Rd 162 +graphic_Rt 170 +graphic_Rtd 175 +graphic_TD 161 +copyright 191 +degree 156 +graphic_dintegral 155 +graphic_divide 159 +graphic_equal 151 +graphic_fatdot 149 +graphic_ge 153 +graphic_lD 167 +graphic_lT 173 +graphic_lTD 180 +graphic_ld 131 +graphic_le 152 +graphic_leandot 158 +graphic_lefthalf 142 +graphic_lowerhalf 140 +graphic_lr 128 +graphic_lrD 183 +graphic_lrT 186 +graphic_lrTD 189 +graphic_lrd 136 +graphic_lrt 137 +graphic_lrtd 138 +graphic_lt 133 +graphic_ltd 135 +graphic_power2 157 +graphic_rD 164 +graphic_rT 169 +graphic_rTD 176 +graphic_rd 130 +graphic_righthalf 143 +graphic_root 150 +graphic_rt 132 +graphic_rtd 134 +nbspace 154 +graphic_square 148 +graphic_td 129 +graphic_tintegral 147 +graphic_upperhalf 139 +cyr_ghe 199 +cyr_ha 200 +cyr_hard_sign 223 +cyr_i 201 +cyr_ie 197 +cyr_ka 203 +cyr_o 207 +cyr_pe 208 +cyr_sha 219 +cyr_shcha 221 +cyr_short_i 202 +cyr_soft_sign 216 +cyr_te 212 +cyr_tse 195 +cyr_u 213 +cyr_ve 215 +cyr_ya 209 +cyr_yeru 217 +cyr_io 163 +cyr_yu 192 +cyr_ze 218 +cyr_zhe 214 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ft.c b/application/third_party/dompdf/lib/ttf2ufm/src/ft.c new file mode 100644 index 00000000..3bbcb896 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ft.c @@ -0,0 +1,649 @@ +/* + * The font parser using the FreeType library version 2. + * + * see COPYRIGHT + * + */ + +#ifdef USE_FREETYPE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pt1.h" +#include "global.h" + +/* prototypes of call entries */ +static void openfont(char *fname, char *arg); +static void closefont( void); +static int getnglyphs ( void); +static int glnames( GLYPH *glyph_list); +static void glmetrics( GLYPH *glyph_list); +static int glenc( GLYPH *glyph_list, int *encoding, int *unimap); +static void fnmetrics( struct font_metrics *fm); +static void glpath( int glyphno, GLYPH *glyph_list); +static void kerning( GLYPH *glyph_list); + +/* globals */ + +/* front-end descriptor */ +struct frontsw freetype_sw = { + /*name*/ "ft", + /*descr*/ "based on the FreeType library", + /*suffix*/ { "ttf", "otf", "pfa", "pfb" }, + /*open*/ openfont, + /*close*/ closefont, + /*nglyphs*/ getnglyphs, + /*glnames*/ glnames, + /*glmetrics*/ glmetrics, + /*glenc*/ glenc, + /*fnmetrics*/ fnmetrics, + /*glpath*/ glpath, + /*kerning*/ kerning, +}; + +/* statics */ + +static FT_Library library; +static FT_Face face; + +static int enc_type, enc_found; + +/* SFNT functions do not seem to be included by default in FT2beta8 */ +#define ENABLE_SFNT + +/* + * Open font and prepare to return information to the main driver. + * May print error and warning messages. + * Exit on error. + */ + +static void +openfont( + char *fname, + char *arg /* unused now */ +) +{ + FT_Error error; + + if( FT_Init_FreeType( &library ) ) { + fprintf(stderr, "** FreeType initialization failed\n"); + exit(1); + } + + if( error = FT_New_Face( library, fname, 0, &face ) ) { + if ( error == FT_Err_Unknown_File_Format ) + fprintf(stderr, "**** %s has format unknown to FreeType\n", fname); + else + fprintf(stderr, "**** Cannot access %s ****\n", fname); + exit(1); + } + + if(FT_HAS_FIXED_SIZES(face)) { + WARNING_1 fprintf(stderr, "Font contains bitmaps\n"); + } + if(FT_HAS_MULTIPLE_MASTERS(face)) { + WARNING_1 fprintf(stderr, "Font contains multiple masters, using default\n"); + } + + if(ISDBG(FT)) fprintf(stderr," %d units per EM\n", face->units_per_EM); + + enc_found = 0; +} + +/* + * Close font. + * Exit on error. + */ + +static void +closefont( + void +) +{ + if( FT_Done_Face(face) ) { + WARNING_1 fprintf(stderr, "Errors when closing the font file, ignored\n"); + } + if( FT_Done_FreeType(library) ) { + WARNING_1 fprintf(stderr, "Errors when stopping FreeType, ignored\n"); + } +} + +/* + * Get the number of glyphs in font. + */ + +static int +getnglyphs ( + void +) +{ + if(ISDBG(FT)) fprintf(stderr, "%d glyphs in font\n", face->num_glyphs); + return (int)face->num_glyphs; +} + +/* + * Get the names of the glyphs. + * Returns 0 if the names were assigned, non-zero if the font + * provides no glyph names. + */ + +static int +glnames( + GLYPH *glyph_list +) +{ +#define MAX_NAMELEN 1024 + unsigned char bf[1024]; + int i; + + if( ! FT_HAS_GLYPH_NAMES(face) ) { + WARNING_1 fprintf(stderr, "Font has no glyph names\n"); + return 1; + } + + for(i=0; i < face->num_glyphs; i++) { + if( FT_Get_Glyph_Name(face, i, bf, MAX_NAMELEN) || bf[0]==0 ) { + sprintf(bf, "_g_%d", i); + WARNING_2 fprintf(stderr, + "Glyph No. %d has no postscript name, becomes %s\n", i, bf); + } + glyph_list[i].name = strdup(bf); + if(ISDBG(FT)) fprintf(stderr, "%d has name %s\n", i, bf); + if (glyph_list[i].name == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + } + return 0; +} + +/* + * Get the metrics of the glyphs. + */ + +static void +glmetrics( + GLYPH *glyph_list +) +{ + GLYPH *g; + int i; + FT_Glyph_Metrics *met; + FT_BBox bbox; + FT_Glyph gly; + FT_ULong charcode; + FT_UInt index; + + for(i=0; i < face->num_glyphs; i++) { + g = &(glyph_list[i]); + + if( FT_Load_Glyph(face, i, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE) ) { + fprintf(stderr, "Can't load glyph %s, skipped\n", g->name); + continue; + } + + met = &face->glyph->metrics; + + if(FT_HAS_HORIZONTAL(face)) { + g->width = met->horiAdvance; + g->lsb = met->horiBearingX; + } else { + WARNING_2 fprintf(stderr, "Glyph %s has no horizontal metrics, guessed them\n", g->name); + g->width = met->width; + g->lsb = 0; + } + + if( FT_Get_Glyph(face->glyph, &gly) ) { + fprintf(stderr, "Can't access glyph %s bbox, skipped\n", g->name); + continue; + } + + FT_Glyph_Get_CBox(gly, ft_glyph_bbox_unscaled, &bbox); + g->xMin = bbox.xMin; + g->yMin = bbox.yMin; + g->xMax = bbox.xMax; + g->yMax = bbox.yMax; + + g->ttf_pathlen = face->glyph->outline.n_points; + + } + + charcode = FT_Get_First_Char(face, &index); + while ( index != 0 ) { + if ( index >= face->num_glyphs ) { + break; + } + for ( i = 0; i < GLYPH_MAX_ENCODINGS; i++ ) { + if ( glyph_list[index].orig_code[i] == -1 ) + break; + } + + if ( i == GLYPH_MAX_ENCODINGS ) { + if (strcmp(glyph_list[index].name, ".notdef") != 0) { + WARNING_2 fprintf(stderr, + "Glyph %s has >= %d encodings (A), %4.4x & %4.4x\n", + GLYPH_MAX_ENCODINGS, + glyph_list[index].name, + glyph_list[index].orig_code[i], + charcode); + } + } else { + glyph_list[index].orig_code[i] = charcode; + } + + charcode = FT_Get_Next_Char(face, charcode, &index); + } +} + +/* + * Get the original encoding of the font. + * Returns 1 for if the original encoding is Unicode, 2 if the + * original encoding is other 16-bit, 0 if 8-bit. + */ + +static int +glenc( + GLYPH *glyph_list, + int *encoding, + int *unimap +) +{ + int i, e; + unsigned code, index; + + if(ISDBG(FT)) + for(e=0; e < face->num_charmaps; e++) { + fprintf(stderr, "found encoding pid=%d eid=%d\n", + face->charmaps[e]->platform_id, + face->charmaps[e]->encoding_id); + } + + if(enc_found) + goto populate_map; + + enc_type = 0; + + /* first check for an explicit PID/EID */ + + if(force_pid != -1) { + for(e=0; e < face->num_charmaps; e++) { + if(face->charmaps[e]->platform_id == force_pid + && face->charmaps[e]->encoding_id == force_eid) { + WARNING_1 fprintf(stderr, "Found Encoding PID=%d/EID=%d\n", + force_pid, force_eid); + if( !face->charmaps || FT_Set_Charmap(face, face->charmaps[e]) ) { + fprintf(stderr, "**** Cannot set charmap in FreeType ****\n"); + exit(1); + } + enc_type = 1; + goto populate_map; + } + } + fprintf(stderr, "*** TTF encoding table PID=%d/EID=%d not found\n", + force_pid, force_eid); + exit(1); + } + + /* next check for a direct Adobe mapping */ + + if(!forcemap) { + for(e=0; e < face->num_charmaps; e++) { + if(face->charmaps[e]->encoding == ft_encoding_adobe_custom) { + WARNING_1 fputs("Found Adobe Custom Encoding\n", stderr); + if( FT_Set_Charmap(face, face->charmaps[e]) ) { + fprintf(stderr, "**** Cannot set charmap in FreeType ****\n"); + exit(1); + } + goto populate_map; + } + } + } + + for(e=0; e < face->num_charmaps; e++) { + if(face->charmaps[e]->platform_id == 3) { + switch(face->charmaps[e]->encoding_id) { + case 0: + WARNING_1 fputs("Found Symbol Encoding\n", stderr); + break; + case 1: + WARNING_1 fputs("Found Unicode Encoding\n", stderr); + enc_type = 1; + break; + default: + WARNING_1 { + fprintf(stderr, + "****MS Encoding ID %d not supported****\n", + face->charmaps[e]->encoding_id); + fputs("Treating it like Symbol encoding\n", stderr); + } + break; + } + break; + } + } + if(e >= face->num_charmaps) { + WARNING_1 fputs("No Microsoft encoding, using first encoding available\n", stderr); + e = 0; + } + + if( FT_Set_Charmap(face, face->charmaps[e]) ) { + fprintf(stderr, "**** Cannot set charmap in FreeType ****\n"); + exit(1); + } + +populate_map: + enc_found = 1; + + for(i=0; iitalic_angle = 0.0; /* FreeType hides the angle */ + fm->underline_position = face->underline_position; + fm->underline_thickness = face->underline_thickness; + fm->is_fixed_pitch = FT_IS_FIXED_WIDTH(face); + + fm->ascender = face->ascender; + fm->descender = face->descender; + + fm->units_per_em = face->units_per_EM; + + fm->bbox[0] = face->bbox.xMin; + fm->bbox[1] = face->bbox.yMin; + fm->bbox[2] = face->bbox.xMax; + fm->bbox[3] = face->bbox.yMax; + +#ifdef ENABLE_SFNT + if( FT_Get_Sfnt_Name(face, TT_NAME_ID_COPYRIGHT, &sn) ) +#endif /* ENABLE_SFNT */ + fm->name_copyright = ""; +#ifdef ENABLE_SFNT + else + fm->name_copyright = dupcnstring(sn.string, sn.string_len); +#endif /* ENABLE_SFNT */ + + fm->name_family = face->family_name; + + fm->name_style = face->style_name; + if(fm->name_style == NULL) + fm->name_style = ""; + +#ifdef ENABLE_SFNT + if( FT_Get_Sfnt_Name(face, TT_NAME_ID_FULL_NAME, &sn) ) +#endif /* ENABLE_SFNT */ + { + int len; + + len = strlen(fm->name_family) + strlen(fm->name_style) + 2; + if(( fm->name_full = malloc(len) )==NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + strcpy(fm->name_full, fm->name_family); + if(strlen(fm->name_style) != 0) { + strcat(fm->name_full, " "); + strcat(fm->name_full, fm->name_style); + } + } +#ifdef ENABLE_SFNT + else + fm->name_full = dupcnstring(sn.string, sn.string_len); +#endif /* ENABLE_SFNT */ + +#ifdef ENABLE_SFNT + if( FT_Get_Sfnt_Name(face, TT_NAME_ID_VERSION_STRING, &sn) ) +#endif /* ENABLE_SFNT */ + fm->name_version = "1.0"; +#ifdef ENABLE_SFNT + else + fm->name_version = dupcnstring(sn.string, sn.string_len); +#endif /* ENABLE_SFNT */ + +#ifdef ENABLE_SFNT + if( FT_Get_Sfnt_Name(face, TT_NAME_ID_PS_NAME , &sn) ) { +#endif /* ENABLE_SFNT */ + if(( fm->name_ps = strdup(fm->name_full) )==NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } +#ifdef ENABLE_SFNT + } else + fm->name_ps = dupcnstring(sn.string, sn.string_len); +#endif /* ENABLE_SFNT */ + for(i=0; fm->name_ps[i]!=0; i++) + if(fm->name_ps[i] == ' ') + fm->name_ps[i] = '_'; /* no spaces in the Postscript name *m + + /* guess the boldness from the font names */ + fm->force_bold=0; + + fieldstocheck[0] = fm->name_style; + fieldstocheck[1] = fm->name_full; + fieldstocheck[2] = fm->name_ps; + + for(i=0; !fm->force_bold && i= len || !islower(str[j+4])) + ) { + fm->force_bold=1; + break; + } + } + } +} + +/* + * Functions to decompose the outlines + */ + +static GLYPH *curg; +static double lastx, lasty; + +static int +outl_moveto( + FT_Vector *to, + void *unused +) +{ + double tox, toy; + + tox = fscale((double)to->x); toy = fscale((double)to->y); + + /* FreeType does not do explicit closepath() */ + if(curg->lastentry) { + g_closepath(curg); + } + fg_rmoveto(curg, tox, toy); + lastx = tox; lasty = toy; + + return 0; +} + +static int +outl_lineto( + FT_Vector *to, + void *unused +) +{ + double tox, toy; + + tox = fscale((double)to->x); toy = fscale((double)to->y); + + fg_rlineto(curg, tox, toy); + lastx = tox; lasty = toy; + + return 0; +} + +static int +outl_conicto( + FT_Vector *control1, + FT_Vector *to, + void *unused +) +{ + double c1x, c1y, tox, toy; + + c1x = fscale((double)control1->x); c1y = fscale((double)control1->y); + tox = fscale((double)to->x); toy = fscale((double)to->y); + + fg_rrcurveto(curg, + (lastx + 2.0 * c1x) / 3.0, (lasty + 2.0 * c1y) / 3.0, + (2.0 * c1x + tox) / 3.0, (2.0 * c1y + toy) / 3.0, + tox, toy ); + lastx = tox; lasty = toy; + + return 0; +} + +static int +outl_cubicto( + FT_Vector *control1, + FT_Vector *control2, + FT_Vector *to, + void *unused +) +{ + double c1x, c1y, c2x, c2y, tox, toy; + + c1x = fscale((double)control1->x); c1y = fscale((double)control1->y); + c2x = fscale((double)control2->x); c2y = fscale((double)control2->y); + tox = fscale((double)to->x); toy = fscale((double)to->y); + + fg_rrcurveto(curg, c1x, c1y, c2x, c2y, tox, toy); + lastx = tox; lasty = toy; + + return 0; +} + +static FT_Outline_Funcs ft_outl_funcs = { + outl_moveto, + outl_lineto, + outl_conicto, + outl_cubicto, + 0, + 0 +}; + +/* + * Get the path of contrours for a glyph. + */ + +static void +glpath( + int glyphno, + GLYPH *glyf_list +) +{ + FT_Outline *ol; + + curg = &glyf_list[glyphno]; + + if( FT_Load_Glyph(face, glyphno, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE|FT_LOAD_NO_HINTING) + || face->glyph->format != ft_glyph_format_outline ) { + fprintf(stderr, "Can't load glyph %s, skipped\n", curg->name); + return; + } + + ol = &face->glyph->outline; + lastx = 0.0; lasty = 0.0; + + if( FT_Outline_Decompose(ol, &ft_outl_funcs, NULL) ) { + fprintf(stderr, "Can't decompose outline of glyph %s, skipped\n", curg->name); + return; + } + + /* FreeType does not do explicit closepath() */ + if(curg->lastentry) { + g_closepath(curg); + } + + if(ol->flags & ft_outline_reverse_fill) { + assertpath(curg->entries, __FILE__, __LINE__, curg->name); + reversepaths(curg); + } +} + +/* + * Get the kerning data. + */ + +static void +kerning( + GLYPH *glyph_list +) +{ + int i, j, n; + int nglyphs = face->num_glyphs; + FT_Vector k; + GLYPH *gl; + + if( nglyphs == 0 || !FT_HAS_KERNING(face) ) { + WARNING_1 fputs("No Kerning data\n", stderr); + return; + } + + for(i=0; i= 1) +#define WARNING_2 if(warnlevel >= 2) +#define WARNING_3 if(warnlevel >= 3) +#define WARNING_4 if(warnlevel >= 4) + +/* + * Bitmap control macros + */ + +#define BITMAP_BYTES(size) (((size)+7)>>3) +#define DEF_BITMAP(name, size) unsigned char name[BITMAP_BYTES(size)] +#define SET_BITMAP(name, bit) ( name[(bit)>>3] |= (1<<((bit)&7)) ) +#define CLR_BITMAP(name, bit) ( name[(bit)>>3] &= ~(1<<((bit)&7)) ) +#define IS_BITMAP(name, bit) ( name[(bit)>>3] & (1<<((bit)&7)) ) + +/* debugging */ + +/* debug flags */ +#define DEBUG_UNICODE 0x00000001 /* unicode to 8-bit code conversion */ +#define DEBUG_MAINSTEMS 0x00000002 /* glyph-wide main stem generation */ +#define DEBUG_SUBSTEMS 0x00000004 /* substituted stem generation */ +#define DEBUG_STEMS (DEBUG_MAINSTEMS|DEBUG_SUBSTEMS) +#define DEBUG_REVERSAL 0x00000008 /* reversal of the paths */ +#define DEBUG_FIXCVDIR 0x00000010 /* fixcvdir() */ +#define DEBUG_STEMOVERLAP 0x00000020 /* stemoverlap() */ +#define DEBUG_BLUESTEMS 0x00000040 /* markbluestems() */ +#define DEBUG_STRAIGHTEN 0x00000080 /* markbluestems() */ +#define DEBUG_EXTMAP 0x00000100 /* parsing of external map */ +#define DEBUG_TOINT 0x00000200 /* conversion of path to integer */ +#define DEBUG_BUILDG 0x00000400 /* building of glyph path */ +#define DEBUG_QUAD 0x00000800 /* splitting curves by quadrants */ +#define DEBUG_SQEQ 0x00001000 /* square equation solver */ +#define DEBUG_COMPOSITE 0x00002000 /* handling of composite glyphs */ +#define DEBUG_FCONCISE 0x00004000 /* normalization of curves */ +#define DEBUG_FT 0x00008000 /* FreeType front-end */ +#define DEBUG_BITMAP 0x00010000 /* conversion from bitmap */ +#define DEBUG_DISABLED 0x80000000 /* special flag: temporary disable debugging */ + +/* at what we want to look now */ +#ifndef DEBUG +# define DEBUG (0) +#endif + +/* uncomment the next line if debugging data is wanted for one glyph only */ +/* #define DBG_GLYPH "C118" /* */ + +#if DEBUG==0 +# define ISDBG(name) (0) +# define ENABLEDBG(condition) (0) +# define DISABLEDBG(condition) (0) +#else + extern int debug; /* collection of the flags */ +/* this ISDBG will only work on ANSI C, not K&R */ +# define ISDBG(name) ( (debug & DEBUG_DISABLED) ? 0 : (debug & (DEBUG_##name)) ) +# define ENABLEDBG(condition) ( (condition) ? (debug&=~DEBUG_DISABLED) : 0 ) +# define DISABLEDBG(condition) ( (condition) ? (debug|=DEBUG_DISABLED) : 0 ) +#endif + +#ifdef DBG_GLYPH +# define DBG_TO_GLYPH(g) DISABLEDBG( strcmp( (g)->name, DBG_GLYPH ) ) +# define DBG_FROM_GLYPH(g) ENABLEDBG(1) +#else +# define DBG_TO_GLYPH(g) (0) +# define DBG_FROM_GLYPH(g) (0) +#endif + +/* prototypes */ +int iscale( int val); +double fscale( double val); +int unicode_rev_lookup( int unival); +void bmp_outline( GLYPH *g, int scale, char *bmap, + int xsz, int ysz, int xoff, int yoff); +int isign( int x); +int fsign( double x); +char *dupcnstring( unsigned char *s, int len); + +/* global metrics for a font */ + +struct font_metrics { + /* post */ + double italic_angle; + short underline_position; + short underline_thickness; + short is_fixed_pitch; + + /* hhea */ + short ascender; + short descender; + + /* head */ + unsigned short units_per_em; + short bbox[4]; + + /* name */ + char *name_copyright; + char *name_family; + char *name_style; + char *name_full; + char *name_version; + char *name_ps; + + /* other */ + int force_bold; +}; + +/* size of the encoding table - glyphs beyond 255 are actually unnumbered */ + +#define ENCTABSZ 1024 + +/* switch table structure for front-ends */ + +#define MAXSUFFIX 10 + +struct frontsw { + char *name; /* name of the front end */ + char *descr; /* description of the front end */ + char *suffix[MAXSUFFIX]; /* possible file name suffixes */ + + void (*open)(char *fname, char *arg); /* open font file */ + void (*close)(void); /* close font file */ + int (*nglyphs)(void); /* get the number of glyphs */ + int (*glnames)(GLYPH *glyphs); /* get the names of glyphs */ + void (*glmetrics)(GLYPH *glyphs); /* get the metrics of glyphs */ + int (*glenc)(GLYPH *glyphs, int *enc, int *unimap); /* get the encoding */ + void (*fnmetrics)(struct font_metrics *fm); /* get the font metrics */ + void (*glpath)(int glyphno, GLYPH *glyphs); /* get the glyph path */ + void (*kerning)(GLYPH *glyph_list); /* extract the kerning data */ +}; diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1250.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1250.map new file mode 100644 index 00000000..34596a94 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1250.map @@ -0,0 +1,254 @@ +// CP1250 code encoding table with glyph renaming +// Petr Titera P.Titera@sh.cvut.cz + +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quote +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D minus +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC .notdef +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+015A Sacute +!8D U+0164 Tcaron +!8E U+017D Zcaron +!8F U+0179 Zacute +!91 U+2018 quotesinglleft +!92 U+2019 quotesinglright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+015B sacute +!9D U+0165 tcaron +!9E U+017E zcaron +!9F U+017A zacute +!A0 U+00A0 nbspace +!A1 U+02C7 caron +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+0104 Aogonek +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+015E Scedilla +!AB U+00AB guillemotleft +!AC U+00AC notsign +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+2219 periodcentered +!B8 U+00B8 cedilla +!B9 U+0105 aogonek +!BA U+015F scedilla +!BB U+00BB guillemotright +!BC U+013D Lcaron +!BD U+02DD hungarumlaut +!BE U+013E lcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+00D0 Eth +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcedilla +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 eth +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcedilla +!FF U+02D9 dotaccent diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1251.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1251.map new file mode 100644 index 00000000..3fd854d9 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1251.map @@ -0,0 +1,245 @@ +// CP1251 encoding table +// Zvezdan Petkovic + +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quote +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D minus +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0402 cyr_DJE +!81 U+0403 cyr_GJE +!82 U+201A quotesinglbase +!83 U+0453 cyr_gje +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+20AC Euro +!89 U+2030 perthousand +!8A U+0409 cyr_LJE +!8B U+2039 guilsinglleft +!8C U+040A cyr_NJE +!8D U+040C cyr_KJE +!8E U+040B cyr_TSHE +!8F U+040F cyr_DZHE +!90 U+0452 cyr_dje +!91 U+2018 quotesinglleft +!92 U+2019 quotesinglright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0459 cyr_lje +!9B U+203A guilsinglright +!9C U+045A cyr_nje +!9D U+045C cyr_kje +!9E U+045B cyr_tshe +!9F U+045F cyr_dzhe +!A0 U+00A0 nbspace +!A1 U+040E cyr_SHORT_U +!A2 U+045E cyr_short_u +!A3 U+0408 cyr_JE +!A4 U+00A4 currency +!A5 U+0490 cyr_GHE_UPTURN +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+0401 cyr_IO +!A9 U+00A9 copyright +!AA U+0404 cyr_UKRAINIAN_IE +!AB U+00AB guillemotleft +!AC U+00AC notsign +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+0407 cyr_YI +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+0406 cyr_BYELORUSSIAN_UKRAINIAN_I +!B3 U+0456 cyr_byelorussian_ukrainian_i +!B4 U+0491 cyr_ghe_upturn +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0451 cyr_io +!B9 U+2116 numero +!BA U+0454 cyr_ukrainian_ie +!BB U+00BB guillemotright +!BC U+0458 cyr_je +!BD U+0405 cyr_DZE +!BE U+0455 cyr_dze +!BF U+0457 cyr_yi +!C0 U+0410 cyr_A +!C1 U+0411 cyr_BE +!C2 U+0412 cyr_VE +!C3 U+0413 cyr_GHE +!C4 U+0414 cyr_DE +!C5 U+0415 cyr_IE +!C6 U+0416 cyr_ZHE +!C7 U+0417 cyr_ZE +!C8 U+0418 cyr_I +!C9 U+0419 cyr_SHORT_I +!CA U+041A cyr_KA +!CB U+041B cyr_EL +!CC U+041C cyr_EM +!CD U+041D cyr_EN +!CE U+041E cyr_O +!CF U+041F cyr_PE +!D0 U+0420 cyr_ER +!D1 U+0421 cyr_ES +!D2 U+0422 cyr_TE +!D3 U+0423 cyr_U +!D4 U+0424 cyr_EF +!D5 U+0425 cyr_HA +!D6 U+0426 cyr_TSE +!D7 U+0427 cyr_CHE +!D8 U+0428 cyr_SHA +!D9 U+0429 cyr_SHCHA +!DA U+042A cyr_HARD_SIGN +!DB U+042B cyr_YERU +!DC U+042C cyr_SOFT_SIGN +!DD U+042D cyr_E +!DE U+042E cyr_YU +!DF U+042F cyr_YA +!E0 U+0430 cyr_a +!E1 U+0431 cyr_be +!E2 U+0432 cyr_ve +!E3 U+0433 cyr_ghe +!E4 U+0434 cyr_de +!E5 U+0435 cyr_ie +!E6 U+0436 cyr_zhe +!E7 U+0437 cyr_ze +!E8 U+0438 cyr_i +!E9 U+0439 cyr_short_i +!EA U+043A cyr_ka +!EB U+043B cyr_el +!EC U+043C cyr_em +!ED U+043D cyr_en +!EE U+043E cyr_o +!EF U+043F cyr_pe +!F0 U+0440 cyr_er +!F1 U+0441 cyr_es +!F2 U+0442 cyr_te +!F3 U+0443 cyr_u +!F4 U+0444 cyr_ef +!F5 U+0445 cyr_ha +!F6 U+0446 cyr_tse +!F7 U+0447 cyr_che +!F8 U+0448 cyr_sha +!F9 U+0449 cyr_shcha +!FA U+044A cyr_hard_sign +!FB U+044B cyr_yeru +!FC U+044C cyr_soft_sign +!FD U+044D cyr_e +!FE U+044E cyr_yu +!FF U+044F cyr_ya diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/T2A_compact.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/T2A_compact.map new file mode 100644 index 00000000..c329b64a --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/T2A_compact.map @@ -0,0 +1,111 @@ +// Map file to make PFA/PFB files with T2A encoding +// from TTF using ttf2pt1 package. See package documentation for details. +// The encoding is incomplete but some (many) glyphs do not exist in TTF. +// Mikhail Umorin mikeumo@obebox.com +//start at 0 +0x0060 +0x00B4 +0x02C6 +0x02DC +0x00A8 +0x02DD +0x02DA +0x02C7 +0x02D8 +0x00AF +0x02D9 +// at 0x000B (11) +// will set more later +0x00B8 +0x02DB +0x0130 +0x2039 +0x203A +0x201C +0x201D +0x0000 +0x0000 +0x0000 +0x2013 +0x2014 +0x0000 +0x0000 +0x0131 +0x0000 +0x0000 +0x0000 +0x0000 +0x0000 +0x0000 +// at 0x0020 (32) +0x0020-0x005F +// at 0x0060 (96) +0x2018 +// at 0x0061 (97) +0x0061-0x007E +0x00AD +//this ends the lower half of the table: 0x007F (127) +// at 0x008F +0x0490 +0x0000 +0x040B +0x0402 +0x0000 +0x0000 +0x0000 +0x0409 +0x0407 +0x0000 +0x0000 +0x0000 +0x00C6 +0x0000 +0x0000 +0x0405 +0x0000 +0x00C7 +0x040E +0x0000 +0x0000 +0x0000 +0x040F +0x0000 +0x0000 +0x0404 +0x0000 +// at 155 +0x040A, 0x0401, 0x2116, 0x00A4, 0x00A7 +// at A0 (160) +0x0491 +0x0000 +0x045B +0x0452 +0x0000 +0x0000 +0x0000 +0x0459 +0x0457 +0x0000 +0x0000 +0x0000 +0x00E6 +0x0000 +0x0000 +0x0455 +0x0000 +0x00E7 +0x045E +0x0000 +0x0000 +0x0000 +0x045F +0x0000 +0x0000 +0x0454 +0x0000 +// at 187 +0x045A, 0x0451, 0x201E, 0x00AB, 0x00BB +// at 192 +0x0410-0x044F +// this concludes the upper half of the table + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/adobe-standard-encoding.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/adobe-standard-encoding.map new file mode 100644 index 00000000..230d4a1e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/adobe-standard-encoding.map @@ -0,0 +1,231 @@ +// Adobe Standard Encoding table for ttf2pt1 +// Thomas Henlich + +=20 U+0020 SPACE +=21 U+0021 EXCLAMATION MARK +=22 U+0022 QUOTATION MARK +=23 U+0023 NUMBER SIGN +=24 U+0024 DOLLAR SIGN +=25 U+0025 PERCENT SIGN +=26 U+0026 AMPERSAND +=27 U+2019 RIGHT SINGLE QUOTATION MARK +=28 U+0028 LEFT PARENTHESIS +=29 U+0029 RIGHT PARENTHESIS +=2A U+002A ASTERISK +=2B U+002B PLUS SIGN +=2C U+002C COMMA +=2D U+002D HYPHEN-MINUS +=2E U+002E FULL STOP +=2F U+002F SOLIDUS +=30 U+0030 DIGIT ZERO +=31 U+0031 DIGIT ONE +=32 U+0032 DIGIT TWO +=33 U+0033 DIGIT THREE +=34 U+0034 DIGIT FOUR +=35 U+0035 DIGIT FIVE +=36 U+0036 DIGIT SIX +=37 U+0037 DIGIT SEVEN +=38 U+0038 DIGIT EIGHT +=39 U+0039 DIGIT NINE +=3A U+003A COLON +=3B U+003B SEMICOLON +=3C U+003C LESS-THAN SIGN +=3D U+003D EQUALS SIGN +=3E U+003E GREATER-THAN SIGN +=3F U+003F QUESTION MARK +=40 U+0040 COMMERCIAL AT +=41 U+0041 LATIN CAPITAL LETTER A +=42 U+0042 LATIN CAPITAL LETTER B +=43 U+0043 LATIN CAPITAL LETTER C +=44 U+0044 LATIN CAPITAL LETTER D +=45 U+0045 LATIN CAPITAL LETTER E +=46 U+0046 LATIN CAPITAL LETTER F +=47 U+0047 LATIN CAPITAL LETTER G +=48 U+0048 LATIN CAPITAL LETTER H +=49 U+0049 LATIN CAPITAL LETTER I +=4A U+004A LATIN CAPITAL LETTER J +=4B U+004B LATIN CAPITAL LETTER K +=4C U+004C LATIN CAPITAL LETTER L +=4D U+004D LATIN CAPITAL LETTER M +=4E U+004E LATIN CAPITAL LETTER N +=4F U+004F LATIN CAPITAL LETTER O +=50 U+0050 LATIN CAPITAL LETTER P +=51 U+0051 LATIN CAPITAL LETTER Q +=52 U+0052 LATIN CAPITAL LETTER R +=53 U+0053 LATIN CAPITAL LETTER S +=54 U+0054 LATIN CAPITAL LETTER T +=55 U+0055 LATIN CAPITAL LETTER U +=56 U+0056 LATIN CAPITAL LETTER V +=57 U+0057 LATIN CAPITAL LETTER W +=58 U+0058 LATIN CAPITAL LETTER X +=59 U+0059 LATIN CAPITAL LETTER Y +=5A U+005A LATIN CAPITAL LETTER Z +=5B U+005B LEFT SQUARE BRACKET +=5C U+005C REVERSE SOLIDUS +=5D U+005D RIGHT SQUARE BRACKET +=5E U+005E CIRCUMFLEX ACCENT +=5F U+005F LOW LINE +=60 U+2018 LEFT SINGLE QUOTATION MARK +=61 U+0061 LATIN SMALL LETTER A +=62 U+0062 LATIN SMALL LETTER B +=63 U+0063 LATIN SMALL LETTER C +=64 U+0064 LATIN SMALL LETTER D +=65 U+0065 LATIN SMALL LETTER E +=66 U+0066 LATIN SMALL LETTER F +=67 U+0067 LATIN SMALL LETTER G +=68 U+0068 LATIN SMALL LETTER H +=69 U+0069 LATIN SMALL LETTER I +=6A U+006A LATIN SMALL LETTER J +=6B U+006B LATIN SMALL LETTER K +=6C U+006C LATIN SMALL LETTER L +=6D U+006D LATIN SMALL LETTER M +=6E U+006E LATIN SMALL LETTER N +=6F U+006F LATIN SMALL LETTER O +=70 U+0070 LATIN SMALL LETTER P +=71 U+0071 LATIN SMALL LETTER Q +=72 U+0072 LATIN SMALL LETTER R +=73 U+0073 LATIN SMALL LETTER S +=74 U+0074 LATIN SMALL LETTER T +=75 U+0075 LATIN SMALL LETTER U +=76 U+0076 LATIN SMALL LETTER V +=77 U+0077 LATIN SMALL LETTER W +=78 U+0078 LATIN SMALL LETTER X +=79 U+0079 LATIN SMALL LETTER Y +=7A U+007A LATIN SMALL LETTER Z +=7B U+007B LEFT CURLY BRACKET +=7C U+007C VERTICAL LINE +=7D U+007D RIGHT CURLY BRACKET +=7E U+007E TILDE +=A1 U+00A1 INVERTED EXCLAMATION MARK +=A2 U+00A2 CENT SIGN +=A3 U+00A3 POUND SIGN +=A4 U+2044 FRACTION SLASH +=A5 U+00A5 YEN SIGN +=A6 U+0192 LATIN SMALL LETTER F WITH HOOK +=A7 U+00A7 SECTION SIGN +=A8 U+00A4 CURRENCY SIGN +=A9 U+0027 APOSTROPHE +=AA U+201C LEFT DOUBLE QUOTATION MARK +=AB U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +=AC U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK +=AD U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +=AE U+FB01 LATIN SMALL LIGATURE FI +=AF U+FB02 LATIN SMALL LIGATURE FL +=B1 U+2013 EN DASH +=B2 U+2020 DAGGER +=B3 U+2021 DOUBLE DAGGER +=B4 U+00B7 MIDDLE DOT +=B6 U+00B6 PILCROW SIGN +=B7 U+2022 BULLET +=B8 U+201A SINGLE LOW-9 QUOTATION MARK +=B9 U+201E DOUBLE LOW-9 QUOTATION MARK +=BA U+201D RIGHT DOUBLE QUOTATION MARK +=BB U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +=BC U+2026 HORIZONTAL ELLIPSIS +=BD U+2030 PER MILLE SIGN +=BF U+00BF INVERTED QUESTION MARK +=C1 U+0060 GRAVE ACCENT +=C2 U+00B4 ACUTE ACCENT +=C3 U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT +=C4 U+02DC SMALL TILDE +=C5 U+00AF MACRON +=C6 U+02D8 BREVE +=C7 U+02D9 DOT ABOVE +=C8 U+00A8 DIAERESIS +=CA U+02DA RING ABOVE +=CB U+00B8 CEDILLA +=CD U+02DD DOUBLE ACUTE ACCENT +=CE U+02DB OGONEK +=CF U+02C7 CARON +=D0 U+2014 EM DASH +=E1 U+00C6 LATIN CAPITAL LETTER AE +=E3 U+00AA FEMININE ORDINAL INDICATOR +=E8 U+0141 LATIN CAPITAL LETTER L WITH STROKE +=E9 U+00D8 LATIN CAPITAL LETTER O WITH STROKE +=EA U+0152 LATIN CAPITAL LIGATURE OE +=EB U+00BA MASCULINE ORDINAL INDICATOR +=F1 U+00E6 LATIN SMALL LETTER AE +=F5 U+0131 LATIN SMALL LETTER DOTLESS I +=F8 U+0142 LATIN SMALL LETTER L WITH STROKE +=F9 U+00F8 LATIN SMALL LETTER O WITH STROKE +=FA U+0153 LATIN SMALL LIGATURE OE +=FB U+00DF LATIN SMALL LETTER SHARP S + +// unencoded characters: +=100 U+00E7 LATIN SMALL LETTER C WITH CEDILLA +=101 U+00FF LATIN SMALL LETTER Y WITH DIAERESIS +=102 U+00E3 LATIN SMALL LETTER A WITH TILDE +=103 U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX +=104 U+00B3 SUPERSCRIPT THREE +=105 U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX +=106 U+00FE LATIN SMALL LETTER THORN +=107 U+00E8 LATIN SMALL LETTER E WITH GRAVE +=108 U+00B2 SUPERSCRIPT TWO +=109 U+00E9 LATIN SMALL LETTER E WITH ACUTE +=10A U+00F5 LATIN SMALL LETTER O WITH TILDE +=10B U+00C1 LATIN CAPITAL LETTER A WITH ACUTE +=10C U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX +=10D U+00FD LATIN SMALL LETTER Y WITH ACUTE +=10E U+00FC LATIN SMALL LETTER U WITH DIAERESIS +=10F U+00BE VULGAR FRACTION THREE QUARTERS +=110 U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX +=111 U+00D0 LATIN CAPITAL LETTER ETH +=112 U+00EB LATIN SMALL LETTER E WITH DIAERESIS +=113 U+00F9 LATIN SMALL LETTER U WITH GRAVE +=114 U+2122 TRADE MARK SIGN +=115 U+00F2 LATIN SMALL LETTER O WITH GRAVE +=116 U+0161 LATIN SMALL LETTER S WITH CARON +=117 U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS +=118 U+00FA LATIN SMALL LETTER U WITH ACUTE +=119 U+00E0 LATIN SMALL LETTER A WITH GRAVE +=11A U+00F1 LATIN SMALL LETTER N WITH TILDE +=11B U+00E5 LATIN SMALL LETTER A WITH RING ABOVE +=11C U+017E LATIN SMALL LETTER Z WITH CARON +=11D U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX +=11E U+00D1 LATIN CAPITAL LETTER N WITH TILDE +=11F U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX +=120 U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX +=121 U+00CD LATIN CAPITAL LETTER I WITH ACUTE +=122 U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA +=123 U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS +=124 U+0160 LATIN CAPITAL LETTER S WITH CARON +=125 U+00CC LATIN CAPITAL LETTER I WITH GRAVE +=126 U+00E4 LATIN SMALL LETTER A WITH DIAERESIS +=127 U+00D2 LATIN CAPITAL LETTER O WITH GRAVE +=128 U+00C8 LATIN CAPITAL LETTER E WITH GRAVE +=129 U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +=12A U+00AE REGISTERED SIGN +=12B U+00D5 LATIN CAPITAL LETTER O WITH TILDE +=12C U+00BC VULGAR FRACTION ONE QUARTER +=12D U+00D9 LATIN CAPITAL LETTER U WITH GRAVE +=12E U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX +=12F U+00DE LATIN CAPITAL LETTER THORN +=130 U+00F7 DIVISION SIGN +=131 U+00C3 LATIN CAPITAL LETTER A WITH TILDE +=132 U+00DA LATIN CAPITAL LETTER U WITH ACUTE +=133 U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +=134 U+00AC NOT SIGN +=135 U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE +=136 U+00EF LATIN SMALL LETTER I WITH DIAERESIS +=137 U+00ED LATIN SMALL LETTER I WITH ACUTE +=138 U+00E1 LATIN SMALL LETTER A WITH ACUTE +=139 U+00B1 PLUS-MINUS SIGN +=13A U+00D7 MULTIPLICATION SIGN +=13B U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS +=13C U+2212 MINUS SIGN +=13D U+00B9 SUPERSCRIPT ONE +=13E U+00C9 LATIN CAPITAL LETTER E WITH ACUTE +=13F U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +=140 U+00A9 COPYRIGHT SIGN +=141 U+00C0 LATIN CAPITAL LETTER A WITH GRAVE +=142 U+00F6 LATIN SMALL LETTER O WITH DIAERESIS +=143 U+00F3 LATIN SMALL LETTER O WITH ACUTE +=144 U+00B0 DEGREE SIGN +=145 U+00EC LATIN SMALL LETTER I WITH GRAVE +=146 U+00B5 MICRO SIGN +=147 U+00D3 LATIN CAPITAL LETTER O WITH ACUTE +=148 U+00F0 LATIN SMALL LETTER ETH +=149 U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS +=14A U+00DD LATIN CAPITAL LETTER Y WITH ACUTE +=14B U+00A6 BROKEN BAR +=14C U+00BD VULGAR FRACTION ONE HALF diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubg5plus.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubg5plus.map new file mode 100644 index 00000000..18f4d283 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubg5plus.map @@ -0,0 +1,3184 @@ +# +# For unicode Big5+ Chinese fonts. +# +plane 01 +at 0x00 + 0x8488, 0x8710, 0x871F, 0x870F, 0x88D3, 0x8C87, 0x8CC6, 0x90CC, + 0x916D, 0x9258, 0x9242, 0x9268, 0x9269, 0x9243, 0x9247, 0x959D, + 0x96CF, 0x97F4, 0x9809, 0x98AB, 0x98FB, 0x9AAC, 0x9AAE, 0x9AAA, + 0x9B5C, 0x50DF, 0x5619, 0x560A, 0x589A, 0x5D85, 0x5E56, 0x5E51, + 0x5FB1, 0x645A, 0x6463, 0x669B, 0x66A3, 0x669E, 0x69B8, 0x69BA, + 0x69C7, 0x69D7, 0x6B70, 0x6B9D, 0x6F16, 0x6F24, 0x6F45, 0x7179, + 0x717A, 0x7254, 0x757C, 0x757B, 0x7612, 0x76B6, 0x76E0, 0x7773, + 0x7772, 0x7770, 0x789D, 0x7A27, 0x7A35, 0x7BA2, 0x7B89, 0x4E28, + 0x4E05, 0x4E04, 0x4E2A, 0x4E87, 0x4E49, 0x51E2, 0x4E46, 0x4E8F, + 0x4EBC, 0x4EBE, 0x5166, 0x51E3, 0x5204, 0x529C, 0x5344, 0x5F51, + 0x961D, 0x4E63, 0x4E62, 0x4EA3, 0x5185, 0x4EC5, 0x4ECF, 0x4ECE, + 0x4ECC, 0x5184, 0x5186, 0x51E4, 0x5205, 0x529E, 0x529D, 0x52FD, + 0x7BA5, 0x7CB6, 0x7DA5, 0x7DC3, 0x7FAB, 0x8025, 0x8059, 0x8185, + 0x818E, 0x84BE, 0x84A6, 0x872F, 0x89A0, 0x8A97, 0x8C8B, 0x8F0F, + 0x9275, 0x929F, 0x95A6, 0x969A, 0x9757, 0x97F7, 0x98B0, 0x99C6, + 0x50FA, 0x5285, 0x5643, 0x563C, 0x5BED, 0x5C35, 0x5F47, 0x616D, + 0x69F5, 0x6A03, 0x6A65, 0x6B75, 0x6F56, 0x6F98, 0x6F68, 0x7234, + 0x7245, 0x735C, 0x7356, 0x78BF, 0x78BD, 0x78E4, 0x7A34, 0x7A36, + 0x7BBA, 0x7BBC, 0x7BC8, 0x7BC3, 0x7BB6, 0x7BC2, 0x7BC5, 0x7BBD, + 0x7BB0, 0x7BBB, 0x7E04, 0x81F1, 0x8522, 0x8538, 0x8532, 0x8510, + 0x854F, 0x877C, 0x890D, 0x8908, 0x8D9E, 0x8F28, 0x8F21, 0x9066, + 0x906C, 0x90F6, 0x92EC, 0x92BA, 0x92E3, 0x92BD, 0x95B4, 0x97D1, + 0x9823, 0x990B, 0x9AB2, 0x9ADB, 0x9B73, 0x9B6E, 0x9B65, 0x9B6A, + 0x9B6D, 0x9D0B, 0x9E76, 0x9F11, 0x5119, 0x5675, 0x596F, 0x61A5, + 0x61A0, 0x65B4, 0x65D8, 0x66C2, 0x6BA8, 0x6F83, 0x6FC5, 0x71CD, + 0x729C, 0x7499, 0x7639, 0x762E, 0x769F, 0x76A0, 0x7794, 0x77AE, + 0x78E6, 0x7ABC, 0x7BD6, 0x7CCF, 0x7E18, 0x806D, 0x8190, 0x8552, + 0x8550, 0x87A0, 0x8786, 0x8795, 0x8860, 0x8928, 0x8920, 0x89A8, + 0x8E3A, 0x9194, 0x9311, 0x9337, 0x9343, 0x96A6, 0x9795, 0x9796, + 0x9825, 0x9926, 0x9934, 0x9B8A, 0x9B7F, 0x9D11, 0x9ED9, 0x9F3C, + 0x5123, 0x512C, 0x5295, 0x5688, 0x568B, 0x61E1, 0x61D7, 0x65A3, + 0x66D3, 0x6A8B, 0x6BAC, 0x7374, 0x7640, 0x5300, 0x533A, 0x5346, +plane 02 +at 0x00 + 0x535D, 0x5386, 0x53B7, 0x53CC, 0x53CE, 0x5721, 0x5E00, 0x5F0C, + 0x6237, 0x6238, 0x6535, 0x738D, 0x4E97, 0x4EE0, 0x4EE7, 0x4EE6, + 0x56D8, 0x518B, 0x518C, 0x5199, 0x51E5, 0x520B, 0x5304, 0x5303, + 0x5307, 0x531E, 0x535F, 0x536D, 0x5389, 0x53BA, 0x7641, 0x76E8, + 0x78F6, 0x7900, 0x7A59, 0x7A55, 0x7AF4, 0x7C04, 0x7C15, 0x7BF5, + 0x81C1, 0x857D, 0x85A5, 0x893A, 0x8E51, 0x9198, 0x9381, 0x936F, + 0x9842, 0x9937, 0x9BA9, 0x9BA7, 0x9BAC, 0x9B9C, 0x9D3C, 0x9D1C, + 0x9D3A, 0x9D32, 0x9D34, 0x9F3F, 0x5EEB, 0x61D5, 0x6502, 0x7012, + 0x7585, 0x7654, 0x7655, 0x76A7, 0x76A8, 0x790F, 0x7CE4, 0x7CE5, + 0x7E65, 0x7E4E, 0x7F82, 0x802D, 0x85CA, 0x85BC, 0x8CFF, 0x91A6, + 0x93B6, 0x93AB, 0x97A7, 0x983E, 0x9BBC, 0x9BB7, 0x9BBE, 0x9D62, + 0x9E8F, 0x9ECB, 0x56A9, 0x5913, 0x5BF4, 0x61EC, 0x61EF, 0x6AD6, + 0x7209, 0x7379, 0x74C6, 0x77C3, 0x791F, 0x7A65, 0x7AC6, 0x7C3A, + 0x7CEB, 0x7F84, 0x85E0, 0x85F3, 0x881E, 0x89B4, 0x89F9, 0x8B44, + 0x8E71, 0x8E6E, 0x8E79, 0x8EC4, 0x908C, 0x93C9, 0x97B0, 0x985A, + 0x9946, 0x9AC3, 0x9B0F, 0x9BF4, 0x9BFA, 0x9BDD, 0x9BED, 0x9BEF, + 0x9E96, 0x9EB3, 0x9EE2, 0x9F8F, 0x56B1, 0x5B41, 0x6AF6, 0x6AF2, + 0x7588, 0x8267, 0x860E, 0x8D0E, 0x91B6, 0x942F, 0x97E0, 0x97DB, + 0x9861, 0x9A33, 0x9C0F, 0x9C11, 0x9C03, 0x9C01, 0x9C16, 0x9D93, + 0x535B, 0x56BF, 0x5DCE, 0x76AC, 0x77D2, 0x7C52, 0x8B76, 0x8EC7, + 0x9434, 0x943E, 0x97BC, 0x9B39, 0x9C2A, 0x9C26, 0x9C27, 0x9DC0, + 0x9DC9, 0x9EEC, 0x9F68, 0x8032, 0x8031, 0x89FD, 0x908E, 0x97C2, + 0x9A4B, 0x9B1C, 0x9B1B, 0x9C42, 0x56D0, 0x56CF, 0x5DDA, 0x66EA, + 0x8B89, 0x9458, 0x9DE7, 0x53D0, 0x53F6, 0x53F7, 0x53F9, 0x53F4, + 0x5724, 0x5904, 0x5918, 0x5932, 0x5930, 0x5934, 0x5975, 0x5B82, + 0x5BF9, 0x5C14, 0x5E81, 0x5E83, 0x5F0D, 0x5F52, 0x5FCA, 0x5FC7, + 0x6239, 0x624F, 0x65E7, 0x672F, 0x6B7A, 0x6C39, 0x6C37, 0x6C44, + 0x6C45, 0x738C, 0x9093, 0x9092, 0x9DEA, 0x9DF1, 0x9F44, 0x9F6D, + 0x5DD9, 0x883A, 0x8975, 0x9A5D, 0x9C64, 0x9E0A, 0x9F73, 0x77E1, + 0x9B2D, 0x9E0C, 0x9F1F, 0x7C70, 0x9479, 0x974A, 0x7E9D, 0x9960, + 0x9F9E, 0x9EF8, 0x9F3A, 0x9F7D, 0x9F96, 0x6729, 0x5E07, 0x5FCB, + 0x52B7, 0x52B8, 0x52B6, 0x52BA, 0x6306, 0x6B85, 0x8C38, 0x7309, +plane 03 +at 0x00 + 0x8A2F, 0x52DC, 0x5921, 0x5E3F, 0x7B3F, 0x83D0, 0x86E7, 0x6117, + 0x8714, 0x88D1, 0x8CCB, 0x8EED, 0x52EC, 0x52E8, 0x7527, 0x798C, + 0x7991, 0x8660, 0x9904, 0x999B, 0x729F, 0x8770, 0x8E37, 0x9703, + 0x52F6, 0x64CC, 0x764A, 0x7AB9, 0x7BD7, 0x999F, 0x9B8D, 0x9E77, + 0x764B, 0x76A2, 0x87F1, 0x9BBA, 0x8804, 0x9BD8, 0x9D7C, 0x7C46, + 0x9D8D, 0x957E, 0x9C20, 0x9C22, 0x9C1E, 0x8970, 0x9C43, 0x9DE0, + 0x9459, 0x9C72, 0x6530, 0x72DD, 0x6804, 0x82FF, 0x8FEC, 0x53DE, + 0x5A30, 0x5BB2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x4E21, 0x4E20, 0x4E22, 0x4E68, 0x4E89, 0x4E98, 0x4EF9, + 0x4EEF, 0x4EF8, 0x4F06, 0x4F03, 0x4EFC, 0x4EEE, 0x4F16, 0x4F28, + 0x4F1C, 0x4F07, 0x4F1A, 0x4EFA, 0x4F17, 0x514A, 0x5172, 0x51B4, + 0x51B3, 0x51B2, 0x51E8, 0x5214, 0x520F, 0x5215, 0x5218, 0x52A8, + 0x534B, 0x534F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 04 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x5350, + 0x538B, 0x53BE, 0x53D2, 0x5416, 0x53FF, 0x5400, 0x5405, 0x5413, + 0x5415, 0x56E3, 0x5735, 0x5736, 0x5731, 0x5732, 0x58EE, 0x5905, + 0x4E54, 0x5936, 0x597A, 0x5986, 0x5B86, 0x5F53, 0x5C18, 0x5C3D, + 0x5C78, 0x5C80, 0x5E08, 0x5EF5, 0x5F0E, 0x5FD3, 0x5FDA, 0x5FDB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0x620F, 0x625D, 0x625F, + 0x6267, 0x6257, 0x9F50, 0x65EB, 0x65EA, 0x6737, 0x6732, 0x6736, +plane 05 +at 0x00 + 0x6B22, 0x6BCE, 0x6C58, 0x6C51, 0x6C77, 0x6C3C, 0x6C5A, 0x6C53, + 0x706F, 0x7072, 0x706E, 0x7073, 0x72B1, 0x72B2, 0x738F, 0x793C, + 0x808D, 0x808E, 0x827B, 0x8D71, 0x8FB9, 0x9096, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x909A, 0x4E24, 0x4E71, 0x4E9C, 0x4F45, + 0x4F4A, 0x4F39, 0x4F37, 0x4F32, 0x4F42, 0x4F44, 0x4F4B, 0x4F40, + 0x4F35, 0x4F31, 0x5151, 0x5150, 0x514E, 0x519D, 0x51B5, 0x51B8, + 0x51EC, 0x5223, 0x5227, 0x5226, 0x521F, 0x522B, 0x5220, 0x52B4, + 0x52B3, 0x5325, 0x533B, 0x5374, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 06 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x544D, 0x543A, 0x5444, 0x544C, 0x5423, 0x541A, 0x5432, + 0x544B, 0x5421, 0x5434, 0x5449, 0x5450, 0x5422, 0x543F, 0x5451, + 0x545A, 0x542F, 0x56E9, 0x56F2, 0x56F3, 0x56EF, 0x56ED, 0x56EC, + 0x56E6, 0x5748, 0x5744, 0x573F, 0x573C, 0x5753, 0x5756, 0x575F, + 0x5743, 0x5758, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 07 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x5757, + 0x5746, 0x573D, 0x5742, 0x5754, 0x5755, 0x58F1, 0x58F2, 0x58F0, + 0x590B, 0x9EA6, 0x56F1, 0x593D, 0x5994, 0x598C, 0x599C, 0x599F, + 0x599B, 0x5989, 0x599A, 0x6588, 0x5B8D, 0x5BFE, 0x5BFF, 0x5BFD, + 0x5C2B, 0x5C84, 0x5C8E, 0x5C9C, 0x5C85, 0x5DF5, 0x5E09, 0x5E0B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0x5E92, 0x5E90, 0x5F03, + 0x5F1E, 0x5F63, 0x5FE7, 0x5FFE, 0x5FE6, 0x5FDC, 0x5FCE, 0x5FFC, + 0x5FDF, 0x5FEC, 0x5FF6, 0x5FF2, 0x5FF0, 0x5FF9, 0x6213, 0x623B, +plane 08 +at 0x00 + 0x623C, 0x6282, 0x6278, 0x628B, 0x629E, 0x62A5, 0x629B, 0x629C, + 0x6299, 0x628D, 0x6285, 0x629D, 0x6275, 0x65F6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x66F5, 0x675B, 0x6754, 0x6752, 0x6758, + 0x6744, 0x674A, 0x6761, 0x6C7F, 0x6C91, 0x6C9E, 0x6C6E, 0x6C7C, + 0x6C9F, 0x6C75, 0x6C56, 0x6CA2, 0x6C79, 0x6CA1, 0x6CAA, 0x6CA0, + 0x7079, 0x7077, 0x707E, 0x7075, 0x707B, 0x7264, 0x72BB, 0x72BC, + 0x72C7, 0x72B9, 0x72BE, 0x72B6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 09 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x7398, 0x7593, 0x7680, 0x7683, 0x76C0, 0x76C1, 0x77F4, + 0x77F5, 0x7ACC, 0x7ACD, 0x7CFA, 0x809F, 0x8091, 0x8097, 0x8094, + 0x8286, 0x828C, 0x8295, 0x866C, 0x8FBE, 0x8FC7, 0x8FC1, 0x90A9, + 0x90A4, 0x90A8, 0x9627, 0x9626, 0x962B, 0x9633, 0x9634, 0x9629, + 0x4E3D, 0x4E9D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 10 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x4F93, + 0x4F8A, 0x4F6D, 0x4F8E, 0x4FA0, 0x4FA2, 0x4FA1, 0x4F9F, 0x4FA3, + 0x4F72, 0x4F8C, 0x5156, 0x5190, 0x51ED, 0x51FE, 0x522F, 0x523C, + 0x5234, 0x5239, 0x52B9, 0x52B5, 0x52BF, 0x5355, 0x5376, 0x537A, + 0x5393, 0x53C1, 0x53C2, 0x53D5, 0x5485, 0x545F, 0x5493, 0x5489, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x8038, 0x8081, + 0x8158, 0x8A24, 0x8DC3, 0x51F2, 0x55B6, 0x5EC3, 0x7861, 0x7A01, + 0x8849, 0x8999, 0x921F, 0x5313, 0x55E0, 0x6139, 0x6ED7, 0x733D, + 0x9775, 0x7FE4, 0x8088, 0x5655, 0x617F, 0x71D7, 0x8666, 0x8F3A, + 0x933D, 0x64F5, 0x7F80, 0x8D01, 0x58E1, 0x7CE9, 0x81CB, 0x95D9, + 0x6707, 0x9A47, 0x7674, 0x5301, 0x53FA, 0x9F99, 0x6C49, 0x8FB7, + 0x4F29, 0x534E, 0x5C81, 0x5F10, 0x6268, 0x6742, 0x6740, 0x51EA, + 0x6C62, 0x7391, 0x8FBB, 0x8FBC, 0x56E8, 0x575B, 0x5C97, 0x6762, + 0x62A4, 0x6766, 0x6CA3, 0x707F, 0x77F6, 0x5479, 0x9EFE, 0x548F, + 0x5469, 0x546D, 0x5494, 0x546A, 0x548A, 0x56FD, 0x56FB, 0x56F8, + 0x56FC, 0x56F6, 0x5765, 0x5781, 0x5763, 0x5767, 0x576E, 0x5778, + 0x577F, 0x58F3, 0x594B, 0x594C, 0x59AD, 0x59C4, 0x59C2, 0x59B0, +plane 11 +at 0x00 + 0x59BF, 0x59C9, 0x59B8, 0x59AC, 0x59B7, 0x59D7, 0x8FC8, 0x4FAB, + 0x5C2D, 0x549C, 0x5788, 0x62C3, 0x6619, 0x67A1, 0x67A6, 0x77FE, + 0x7F57, 0x82C5, 0x8FDF, 0x8FDC, 0x4FE4, 0x551B, 0x57AA, 0x57AB, + 0x5BA9, 0x6811, 0x7551, 0x7553, 0x7818, 0x7AD7, 0x7C7E, 0x867E, + 0x5266, 0x5520, 0x5521, 0x57D7, 0x5BBE, 0x6857, 0x7F3C, 0x8273, + 0x96BE, 0x66FA, 0x5A72, 0x68BD, 0x6E15, 0x7413, 0x74F8, 0x7B3D, + 0x76D8, 0x79FC, 0x7B39, 0x7D4B, 0x83B9, 0x86CF, 0x8EAE, 0x96EB, + 0x55B0, 0x5840, 0x5842, 0x692B, 0x6916, 0x691B, 0x6927, 0x6BF5, + 0x6E82, 0x6E7A, 0x7129, 0x7CAB, 0x7CAC, 0x83F7, 0x9596, 0x55F1, + 0x5F41, 0x698A, 0x698C, 0x6980, 0x697F, 0x789C, 0x7B7B, 0x90D2, + 0x95A0, 0x51A9, 0x7195, 0x7198, 0x7478, 0x78B9, 0x7A33, 0x7CC0, + 0x7CC1, 0x8744, 0x9064, 0x9277, 0x92AF, 0x5E64, 0x6A2B, 0x6F46, + 0x6F9A, 0x92F2, 0x9B79, 0x567A, 0x5F5C, 0x65D9, 0x6A72, 0x6A78, + 0x6B5A, 0x8EBE, 0x933B, 0x9340, 0x933A, 0x9B96, 0x71F5, 0x7A50, + 0x9387, 0x9385, 0x9BB1, 0x9D47, 0x93B9, 0x93BF, 0x9BCF, 0x9D64, + 0x9EBF, 0x89B8, 0x9BF3, 0x7C4F, 0x9425, 0x95E6, 0x9C2F, 0x6B0C, + 0x9C47, 0x7936, 0x6B15, 0x53B5, 0x4F66, 0x4F68, 0x4FE7, 0x503F, + 0x50A6, 0x510F, 0x523E, 0x5324, 0x5365, 0x539B, 0x517F, 0x54CB, + 0x5573, 0x5571, 0x556B, 0x55F4, 0x5622, 0x5620, 0x5692, 0x56BA, + 0x5691, 0x56B0, 0x5759, 0x578A, 0x580F, 0x5812, 0x5813, 0x5847, + 0x589B, 0x5900, 0x594D, 0x5B60, 0x5B96, 0x5B9E, 0x5B94, 0x5B9F, + 0x5B9D, 0x5C00, 0x5C19, 0x5C49, 0x5C4A, 0x5CBB, 0x5CC1, 0x5CB9, + 0x5C9E, 0x5CB4, 0x5CBA, 0x5DF6, 0x5E13, 0x5E12, 0x5E77, 0x5E98, + 0x5E99, 0x5E9D, 0x5EF8, 0x5EF9, 0x5F06, 0x5F21, 0x5F25, 0x5F55, + 0x5F84, 0x5F83, 0x6030, 0x6007, 0x5AD1, 0x5AD3, 0x5B67, 0x5C57, + 0x5C77, 0x5CD5, 0x5D75, 0x5D8E, 0x5DA5, 0x5DB6, 0x5DBF, 0x5E65, + 0x5ECD, 0x5EED, 0x5F94, 0x5F9A, 0x5FBA, 0x6125, 0x6150, 0x62A3, + 0x6360, 0x6364, 0x63B6, 0x6403, 0x64B6, 0x651A, 0x7A25, 0x5C21, + 0x66E2, 0x6702, 0x67A4, 0x67AC, 0x6810, 0x6806, 0x685E, 0x685A, + 0x692C, 0x6929, 0x6A2D, 0x6A77, 0x6A7A, 0x6ACA, 0x6AE6, 0x6AF5, + 0x6B0D, 0x6B0E, 0x6BDC, 0x6BDD, 0x6BF6, 0x6C1E, 0x6C63, 0x6DA5, + 0x6E0F, 0x6E8A, 0x6E84, 0x6E8B, 0x6E7C, 0x6F4C, 0x6F48, 0x6F49, +plane 12 +at 0x00 + 0x6F9D, 0x6F99, 0x6FF8, 0x702E, 0x702D, 0x705C, 0x79CC, 0x70BF, + 0x70EA, 0x70E5, 0x7111, 0x7112, 0x713F, 0x7139, 0x713B, 0x713D, + 0x7177, 0x7175, 0x7176, 0x7171, 0x7196, 0x7193, 0x71B4, 0x71DD, + 0x71DE, 0x720E, 0x5911, 0x7218, 0x7347, 0x7348, 0x73EF, 0x7412, + 0x743B, 0x74A4, 0x748D, 0x74B4, 0x7673, 0x7677, 0x76BC, 0x7819, + 0x781B, 0x783D, 0x7853, 0x7854, 0x7858, 0x78B7, 0x78D8, 0x78EE, + 0x7922, 0x794D, 0x7986, 0x7999, 0x79A3, 0x79BC, 0x7AA7, 0x7B37, + 0x7B59, 0x7BD0, 0x7C2F, 0x7C32, 0x7C42, 0x7C4E, 0x7C68, 0x7CA9, + 0x7CED, 0x7DD0, 0x7E07, 0x7DD3, 0x7E64, 0x7F40, 0x8041, 0x8063, + 0x80BB, 0x6711, 0x6725, 0x8248, 0x8310, 0x8362, 0x8312, 0x8421, + 0x841E, 0x84E2, 0x84DE, 0x84E1, 0x8573, 0x85D4, 0x85F5, 0x8637, + 0x8645, 0x8672, 0x874A, 0x87A9, 0x87A5, 0x87F5, 0x8834, 0x8850, + 0x8887, 0x6036, 0x5FE9, 0x603D, 0x6008, 0x62BA, 0x62B2, 0x62B7, + 0x62E4, 0x62A7, 0x62D5, 0x62E1, 0x62DD, 0x62A6, 0x62C1, 0x62C5, + 0x62C0, 0x62DF, 0x62E0, 0x62DE, 0x6589, 0x65A6, 0x65BA, 0x65FF, + 0x6617, 0x6618, 0x6601, 0x65FE, 0x670C, 0x676B, 0x6796, 0x6782, + 0x678A, 0x67A3, 0x8954, 0x8984, 0x8B03, 0x8C52, 0x8CD8, 0x8D0C, + 0x8D18, 0x8DB0, 0x8EBC, 0x8ED5, 0x8FAA, 0x909C, 0x915C, 0x922B, + 0x9221, 0x9273, 0x92F4, 0x92F5, 0x933F, 0x9342, 0x9386, 0x93BE, + 0x93BC, 0x93BD, 0x93F1, 0x93F2, 0x93EF, 0x9422, 0x9423, 0x9424, + 0x9467, 0x9466, 0x9597, 0x95CE, 0x95E7, 0x973B, 0x974D, 0x98E4, + 0x9942, 0x9B1D, 0x9B98, 0x9D49, 0x6449, 0x5E71, 0x5E85, 0x61D3, + 0x990E, 0x8002, 0x781E, 0x5528, 0x5572, 0x55BA, 0x55F0, 0x55EE, + 0x56B8, 0x56B9, 0x56C4, 0x8053, 0x92B0, 0x4E13, 0x4E1A, 0x4E1B, + 0x4E1C, 0x4E1D, 0x4E25, 0x4E27, 0x4E2C, 0x4E34, 0x4E3A, 0x4E3E, + 0x4E4C, 0x4E50, 0x4E60, 0x4E61, 0x4E66, 0x4E70, 0x4E78, 0x4E9A, + 0x4EA7, 0x4EA9, 0x4EAA, 0x4EB5, 0x4EB8, 0x4EBB, 0x4EBF, 0x4ED1, + 0x4ED3, 0x4EEA, 0x4EEB, 0x4EEC, 0x4F1E, 0x4F1F, 0x4F20, 0x4F21, + 0x4F23, 0x4F24, 0x4F25, 0x4F26, 0x4F27, 0x4F2A, 0x4F2B, 0x4F65, + 0x4FA5, 0x4FA6, 0x4FA7, 0x4FA8, 0x4FA9, 0x4FAA, 0x4FAC, 0x4FE6, + 0x4FE8, 0x4FEA, 0x4FEB, 0x4FED, 0x503A, 0x503D, 0x503E, 0x507E, + 0x507F, 0x50A4, 0x50A5, 0x50A7, 0x50A8, 0x50A9, 0x5170, 0x5174, +plane 13 +at 0x00 + 0x517B, 0x517D, 0x5181, 0x519A, 0x519B, 0x519C, 0x51A7, 0x51AE, + 0x51AF, 0x51BB, 0x51EB, 0x51EF, 0x51FB, 0x51FC, 0x51FF, 0x520D, + 0x5219, 0x521A, 0x521B, 0x522C, 0x522D, 0x523F, 0x5240, 0x5242, + 0x5250, 0x5251, 0x528F, 0x52A1, 0x52A2, 0x52B2, 0x52CB, 0x67A2, + 0x678F, 0x67F9, 0x6780, 0x6B26, 0x6B27, 0x6B68, 0x6B69, 0x6B81, + 0x6BB4, 0x6BD1, 0x6C1C, 0x6C97, 0x6C6C, 0x6CDF, 0x6CEA, 0x6CE4, + 0x6CD8, 0x6CB2, 0x6CCE, 0x6CC8, 0x708B, 0x7088, 0x7090, 0x708F, + 0x7087, 0x7089, 0x708D, 0x7081, 0x708C, 0x7240, 0x7265, 0x7266, + 0x52DA, 0x5326, 0x532E, 0x5356, 0x5362, 0x536B, 0x5385, 0x538C, + 0x538D, 0x5390, 0x5395, 0x53A2, 0x53A3, 0x53BF, 0x53C6, 0x53C7, + 0x53D1, 0x53D8, 0x53FE, 0x5417, 0x5452, 0x5453, 0x5456, 0x5457, + 0x5458, 0x5459, 0x545B, 0x545C, 0x5497, 0x5499, 0x549B, 0x549D, + 0x54D1, 0x54D2, 0x54D3, 0x54D4, 0x54D5, 0x54D7, 0x54D9, 0x54DC, + 0x54DD, 0x54DF, 0x551D, 0x551E, 0x5522, 0x5523, 0x5524, 0x5525, + 0x5567, 0x556C, 0x556D, 0x556E, 0x556F, 0x5570, 0x5574, 0x5578, + 0x5579, 0x55B7, 0x55B9, 0x55BC, 0x55BE, 0x55EB, 0x55EC, 0x55F3, + 0x55F5, 0x5621, 0x5623, 0x5624, 0x5625, 0x565C, 0x565D, 0x567C, + 0x56A1, 0x56A3, 0x56A4, 0x56D6, 0x56E2, 0x56F4, 0x56F5, 0x56FE, + 0x5706, 0x5719, 0x5739, 0x573A, 0x575A, 0x575C, 0x575D, 0x575E, + 0x5760, 0x5784, 0x5785, 0x57AD, 0x57AF, 0x57B1, 0x57B2, 0x57D8, + 0x57D9, 0x57DA, 0x5811, 0x5816, 0x5846, 0x5899, 0x58B6, 0x58CB, + 0x58EA, 0x58F6, 0x58F8, 0x5907, 0x5939, 0x593A, 0x5941, 0x5942, + 0x5956, 0x5987, 0x5988, 0x59A9, 0x59AA, 0x59AB, 0x5A05, 0x5A06, + 0x5A07, 0x5A08, 0x5A32, 0x5A34, 0x5A74, 0x5A76, 0x5AAD, 0x5AD2, + 0x5AD4, 0x5AF1, 0x5AF2, 0x5B59, 0x5B6D, 0x5BA0, 0x5BA1, 0x5BAA, + 0x5BBD, 0x5BFB, 0x5BFC, 0x5C1C, 0x5C1D, 0x5C27, 0x5C34, 0x5C42, + 0x5C43, 0x5C66, 0x5C72, 0x5C7F, 0x5C82, 0x5C83, 0x5C96, 0x5C98, + 0x5C99, 0x5C9A, 0x5C9B, 0x5CBD, 0x5CBF, 0x7268, 0x72CD, 0x72D3, + 0x72DB, 0x72CF, 0x73A7, 0x73A3, 0x739E, 0x73AF, 0x73AA, 0x739C, + 0x7542, 0x7544, 0x753B, 0x7541, 0x759B, 0x759E, 0x79C4, 0x79C3, + 0x79C6, 0x79C7, 0x79CA, 0x7ACF, 0x7C76, 0x7C74, 0x7CFF, 0x7CFC, + 0x7F59, 0x80A8, 0x80B0, 0x80B3, 0x80A4, 0x80B6, 0x5CC2, 0x5CC3, +plane 14 +at 0x00 + 0x5CC4, 0x5CE3, 0x5CE4, 0x5CE7, 0x5D02, 0x5D03, 0x5D04, 0x5D05, + 0x5D2D, 0x5D58, 0x5D5A, 0x5D5D, 0x5DC5, 0x5DEF, 0x5E05, 0x5E0F, + 0x5E10, 0x5E1C, 0x5E26, 0x5E27, 0x5E31, 0x5E3B, 0x5E3C, 0x5E86, + 0x5E91, 0x5E93, 0x5E94, 0x5E9E, 0x5E9F, 0x5EBC, 0x5F20, 0x5F2A, + 0x5F5F, 0x5F68, 0x5F7B, 0x5F95, 0x6001, 0x6002, 0x6003, 0x6004, + 0x6005, 0x6006, 0x603B, 0x603C, 0x603F, 0x6076, 0x6078, 0x6079, + 0x607A, 0x607B, 0x607D, 0x60AB, 0x60AC, 0x60AD, 0x60AF, 0x60EB, + 0x60EC, 0x60ED, 0x60EF, 0x6124, 0x6126, 0x6151, 0x61D1, 0x61D2, + 0x61D4, 0x6206, 0x620B, 0x6217, 0x6269, 0x626A, 0x626B, 0x626C, + 0x629F, 0x62A0, 0x62A1, 0x62A2, 0x62E2, 0x62E3, 0x62E6, 0x62E7, + 0x62E8, 0x62E9, 0x631A, 0x631C, 0x631D, 0x631E, 0x6320, 0x6322, + 0x6324, 0x6325, 0x6326, 0x635E, 0x635F, 0x6361, 0x6362, 0x6363, + 0x63B3, 0x63B7, 0x63B8, 0x63B9, 0x63BC, 0x63FB, 0x63FC, 0x63FD, + 0x63FF, 0x6400, 0x6401, 0x6402, 0x6404, 0x6405, 0x6444, 0x6445, + 0x6448, 0x644A, 0x6484, 0x64B5, 0x64B7, 0x64B8, 0x64BA, 0x64DD, + 0x64DE, 0x6512, 0x6569, 0x6586, 0x658F, 0x6593, 0x65A9, 0x65F7, + 0x65F8, 0x663D, 0x663E, 0x6653, 0x6654, 0x6655, 0x6656, 0x6682, + 0x66A7, 0x6743, 0x6767, 0x6768, 0x6769, 0x67A5, 0x67A7, 0x67A8, + 0x67AA, 0x67AB, 0x67AD, 0x67FD, 0x6807, 0x6808, 0x6809, 0x680A, + 0x680B, 0x680C, 0x680E, 0x80A7, 0x80AC, 0x80A6, 0x5367, 0x820E, + 0x82C4, 0x833E, 0x829C, 0x82AA, 0x82C9, 0x82A6, 0x82B2, 0x8FCC, + 0x8FD9, 0x8FCA, 0x8FD8, 0x8FCF, 0x90B7, 0x90AD, 0x90B9, 0x9637, + 0x9641, 0x963E, 0x9751, 0x9763, 0x4E57, 0x4E79, 0x4EB2, 0x4EB0, + 0x4EAF, 0x4EB1, 0x4FD2, 0x4FD5, 0x680F, 0x6860, 0x6861, 0x6862, + 0x6864, 0x6865, 0x6866, 0x6868, 0x6869, 0x686A, 0x68BE, 0x68BF, + 0x68C0, 0x691D, 0x691F, 0x6920, 0x6924, 0x692D, 0x6984, 0x6987, + 0x6988, 0x6989, 0x69DA, 0x69DB, 0x69DC, 0x69DF, 0x69E0, 0x6A2F, + 0x6A31, 0x6A79, 0x6A7C, 0x6AA9, 0x6B7C, 0x6B87, 0x6B92, 0x6B93, + 0x6B9A, 0x6BC2, 0x6BD5, 0x6BD9, 0x6C07, 0x6C22, 0x6C29, 0x6C47, + 0x6C48, 0x6C64, 0x6CA4, 0x6CA5, 0x6CA6, 0x6CA7, 0x6CA8, 0x6CA9, + 0x6CF6, 0x6CF7, 0x6CF8, 0x6CFA, 0x6CFB, 0x6CFC, 0x6CFD, 0x6CFE, + 0x6D46, 0x6D47, 0x6D48, 0x6D49, 0x6D4A, 0x6D4B, 0x6D4D, 0x6D4E, +plane 15 +at 0x00 + 0x6D4F, 0x6D50, 0x6D51, 0x6D52, 0x6D53, 0x6D54, 0x6D55, 0x6D9D, + 0x6D9F, 0x6DA0, 0x6DA1, 0x6DA2, 0x6DA3, 0x6DA4, 0x6DA6, 0x6DA7, + 0x6DA8, 0x6DA9, 0x6E0D, 0x6E0E, 0x6E10, 0x6E11, 0x6E14, 0x6E16, + 0x6E81, 0x6E83, 0x6E85, 0x6E87, 0x6EDF, 0x6EE0, 0x6EE1, 0x6EE2, + 0x6EE4, 0x6EE5, 0x6EE7, 0x6EEA, 0x6F47, 0x6F4B, 0x6F4D, 0x6F9B, + 0x6F9C, 0x6FD1, 0x6FD2, 0x704F, 0x706D, 0x7080, 0x709C, 0x709D, + 0x709E, 0x70BC, 0x70BD, 0x70C1, 0x70C2, 0x70C3, 0x70E6, 0x70E7, + 0x70E8, 0x70E9, 0x70EB, 0x70EC, 0x70ED, 0x7115, 0x7116, 0x7118, + 0x7140, 0x71F7, 0x7231, 0x7237, 0x724D, 0x7275, 0x728A, 0x72B7, + 0x72B8, 0x72C8, 0x72DE, 0x72EE, 0x72EF, 0x72F0, 0x72F1, 0x72F2, + 0x7303, 0x7321, 0x736D, 0x7399, 0x739A, 0x739B, 0x73AE, 0x73B0, + 0x73B1, 0x4FBE, 0x4FB8, 0x4FB0, 0x4FB1, 0x4FC8, 0x4FC6, 0x4FCC, + 0x4FE5, 0x4FE3, 0x4FB4, 0x516A, 0x519F, 0x51C1, 0x51C2, 0x51C3, + 0x5245, 0x5248, 0x524F, 0x52C5, 0x52CA, 0x52C4, 0x5327, 0x5358, + 0x537D, 0x53DD, 0x53DC, 0x53DA, 0x53D9, 0x54B9, 0x54D0, 0x54B4, + 0x54CA, 0x54A3, 0x73D1, 0x73F0, 0x73F2, 0x740E, 0x740F, 0x7410, + 0x7437, 0x7477, 0x748E, 0x74D2, 0x7519, 0x7534, 0x7535, 0x7545, + 0x758D, 0x7596, 0x759F, 0x75A0, 0x75A1, 0x75AC, 0x75AD, 0x75AE, + 0x75AF, 0x75C8, 0x75C9, 0x75D6, 0x75E8, 0x75EA, 0x75EB, 0x7605, + 0x7617, 0x7618, 0x762A, 0x762B, 0x763E, 0x763F, 0x765D, 0x765E, + 0x7663, 0x7666, 0x766B, 0x7691, 0x76B1, 0x76B2, 0x76CF, 0x76D0, + 0x76D1, 0x770D, 0x772C, 0x7750, 0x7751, 0x7786, 0x7792, 0x7793, + 0x77CB, 0x77EB, 0x77FF, 0x7800, 0x7801, 0x7816, 0x7817, 0x781A, + 0x781C, 0x7839, 0x783B, 0x783E, 0x7840, 0x7841, 0x7855, 0x7856, + 0x7857, 0x7859, 0x785A, 0x785B, 0x7875, 0x7877, 0x789B, 0x78D7, + 0x78D9, 0x7903, 0x7933, 0x7943, 0x794E, 0x796F, 0x7978, 0x79EF, + 0x79FE, 0x7A06, 0x7A23, 0x7A51, 0x7A52, 0x7A5E, 0x7A77, 0x7A8D, + 0x7A8E, 0x7A9C, 0x7A9D, 0x7AA5, 0x7AA6, 0x7AAD, 0x7AD6, 0x7ADE, + 0x7B03, 0x7B15, 0x7B3A, 0x7B3C, 0x7B3E, 0x7B5A, 0x7B5B, 0x7B5C, + 0x7B7C, 0x7B7E, 0x7B7F, 0x7B80, 0x7BA6, 0x7BA7, 0x7BA8, 0x7BA9, + 0x7BAB, 0x7BD1, 0x7BD3, 0x7BEE, 0x7BEF, 0x7C16, 0x7C41, 0x7CAA, + 0x7CF9, 0x7D27, 0x7D77, 0x7DD4, 0x7E06, 0x7E9F, 0x7EA0, 0x7EA1, +plane 16 +at 0x00 + 0x7EA2, 0x7EA3, 0x7EA4, 0x7EA5, 0x7EA6, 0x7EA7, 0x7EA8, 0x7EA9, + 0x7EAA, 0x7EAB, 0x7EAC, 0x7EAD, 0x7EAE, 0x7EAF, 0x7EB0, 0x7EB1, + 0x7EB2, 0x7EB3, 0x7EB4, 0x7EB5, 0x7EB6, 0x7EB7, 0x7EB8, 0x54DA, + 0x54A4, 0x54B2, 0x549E, 0x549F, 0x54B5, 0x54CD, 0x54CC, 0x5700, + 0x57AC, 0x5791, 0x578E, 0x578D, 0x5792, 0x57A1, 0x5790, 0x57A6, + 0x57A8, 0x579C, 0x5796, 0x57A7, 0x58F5, 0x5909, 0x5908, 0x5952, + 0x59DF, 0x59EB, 0x59EF, 0x59F0, 0x59D5, 0x5A0D, 0x5A04, 0x59F9, + 0x7EB9, 0x7EBA, 0x7EBB, 0x7EBC, 0x7EBD, 0x7EBE, 0x7EBF, 0x7EC0, + 0x7EC1, 0x7EC2, 0x7EC3, 0x7EC4, 0x7EC5, 0x7EC6, 0x7EC7, 0x7EC8, + 0x7EC9, 0x7ECA, 0x7ECB, 0x7ECC, 0x7ECD, 0x7ECE, 0x7ECF, 0x7ED0, + 0x7ED1, 0x7ED2, 0x7ED3, 0x7ED4, 0x7ED5, 0x7ED6, 0x7ED7, 0x7ED8, + 0x7ED9, 0x7EDA, 0x7EDB, 0x7EDC, 0x7EDD, 0x7EDE, 0x7EDF, 0x7EE0, + 0x7EE1, 0x7EE2, 0x7EE3, 0x7EE4, 0x7EE5, 0x7EE6, 0x7EE7, 0x7EE8, + 0x7EE9, 0x7EEA, 0x7EEB, 0x7EEC, 0x7EED, 0x7EEE, 0x7EEF, 0x7EF0, + 0x7EF1, 0x7EF2, 0x7EF3, 0x7EF4, 0x7EF5, 0x7EF6, 0x7EF7, 0x7EF8, + 0x7EF9, 0x7EFA, 0x7EFB, 0x7EFC, 0x7EFD, 0x7EFE, 0x7EFF, 0x7F00, + 0x7F01, 0x7F02, 0x7F03, 0x7F04, 0x7F05, 0x7F06, 0x7F07, 0x7F08, + 0x7F09, 0x7F0A, 0x7F0B, 0x7F0C, 0x7F0D, 0x7F0E, 0x7F0F, 0x7F10, + 0x7F11, 0x7F12, 0x7F13, 0x7F14, 0x7F15, 0x7F16, 0x7F17, 0x7F18, + 0x7F19, 0x7F1A, 0x7F1B, 0x7F1C, 0x7F1D, 0x7F1E, 0x7F1F, 0x7F20, + 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F28, + 0x7F29, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2E, 0x7F2F, 0x7F30, + 0x7F31, 0x7F32, 0x7F33, 0x7F34, 0x7F35, 0x7F42, 0x7F49, 0x7F56, + 0x7F5A, 0x7F74, 0x7F81, 0x7F9F, 0x7FD8, 0x7FD9, 0x7FDA, 0x8022, + 0x8027, 0x8042, 0x804B, 0x804C, 0x804D, 0x8054, 0x8069, 0x8080, + 0x8083, 0x80A0, 0x80BC, 0x80BD, 0x80BE, 0x80BF, 0x80C0, 0x80C1, + 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80EB, 0x5A02, 0x59F8, 0x59E2, + 0x59D9, 0x59E7, 0x5B6A, 0x5BAB, 0x5C1B, 0x5C2F, 0x663C, 0x5CD1, + 0x5CDC, 0x5CE6, 0x5CE1, 0x5CCD, 0x5CE2, 0x5CDD, 0x5CE5, 0x5DFB, + 0x5DFA, 0x5E1E, 0x5EA1, 0x5EFC, 0x5EFB, 0x5F2F, 0x5F66, 0x605C, + 0x604E, 0x6051, 0x6023, 0x6031, 0x607C, 0x6060, 0x80EC, 0x810C, + 0x810D, 0x810E, 0x810F, 0x8110, 0x8111, 0x8112, 0x8113, 0x8132, +plane 17 +at 0x00 + 0x8136, 0x8137, 0x8138, 0x8156, 0x8159, 0x815A, 0x817B, 0x817C, + 0x817E, 0x8191, 0x81A5, 0x81B6, 0x81DC, 0x8206, 0x8223, 0x8230, + 0x8231, 0x823B, 0x823E, 0x8254, 0x8270, 0x8282, 0x8288, 0x8297, + 0x82C7, 0x82C8, 0x82CB, 0x82CC, 0x82CD, 0x82CE, 0x82CF, 0x830F, + 0x8311, 0x8313, 0x8314, 0x8315, 0x8359, 0x835A, 0x835B, 0x835C, + 0x835D, 0x835E, 0x835F, 0x8360, 0x8361, 0x8364, 0x8365, 0x8366, + 0x8367, 0x8368, 0x8369, 0x836A, 0x836B, 0x836C, 0x836D, 0x836E, + 0x836F, 0x83B2, 0x83B3, 0x83B4, 0x83B6, 0x83B8, 0x83BA, 0x83BC, + 0x841A, 0x841C, 0x841D, 0x8424, 0x8425, 0x8426, 0x8427, 0x8428, + 0x8487, 0x8489, 0x848C, 0x84DD, 0x84DF, 0x84E0, 0x84E3, 0x84E5, + 0x84E6, 0x8537, 0x8539, 0x853A, 0x853C, 0x8572, 0x8574, 0x85D3, + 0x8614, 0x864F, 0x867F, 0x8680, 0x8681, 0x8682, 0x8683, 0x86AC, + 0x86F0, 0x86F1, 0x86F2, 0x86F3, 0x86F4, 0x8717, 0x8748, 0x877E, + 0x8780, 0x87A8, 0x87CF, 0x8854, 0x8865, 0x886C, 0x8885, 0x8886, + 0x88AD, 0x88AF, 0x88C6, 0x88C7, 0x88C8, 0x88E2, 0x88E3, 0x88E4, + 0x88E5, 0x8934, 0x8947, 0x8955, 0x8980, 0x89C1, 0x89C2, 0x89C3, + 0x89C4, 0x89C5, 0x89C6, 0x89C7, 0x89C8, 0x89C9, 0x89CA, 0x89CB, + 0x89CC, 0x89CD, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x89DE, 0x89EF, + 0x8A01, 0x8A1A, 0x8A5F, 0x604A, 0x6061, 0x6218, 0x631F, 0x6317, + 0x62EA, 0x6321, 0x6304, 0x6305, 0x6531, 0x6544, 0x6540, 0x6542, + 0x65BE, 0x6629, 0x661B, 0x6623, 0x662C, 0x661A, 0x6630, 0x663B, + 0x661E, 0x6637, 0x6638, 0x670E, 0x67E8, 0x67D6, 0x67C7, 0x67BC, + 0x6852, 0x67BF, 0x67D5, 0x67FE, 0x8A8A, 0x8BA0, 0x8BA1, 0x8BA2, + 0x8BA3, 0x8BA4, 0x8BA5, 0x8BA6, 0x8BA7, 0x8BA8, 0x8BA9, 0x8BAA, + 0x8BAB, 0x8BAC, 0x8BAD, 0x8BAE, 0x8BAF, 0x8BB0, 0x8BB1, 0x8BB2, + 0x8BB3, 0x8BB4, 0x8BB5, 0x8BB6, 0x8BB7, 0x8BB8, 0x8BB9, 0x8BBA, + 0x8BBB, 0x8BBC, 0x8BBD, 0x8BBE, 0x8BBF, 0x8BC0, 0x8BC1, 0x8BC2, + 0x8BC3, 0x8BC4, 0x8BC5, 0x8BC6, 0x8BC7, 0x8BC8, 0x8BC9, 0x8BCA, + 0x8BCB, 0x8BCC, 0x8BCD, 0x8BCE, 0x8BCF, 0x8BD0, 0x8BD1, 0x8BD2, + 0x8BD3, 0x8BD4, 0x8BD5, 0x8BD6, 0x8BD7, 0x8BD8, 0x8BD9, 0x8BDA, + 0x8BDB, 0x8BDC, 0x8BDD, 0x8BDE, 0x8BDF, 0x8BE0, 0x8BE1, 0x8BE2, + 0x8BE3, 0x8BE4, 0x8BE5, 0x8BE6, 0x8BE7, 0x8BE8, 0x8BE9, 0x8BEA, +plane 18 +at 0x00 + 0x8BEB, 0x8BEC, 0x8BED, 0x8BEE, 0x8BEF, 0x8BF0, 0x8BF1, 0x8BF2, + 0x8BF3, 0x8BF4, 0x8BF5, 0x8BF6, 0x8BF7, 0x8BF8, 0x8BF9, 0x8BFA, + 0x8BFB, 0x8BFC, 0x8BFD, 0x8BFE, 0x8BFF, 0x8C00, 0x8C01, 0x8C02, + 0x8C03, 0x8C04, 0x8C05, 0x8C06, 0x8C07, 0x8C08, 0x8C09, 0x8C0A, + 0x8C0B, 0x8C0C, 0x8C0D, 0x8C0E, 0x8C0F, 0x8C10, 0x8C11, 0x8C12, + 0x8C13, 0x8C14, 0x8C15, 0x8C16, 0x8C17, 0x8C18, 0x8C19, 0x8C1A, + 0x8C1B, 0x8C1C, 0x8C1D, 0x8C1E, 0x8C1F, 0x8C20, 0x8C21, 0x8C22, + 0x8C23, 0x8C24, 0x8C25, 0x8C26, 0x8C27, 0x8C28, 0x8C29, 0x8C2A, + 0x8C2B, 0x8C2C, 0x8C2D, 0x8C2E, 0x8C2F, 0x8C30, 0x8C31, 0x8C32, + 0x8C33, 0x8C34, 0x8C35, 0x8C36, 0x8C6E, 0x8D1D, 0x8D1E, 0x8D1F, + 0x8D20, 0x8363, 0x67FB, 0x67B1, 0x6801, 0x6805, 0x6800, 0x67D7, + 0x6B2A, 0x6B6B, 0x6BE1, 0x6D23, 0x6CFF, 0x6D14, 0x6D05, 0x6D13, + 0x6D06, 0x6D21, 0x6D15, 0x6CAF, 0x6CF4, 0x6D02, 0x6D45, 0x6D26, + 0x6D44, 0x6D24, 0x70A5, 0x70A3, 0x70A2, 0x70BB, 0x70A0, 0x70AA, + 0x70A8, 0x70B6, 0x8D21, 0x8D22, 0x8D23, 0x8D24, 0x8D25, 0x8D26, + 0x8D27, 0x8D28, 0x8D29, 0x8D2A, 0x8D2B, 0x8D2C, 0x8D2D, 0x8D2E, + 0x8D2F, 0x8D30, 0x8D31, 0x8D32, 0x8D33, 0x8D34, 0x8D35, 0x8D36, + 0x8D37, 0x8D38, 0x8D39, 0x8D3A, 0x8D3B, 0x8D3C, 0x8D3D, 0x8D3E, + 0x8D3F, 0x8D40, 0x8D41, 0x8D42, 0x8D43, 0x8D44, 0x8D45, 0x8D46, + 0x8D47, 0x8D48, 0x8D49, 0x8D4A, 0x8D4B, 0x8D4C, 0x8D4D, 0x8D4E, + 0x8D4F, 0x8D50, 0x8D51, 0x8D52, 0x8D53, 0x8D54, 0x8D55, 0x8D56, + 0x8D57, 0x8D58, 0x8D59, 0x8D5A, 0x8D5B, 0x8D5C, 0x8D5D, 0x8D5E, + 0x8D5F, 0x8D60, 0x8D61, 0x8D62, 0x8D63, 0x8D6A, 0x8D75, 0x8DB1, + 0x8DB8, 0x8DC4, 0x8DDE, 0x8DF6, 0x8DF7, 0x8DF8, 0x8DF9, 0x8DFB, + 0x8E0C, 0x8E0E, 0x8E2C, 0x8E2D, 0x8E2F, 0x8E52, 0x8E7E, 0x8E7F, + 0x8E80, 0x8E8F, 0x8E9C, 0x8ECE, 0x8F66, 0x8F67, 0x8F68, 0x8F69, + 0x8F6A, 0x8F6B, 0x8F6C, 0x8F6D, 0x8F6E, 0x8F6F, 0x8F70, 0x8F71, + 0x8F72, 0x8F73, 0x8F74, 0x8F75, 0x8F76, 0x8F77, 0x8F78, 0x8F79, + 0x8F7A, 0x8F7B, 0x8F7C, 0x8F7D, 0x8F7E, 0x8F7F, 0x8F80, 0x8F81, + 0x8F82, 0x8F83, 0x8F84, 0x8F85, 0x8F86, 0x8F87, 0x8F88, 0x8F89, + 0x8F8A, 0x8F8B, 0x8F8C, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F90, 0x8F91, + 0x8F92, 0x8F93, 0x8F94, 0x8F95, 0x8F96, 0x8F97, 0x8F98, 0x8F99, +plane 19 +at 0x00 + 0x8F9A, 0x8FA9, 0x8FAB, 0x8FBD, 0x8FDB, 0x8FDD, 0x8FDE, 0x8FF3, + 0x900A, 0x9026, 0x9057, 0x909D, 0x90AC, 0x90BA, 0x90BB, 0x70B2, + 0x70A7, 0x70B9, 0x722E, 0x723C, 0x726D, 0x72E7, 0x72ED, 0x72EC, + 0x72E5, 0x72E2, 0x73C4, 0x73BD, 0x73CF, 0x73C9, 0x73C1, 0x73D0, + 0x73CE, 0x74ED, 0x74EB, 0x74EF, 0x7549, 0x7550, 0x7546, 0x754A, + 0x754D, 0x75A6, 0x75A8, 0x76C7, 0x76FF, 0x76FD, 0x77E6, 0x780A, + 0x90CF, 0x90D0, 0x90D1, 0x90D3, 0x90E6, 0x90E7, 0x90F8, 0x9142, + 0x915D, 0x915E, 0x9166, 0x9171, 0x917D, 0x917E, 0x917F, 0x91CA, + 0x91D2, 0x91FA, 0x922A, 0x9274, 0x933E, 0x9341, 0x93F0, 0x9426, + 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948A, 0x948B, 0x948C, + 0x948D, 0x948E, 0x948F, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, + 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949A, 0x949B, 0x949C, + 0x949D, 0x949E, 0x949F, 0x94A0, 0x94A1, 0x94A2, 0x94A3, 0x94A4, + 0x94A5, 0x94A6, 0x94A7, 0x94A8, 0x94A9, 0x94AA, 0x94AB, 0x94AC, + 0x94AD, 0x94AE, 0x94AF, 0x94B0, 0x94B1, 0x94B2, 0x94B3, 0x94B4, + 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, + 0x94BD, 0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0x94C4, + 0x94C5, 0x94C6, 0x94C7, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, + 0x94CD, 0x94CE, 0x94CF, 0x94D0, 0x94D1, 0x94D2, 0x94D3, 0x94D4, + 0x94D5, 0x94D6, 0x94D7, 0x94D8, 0x94D9, 0x94DA, 0x94DB, 0x94DC, + 0x94DD, 0x94DE, 0x94DF, 0x94E0, 0x94E1, 0x94E2, 0x94E3, 0x94E4, + 0x94E5, 0x94E6, 0x94E7, 0x94E8, 0x94E9, 0x94EA, 0x94EB, 0x94EC, + 0x94ED, 0x94EE, 0x94EF, 0x94F0, 0x94F1, 0x94F2, 0x94F3, 0x94F4, + 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x94F9, 0x94FA, 0x94FB, 0x94FC, + 0x94FD, 0x94FE, 0x94FF, 0x9500, 0x9501, 0x9502, 0x9503, 0x9504, + 0x9505, 0x9506, 0x9507, 0x9508, 0x9509, 0x7804, 0x780B, 0x7807, + 0x7815, 0x7808, 0x79D3, 0x79D4, 0x79D0, 0x79D7, 0x7A7C, 0x7A7D, + 0x7A83, 0x7A82, 0x7AD4, 0x7AD5, 0x7AD3, 0x7AD0, 0x7AD2, 0x7AFE, + 0x7AFC, 0x7C77, 0x7C7C, 0x7C7B, 0x7F8F, 0x80D3, 0x80CB, 0x80D2, + 0x8109, 0x80E2, 0x80DF, 0x80C6, 0x8224, 0x82F7, 0x950A, 0x950B, + 0x950C, 0x950D, 0x950E, 0x950F, 0x9510, 0x9511, 0x9512, 0x9513, + 0x9514, 0x9515, 0x9516, 0x9517, 0x9518, 0x9519, 0x951A, 0x951B, +plane 20 +at 0x00 + 0x951C, 0x951D, 0x951E, 0x951F, 0x9520, 0x9521, 0x9522, 0x9523, + 0x9524, 0x9525, 0x9526, 0x9527, 0x9528, 0x9529, 0x952A, 0x952B, + 0x952C, 0x952D, 0x952E, 0x952F, 0x9530, 0x9531, 0x9532, 0x9533, + 0x9534, 0x9535, 0x9536, 0x9537, 0x9538, 0x9539, 0x953A, 0x953B, + 0x953C, 0x953D, 0x953E, 0x953F, 0x9540, 0x9541, 0x9542, 0x9543, + 0x9544, 0x9545, 0x9546, 0x9547, 0x9548, 0x9549, 0x954A, 0x954B, + 0x954C, 0x954D, 0x954E, 0x954F, 0x9550, 0x9551, 0x9552, 0x9553, + 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559, 0x955A, 0x955B, + 0x955C, 0x955D, 0x955E, 0x955F, 0x9560, 0x9561, 0x9562, 0x9563, + 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, + 0x956C, 0x956D, 0x956E, 0x956F, 0x9570, 0x9571, 0x9572, 0x9573, + 0x9574, 0x9575, 0x9576, 0x957F, 0x95E8, 0x95E9, 0x95EA, 0x95EB, + 0x95EC, 0x95ED, 0x95EE, 0x95EF, 0x95F0, 0x95F1, 0x95F2, 0x95F3, + 0x95F4, 0x95F5, 0x95F6, 0x95F7, 0x95F8, 0x95F9, 0x95FA, 0x95FB, + 0x95FC, 0x95FD, 0x95FE, 0x95FF, 0x9600, 0x9601, 0x9602, 0x9603, + 0x9604, 0x9605, 0x9606, 0x9607, 0x9608, 0x9609, 0x960A, 0x960B, + 0x960C, 0x960D, 0x960E, 0x960F, 0x9610, 0x9611, 0x9612, 0x9613, + 0x9614, 0x9615, 0x9616, 0x82D8, 0x82DD, 0x82F8, 0x82FC, 0x82E9, + 0x82EE, 0x82D0, 0x830E, 0x82E2, 0x830B, 0x82FD, 0x5179, 0x8676, + 0x8678, 0x8675, 0x867D, 0x8842, 0x8866, 0x898C, 0x8A05, 0x8A06, + 0x8C9F, 0x8FF1, 0x8FE7, 0x8FE9, 0x8FEF, 0x90C2, 0x90BC, 0x90C6, + 0x90C0, 0x90CD, 0x90C9, 0x90C4, 0x9617, 0x9618, 0x9619, 0x961A, + 0x961B, 0x961F, 0x9635, 0x9636, 0x9645, 0x9646, 0x9647, 0x9648, + 0x9649, 0x9667, 0x9668, 0x9669, 0x9690, 0x96E0, 0x96F3, 0x96FE, + 0x9701, 0x972D, 0x9753, 0x9754, 0x9765, 0x9791, 0x9792, 0x97AF, + 0x97E6, 0x97E7, 0x97E8, 0x97E9, 0x97EA, 0x97EB, 0x97EC, 0x9875, + 0x9876, 0x9877, 0x9878, 0x9879, 0x987A, 0x987B, 0x987C, 0x987D, + 0x987E, 0x987F, 0x9880, 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, + 0x9886, 0x9887, 0x9888, 0x9889, 0x988A, 0x988B, 0x988C, 0x988D, + 0x988E, 0x988F, 0x9890, 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, + 0x9896, 0x9897, 0x9898, 0x9899, 0x989A, 0x989B, 0x989C, 0x989D, + 0x989E, 0x989F, 0x98A0, 0x98A1, 0x98A2, 0x98A3, 0x98A4, 0x98A5, +plane 21 +at 0x00 + 0x98A6, 0x98A7, 0x98CE, 0x98CF, 0x98D0, 0x98D1, 0x98D2, 0x98D3, + 0x98D4, 0x98D5, 0x98D6, 0x98D7, 0x98D8, 0x98D9, 0x98DA, 0x98DE, + 0x98E0, 0x98E8, 0x990D, 0x990F, 0x9962, 0x9963, 0x9964, 0x9965, + 0x9966, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x996D, + 0x996E, 0x996F, 0x9970, 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, + 0x9976, 0x9977, 0x9978, 0x9979, 0x997A, 0x997B, 0x997C, 0x997D, + 0x997E, 0x997F, 0x9980, 0x9981, 0x9982, 0x9983, 0x9984, 0x9985, + 0x9986, 0x9987, 0x9988, 0x9989, 0x998A, 0x998B, 0x998C, 0x998D, + 0x998E, 0x998F, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, + 0x9A6C, 0x9581, 0x9CEC, 0x5032, 0x4FF9, 0x501D, 0x4FFF, 0x5004, + 0x4FF0, 0x5003, 0x5002, 0x4FFC, 0x4FF2, 0x5024, 0x5008, 0x5036, + 0x502E, 0x5010, 0x5038, 0x5039, 0x4FFD, 0x5056, 0x4FFB, 0x51A3, + 0x51A6, 0x51A1, 0x51C7, 0x51C9, 0x5260, 0x5264, 0x5259, 0x5265, + 0x5267, 0x5257, 0x9A6D, 0x9A6E, 0x9A6F, 0x9A70, 0x9A71, 0x9A72, + 0x9A73, 0x9A74, 0x9A75, 0x9A76, 0x9A77, 0x9A78, 0x9A79, 0x9A7A, + 0x9A7B, 0x9A7C, 0x9A7D, 0x9A7E, 0x9A7F, 0x9A80, 0x9A81, 0x9A82, + 0x9A83, 0x9A84, 0x9A85, 0x9A86, 0x9A87, 0x9A88, 0x9A89, 0x9A8A, + 0x9A8B, 0x9A8C, 0x9A8D, 0x9A8E, 0x9A8F, 0x9A90, 0x9A91, 0x9A92, + 0x9A93, 0x9A94, 0x9A95, 0x9A96, 0x9A97, 0x9A98, 0x9A99, 0x9A9A, + 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9E, 0x9A9F, 0x9AA0, 0x9AA1, 0x9AA2, + 0x9AA3, 0x9AA4, 0x9AA5, 0x9AA6, 0x9AA7, 0x9ACB, 0x9ACC, 0x9B13, + 0x9B47, 0x9C7C, 0x9C7D, 0x9C7E, 0x9C7F, 0x9C80, 0x9C81, 0x9C82, + 0x9C83, 0x9C84, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x9C89, 0x9C8A, + 0x9C8B, 0x9C8C, 0x9C8D, 0x9C8E, 0x9C8F, 0x9C90, 0x9C91, 0x9C92, + 0x9C93, 0x9C94, 0x9C95, 0x9C96, 0x9C97, 0x9C98, 0x9C99, 0x9C9A, + 0x9C9B, 0x9C9C, 0x9C9D, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, + 0x9CA3, 0x9CA4, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAA, + 0x9CAB, 0x9CAC, 0x9CAD, 0x9CAE, 0x9CAF, 0x9CB0, 0x9CB1, 0x9CB2, + 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CB8, 0x9CB9, 0x9CBA, + 0x9CBB, 0x9CBC, 0x9CBD, 0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, + 0x9CC3, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CC8, 0x9CC9, 0x9CCA, + 0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD1, 0x9CD2, +plane 22 +at 0x00 + 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD6, 0x9CD7, 0x9CD8, 0x9CD9, 0x5263, + 0x5253, 0x52CF, 0x52CE, 0x52D0, 0x52D1, 0x52CC, 0x550D, 0x54F4, + 0x5513, 0x54EF, 0x54F5, 0x54F9, 0x5502, 0x5500, 0x5518, 0x54F0, + 0x54F6, 0x5519, 0x5705, 0x57C9, 0x57B7, 0x57CD, 0x57BE, 0x57BB, + 0x57DB, 0x57C8, 0x57C4, 0x57C5, 0x57D1, 0x57CA, 0x57C0, 0x5A21, + 0x9CDA, 0x9CDB, 0x9CDC, 0x9CDD, 0x9CDE, 0x9CDF, 0x9CE0, 0x9CE1, + 0x9CE2, 0x9CE3, 0x9CE4, 0x9E1F, 0x9E20, 0x9E21, 0x9E22, 0x9E23, + 0x9E24, 0x9E25, 0x9E26, 0x9E27, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, + 0x9E2C, 0x9E2D, 0x9E2E, 0x9E2F, 0x9E30, 0x9E31, 0x9E32, 0x9E33, + 0x9E34, 0x9E35, 0x9E36, 0x9E37, 0x9E38, 0x9E39, 0x9E3A, 0x9E3B, + 0x9E3C, 0x9E3D, 0x9E3E, 0x9E3F, 0x9E40, 0x9E41, 0x9E42, 0x9E43, + 0x9E44, 0x9E45, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4A, 0x9E4B, + 0x9E4C, 0x9E4D, 0x9E4E, 0x9E4F, 0x9E50, 0x9E51, 0x9E52, 0x9E53, + 0x9E54, 0x9E55, 0x9E56, 0x9E57, 0x9E58, 0x9E59, 0x9E5A, 0x9E5B, + 0x9E5C, 0x9E5D, 0x9E5E, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, 0x9E63, + 0x9E64, 0x9E65, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, + 0x9E6C, 0x9E6D, 0x9E6E, 0x9E6F, 0x9E70, 0x9E71, 0x9E72, 0x9E73, + 0x9E74, 0x9E7E, 0x9EC9, 0x9EE1, 0x9EE9, 0x9EEA, 0x9F0B, 0x9F0C, + 0x9F0D, 0x9F51, 0x9F7F, 0x9F80, 0x9F81, 0x9F82, 0x9F83, 0x9F84, + 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, 0x9F8B, 0x9F8C, + 0x9F9A, 0x9F9B, 0x9F9F, 0x4E06, 0x4E37, 0x4E44, 0x4E4A, 0x4E55, + 0x4E5B, 0x4E64, 0x4E65, 0x4E67, 0x4E6B, 0x4E6C, 0x4E6D, 0x4E6E, + 0x4E6F, 0x4E72, 0x4E76, 0x4E77, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, + 0x4E8A, 0x4E90, 0x4EBD, 0x4ED2, 0x4EED, 0x4FA4, 0x4FAD, 0x503B, + 0x50F2, 0x516F, 0x517A, 0x51E6, 0x51E7, 0x5A2A, 0x5A1D, 0x5A0B, + 0x5A22, 0x5A24, 0x5A14, 0x5A31, 0x5A2F, 0x5A1A, 0x5A12, 0x5A26, + 0x5BBC, 0x5BBB, 0x5BB7, 0x5C05, 0x5C06, 0x5C52, 0x5C53, 0x5CFA, + 0x5CEB, 0x5CF3, 0x5CF5, 0x5CE9, 0x5CEF, 0x5E2A, 0x5E30, 0x5E2E, + 0x5E2C, 0x5E2F, 0x5EAF, 0x5EA9, 0x5EFD, 0x5F32, 0x51E9, 0x5271, + 0x5302, 0x5381, 0x5391, 0x53BC, 0x5414, 0x5455, 0x54D8, 0x54DB, + 0x551C, 0x551F, 0x5569, 0x55B8, 0x55BD, 0x55ED, 0x561A, 0x565B, + 0x56A2, 0x56CE, 0x56D5, 0x5726, 0x5737, 0x5738, 0x5786, 0x5789, +plane 23 +at 0x00 + 0x57B0, 0x57B3, 0x57D6, 0x5815, 0x5841, 0x586E, 0x5870, 0x58B8, + 0x58B9, 0x58CC, 0x58D7, 0x58E5, 0x58ED, 0x591E, 0x593B, 0x5B36, + 0x5B5E, 0x5B91, 0x5BC9, 0x5C02, 0x5C26, 0x5C2E, 0x5C32, 0x5C76, + 0x5CBC, 0x5CBE, 0x5CC5, 0x5CE0, 0x5D2B, 0x5D5C, 0x5D76, 0x5DEA, + 0x5DEC, 0x5DED, 0x5DFC, 0x5E49, 0x5EE4, 0x5F09, 0x5F16, 0x5F45, + 0x5FC6, 0x603A, 0x603E, 0x6077, 0x6184, 0x61F4, 0x6244, 0x6255, + 0x6256, 0x62E5, 0x6318, 0x6327, 0x63B4, 0x63B5, 0x63BB, 0x6442, + 0x655B, 0x657D, 0x657E, 0x65C0, 0x65D5, 0x663F, 0x6683, 0x66FB, + 0x66FD, 0x6730, 0x6741, 0x6763, 0x6764, 0x67A0, 0x67A9, 0x6802, + 0x6803, 0x680D, 0x685B, 0x685C, 0x685D, 0x685F, 0x6863, 0x6867, + 0x688D, 0x68BA, 0x68BB, 0x68BC, 0x68C2, 0x6919, 0x691A, 0x6921, + 0x6922, 0x6923, 0x6926, 0x6928, 0x697E, 0x6981, 0x698B, 0x69DD, + 0x69DE, 0x6A2E, 0x6A30, 0x6A73, 0x6A74, 0x6A75, 0x6A7B, 0x6AC9, + 0x6AE4, 0x6AF7, 0x6B05, 0x6B1F, 0x6BA9, 0x6BB1, 0x6BDF, 0x6BEE, + 0x6C0E, 0x6C17, 0x6C35, 0x6C3A, 0x6C3D, 0x6D4C, 0x6D9C, 0x6D9E, + 0x6E13, 0x6E7F, 0x6E8C, 0x6EDE, 0x6FF9, 0x704E, 0x7050, 0x7114, + 0x713C, 0x713E, 0x7155, 0x5F8E, 0x5F93, 0x5F8F, 0x604F, 0x6099, + 0x607E, 0x6074, 0x604B, 0x6073, 0x6075, 0x6056, 0x60A9, 0x608B, + 0x60A6, 0x6093, 0x60AE, 0x609E, 0x60A7, 0x6245, 0x632E, 0x6352, + 0x6330, 0x635B, 0x6319, 0x631B, 0x6331, 0x635D, 0x6337, 0x6335, + 0x6353, 0x635C, 0x633F, 0x654B, 0x7173, 0x71F6, 0x7233, 0x725C, + 0x72A0, 0x731F, 0x7320, 0x7339, 0x7363, 0x7364, 0x73F1, 0x7411, + 0x748F, 0x7491, 0x74E7, 0x74F0, 0x74F1, 0x74F2, 0x74FC, 0x7505, + 0x753C, 0x7552, 0x7560, 0x7569, 0x7573, 0x7574, 0x7582, 0x7597, + 0x75E9, 0x7604, 0x7606, 0x764D, 0x767A, 0x770C, 0x77C8, 0x783A, + 0x783C, 0x783F, 0x7872, 0x7873, 0x7874, 0x78B5, 0x78B6, 0x78F5, + 0x7916, 0x7934, 0x793B, 0x7985, 0x79F4, 0x79FD, 0x7A24, 0x7A43, + 0x7A5D, 0x7A63, 0x7AC3, 0x7B02, 0x7B07, 0x7B5D, 0x7B7A, 0x7B7D, + 0x7B9A, 0x7BAA, 0x7BCF, 0x7BD2, 0x7C13, 0x7C14, 0x7C17, 0x7C31, + 0x7C61, 0x7C82, 0x7C8F, 0x7C90, 0x7CAD, 0x7CD8, 0x7D26, 0x7D9A, + 0x7D9B, 0x7DD5, 0x7E05, 0x7E28, 0x7E4A, 0x7E4B, 0x7E67, 0x7E83, + 0x7E90, 0x7F53, 0x7FAA, 0x8062, 0x810B, 0x8133, 0x8135, 0x8157, +plane 24 +at 0x00 + 0x81A4, 0x81D3, 0x8217, 0x822E, 0x824D, 0x825D, 0x8260, 0x827A, + 0x82C6, 0x83B1, 0x83B5, 0x83BB, 0x8419, 0x8420, 0x8422, 0x8485, + 0x848A, 0x848B, 0x84D9, 0x84DC, 0x8536, 0x85AD, 0x85AE, 0x8612, + 0x8630, 0x8644, 0x86AB, 0x86CD, 0x86CE, 0x86EF, 0x8749, 0x874B, + 0x877F, 0x87A6, 0x87A7, 0x87D0, 0x8864, 0x88AE, 0x88B0, 0x88C3, + 0x88C4, 0x88C5, 0x8904, 0x891C, 0x891D, 0x8945, 0x8968, 0x8977, + 0x8A33, 0x8A89, 0x8AAD, 0x8AAE, 0x8ADA, 0x8B21, 0x8B5B, 0x8B72, + 0x8B8F, 0x8CCE, 0x8DE5, 0x8DF5, 0x8E7D, 0x8E9B, 0x8EB5, 0x8EBB, + 0x8EC5, 0x658B, 0x659A, 0x6650, 0x6646, 0x664E, 0x6640, 0x664B, + 0x6648, 0x6660, 0x6644, 0x664D, 0x6837, 0x6824, 0x681B, 0x6836, + 0x682C, 0x6819, 0x6856, 0x6847, 0x683E, 0x681E, 0x6815, 0x6822, + 0x6827, 0x6859, 0x6858, 0x6855, 0x6830, 0x6823, 0x6B2E, 0x6B2B, + 0x6B30, 0x6B6C, 0x8EC8, 0x8EE2, 0x8EE3, 0x8F0C, 0x8F4C, 0x8FBA, + 0x8FDA, 0x8FF2, 0x9027, 0x9039, 0x9056, 0x9065, 0x915B, 0x9197, + 0x91A4, 0x91B8, 0x91C8, 0x91E1, 0x91FB, 0x91FC, 0x9228, 0x9229, + 0x922C, 0x9271, 0x9344, 0x93BA, 0x9421, 0x9441, 0x9453, 0x958A, + 0x95AA, 0x95CF, 0x9665, 0x9666, 0x967A, 0x974C, 0x974E, 0x974F, + 0x9771, 0x9786, 0x9790, 0x982C, 0x98AA, 0x98B4, 0x98C5, 0x98EE, + 0x99C5, 0x99F2, 0x9A12, 0x9A13, 0x9A28, 0x9AC5, 0x9B36, 0x9B5E, + 0x9B78, 0x9B97, 0x9BB2, 0x9BB4, 0x9BCE, 0x9BD0, 0x9BD1, 0x9BF1, + 0x9BF2, 0x9BF5, 0x9C18, 0x9C19, 0x9C1A, 0x9C30, 0x9C5A, 0x9C5B, + 0x9C5C, 0x9C69, 0x9C6A, 0x9C6B, 0x9C70, 0x9CF0, 0x9D0E, 0x9D2B, + 0x9D2C, 0x9D46, 0x9D48, 0x9D65, 0x9D8E, 0x9D8F, 0x9DAB, 0x9DC6, + 0x9E78, 0x9EB8, 0x9EB9, 0x9EBA, 0x9F21, 0x9F62, 0, 0, + 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2027, 0xFF1B, 0xFF1A, + 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFE51, 0xFE52, + 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2015, 0xFE31, + 0x2014, 0xFE33, 0x2574, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, + 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, + 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, + 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, + 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, 0x6B8B, +plane 25 +at 0x00 + 0x6BE9, 0x6BEA, 0x6BE5, 0x6D6B, 0x6D73, 0x6D57, 0x6D5D, 0x6D56, + 0x6D8F, 0x6D5B, 0x6D1C, 0x6D9A, 0x6D9B, 0x6D99, 0x6D81, 0x6D71, + 0x6D72, 0x6D5C, 0x6D96, 0x70C4, 0x70DB, 0x70CC, 0x70D0, 0x70E3, + 0x70DF, 0x70D6, 0x70EE, 0x70D5, 0x727A, 0x72F5, 0x7302, 0x73E2, + 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, 0x201D, + 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, 0x203B, + 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, 0x2606, + 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, 0x32A3, + 0x2105, 0x203E, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49, 0xFE4A, 0xFE4D, + 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, 0xFF0D, + 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, 0x2266, + 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, 0xFE64, + 0xFE65, 0xFE66, 0xFF5E, 0x2229, 0x222A, 0x22A5, 0x2220, 0x221F, + 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, 0x2640, + 0x2642, 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, + 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F, 0xFF3C, 0x2215, + 0xFE68, 0xFF04, 0xFFE5, 0x3012, 0xFFE0, 0xFFE1, 0xFF05, 0xFF20, + 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, 0x339C, 0x339D, + 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, 0x00B0, 0x5159, + 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, 0x74E9, 0x7CCE, + 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, + 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x253C, + 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, 0x2502, 0x2595, + 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, 0x73EC, 0x73D5, 0x73F9, + 0x73DF, 0x73E6, 0x73E4, 0x73E1, 0x74F3, 0x7556, 0x7555, 0x7558, + 0x7557, 0x755E, 0x75C3, 0x75B4, 0x75B1, 0x76CB, 0x76CC, 0x772A, + 0x7716, 0x770F, 0x773F, 0x772B, 0x770E, 0x7724, 0x7721, 0x7718, + 0x77DD, 0x7824, 0x7836, 0x7958, 0x7959, 0x7962, 0x256E, 0x2570, + 0x256F, 0x2501, 0x251D, 0x253F, 0x2525, 0x25E2, 0x25E3, 0x25E5, + 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10, 0xFF11, 0xFF12, 0xFF13, + 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x2160, 0x2161, + 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, +plane 26 +at 0x00 + 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, + 0x3029, 0x5341, 0x5344, 0x5345, 0xFF21, 0xFF22, 0xFF23, 0xFF24, + 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, + 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, + 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF41, 0xFF42, + 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, + 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, + 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, + 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, + 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, + 0x310D, 0x310E, 0x310F, 0x79DA, 0x79D9, 0x79E1, 0x79E5, 0x79E8, + 0x79DB, 0x79E2, 0x79F0, 0x7ADA, 0x7ADD, 0x7ADB, 0x7ADC, 0x7B0D, + 0x7B0B, 0x7B14, 0x7C8E, 0x7C86, 0x7C87, 0x7C83, 0x7C8B, 0x7D24, + 0x7D25, 0x7F62, 0x7F93, 0x7F99, 0x7F97, 0x7FC4, 0x7FC6, 0x800A, + 0x8040, 0x803C, 0x803B, 0x80F6, 0x3110, 0x3111, 0x3112, 0x3113, + 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, + 0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, + 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, + 0x02CA, 0x02C7, 0x02CB, 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, + 0x2405, 0x2406, 0x2407, 0x2408, 0x2409, 0x240A, 0x240B, 0x240C, + 0x240D, 0x240E, 0x240F, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, + 0x2415, 0x2416, 0x2417, 0x2418, 0x2419, 0x241A, 0x241B, 0x241C, + 0x241D, 0x241E, 0x241F, 0x2421, 0x532C, 0x5359, 0x5368, 0x537E, + 0x53A1, 0x555B, 0x5542, 0x5547, 0x553D, 0x5560, 0x57EB, 0x595F, + 0x5B6F, 0x5C5A, 0x5FA2, 0x5F9D, 0x5FA3, 0x60C2, 0x60A5, 0x621C, + 0x621D, 0x6395, 0x639A, 0x63A6, 0x6550, 0x6552, 0x65C8, 0x6658, + 0x6888, 0x6BB8, 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, +plane 27 +at 0x00 + 0x4E86, 0x4E8C, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, + 0x5201, 0x529B, 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, + 0x4E08, 0x4E0A, 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, + 0x4E5E, 0x4E8E, 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, + 0x53E3, 0x571F, 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, + 0x5B53, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, + 0x5DF1, 0x5DF2, 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, + 0x624D, 0x80FF, 0x80EE, 0x8104, 0x8103, 0x8107, 0x80F7, 0x822D, + 0x8227, 0x8229, 0x831F, 0x8357, 0x8321, 0x8318, 0x8358, 0x8684, + 0x869F, 0x869B, 0x8689, 0x86A6, 0x8692, 0x868F, 0x86A0, 0x884F, + 0x8878, 0x887A, 0x886E, 0x887B, 0x8884, 0x8873, 0x8A0D, 0x8A0B, + 0x8A19, 0x8ED0, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, + 0x4E4B, 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, + 0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, + 0x4EC4, 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197, + 0x51F6, 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316, + 0x5339, 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA, + 0x53CD, 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11, + 0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, + 0x5FC3, 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, + 0x65A4, 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, + 0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, + 0x7236, 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19, + 0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, + 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, + 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9, + 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317, + 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E, + 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8, + 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1, + 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, 0x8FF9, + 0x9009, 0x9008, 0x90DE, 0x9151, 0x91DB, 0x91DF, 0x91DE, 0x91D6, +plane 28 +at 0x00 + 0x91E0, 0x9585, 0x9660, 0x9659, 0x9656, 0x96BD, 0x5042, 0x5059, + 0x5044, 0x5066, 0x5052, 0x5054, 0x5071, 0x5050, 0x507B, 0x507C, + 0x5058, 0x5079, 0x506C, 0x5078, 0x51A8, 0x51D1, 0x51CF, 0x5268, + 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, 0x5DE8, + 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, 0x5F18, + 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, 0x65A5, + 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, 0x6BCD, + 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, 0x7384, + 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, 0x7530, + 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, 0x76EE, + 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, 0x4E1E, + 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, 0x4EA5, + 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, 0x4F11, + 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, 0x4F01, + 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0x5171, 0x518D, + 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216, 0x52A3, 0x5308, + 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F, 0x540C, 0x540A, + 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D, 0x5408, 0x5403, + 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, 0x5733, 0x5730, + 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, 0x5919, 0x591A, 0x5937, + 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, 0x5979, 0x5982, 0x5981, + 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, 0x5BFA, 0x5C16, + 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, 0x5276, 0x52D4, 0x53A0, + 0x53C4, 0x5558, 0x554C, 0x5568, 0x5549, 0x555D, 0x5529, 0x5554, + 0x5553, 0x555A, 0x553A, 0x553F, 0x552B, 0x57EA, 0x57EF, 0x57DD, + 0x57FE, 0x57DE, 0x57E6, 0x57E8, 0x57FF, 0x5803, 0x58F7, 0x68A6, + 0x591F, 0x595B, 0x595D, 0x595E, 0x5A2B, 0x5A3B, 0x5F0F, 0x5F1B, + 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, 0x6210, 0x6263, 0x625B, + 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, 0x65ED, 0x66F2, 0x66F3, + 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, 0x6B21, 0x6B64, 0x6B7B, + 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, 0x6C60, 0x6C50, 0x6C55, + 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070, 0x725F, 0x725D, 0x767E, +plane 29 +at 0x00 + 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, 0x8001, 0x8003, + 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x808B, 0x808C, 0x81E3, + 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, + 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, 0x897F, 0x9621, 0x4E32, + 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, 0x4F5E, 0x4F34, 0x4F5B, + 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, 0x4F3A, 0x4F38, 0x4F43, + 0x4F54, 0x4F3C, 0x4F46, 0x4F63, 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, + 0x4F36, 0x4F59, 0x4F5D, 0x4F48, 0x4F5A, 0x514C, 0x514B, 0x514D, + 0x5175, 0x51B6, 0x51B7, 0x5225, 0x5224, 0x5229, 0x522A, 0x5228, + 0x52AB, 0x52A9, 0x52AA, 0x52AC, 0x5323, 0x5373, 0x5375, 0x541D, + 0x542D, 0x541E, 0x543E, 0x5426, 0x544E, 0x5427, 0x5446, 0x5443, + 0x5433, 0x5448, 0x5442, 0x541B, 0x5429, 0x544A, 0x5439, 0x543B, + 0x5438, 0x542E, 0x5435, 0x5436, 0x5420, 0x543C, 0x5440, 0x5431, + 0x542B, 0x541F, 0x542C, 0x56EA, 0x56F0, 0x56E4, 0x56EB, 0x574A, + 0x5751, 0x5740, 0x574D, 0x5A61, 0x5A3A, 0x5A6E, 0x5A4B, 0x5A6B, + 0x5A45, 0x5A4E, 0x5A68, 0x5A3D, 0x5A71, 0x5A3F, 0x5A6F, 0x5A75, + 0x5A73, 0x5A2C, 0x5A59, 0x5A54, 0x5A4F, 0x5A63, 0x5BC8, 0x5BC3, + 0x5C5B, 0x5C61, 0x5D21, 0x5D0A, 0x5D09, 0x5D2C, 0x5D08, 0x5D2A, + 0x5D15, 0x5D10, 0x5D13, 0x5D2F, 0x5747, 0x574E, 0x573E, 0x5750, + 0x574F, 0x573B, 0x58EF, 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, + 0x59A3, 0x5999, 0x5996, 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, + 0x5B5D, 0x5B5C, 0x5B5A, 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, + 0x5C40, 0x5C41, 0x5C3F, 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, + 0x5DEB, 0x5E0C, 0x5E8F, 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, + 0x5F64, 0x5F62, 0x5F77, 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, + 0x5FF1, 0x5FEB, 0x5FF8, 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, + 0x6296, 0x6280, 0x6276, 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, + 0x6279, 0x6273, 0x6292, 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, + 0x6291, 0x6286, 0x6539, 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, + 0x674E, 0x674F, 0x6750, 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, + 0x6746, 0x6760, 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, + 0x6C99, 0x6C81, 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, +plane 30 +at 0x00 + 0x6C90, 0x6C70, 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, + 0x6C72, 0x6C7E, 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, + 0x6C82, 0x7076, 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, + 0x72C4, 0x72C2, 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, + 0x76EF, 0x77E3, 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, + 0x8096, 0x8093, 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, + 0x8292, 0x5D18, 0x5DE3, 0x5E39, 0x5E35, 0x5E3A, 0x5E32, 0x5EBB, + 0x5EBA, 0x5F34, 0x5F39, 0x6098, 0x60D0, 0x60D7, 0x60AA, 0x60A1, + 0x60A4, 0x60EE, 0x60E7, 0x60E8, 0x60DE, 0x637E, 0x638B, 0x6379, + 0x6386, 0x6393, 0x6373, 0x636A, 0x636C, 0x637F, 0x63B2, 0x63BA, + 0x6366, 0x6374, 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, + 0x8C46, 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, + 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, + 0x90A2, 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, + 0x962E, 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, + 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, + 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, + 0x4F88, 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, + 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, + 0x51FD, 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, + 0x5241, 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, + 0x5377, 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475, + 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492, + 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462, + 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, + 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, + 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, + 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, + 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, + 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, 0x655A, + 0x654E, 0x654D, 0x658D, 0x658E, 0x65AD, 0x65C7, 0x65CA, 0x65C9, + 0x65E3, 0x6657, 0x6663, 0x6667, 0x671A, 0x6719, 0x6716, 0x689E, +plane 31 +at 0x00 + 0x68B6, 0x6898, 0x6873, 0x689A, 0x688E, 0x68B7, 0x68DB, 0x68A5, + 0x686C, 0x68C1, 0x6884, 0x6895, 0x687A, 0x6899, 0x68B8, 0x68B9, + 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1, 0x5CB3, + 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, 0x5E9A, + 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, 0x5F29, + 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, 0x5FF5, + 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, 0x6015, + 0x6021, 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, 0x623F, + 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF, 0x62C2, + 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB, 0x62C8, + 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD, 0x62B5, + 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC, 0x62CE, + 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, 0x6606, + 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A, 0x6607, 0x670D, + 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, 0x6773, 0x6777, + 0x6787, 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, 0x6789, 0x677E, + 0x6790, 0x6775, 0x679A, 0x6793, 0x677C, 0x676A, 0x6772, 0x6B23, + 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3, 0x6CE8, 0x6CF3, + 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE, 0x6CBC, 0x6CE2, + 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9, 0x6CC1, 0x6CAE, + 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, 0x6CDB, 0x6CCA, + 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, 0x6870, 0x6B35, 0x6B90, + 0x6BBB, 0x6BED, 0x6DC1, 0x6DC3, 0x6DCE, 0x6DAD, 0x6E04, 0x6DB9, + 0x6DE7, 0x6E08, 0x6E06, 0x6E0A, 0x6DB0, 0x6DF8, 0x6E0C, 0x6DB1, + 0x6E02, 0x6E07, 0x6E09, 0x6E01, 0x6E17, 0x6DFF, 0x6E12, 0x7103, + 0x7107, 0x7101, 0x70F5, 0x70F1, 0x7108, 0x70F2, 0x7095, 0x708E, + 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, 0x7238, 0x7248, 0x7267, + 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, 0x72D0, 0x73A9, 0x73A8, + 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, 0x7599, 0x759A, 0x7684, + 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, 0x793E, 0x7940, 0x7941, + 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, 0x7CFE, 0x7F54, 0x7F8C, + 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, 0x80B1, 0x80A1, 0x80AB, +plane 32 +at 0x00 + 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, 0x81FE, 0x820D, 0x82B3, + 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, 0x82B9, 0x82B1, 0x82AC, + 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, 0x82BE, 0x82B7, 0x864E, + 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, 0x8FD4, 0x8FD1, 0x90B5, + 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, 0x9577, 0x9580, 0x961C, + 0x9640, 0x963F, 0x963B, 0x9644, 0x9642, 0x96B9, 0x96E8, 0x9752, + 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, + 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, + 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, + 0x4FDE, 0x4FB7, 0x5157, 0x5192, 0x5191, 0x51A0, 0x524E, 0x5243, + 0x524A, 0x524D, 0x524C, 0x524B, 0x5247, 0x52C7, 0x52C9, 0x52C3, + 0x52C1, 0x530D, 0x5357, 0x537B, 0x539A, 0x53DB, 0x54AC, 0x54C0, + 0x54A8, 0x54CE, 0x54C9, 0x54B8, 0x54A6, 0x54B3, 0x54C7, 0x54C2, + 0x54BD, 0x54AA, 0x54C1, 0x710F, 0x70FE, 0x731A, 0x7310, 0x730E, + 0x7402, 0x73F3, 0x73FB, 0x751B, 0x7523, 0x7561, 0x7568, 0x7567, + 0x75D3, 0x7690, 0x76D5, 0x76D7, 0x76D6, 0x7730, 0x7726, 0x7740, + 0x771E, 0x7847, 0x784B, 0x7851, 0x784F, 0x7842, 0x7846, 0x796E, + 0x796C, 0x79F2, 0x79F1, 0x79F5, 0x54C4, 0x54C8, 0x54AF, 0x54AB, + 0x54B1, 0x54BB, 0x54A9, 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, + 0x57A0, 0x57A3, 0x57A2, 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, + 0x594F, 0x594E, 0x5950, 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, + 0x5A03, 0x59E5, 0x59EA, 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, + 0x5BA3, 0x5BA6, 0x5BA4, 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, + 0x5C4D, 0x5C4B, 0x5CD9, 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, + 0x5E7D, 0x5EA0, 0x5EA6, 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, + 0x5F85, 0x5F8A, 0x5F8B, 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, + 0x6020, 0x6025, 0x600E, 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, + 0x6046, 0x6043, 0x606C, 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, + 0x6316, 0x6309, 0x62FC, 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, + 0x62F1, 0x62F7, 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, + 0x653F, 0x6545, 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, + 0x6627, 0x662F, 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, +plane 33 +at 0x00 + 0x67D3, 0x67F1, 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, + 0x67E9, 0x67EF, 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, + 0x67CF, 0x67DE, 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, + 0x6B6A, 0x6B83, 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, + 0x6D0B, 0x6D32, 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, + 0x6D17, 0x79F3, 0x79F9, 0x7A9A, 0x7A93, 0x7A91, 0x7AE1, 0x7B21, + 0x7B1C, 0x7B16, 0x7B17, 0x7B36, 0x7B1F, 0x7C93, 0x7C99, 0x7C9A, + 0x7C9C, 0x7D49, 0x7D34, 0x7D37, 0x7D2D, 0x7D4C, 0x7D48, 0x7F3B, + 0x8008, 0x801A, 0x801D, 0x8049, 0x8045, 0x8044, 0x7C9B, 0x812A, + 0x812E, 0x8131, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, + 0x6D39, 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, + 0x70AB, 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE, + 0x70A4, 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, + 0x73B7, 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, + 0x752D, 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, + 0x75A2, 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, + 0x76C3, 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, + 0x76FC, 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946, + 0x7949, 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB, + 0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00, + 0x7D09, 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8004, + 0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, + 0x80C4, 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, + 0x81F4, 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, + 0x8304, 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, + 0x82DC, 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, + 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, + 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, + 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, 0x811A, + 0x8134, 0x8117, 0x831D, 0x8371, 0x8384, 0x8380, 0x8372, 0x83A1, + 0x8379, 0x8391, 0x839F, 0x83AD, 0x8323, 0x8385, 0x839C, 0x83B7, + 0x8658, 0x865A, 0x8657, 0x86B2, 0x86AE, 0x8845, 0x889C, 0x8894, +plane 34 +at 0x00 + 0x88A3, 0x888F, 0x88A5, 0x88A9, 0x88A6, 0x888A, 0x88A0, 0x8890, + 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, 0x90C3, + 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, 0x964D, + 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, 0x98DB, + 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, 0x5023, + 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, 0x503C, + 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, 0x5028, + 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, 0x502D, + 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, 0x51A2, + 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, 0x525B, + 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, 0x5510, + 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, 0x5514, + 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, 0x54EA, 0x54E6, 0x5527, + 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, 0x57C2, 0x57D4, 0x57CB, + 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, 0x595A, 0x5A11, 0x5A18, + 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, 0x5A20, 0x5A23, 0x5A29, + 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0, 0x5BB3, 0x5BB6, + 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, 0x5C51, 0x5C55, + 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, 0x5CF0, 0x5CF6, + 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, 0x5EAD, 0x5EA7, + 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, 0x8992, 0x8991, 0x8994, + 0x8A26, 0x8A32, 0x8A28, 0x8A1C, 0x8A2B, 0x8A20, 0x8A29, 0x8A21, + 0x8C3A, 0x8C5B, 0x8C58, 0x8C7C, 0x8CA6, 0x8CAE, 0x8CAD, 0x8D65, + 0x8D7E, 0x8D7C, 0x8D7F, 0x8D7A, 0x8DBD, 0x8DC0, 0x8DBB, 0x8EAD, + 0x8EAF, 0x8ED6, 0x8ED9, 0x9012, 0x900E, 0x9025, 0x6063, 0x6065, + 0x6050, 0x6055, 0x606D, 0x6069, 0x606F, 0x6084, 0x609F, 0x609A, + 0x608D, 0x6094, 0x608C, 0x6085, 0x6096, 0x6247, 0x62F3, 0x6308, + 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, 0x6342, 0x6346, 0x634F, + 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, 0x632B, 0x6328, 0x634D, + 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, 0x65C5, 0x6642, 0x6649, + 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, 0x6641, 0x66F8, 0x6714, + 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, +plane 35 +at 0x00 + 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817, 0x684C, 0x6851, 0x683D, + 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843, 0x682A, 0x6845, 0x6813, + 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7, 0x6C23, 0x6C27, 0x6C28, + 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95, 0x6D88, 0x6D87, 0x6D66, + 0x6D78, 0x6D77, 0x6D59, 0x6D93, 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, + 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, 0x6D79, 0x6D85, 0x6D65, 0x6D94, + 0x70CA, 0x70D8, 0x70E4, 0x70D9, 0x70C8, 0x70CF, 0x7239, 0x7279, + 0x72FC, 0x72F9, 0x72FD, 0x72F8, 0x72F7, 0x7386, 0x73ED, 0x7409, + 0x73EE, 0x73E0, 0x73EA, 0x73DE, 0x7554, 0x755D, 0x755C, 0x755A, + 0x7559, 0x75BE, 0x75C5, 0x75C7, 0x75B2, 0x75B3, 0x75BD, 0x75BC, + 0x75B9, 0x75C2, 0x75B8, 0x768B, 0x76B0, 0x76CA, 0x76CD, 0x76CE, + 0x7729, 0x771F, 0x7720, 0x7728, 0x77E9, 0x7830, 0x7827, 0x7838, + 0x781D, 0x7834, 0x7837, 0x9013, 0x90EE, 0x90AB, 0x90F7, 0x9159, + 0x9154, 0x91F2, 0x91F0, 0x91E5, 0x91F6, 0x9587, 0x965A, 0x966E, + 0x9679, 0x98E1, 0x98E6, 0x9EC4, 0x9ED2, 0x4E80, 0x4E81, 0x508F, + 0x5097, 0x5088, 0x5089, 0x5081, 0x5160, 0x5E42, 0x51D3, 0x51D2, + 0x51D6, 0x5273, 0x5270, 0x53A8, 0x7825, 0x782D, 0x7820, 0x781F, + 0x7832, 0x7955, 0x7950, 0x7960, 0x795F, 0x7956, 0x795E, 0x795D, + 0x7957, 0x795A, 0x79E4, 0x79E3, 0x79E7, 0x79DF, 0x79E6, 0x79E9, + 0x79D8, 0x7A84, 0x7A88, 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, + 0x7D17, 0x7D0B, 0x7D0A, 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, + 0x7D1A, 0x7D1C, 0x7D0D, 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, + 0x7FC5, 0x7FC1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, + 0x803F, 0x80F1, 0x8102, 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, + 0x80F8, 0x80F3, 0x8108, 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, + 0x81EC, 0x8200, 0x8210, 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, + 0x832B, 0x8352, 0x8354, 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, + 0x8334, 0x834F, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, + 0x8328, 0x8343, 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, + 0x868C, 0x86A3, 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, + 0x8879, 0x8A18, 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, + 0x8A13, 0x8A16, 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, +plane 36 +at 0x00 + 0x8CA2, 0x8D77, 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, + 0x9006, 0x8FF7, 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, + 0x8FF8, 0x9095, 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, + 0x91D8, 0x91DD, 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, + 0x9661, 0x53A6, 0x53C5, 0x5597, 0x55DE, 0x5596, 0x55B4, 0x5585, + 0x559B, 0x55A0, 0x5559, 0x5586, 0x55AF, 0x557A, 0x559E, 0x55A9, + 0x570F, 0x570E, 0x581A, 0x581F, 0x583C, 0x5818, 0x583E, 0x5826, + 0x583A, 0x5822, 0x58FB, 0x5963, 0x5964, 0x5AA8, 0x5AA3, 0x5A82, + 0x5A88, 0x5AA1, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, + 0x98E2, 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, + 0x507A, 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, + 0x5065, 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, + 0x500F, 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, + 0x52D2, 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, + 0x5340, 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, + 0x555E, 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, + 0x552F, 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, + 0x5541, 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, + 0x5806, 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, + 0x5920, 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40, + 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, + 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, + 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, + 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2, + 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, + 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, + 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3, + 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, 0x5A85, + 0x5A98, 0x5A99, 0x5A89, 0x5A81, 0x5A96, 0x5A80, 0x5A91, 0x5ACF, + 0x5A87, 0x5AA0, 0x5A79, 0x5A86, 0x5AAB, 0x5AAA, 0x5AA4, 0x5A8D, + 0x5A7E, 0x5BD5, 0x5C1E, 0x5C5F, 0x5C5E, 0x5D44, 0x5D3E, 0x5D48, + 0x5D1C, 0x5D5B, 0x5D4D, 0x5D57, 0x5D53, 0x5D4F, 0x5D3B, 0x5D46, +plane 37 +at 0x00 + 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, 0x60C6, + 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, 0x63A0, + 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367, 0x6398, + 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B, 0x63A8, + 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F, 0x6380, + 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551, 0x6559, + 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, 0x659B, + 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, 0x6664, + 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, 0x68AF, + 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, 0x6897, + 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, 0x689D, + 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA, 0x6BEB, 0x6BEC, + 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2, 0x6DE1, 0x6DCC, + 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB, 0x6DAF, 0x6DD1, + 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, 0x6DC5, 0x6DD2, + 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, 0x6DF1, 0x6DEE, + 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, 0x6DE6, 0x70F9, + 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, 0x7281, 0x731C, + 0x731B, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740A, 0x7403, + 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6, 0x5E46, 0x5E47, 0x5E48, + 0x5EC0, 0x5EBD, 0x5EBF, 0x5F11, 0x5F3E, 0x5F3B, 0x5F3A, 0x5FA7, + 0x60EA, 0x6107, 0x6122, 0x610C, 0x60B3, 0x60D6, 0x60D2, 0x60E3, + 0x60E5, 0x60E9, 0x6111, 0x60FD, 0x611E, 0x6120, 0x6121, 0x621E, + 0x63E2, 0x63DE, 0x63E6, 0x63F8, 0x63FE, 0x63C1, 0x74F7, 0x751C, + 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758F, 0x75D4, 0x75D5, + 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, 0x76D2, 0x76DB, 0x7737, + 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, 0x786B, 0x7843, 0x784E, + 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, 0x7A95, 0x7B20, 0x7B28, + 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, 0x7B2E, 0x7C92, 0x7C97, + 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, 0x7D39, 0x7D3C, 0x7D40, + 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, 0x7D32, 0x7D31, 0x7F3D, + 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, 0x801C, 0x804A, 0x8046, +plane 38 +at 0x00 + 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, 0x8130, 0x8124, 0x8202, + 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, 0x839E, 0x8398, 0x8378, + 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, 0x838A, 0x8393, 0x8389, + 0x83A0, 0x8377, 0x837B, 0x837C, 0x8386, 0x83A7, 0x8655, 0x5F6A, + 0x86C7, 0x86C0, 0x86B6, 0x86C4, 0x86B5, 0x86C6, 0x86CB, 0x86B1, + 0x86AF, 0x86C9, 0x8853, 0x889E, 0x8888, 0x88AB, 0x8892, 0x8896, + 0x888D, 0x888B, 0x8993, 0x898F, 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, + 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, + 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, + 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, 0x900D, 0x901A, 0x9017, 0x9023, + 0x901F, 0x901D, 0x9010, 0x9015, 0x901E, 0x9020, 0x900F, 0x9022, + 0x9016, 0x901B, 0x9014, 0x63BF, 0x63F7, 0x63D1, 0x655F, 0x6560, + 0x6561, 0x65D1, 0x667D, 0x666B, 0x667F, 0x6673, 0x6681, 0x666D, + 0x6669, 0x671E, 0x68ED, 0x6903, 0x68FE, 0x68E5, 0x691E, 0x6902, + 0x6909, 0x68CA, 0x6900, 0x6901, 0x6918, 0x68E2, 0x68CF, 0x692E, + 0x68C5, 0x68FF, 0x691C, 0x68C3, 0x90E8, 0x90ED, 0x90FD, 0x9157, + 0x91CE, 0x91F5, 0x91E6, 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, + 0x966A, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, + 0x966C, 0x96C0, 0x96EA, 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, + 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, + 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, + 0x51F1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, + 0x535A, 0x53A5, 0x557B, 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, + 0x5598, 0x5582, 0x559C, 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, + 0x55B3, 0x55AE, 0x559F, 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, + 0x55B1, 0x557E, 0x5589, 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, + 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, + 0x58FA, 0x5960, 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, + 0x5B73, 0x5B71, 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, + 0x5C31, 0x5D4C, 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, + 0x5E40, 0x5E43, 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, + 0x5F6D, 0x5FA9, 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, +plane 39 +at 0x00 + 0x60E0, 0x611C, 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, + 0x6168, 0x60F1, 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, + 0x6249, 0x63A3, 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, + 0x63CD, 0x6B6F, 0x6B6E, 0x6BBE, 0x6BF4, 0x6C2D, 0x6DB6, 0x6E75, + 0x6E1E, 0x6E18, 0x6E48, 0x6E4F, 0x6E42, 0x6E6A, 0x6E70, 0x6DFE, + 0x6E6D, 0x6E7B, 0x6E7E, 0x6E59, 0x6E57, 0x6E80, 0x6E50, 0x6E29, + 0x6E76, 0x6E2A, 0x6E4C, 0x712A, 0x7135, 0x712C, 0x7137, 0x711D, + 0x7138, 0x7134, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, + 0x63EE, 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, + 0x655E, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, + 0x6670, 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, + 0x66FE, 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8, + 0x68D7, 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2, + 0x68F2, 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9, + 0x68DA, 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, + 0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, + 0x6E21, 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, + 0x6E5B, 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, + 0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, + 0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F, + 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C, + 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A, + 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F, + 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2, + 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C, + 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C, + 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, 0x712B, + 0x7133, 0x7127, 0x7124, 0x712D, 0x7232, 0x7283, 0x7282, 0x7287, + 0x7306, 0x7324, 0x7338, 0x732A, 0x732C, 0x732B, 0x732F, 0x7328, + 0x7417, 0x7419, 0x7438, 0x741F, 0x7414, 0x743C, 0x73F7, 0x741C, + 0x7415, 0x7418, 0x7439, 0x74F9, 0x7524, 0x756E, 0x756D, 0x7571, + 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, 0x7B50, +plane 40 +at 0x00 + 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, 0x7CA5, + 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, 0x7D61, + 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, 0x800B, + 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, 0x8139, + 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, 0x83E9, + 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, 0x83EF, + 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, 0x83FD, + 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, 0x83D4, + 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, 0x86E4, + 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, 0x8996, + 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41, 0x8A54, 0x8A5B, + 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, 0x8C61, 0x8C82, + 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, 0x8CC0, 0x8CB4, + 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, 0x8D81, 0x8DCE, + 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, 0x8DC6, 0x8EFB, + 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, 0x9038, 0x9032, + 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, 0x9165, 0x91CF, + 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, 0x920D, 0x9210, 0x9207, + 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, 0x758E, 0x75E5, 0x7694, + 0x76B3, 0x76D9, 0x7748, 0x7749, 0x7743, 0x7742, 0x77DF, 0x7863, + 0x7876, 0x785F, 0x7866, 0x7966, 0x7971, 0x7976, 0x7984, 0x7975, + 0x79FF, 0x7A07, 0x7A0E, 0x7A09, 0x7AE7, 0x7AE2, 0x7B55, 0x7B43, + 0x7B57, 0x7B6C, 0x7B42, 0x7B53, 0x7B41, 0x7CA0, 0x9593, 0x9592, + 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, 0x9685, 0x9686, 0x968D, + 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, 0x96C6, 0x96C7, 0x96EF, + 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, 0x98E7, 0x98EA, 0x98EF, + 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, 0x9EC3, 0x9ECD, 0x9ED1, + 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3, 0x50C5, 0x50BE, 0x50AC, + 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F, 0x5277, 0x527D, 0x52DF, + 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F, 0x55DF, 0x55E8, 0x55D3, + 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1, 0x55E3, 0x55E4, 0x55EF, + 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, 0x55C9, 0x5712, 0x5713, +plane 41 +at 0x00 + 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, 0x5854, 0x586B, 0x584C, + 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, 0x5967, 0x5AC1, 0x5AC9, + 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, + 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, + 0x5FAE, 0x611A, 0x610F, 0x6148, 0x611F, 0x60F3, 0x611B, 0x60F9, + 0x6101, 0x6108, 0x614E, 0x614C, 0x6144, 0x614D, 0x613E, 0x6134, + 0x6127, 0x610D, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643E, + 0x641E, 0x642A, 0x642D, 0x643D, 0x642C, 0x640F, 0x641C, 0x6414, + 0x640D, 0x6436, 0x6416, 0x6417, 0x6406, 0x656C, 0x659F, 0x65B0, + 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668D, + 0x6703, 0x6994, 0x696D, 0x7CA6, 0x7CA4, 0x7D74, 0x7D59, 0x7D60, + 0x7D57, 0x7D6C, 0x7D7E, 0x7D64, 0x7D5A, 0x7D5D, 0x7D76, 0x7D4D, + 0x7D75, 0x7FD3, 0x7FD6, 0x8060, 0x804E, 0x8145, 0x813B, 0x8148, + 0x8142, 0x8149, 0x8140, 0x8114, 0x8141, 0x81EF, 0x81F6, 0x8203, + 0x83ED, 0x83DA, 0x8418, 0x83D2, 0x695A, 0x6977, 0x6960, 0x6954, + 0x6975, 0x6930, 0x6982, 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, + 0x6979, 0x6986, 0x695D, 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, + 0x6BBF, 0x6BD3, 0x6BFD, 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, + 0x6E90, 0x6E9D, 0x6EC7, 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, + 0x6EAB, 0x6ED1, 0x6E96, 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, + 0x6EB4, 0x714E, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, + 0x716C, 0x7166, 0x714C, 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, + 0x723A, 0x7252, 0x7337, 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, + 0x7455, 0x745F, 0x745E, 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, + 0x7576, 0x7578, 0x7600, 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, + 0x75FF, 0x75F4, 0x75F3, 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, + 0x775E, 0x7763, 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, + 0x7762, 0x77EE, 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, + 0x787C, 0x7891, 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, + 0x79BD, 0x7A1C, 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, + 0x7AA0, 0x7B77, 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, + 0x7CB5, 0x7D93, 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, +plane 42 +at 0x00 + 0x7F69, 0x7F6A, 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, + 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, + 0x816B, 0x8408, 0x8400, 0x8417, 0x8346, 0x8414, 0x83D3, 0x8405, + 0x841F, 0x8402, 0x8416, 0x83CD, 0x83E6, 0x865D, 0x86D5, 0x86E1, + 0x86EE, 0x8847, 0x8846, 0x88BB, 0x88BF, 0x88B4, 0x88B5, 0x899A, + 0x8A43, 0x8A5A, 0x8A35, 0x8A38, 0x8A42, 0x8A49, 0x8A5D, 0x8A4B, + 0x8A3D, 0x8C60, 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, + 0x8477, 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, + 0x845B, 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, + 0x865E, 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, + 0x86FE, 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, + 0x88D4, 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, + 0x88D2, 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, + 0x8A70, 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, + 0x8A62, 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, + 0x8C8A, 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, + 0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, + 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, + 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C, + 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E, + 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237, + 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, + 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, + 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, + 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, + 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, 0x8C5E, + 0x8C7F, 0x8C7E, 0x8C83, 0x8CB1, 0x8D87, 0x8D88, 0x8D83, 0x8D86, + 0x8D8B, 0x8D82, 0x8DCA, 0x8DD2, 0x8DD4, 0x8DC9, 0x8EB0, 0x8EF2, + 0x8EE4, 0x8EF3, 0x8EEA, 0x8EFD, 0x8F9D, 0x902B, 0x902A, 0x9028, + 0x9029, 0x902C, 0x903A, 0x9030, 0x9037, 0x903B, 0x910A, 0x91FE, + 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9, 0x9E82, + 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6, 0x50ED, +plane 43 +at 0x00 + 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, 0x5162, + 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, 0x561B, + 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, 0x55F7, + 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, 0x5875, + 0x587E, 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, 0x58FD, + 0x5925, 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6, 0x5AE9, + 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7, 0x5BE1, + 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D, 0x5C62, + 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54, 0x5ED3, + 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147, 0x613F, 0x614B, + 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, 0x6175, 0x622A, + 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, 0x647A, 0x6451, + 0x6467, 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, 0x65D7, 0x65D6, + 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995, 0x69C1, 0x69AE, + 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB, 0x69B4, 0x69D0, + 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3, 0x6B49, 0x6B4C, + 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4, 0x6F29, 0x6F3E, + 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, 0x9220, 0x920B, 0x9218, + 0x9222, 0x921B, 0x9208, 0x920E, 0x9213, 0x9595, 0x968C, 0x967B, + 0x967F, 0x9681, 0x9682, 0x96EE, 0x96ED, 0x96EC, 0x975F, 0x976F, + 0x976D, 0x98F0, 0x9AA9, 0x9AE0, 0x4EB7, 0x50CC, 0x50BC, 0x50AA, + 0x50B9, 0x50AB, 0x50C3, 0x50CD, 0x517E, 0x527E, 0x6EFF, 0x6EEF, + 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, 0x6F15, 0x6F2B, 0x6F2F, + 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC, 0x6EF7, 0x7194, + 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, 0x723E, 0x7292, 0x7296, + 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, 0x7470, 0x746D, 0x7504, + 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, 0x7613, 0x76E1, 0x76E3, + 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, 0x789F, 0x78A7, 0x78B3, + 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, 0x7A2E, 0x7A31, 0x7AAA, + 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B, 0x7B75, 0x7B97, + 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, 0x7B84, 0x7CB9, 0x7CBD, + 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE, 0x7DA0, 0x7DCA, +plane 44 +at 0x00 + 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF, 0x7DB5, 0x7DB8, + 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC, 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, + 0x805E, 0x805A, 0x8087, 0x8150, 0x8180, 0x818F, 0x8188, 0x818A, + 0x817F, 0x8182, 0x81E7, 0x81FA, 0x8207, 0x8214, 0x821E, 0x824B, + 0x84C9, 0x84BF, 0x84C6, 0x84C4, 0x8499, 0x849E, 0x84B2, 0x849C, + 0x84CB, 0x84B8, 0x84C0, 0x84D3, 0x8490, 0x84BC, 0x84D1, 0x84CA, + 0x873F, 0x871C, 0x873B, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, + 0x8737, 0x8729, 0x88F3, 0x8902, 0x88F4, 0x88F9, 0x88F8, 0x88FD, + 0x88E8, 0x891A, 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, + 0x8AA1, 0x8A93, 0x8AA4, 0x5279, 0x52E1, 0x52E0, 0x52E7, 0x5380, + 0x53AB, 0x53AA, 0x53A9, 0x53E0, 0x55EA, 0x55D7, 0x55C1, 0x5715, + 0x586C, 0x585C, 0x5850, 0x5861, 0x586A, 0x5869, 0x5856, 0x5860, + 0x5866, 0x585F, 0x5923, 0x5966, 0x5968, 0x5ACE, 0x5AC5, 0x5AC3, + 0x5AD0, 0x5B74, 0x5B76, 0x5BDC, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, + 0x8A91, 0x8A9A, 0x8AA7, 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, + 0x8CD2, 0x8D6B, 0x8D99, 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, + 0x8F13, 0x8FA3, 0x9060, 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, + 0x9062, 0x905D, 0x905B, 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, + 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, + 0x9293, 0x929C, 0x92A8, 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, + 0x95A3, 0x95A5, 0x95A4, 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, + 0x9700, 0x977C, 0x9785, 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, + 0x9903, 0x9905, 0x990C, 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, + 0x9B41, 0x9B42, 0x9CF4, 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, + 0x5104, 0x5100, 0x50FB, 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, + 0x5105, 0x51DC, 0x5287, 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, + 0x53B2, 0x562E, 0x563B, 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, + 0x5653, 0x564E, 0x5657, 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, + 0x589F, 0x589E, 0x58B3, 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, + 0x5B09, 0x5AFB, 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, + 0x5BE9, 0x5BEB, 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, + 0x5E61, 0x5EE2, 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, +plane 45 +at 0x00 + 0x5F71, 0x5FB7, 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, + 0x6182, 0x5BD7, 0x5BDA, 0x5BDB, 0x5C20, 0x5D6D, 0x5D66, 0x5D64, + 0x5D6E, 0x5D60, 0x5F42, 0x5F5A, 0x5F6E, 0x6130, 0x613A, 0x612A, + 0x6143, 0x6119, 0x6131, 0x613D, 0x6408, 0x6432, 0x6438, 0x6431, + 0x6419, 0x6411, 0x6429, 0x641D, 0x643C, 0x6446, 0x6447, 0x643A, + 0x6407, 0x656B, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, + 0x61AB, 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE, 0x622E, + 0x6469, 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490, 0x64B0, + 0x64A5, 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD, 0x64AB, + 0x649A, 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, 0x6578, + 0x66AE, 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, + 0x6A1E, 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, + 0x6A05, 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, + 0x6F3F, 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, + 0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, + 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC, 0x71B1, + 0x71A8, 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B, 0x7483, + 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624, 0x7626, + 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, 0x778C, + 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5, + 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, + 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, + 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, + 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, + 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF, 0x6570, + 0x656D, 0x65E4, 0x6693, 0x668F, 0x6692, 0x668E, 0x6946, 0x6931, + 0x693E, 0x697C, 0x6943, 0x6973, 0x6955, 0x6985, 0x694D, 0x6950, + 0x6947, 0x6967, 0x6936, 0x6964, 0x6961, 0x697D, 0x6B44, 0x6B40, + 0x6B71, 0x6B73, 0x6B9C, 0x6BC1, 0x6BFA, 0x6C31, 0x6C32, 0x6EB8, + 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, 0x8198, + 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, 0x8511, + 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, 0x8782, +plane 46 +at 0x00 + 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, + 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, 0x8913, + 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, 0x8ACB, + 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, 0x8ACD, + 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, 0x8CDE, + 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, 0x8CEA, + 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, 0x8E22, + 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, 0x8F1B, + 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, 0x8F25, 0x9069, + 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, 0x9127, 0x9131, + 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, 0x92B7, 0x92EA, + 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, 0x92C7, 0x92F0, + 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, + 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, 0x981C, 0x98B3, 0x990A, + 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, 0x99DB, 0x99D1, + 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, 0x9B27, 0x9B45, + 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, 0x6EA8, 0x6E91, 0x6EBB, + 0x6E9A, 0x6EA9, 0x6EB5, 0x6E6C, 0x6EE8, 0x6EDD, 0x6EDA, 0x6EE6, + 0x6EAC, 0x6ED9, 0x6EE3, 0x6EE9, 0x6EDB, 0x716F, 0x7148, 0x714A, + 0x716B, 0x714F, 0x7157, 0x7174, 0x7145, 0x7151, 0x716D, 0x7251, + 0x7250, 0x724E, 0x7341, 0x732E, 0x7346, 0x7427, 0x9D03, 0x9EA9, + 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112, 0x5118, 0x5114, 0x5110, + 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291, 0x5293, 0x52F3, 0x5659, + 0x566B, 0x5679, 0x5669, 0x5664, 0x5678, 0x566A, 0x5668, 0x5665, + 0x5671, 0x566F, 0x566C, 0x5662, 0x5676, 0x58C1, 0x58BE, 0x58C7, + 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, 0x5BF0, 0x5C0E, 0x5F4A, + 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, 0x61B6, 0x61BE, 0x61CA, + 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, 0x64BB, 0x64BC, 0x64DA, + 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, 0x64D2, 0x64D4, 0x64BE, + 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, 0x66C7, 0x66B8, 0x6A3D, + 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, 0x6A39, 0x6A44, 0x6A62, + 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F, 0x6A48, 0x6B59, 0x6B77, +plane 47 +at 0x00 + 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1, 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, + 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, + 0x71C9, 0x71D0, 0x71D2, 0x71C8, 0x71D5, 0x71B9, 0x71CE, 0x71D9, + 0x71DC, 0x71C3, 0x71C4, 0x7368, 0x749C, 0x74A3, 0x7498, 0x749F, + 0x749E, 0x74E2, 0x750C, 0x750D, 0x7634, 0x7638, 0x763A, 0x76E7, + 0x76E5, 0x77A0, 0x779E, 0x779F, 0x77A5, 0x78E8, 0x78DA, 0x78EC, + 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, + 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, + 0x7CD5, 0x7CD6, 0x7E0A, 0x7448, 0x7453, 0x743D, 0x745D, 0x7456, + 0x741E, 0x7447, 0x7443, 0x7458, 0x7449, 0x744C, 0x7445, 0x743E, + 0x7501, 0x751E, 0x757A, 0x75EE, 0x7602, 0x7697, 0x7698, 0x775D, + 0x7764, 0x7753, 0x7758, 0x7882, 0x7890, 0x788A, 0x787A, 0x787D, + 0x788B, 0x7878, 0x788D, 0x7888, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, + 0x7E1E, 0x7E1D, 0x7E09, 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, + 0x7FEE, 0x8028, 0x81B3, 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, + 0x8259, 0x854A, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, + 0x856D, 0x856A, 0x855E, 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, + 0x8861, 0x892A, 0x8932, 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, + 0x8AE6, 0x8AFA, 0x8AEB, 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, + 0x8AFE, 0x8B01, 0x8B02, 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, + 0x8C6B, 0x8C6D, 0x8C93, 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, + 0x8E39, 0x8E35, 0x8F3B, 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, + 0x9075, 0x9074, 0x9078, 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, + 0x9320, 0x9336, 0x92F8, 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, + 0x9304, 0x931A, 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, + 0x95BB, 0x96A7, 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, + 0x970D, 0x9713, 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, + 0x9838, 0x983B, 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, + 0x991E, 0x991B, 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, + 0x9ABC, 0x9AFB, 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, + 0x9D28, 0x9D12, 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, + 0x511F, 0x5121, 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, +plane 48 +at 0x00 + 0x5687, 0x7892, 0x797E, 0x7983, 0x7980, 0x7A0F, 0x7A1D, 0x7AA1, + 0x7AA4, 0x7AE9, 0x7AEA, 0x7B62, 0x7B6B, 0x7B5E, 0x7B79, 0x7B6F, + 0x7B68, 0x7CAE, 0x7CB0, 0x7D90, 0x7D8A, 0x7D8B, 0x7D99, 0x7D95, + 0x7D87, 0x7D78, 0x7D97, 0x7D89, 0x7D98, 0x7FA3, 0x7FDD, 0x8057, + 0x8163, 0x816A, 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, + 0x5B2A, 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, + 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, + 0x61CB, 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, + 0x64E6, 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, + 0x66D6, 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, + 0x6A7E, 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, + 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, + 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, + 0x71DF, 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, + 0x7235, 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, + 0x7646, 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC, + 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, + 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, + 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, + 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, + 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35, + 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070, + 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF, + 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, 0x816C, + 0x815D, 0x8175, 0x815F, 0x817D, 0x816D, 0x8241, 0x844F, 0x8484, + 0x847F, 0x8448, 0x842A, 0x847B, 0x8472, 0x8464, 0x842E, 0x845C, + 0x8453, 0x8441, 0x84C8, 0x8462, 0x8480, 0x843E, 0x8483, 0x8471, + 0x844A, 0x8455, 0x8458, 0x86FC, 0x86FD, 0x8715, 0x8716, 0x86FF, + 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, 0x8587, + 0x85A8, 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, 0x87C6, + 0x87AB, 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, 0x8944, + 0x8938, 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, 0x8B0A, +plane 49 +at 0x00 + 0x8B20, 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73, 0x8CFA, + 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B, 0x8E48, + 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F, 0x907D, + 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E, 0x919C, + 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, 0x9318, + 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, 0x95CB, + 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, 0x971E, + 0x97A0, 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01, 0x99FF, 0x9BAE, + 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, + 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2, 0x5695, 0x56AE, + 0x58D9, 0x58D8, 0x5B38, 0x5F5E, 0x61E3, 0x6233, 0x64F4, 0x64F2, + 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7, 0x66DC, 0x6726, + 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, 0x6AAE, 0x6AAF, + 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, 0x7006, 0x6FFA, + 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, 0x7377, 0x7375, + 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658, 0x8858, 0x88E0, 0x89E7, + 0x8A6A, 0x8A80, 0x8A6F, 0x8A65, 0x8A78, 0x8A7D, 0x8A88, 0x8A64, + 0x8A7E, 0x8A67, 0x8C63, 0x8C88, 0x8CCD, 0x8CC9, 0x8DED, 0x8EB1, + 0x8F04, 0x8F9E, 0x8FA0, 0x9043, 0x9046, 0x9048, 0x9045, 0x9040, + 0x904C, 0x910C, 0x9113, 0x9115, 0x916B, 0x9167, 0x7652, 0x77BD, + 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE, 0x7A61, 0x7A62, 0x7A60, + 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A, 0x7C1E, 0x7C23, 0x7C21, + 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A, 0x7E61, 0x7E52, 0x7E59, + 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076, 0x81CD, 0x81CF, 0x820A, + 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9, 0x85B0, 0x85BA, 0x85B9, + 0x85A6, 0x87EF, 0x87EC, 0x87F2, 0x87E0, 0x8986, 0x89B2, 0x89F4, + 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, 0x8D05, 0x8E59, 0x8E63, + 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, 0x8F49, 0x8F4D, 0x9087, + 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, 0x9394, 0x938A, 0x9396, + 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, 0x9398, 0x939A, 0x9397, + 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, 0x96DC, 0x96D9, 0x96DB, + 0x96DE, 0x9724, 0x97A3, 0x97A6, 0x97AD, 0x97F9, 0x984D, 0x984F, +plane 50 +at 0x00 + 0x984C, 0x984E, 0x9853, 0x98BA, 0x993E, 0x993F, 0x993D, 0x992E, + 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, + 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, + 0x9EE0, 0x9F15, 0x9F2C, 0x5133, 0x56A5, 0x58DE, 0x58DF, 0x58E2, + 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, 0x61F7, 0x61F6, 0x61F5, 0x6500, + 0x650F, 0x66E0, 0x66DD, 0x6AE5, 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, + 0x701F, 0x7028, 0x701A, 0x701D, 0x7015, 0x7018, 0x7206, 0x720D, + 0x7258, 0x72A2, 0x7378, 0x925D, 0x9255, 0x9235, 0x9259, 0x922F, + 0x923C, 0x928F, 0x925C, 0x926A, 0x9262, 0x925F, 0x926B, 0x926E, + 0x923B, 0x9244, 0x9241, 0x959A, 0x9599, 0x968F, 0x9696, 0x96F4, + 0x96FC, 0x9755, 0x9779, 0x97EE, 0x97F5, 0x980B, 0x98F3, 0x98F7, + 0x98FF, 0x98F5, 0x98EC, 0x98F1, 0x737A, 0x74BD, 0x74CA, 0x74E3, + 0x7587, 0x7586, 0x765F, 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, + 0x7A69, 0x7C3E, 0x7C3F, 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, + 0x7E6D, 0x7E79, 0x7E69, 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, + 0x7FB8, 0x81D8, 0x85E9, 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, + 0x85F7, 0x87FB, 0x8805, 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, + 0x8956, 0x895E, 0x8B41, 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, + 0x8B4F, 0x8B46, 0x8B59, 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, + 0x8E76, 0x8E6C, 0x8E7A, 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, + 0x908B, 0x91B1, 0x91AE, 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, + 0x93DC, 0x93DD, 0x93D6, 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, + 0x93E8, 0x95DC, 0x96B4, 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, + 0x97FB, 0x985E, 0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, + 0x9A19, 0x9B0D, 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, + 0x9D72, 0x9D6A, 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, + 0x56A8, 0x56B7, 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, + 0x5B7D, 0x5BF6, 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, + 0x66E6, 0x6727, 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, + 0x74CF, 0x7662, 0x7665, 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, + 0x7AF6, 0x7C4C, 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, + 0x7E7C, 0x999A, 0x9AE2, 0x9B3D, 0x9B5D, 0x9CE8, 0x9CEB, 0x9CEF, +plane 51 +at 0x00 + 0x9CEE, 0x9E81, 0x9F14, 0x50D0, 0x50D9, 0x50DC, 0x50D8, 0x50E1, + 0x50EB, 0x50F4, 0x50E2, 0x50DE, 0x51F4, 0x52ED, 0x52EA, 0x5332, + 0x53AE, 0x53B0, 0x55FB, 0x5603, 0x560B, 0x5607, 0x55F8, 0x5628, + 0x561E, 0x5618, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, + 0x85F9, 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, + 0x8815, 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, + 0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, + 0x91B4, 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, + 0x9952, 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13, + 0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, + 0x5137, 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD, + 0x61FC, 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04, + 0x6AFA, 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, + 0x77D3, 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, + 0x8823, 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74, + 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, + 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B, + 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957, + 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D, + 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, + 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9, + 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61, + 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, 0x5611, + 0x5651, 0x5605, 0x5717, 0x5892, 0x588C, 0x5878, 0x5884, 0x5873, + 0x58AD, 0x5897, 0x5895, 0x5877, 0x5872, 0x5896, 0x588D, 0x5910, + 0x596C, 0x5AE7, 0x5AE4, 0x5AEF, 0x5626, 0x5AF0, 0x5D7B, 0x5D83, + 0x5D8B, 0x5D8C, 0x5D78, 0x5E52, 0x5ED0, 0x5ECF, 0x5FB3, 0x5FB4, + 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, 0x896F, + 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, 0x9148, + 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, 0x986B, + 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, 0x9C3E, + 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, 0x56CC, +plane 52 +at 0x00 + 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, 0x74DA, + 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, 0x81E2, + 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, 0x9460, + 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, 0x9AD3, + 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, 0x9EF4, + 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, 0x7F50, + 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92, 0x8B96, 0x8277, + 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, 0x97C6, 0x9870, + 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, 0x9E7C, 0x9E7D, + 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, 0x7C6C, 0x7C6E, + 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, 0x9871, 0x995E, + 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, 0x9477, 0x97C9, + 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, 0x947D, 0x947E, + 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, 0x9E1A, 0x7228, + 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, 0x617B, 0x616F, 0x6181, + 0x613C, 0x6142, 0x6138, 0x6133, 0x6160, 0x6169, 0x617D, 0x6186, + 0x622C, 0x6228, 0x644C, 0x6457, 0x647C, 0x6455, 0x6462, 0x6471, + 0x646A, 0x6456, 0x643B, 0x6481, 0x644F, 0x647E, 0x6464, 0x6571, + 0x66A5, 0x669A, 0x669C, 0x66A6, 0x66A4, 0x698F, 0x2460, 0x2461, + 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, + 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, + 0x247C, 0x247D, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, + 0x2176, 0x2177, 0x2178, 0x2179, 0x4E36, 0x4E3F, 0x4E85, 0x4EA0, + 0x5182, 0x5196, 0x51AB, 0x52F9, 0x5338, 0x5369, 0x53B6, 0x590A, + 0x5B80, 0x5DDB, 0x5E7A, 0x5E7F, 0x5EF4, 0x5F50, 0x5F61, 0x6534, + 0x65E0, 0x7592, 0x7676, 0x8FB5, 0x96B6, 0x5902, 0xFF3E, 0x30FD, + 0x30FE, 0x309D, 0x309E, 0xFF02, 0x309B, 0x309C, 0x30FB, 0x3007, + 0x30FC, 0xFF3B, 0xFF3D, 0x273D, 0x3041, 0x3042, 0x3043, 0x3044, + 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, + 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, + 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, + 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, +plane 53 +at 0x00 + 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, + 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, + 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, + 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, + 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, + 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, + 0x30A2, 0x30A3, 0x30A4, 0x69C5, 0x69C8, 0x6992, 0x69B2, 0x69E3, + 0x69C0, 0x69D6, 0x69D1, 0x699F, 0x69A2, 0x69D2, 0x69E1, 0x69D5, + 0x699D, 0x6998, 0x6B74, 0x6BA1, 0x6EF0, 0x6EF3, 0x6F1B, 0x6F0C, + 0x6F1D, 0x6F34, 0x6F28, 0x6F17, 0x6F44, 0x6F42, 0x6F04, 0x6F11, + 0x6EFA, 0x6F4A, 0x7191, 0x718E, 0x30A5, 0x30A6, 0x30A7, 0x30A8, + 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, + 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, + 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, + 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, + 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, + 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, + 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, + 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, + 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x6BB9, 0x6E0B, + 0x7105, 0x7314, 0x7304, 0x7305, 0x7315, 0x730D, 0x772E, 0x7741, + 0x77EA, 0x7844, 0x7B29, 0x7B27, 0x7C9D, 0x7FC8, 0x8126, 0x811C, + 0x8128, 0x8370, 0x8382, 0x83AC, 0x86AD, 0x86CA, 0x8851, 0x889D, + 0x8990, 0x89D8, 0x89D7, 0x8A2E, 0x8C59, 0x8EDA, 0x9033, 0x9018, + 0x91EF, 0x9AD9, 0x4EB4, 0x50A0, 0x5090, 0x5086, 0x5084, 0x508A, + 0x509F, 0x50A1, 0x5093, 0x51D5, 0x5590, 0x5710, 0x5817, 0x5844, + 0x582B, 0x5845, 0x5965, 0x5BCF, 0x5D56, 0x5D54, 0x5F3D, 0x5FA4, + 0x63EC, 0x63FA, 0x63D4, 0x6675, 0x671C, 0x68D9, 0x6BF1, 0x6E37, + 0x6E7D, 0x6E86, 0x74FA, 0x7572, 0x75DC, 0x7867, 0x7977, 0x7A9B, + 0x7D2A, 0x718B, 0x718D, 0x717F, 0x718C, 0x717E, 0x717C, 0x7183, + 0x7188, 0x7294, 0x7355, 0x7353, 0x734F, 0x7354, 0x746C, 0x7465, +plane 54 +at 0x00 + 0x7466, 0x7461, 0x746B, 0x7468, 0x7476, 0x7460, 0x7474, 0x7506, + 0x760E, 0x7607, 0x76B9, 0x76B7, 0x76E2, 0x7774, 0x7777, 0x7776, + 0x7775, 0x7778, 0x7D65, 0x7F64, 0x8020, 0x8120, 0x813C, 0x813F, + 0x81F0, 0x81F5, 0x8415, 0x83BE, 0x86E5, 0x86D2, 0x86E0, 0x88B3, + 0x8A53, 0x8A37, 0x8A47, 0x8A5C, 0x8EF0, 0x921D, 0x976B, 0x50C0, + 0x52E5, 0x53AF, 0x55D8, 0x5711, 0x5867, 0x5843, 0x5BDD, 0x5D70, + 0x5D6A, 0x5D74, 0x5D5F, 0x5D61, 0x5D73, 0x5E50, 0x5F3F, 0x5FB0, + 0x6135, 0x612D, 0x6102, 0x6226, 0x656E, 0x65B1, 0x65D4, 0x6685, + 0x6972, 0x693A, 0x6EAD, 0x6E95, 0x7243, 0x728F, 0x7575, 0x75EC, + 0x7757, 0x797B, 0x7A21, 0x7A16, 0x7AE8, 0x7B6A, 0x7B5F, 0x7D82, + 0x8055, 0x8168, 0x8246, 0x8243, 0x8481, 0x847C, 0x846A, 0x9170, + 0x50D2, 0x9B62, 0x6F8A, 0x8772, 0x9AF0, 0x9EA8, 0x5292, 0x878C, + 0x9ABA, 0x9B81, 0x9384, 0x9AFF, 0x9BB3, 0x9BB0, 0x9EC7, 0x9721, + 0x7C36, 0x8B5E, 0x9401, 0x941D, 0x994A, 0x8B73, 0x9DD4, 0x77D6, + 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, + 0x4E8D, 0x56D7, 0x5140, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, + 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, + 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, + 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, + 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723, + 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73, + 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, 0x7771, + 0x777A, 0x715B, 0x777B, 0x78A6, 0x78AE, 0x78B8, 0x78B1, 0x78AF, + 0x7989, 0x7987, 0x7A29, 0x7A2A, 0x7A2D, 0x7A2C, 0x7A32, 0x7AEC, + 0x7AF0, 0x7B81, 0x7B9E, 0x7B83, 0x7B92, 0x7BA3, 0x7B9F, 0x7B93, + 0x7B86, 0x7CB8, 0x7CB7, 0x7DC8, 0x7DB6, 0x7DD1, 0x7DA8, 0x7DAB, + 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, 0x79B8, + 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, 0x4EF1, + 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, 0x4F13, + 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210, 0x52A6, + 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF, 0x572E, + 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B, 0x597E, +plane 55 +at 0x00 + 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A, 0x5C7B, + 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74, 0x5FD5, + 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, 0x6262, + 0x6259, 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E, 0x6739, + 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, 0x6C46, + 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B, 0x6C4C, 0x7071, + 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, 0x7A75, 0x7F51, + 0x8278, 0x827C, 0x8280, 0x827D, 0x827F, 0x864D, 0x897E, 0x9099, + 0x9097, 0x9098, 0x909B, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, + 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64, 0x4F3E, 0x4F67, + 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33, 0x4F3F, 0x4F61, + 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, 0x52AE, 0x5309, + 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, 0x542A, 0x5454, + 0x5445, 0x5419, 0x541C, 0x5425, 0x5418, 0x7DB3, 0x7DCD, 0x7DCF, + 0x7DA4, 0x7F41, 0x7F6F, 0x7F71, 0x8023, 0x805B, 0x8061, 0x805F, + 0x8181, 0x8184, 0x8213, 0x824A, 0x824C, 0x84BD, 0x8495, 0x8492, + 0x84C3, 0x8496, 0x84A5, 0x84B5, 0x84B3, 0x84A3, 0x84E4, 0x84D8, + 0x84D5, 0x84B7, 0x84AD, 0x84DA, 0x8493, 0x8736, 0x543D, 0x544F, + 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, 0x56E7, 0x56E5, 0x5741, + 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, 0x5906, 0x5940, 0x59A6, + 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, 0x5990, 0x598F, 0x59A7, + 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, 0x5C8D, 0x5C8F, 0x5C88, + 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, 0x5C93, 0x5C95, 0x5DE0, + 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, 0x5E88, 0x5E8D, 0x5F05, + 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0, 0x5FED, 0x5FE8, + 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA, 0x5FEF, 0x5FF7, + 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, 0x628C, 0x628E, 0x628F, + 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, 0x6270, 0x6281, 0x6288, + 0x6277, 0x627D, 0x6272, 0x6274, 0x6537, 0x65F0, 0x65F4, 0x65F3, + 0x65F2, 0x65F5, 0x6745, 0x6747, 0x6759, 0x6755, 0x674C, 0x6748, + 0x675D, 0x674D, 0x675A, 0x674B, 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, + 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, +plane 56 +at 0x00 + 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73, 0x6C65, + 0x6C7B, 0x6C8E, 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD, 0x72C3, + 0x72C6, 0x72C1, 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393, 0x7394, + 0x7392, 0x753A, 0x7539, 0x7594, 0x7595, 0x7681, 0x793D, 0x8034, + 0x8095, 0x8099, 0x8090, 0x8092, 0x809C, 0x8290, 0x828F, 0x8285, + 0x828E, 0x8291, 0x8293, 0x873D, 0x872B, 0x8747, 0x8739, 0x8745, + 0x871D, 0x88FF, 0x88EA, 0x88F5, 0x8900, 0x88ED, 0x8903, 0x88E9, + 0x89EA, 0x8A9B, 0x8A8E, 0x8AA2, 0x8A9C, 0x8A94, 0x8A90, 0x8AA9, + 0x8AAC, 0x8A9F, 0x8A9D, 0x8C67, 0x8CD0, 0x8CD6, 0x8CD4, 0x8D98, + 0x8D9A, 0x8D97, 0x8E0B, 0x8E08, 0x828A, 0x8283, 0x8284, 0x8C78, + 0x8FC9, 0x8FBF, 0x909F, 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, + 0x9630, 0x9628, 0x962F, 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, + 0x4F7D, 0x4F80, 0x4F87, 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, + 0x4F4C, 0x4F97, 0x4F6A, 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, + 0x4F9C, 0x4F94, 0x4F9E, 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, + 0x519E, 0x51BC, 0x51BE, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, + 0x52BC, 0x530A, 0x530B, 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, + 0x5481, 0x5491, 0x5482, 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, + 0x546C, 0x5474, 0x5466, 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, + 0x5463, 0x5467, 0x5464, 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, + 0x576B, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, + 0x5774, 0x5762, 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, + 0x59CF, 0x59CE, 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, + 0x59D6, 0x59B1, 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, + 0x5B65, 0x5B93, 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, + 0x5CB5, 0x5CAF, 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, + 0x5CAA, 0x5CA7, 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, + 0x5E14, 0x5E19, 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, + 0x5F7E, 0x5F7D, 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, + 0x600B, 0x8E01, 0x8EB4, 0x8EB3, 0x8FA1, 0x8FA2, 0x905A, 0x9061, + 0x905F, 0x9125, 0x917B, 0x9176, 0x917C, 0x9289, 0x92F6, 0x92B1, + 0x92AD, 0x9292, 0x9281, 0x9284, 0x92AE, 0x9290, 0x929E, 0x95A2, +plane 57 +at 0x00 + 0x95A7, 0x96A0, 0x969D, 0x969F, 0x96D0, 0x96D1, 0x9759, 0x9764, + 0x9819, 0x9814, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, + 0x602C, 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, + 0x6009, 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, + 0x62AA, 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, + 0x62B0, 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, + 0x6612, 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, + 0x6611, 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, + 0x6776, 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, + 0x677A, 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, + 0x6779, 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, + 0x6CEC, 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, + 0x6CB7, 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, + 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, + 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, + 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, + 0x7082, 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, + 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, + 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, + 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, + 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, 0x9815, + 0x981A, 0x9906, 0x98F8, 0x9901, 0x99BE, 0x99BC, 0x99B7, 0x99B6, + 0x99C0, 0x99B8, 0x99C4, 0x99BF, 0x9ADA, 0x9AE4, 0x9AE9, 0x9AE8, + 0x9AEA, 0x9AE5, 0x9B26, 0x9B40, 0x9EBD, 0x510E, 0x50F7, 0x50FC, + 0x510D, 0x5101, 0x51DA, 0x51D9, 0x51DB, 0x5286, 0x528E, 0x52EE, + 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, 0x7C75, + 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, 0x80AD, + 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, 0x82B5, + 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, 0x82A1, + 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, 0x866F, + 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, 0x8FD6, + 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, 0x9639, +plane 58 +at 0x00 + 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, 0x4FB2, + 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, 0x4FB3, + 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, 0x5244, + 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, 0x5399, + 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, 0x54CF, 0x54C3, 0x830D, + 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, 0x54C6, 0x54A0, 0x5470, + 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, 0x54B0, 0x57B5, 0x579E, + 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B, 0x5794, 0x5798, + 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4, 0x590D, 0x5953, + 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD, 0x59FA, 0x59FD, + 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB, 0x59E9, 0x59F3, + 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8, 0x5C4C, 0x5CD0, + 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, 0x5333, 0x53B1, 0x5647, + 0x562D, 0x5654, 0x564B, 0x5652, 0x5631, 0x5644, 0x5656, 0x5650, + 0x562B, 0x564D, 0x5637, 0x564F, 0x58A2, 0x58B7, 0x58B2, 0x58AA, + 0x58B5, 0x58B0, 0x58B4, 0x58A4, 0x58A7, 0x5926, 0x5AFE, 0x5B04, + 0x5AFC, 0x5B06, 0x5B0A, 0x5B0D, 0x5B00, 0x5B0E, 0x5CDE, 0x5CDA, + 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3, 0x5CD4, 0x5CCF, 0x5CC8, + 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, 0x5E21, 0x5E22, 0x5E23, + 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, 0x5E9B, 0x5EA3, 0x5EA5, + 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, 0x6039, 0x6054, 0x6072, + 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, 0x605B, 0x604C, 0x6040, + 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, 0x6066, 0x606E, 0x6242, + 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5, 0x630E, 0x6303, 0x62EB, + 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6, 0x6300, 0x6313, 0x6314, + 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541, 0x6543, 0x65AA, 0x65BF, + 0x6636, 0x6621, 0x6632, 0x6635, 0x661C, 0x6626, 0x6622, 0x6633, + 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, 0x662E, 0x670F, 0x6710, + 0x67C1, 0x67F2, 0x67C8, 0x67BA, 0x67DC, 0x67BB, 0x67F8, 0x67D8, + 0x67C0, 0x67B7, 0x67C5, 0x67EB, 0x67E4, 0x67DF, 0x67B5, 0x67CD, + 0x67B3, 0x67F7, 0x67F6, 0x67EE, 0x67E3, 0x67C2, 0x67B9, 0x67CE, + 0x67E7, 0x67F0, 0x67B2, 0x67FC, 0x67C6, 0x67ED, 0x67CC, 0x67AE, +plane 59 +at 0x00 + 0x67E6, 0x67DB, 0x67FA, 0x67C9, 0x67CA, 0x67C3, 0x67EA, 0x67CB, + 0x6B28, 0x6B82, 0x6B84, 0x6BB6, 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, + 0x6C21, 0x6D28, 0x6D34, 0x6D2D, 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, + 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, + 0x6D00, 0x6D1D, 0x6D42, 0x5D91, 0x5D8F, 0x5D90, 0x5D98, 0x5DA4, + 0x5D9B, 0x5DA3, 0x5D96, 0x5DE4, 0x5E5A, 0x5E5E, 0x5FB8, 0x6157, + 0x615C, 0x61A6, 0x6195, 0x6188, 0x61A3, 0x618F, 0x6164, 0x6159, + 0x6178, 0x6185, 0x6187, 0x619E, 0x6198, 0x619C, 0x622F, 0x6480, + 0x649B, 0x648E, 0x648D, 0x6494, 0x6D01, 0x6D18, 0x6D37, 0x6D03, + 0x6D0F, 0x6D40, 0x6D07, 0x6D20, 0x6D2C, 0x6D08, 0x6D22, 0x6D09, + 0x6D10, 0x70B7, 0x709F, 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, + 0x70B5, 0x70A9, 0x7241, 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, + 0x726E, 0x72CA, 0x72E4, 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, + 0x72E3, 0x7385, 0x73CC, 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, + 0x73B5, 0x73B4, 0x73EB, 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, + 0x73B8, 0x73CB, 0x74EC, 0x74EE, 0x752E, 0x7547, 0x7548, 0x75A7, + 0x75AA, 0x7679, 0x76C4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770A, + 0x76F7, 0x76FB, 0x76FA, 0x77E7, 0x77E8, 0x7806, 0x7811, 0x7812, + 0x7805, 0x7810, 0x780F, 0x780E, 0x7809, 0x7803, 0x7813, 0x794A, + 0x794C, 0x794B, 0x7945, 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, + 0x79CE, 0x7A80, 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, + 0x7C79, 0x7C7F, 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, + 0x7F91, 0x7F8D, 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, + 0x80D8, 0x80C7, 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, + 0x80E3, 0x80D9, 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, 0x80D7, + 0x80E6, 0x80CD, 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, 0x82F9, + 0x8307, 0x82E8, 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, 0x82F4, + 0x82EC, 0x82E1, 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, 0x82F0, + 0x82EA, 0x64C6, 0x64A8, 0x6483, 0x64B9, 0x6486, 0x64B4, 0x64AF, + 0x6491, 0x64AA, 0x64A1, 0x64A7, 0x66B6, 0x66B3, 0x66BC, 0x66AC, + 0x66AD, 0x6A0E, 0x6A1C, 0x6A1A, 0x6A0B, 0x69EF, 0x6A0C, 0x69F0, + 0x6A22, 0x69D8, 0x6A12, 0x69FA, 0x6A2A, 0x6A10, 0x6A29, 0x69F9, +plane 60 +at 0x00 + 0x69EA, 0x6A2C, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, + 0x8674, 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, + 0x89D3, 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, + 0x90F1, 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, + 0x90C8, 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, + 0x964E, 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, + 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, + 0x501C, 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, + 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, + 0x525A, 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, + 0x539E, 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, + 0x551A, 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1, + 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, + 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6, + 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9, + 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15, + 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, + 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, + 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, + 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, 0x6A24, + 0x69E9, 0x6B52, 0x6B4F, 0x6B53, 0x6F10, 0x6F65, 0x6F75, 0x6FD0, + 0x6F5C, 0x6F3D, 0x6F71, 0x6F91, 0x6F0B, 0x6F79, 0x6F81, 0x6F8F, + 0x6F59, 0x6F74, 0x71AE, 0x71A3, 0x71AD, 0x71AB, 0x71A6, 0x71A2, + 0x52F2, 0x7257, 0x7255, 0x7299, 0x734B, 0x747A, 0x748C, 0x7484, + 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D, 0x6083, + 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219, 0x6246, + 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336, 0x6343, + 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341, 0x6334, + 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, 0x6351, + 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, 0x65C3, + 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, 0x6713, + 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, 0x684F, +plane 61 +at 0x00 + 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, 0x684E, + 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828, 0x682E, + 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D, 0x6B31, + 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4, 0x6BE8, 0x6BE3, + 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, 0x6D76, 0x6D0D, + 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, 0x6D91, 0x6D8D, + 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, 0x6D97, 0x6D70, + 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, 0x6D8B, 0x6D7E, + 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, 0x6D75, 0x6D90, + 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39, 0x70E2, 0x70D7, + 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5, 0x70C6, 0x70C7, + 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, 0x7482, 0x7493, 0x747B, + 0x7509, 0x778A, 0x7790, 0x78C6, 0x78D3, 0x78C0, 0x78D2, 0x78C7, + 0x78C2, 0x799F, 0x799D, 0x799E, 0x7A41, 0x7A38, 0x7A3A, 0x7A42, + 0x7A3E, 0x7AB0, 0x7BAE, 0x7BB3, 0x7BBF, 0x7BCD, 0x7BB2, 0x7CC4, + 0x7CCD, 0x7CC2, 0x7CC6, 0x7CC3, 0x7CC9, 0x7CC7, 0x7277, 0x7276, + 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, 0x72F3, 0x72FB, 0x7301, + 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3, 0x73E9, + 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7, 0x73D8, + 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B, 0x755F, + 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6, 0x75BA, + 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, 0x7713, 0x7712, 0x7723, + 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, 0x7727, 0x7823, 0x782C, + 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, 0x782B, 0x7821, 0x7829, + 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, 0x794F, 0x795C, 0x7953, + 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, 0x79EE, 0x79ED, 0x79EA, + 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B, 0x7A8C, + 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, 0x7B04, 0x7B13, 0x7B05, 0x7B0F, + 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91, 0x7C8A, + 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, + 0x7D18, 0x7D16, 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, + 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, +plane 62 +at 0x00 + 0x7FC2, 0x7FC0, 0x8016, 0x803E, 0x8039, 0x80FA, 0x80F2, 0x80F9, + 0x80F5, 0x8101, 0x80FB, 0x8100, 0x8201, 0x822F, 0x8225, 0x8333, + 0x832D, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833F, 0x8341, + 0x8326, 0x831C, 0x8322, 0x7DF8, 0x7DED, 0x7DE2, 0x7DDC, 0x7E02, + 0x7E01, 0x7DD6, 0x7DE4, 0x7DFE, 0x7E00, 0x7DFC, 0x7DFD, 0x7DF5, + 0x7DFF, 0x7DEB, 0x7DE5, 0x7F78, 0x7FAE, 0x7FE7, 0x8065, 0x806A, + 0x8066, 0x8068, 0x806B, 0x8194, 0x81A1, 0x8192, 0x8196, 0x8193, + 0x8501, 0x84F8, 0x84F5, 0x8504, 0x8342, 0x834E, 0x831B, 0x832A, + 0x8308, 0x833C, 0x834D, 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, + 0x8329, 0x8347, 0x8345, 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, + 0x8327, 0x8348, 0x8653, 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, + 0x8691, 0x869E, 0x8687, 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, + 0x86A5, 0x8699, 0x86A1, 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, + 0x8690, 0x8694, 0x8843, 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, + 0x8880, 0x8871, 0x887F, 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, + 0x8A12, 0x8C47, 0x8C57, 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, + 0x8DB5, 0x8DB7, 0x8DB6, 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, + 0x8FFF, 0x8FFB, 0x9004, 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, + 0x90DA, 0x90E3, 0x90DF, 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, + 0x90E4, 0x9150, 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, + 0x965F, 0x96BC, 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, + 0x5061, 0x505E, 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, + 0x504D, 0x5041, 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, + 0x5069, 0x506B, 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, + 0x5057, 0x5051, 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, + 0x52D3, 0x532D, 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, + 0x5534, 0x552A, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, + 0x5545, 0x851B, 0x8503, 0x8533, 0x8534, 0x84ED, 0x8535, 0x8505, + 0x877D, 0x8771, 0x885C, 0x88E6, 0x890F, 0x891B, 0x89A9, 0x89A5, + 0x89EE, 0x8AB1, 0x8ACC, 0x8ACE, 0x8AB7, 0x8AB5, 0x8AE9, 0x8AB4, + 0x8AB3, 0x8AC1, 0x8AAF, 0x8ACA, 0x8AD0, 0x8C8E, 0x8CE9, 0x8CDB, + 0x8CEB, 0x8DA4, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, +plane 63 +at 0x00 + 0x552D, 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, + 0x57E2, 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, + 0x57F8, 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, + 0x57E5, 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, + 0x580C, 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, + 0x5A58, 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, + 0x5A5F, 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, + 0x5A52, 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, + 0x5A4C, 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, + 0x5B72, 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, + 0x5D1A, 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, + 0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, + 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, + 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, + 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, + 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, + 0x638A, 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, + 0x63AB, 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, + 0x639C, 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, 0x8DA2, + 0x8D9D, 0x8E2A, 0x8E28, 0x8EB8, 0x8EB6, 0x8EB9, 0x8EB7, 0x8F22, + 0x8F2B, 0x8F27, 0x8F19, 0x8FA4, 0x8FB3, 0x9071, 0x906A, 0x9188, + 0x918C, 0x92BF, 0x92B8, 0x92BE, 0x92DC, 0x92E5, 0x92D4, 0x92D6, + 0x92DA, 0x92ED, 0x92F3, 0x92DB, 0x92E2, 0x92EB, 0x95AF, 0x95B2, + 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, 0x6370, 0x6553, 0x65CD, + 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, 0x6718, 0x6879, + 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, 0x6956, + 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, 0x688F, + 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, 0x6871, + 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, 0x6878, + 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, 0x6B37, + 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, 0x6DC0, + 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, 0x6DB7, +plane 64 +at 0x00 + 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, 0x6DBE, + 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, 0x6DED, + 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, 0x6DD0, 0x6DF2, + 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, 0x70FA, 0x710D, + 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104, 0x70F3, 0x7110, + 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8, 0x70F6, 0x710B, + 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, 0x727F, 0x731D, 0x7317, + 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, 0x72FF, 0x730F, 0x731E, + 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, 0x7401, 0x73FD, 0x7407, + 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, 0x740B, 0x73F4, 0x7408, + 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, 0x95B3, 0x96A3, 0x96A5, + 0x970A, 0x9787, 0x9789, 0x978C, 0x97EF, 0x982A, 0x9822, 0x981F, + 0x9919, 0x99CA, 0x99DA, 0x99DE, 0x99C8, 0x99E0, 0x9AB6, 0x9AB5, + 0x9AF4, 0x9B6B, 0x9B69, 0x9B72, 0x9B63, 0x9D0D, 0x9D01, 0x9D0C, + 0x9CF8, 0x9CFE, 0x9D02, 0x9E84, 0x9EAB, 0x9EAA, 0x75CB, 0x75CC, + 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, 0x7739, 0x772F, 0x772D, + 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, 0x7725, 0x773B, 0x7735, + 0x7848, 0x7852, 0x7849, 0x784D, 0x784A, 0x784C, 0x7826, 0x7845, + 0x7850, 0x7964, 0x7967, 0x7969, 0x796A, 0x7963, 0x796B, 0x7961, + 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7, 0x7A8F, 0x7A94, 0x7A90, + 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30, 0x7B22, 0x7B24, 0x7B33, + 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, 0x7B2D, 0x7B2F, 0x7B32, + 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, 0x7C96, 0x7CA3, 0x7D35, + 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, 0x7D2C, 0x7D29, 0x7D41, + 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, 0x7D28, 0x7F63, 0x7F95, + 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, 0x7FCD, 0x7FD0, 0x7FD1, + 0x7FC7, 0x7FCF, 0x7FC9, 0x801F, 0x801E, 0x801B, 0x8047, 0x8043, + 0x8048, 0x8118, 0x8125, 0x8119, 0x811B, 0x812D, 0x811F, 0x812C, + 0x811E, 0x8121, 0x8115, 0x8127, 0x811D, 0x8122, 0x8211, 0x8238, + 0x8233, 0x823A, 0x8234, 0x8232, 0x8274, 0x8390, 0x83A3, 0x83A8, + 0x838D, 0x837A, 0x8373, 0x83A4, 0x8374, 0x838F, 0x8381, 0x8395, + 0x8399, 0x8375, 0x8394, 0x83A9, 0x837D, 0x8383, 0x838C, 0x839D, +plane 65 +at 0x00 + 0x839B, 0x83AA, 0x838B, 0x837E, 0x83A5, 0x83AF, 0x8388, 0x8397, + 0x83B0, 0x837F, 0x83A6, 0x8387, 0x83AE, 0x8376, 0x839A, 0x8659, + 0x8656, 0x86BF, 0x86B7, 0x511D, 0x5116, 0x512B, 0x511E, 0x511B, + 0x5290, 0x5294, 0x5314, 0x5667, 0x567B, 0x565F, 0x5661, 0x58C3, + 0x58CA, 0x58C0, 0x58C4, 0x5901, 0x5B1F, 0x5B18, 0x5B11, 0x5B15, + 0x5B12, 0x5B1C, 0x5B22, 0x5B79, 0x5DA6, 0x5DB3, 0x5DAB, 0x5EEA, + 0x5F5B, 0x61B7, 0x61CE, 0x61B9, 0x86C2, 0x86C1, 0x86C5, 0x86BA, + 0x86B0, 0x86C8, 0x86B9, 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, + 0x86BC, 0x86C3, 0x86BD, 0x86BE, 0x8852, 0x8889, 0x8895, 0x88A8, + 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1, 0x889F, 0x8898, 0x88A7, + 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC, 0x888C, 0x8893, 0x888E, + 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30, 0x8A27, 0x8A2C, 0x8A1E, + 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, + 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, + 0x8EDD, 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, + 0x901C, 0x900C, 0x9021, 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, + 0x90F3, 0x90D4, 0x90EB, 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, + 0x9153, 0x9155, 0x91EC, 0x91F4, 0x91F1, 0x91F3, 0x91F8, 0x91E4, + 0x91F9, 0x91EA, 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, 0x9586, + 0x9588, 0x967C, 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, 0x976A, + 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, 0x508B, + 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, + 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, + 0x5591, 0x55A8, 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, + 0x5588, 0x558F, 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, + 0x558C, 0x55A6, 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, + 0x5837, 0x61BD, 0x61CF, 0x61C0, 0x6199, 0x6197, 0x61BB, 0x61D0, + 0x61C4, 0x6231, 0x64D3, 0x64C0, 0x64DC, 0x64D1, 0x64C8, 0x64D5, + 0x66C3, 0x66BF, 0x66C5, 0x66CD, 0x66C1, 0x6706, 0x6724, 0x6A63, + 0x6A42, 0x6A52, 0x6A43, 0x6A33, 0x6A6C, 0x6A57, 0x6A4C, 0x6A6E, + 0x6A37, 0x6A71, 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, + 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, +plane 66 +at 0x00 + 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, + 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, + 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, + 0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, + 0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, + 0x5C0C, 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, + 0x5D35, 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, + 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, + 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, + 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114, + 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, + 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, + 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, + 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, + 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, + 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0, + 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568, + 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, 0x6A4A, + 0x6A36, 0x6A53, 0x6A45, 0x6A70, 0x6A5C, 0x6B58, 0x6B57, 0x6FBB, + 0x6FBE, 0x6FB5, 0x6FD3, 0x6F9F, 0x6FB7, 0x6FF5, 0x71B7, 0x71BB, + 0x71D1, 0x71BA, 0x71B6, 0x71CC, 0x71D3, 0x749B, 0x7496, 0x74A2, + 0x749D, 0x750A, 0x750E, 0x7581, 0x762C, 0x7637, 0x7636, 0x763B, + 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, 0x6672, + 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, 0x68EA, + 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, 0x6913, + 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, 0x68B4, + 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD, 0x68FC, + 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD, 0x68DE, + 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915, 0x6925, + 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97, 0x6B99, + 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, 0x6E46, + 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, 0x6E62, +plane 67 +at 0x00 + 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, 0x6E4B, + 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0x6E68, 0x6E5C, + 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39, 0x6E22, + 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, 0x6E77, 0x6E55, + 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, 0x7120, 0x711E, + 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, + 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, 0x7288, 0x7289, + 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322, 0x7331, + 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335, 0x730C, + 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, 0x76A1, 0x7798, 0x7796, + 0x78D6, 0x78EB, 0x78DC, 0x79A5, 0x79A9, 0x9834, 0x7A53, 0x7A45, + 0x7A4F, 0x7ABD, 0x7ABB, 0x7AF1, 0x7BEC, 0x7BED, 0x7CD3, 0x7CE1, + 0x7E19, 0x7E27, 0x7E26, 0x806E, 0x81AF, 0x81AD, 0x81AA, 0x8218, + 0x856F, 0x854C, 0x8542, 0x855C, 0x8570, 0x855F, 0x741A, 0x7421, + 0x742D, 0x7431, 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432, + 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6, + 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, 0x7692, 0x76DA, 0x7746, + 0x7747, 0x7744, 0x774D, 0x7745, 0x774A, 0x774E, 0x774B, 0x774C, + 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, 0x785C, 0x786D, 0x7871, + 0x786A, 0x786E, 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, 0x7974, + 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04, + 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B3B, 0x7B44, 0x7B48, 0x7B4C, + 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1, + 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F, + 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F, + 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, + 0x7FD7, 0x8051, 0x804F, 0x8050, 0x80FE, 0x80D4, 0x8143, 0x814A, + 0x8152, 0x814F, 0x8147, 0x813D, 0x814D, 0x813A, 0x81E6, 0x81EE, + 0x81F7, 0x81F8, 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, 0x8275, + 0x833B, 0x83CF, 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7, + 0x83E4, 0x83FC, 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3, + 0x83BF, 0x8401, 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB, +plane 68 +at 0x00 + 0x83CE, 0x83D6, 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411, + 0x8406, 0x83C2, 0x83F3, 0x855A, 0x854B, 0x853F, 0x878A, 0x878B, + 0x87A1, 0x878E, 0x8799, 0x885E, 0x885F, 0x8924, 0x89A7, 0x8AEA, + 0x8AFD, 0x8AF9, 0x8AE3, 0x8AE5, 0x8AEC, 0x8CF2, 0x8CEF, 0x8DA6, + 0x8E3B, 0x8E43, 0x8E32, 0x8F31, 0x8F30, 0x8F2D, 0x8F3C, 0x8FA7, + 0x8FA5, 0x9137, 0x9195, 0x918E, 0x83D5, 0x83FA, 0x83C7, 0x83D1, + 0x83EA, 0x8413, 0x83C3, 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, + 0x83E2, 0x841B, 0x83DB, 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, + 0x86E3, 0x86DA, 0x86EA, 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, + 0x86D7, 0x86E8, 0x86D1, 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, + 0x88B9, 0x88B8, 0x88C0, 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, + 0x88B2, 0x8901, 0x88C9, 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, + 0x89DB, 0x8A4E, 0x8A4D, 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, + 0x8A44, 0x8A45, 0x8A52, 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, + 0x8C5F, 0x8C81, 0x8C80, 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, + 0x8D84, 0x8D80, 0x8D89, 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, + 0x8DDC, 0x8DCF, 0x8DD5, 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, + 0x8EF7, 0x8EFA, 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, + 0x8EE8, 0x8EF6, 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, + 0x9034, 0x902F, 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, + 0x90F9, 0x90FB, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, + 0x9164, 0x915F, 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, + 0x921A, 0x9226, 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, + 0x9206, 0x9204, 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, + 0x9205, 0x9216, 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, + 0x9688, 0x9196, 0x9345, 0x930A, 0x92FD, 0x9317, 0x931C, 0x9307, + 0x9331, 0x9332, 0x932C, 0x9330, 0x9303, 0x9305, 0x95C2, 0x95B8, + 0x95C1, 0x96AB, 0x96B7, 0x9715, 0x9714, 0x970C, 0x9717, 0x9793, + 0x97D2, 0x9836, 0x9831, 0x9833, 0x983C, 0x982E, 0x983A, 0x983D, + 0x98B5, 0x9922, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, + 0x96F1, 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, + 0x9CE6, 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, +plane 69 +at 0x00 + 0x50AE, 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, + 0x50BA, 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, + 0x5278, 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, + 0x55CA, 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, + 0x558D, 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, + 0x55D9, 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, + 0x5849, 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, + 0x583D, 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, + 0x5AB8, 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, + 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, + 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, + 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, + 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, + 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, + 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, + 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, + 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x9923, + 0x9920, 0x991C, 0x991D, 0x99A0, 0x99EF, 0x99E8, 0x99EB, 0x99E1, + 0x99E6, 0x9AF8, 0x9AF5, 0x9B83, 0x9B94, 0x9B84, 0x9B8B, 0x9B8F, + 0x9B8C, 0x9B89, 0x9B8E, 0x9D24, 0x9D0F, 0x9D13, 0x9D0A, 0x9D2A, + 0x9D1A, 0x9D27, 0x9D16, 0x9D21, 0x9E85, 0x9EAC, 0x9EC6, 0x9EC5, + 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, + 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642F, + 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, 0x641B, + 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, 0x668C, + 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, 0x6694, 0x6678, 0x6720, + 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, 0x6971, 0x693F, 0x6945, + 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, 0x6948, 0x6949, + 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, 0x6934, + 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, + 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951, 0x6932, + 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, 0x6B42, +plane 70 +at 0x00 + 0x6B48, 0x6B41, 0x6B9B, 0x55C0, 0x6BFB, 0x6BFC, 0x6BF9, 0x6BF7, + 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, 0x6EC0, 0x6E9F, 0x6E93, + 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, 0x6ED2, 0x6EBD, 0x6EC1, + 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6, 0x6ECF, 0x6EB2, + 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92, 0x6E8E, 0x6E8D, + 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA, 0x6E97, 0x6EAE, + 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715D, + 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, 0x7142, 0x7158, 0x7143, + 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, 0x9ED7, 0x9F53, 0x5128, + 0x5127, 0x51DF, 0x5335, 0x53B3, 0x568A, 0x567D, 0x5689, 0x58CD, + 0x58D0, 0x5B2B, 0x5B33, 0x5B29, 0x5B35, 0x5B31, 0x5B37, 0x5C36, + 0x5DBE, 0x5DB9, 0x5DBB, 0x61E2, 0x61DB, 0x61DD, 0x61DC, 0x61DA, + 0x61D9, 0x64DF, 0x64E1, 0x64EE, 0x65B5, 0x66D4, 0x7144, 0x714D, + 0x715A, 0x724F, 0x728D, 0x728C, 0x7291, 0x7290, 0x728E, 0x733C, + 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, 0x7349, 0x7444, 0x744A, + 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, 0x744F, 0x7450, 0x744E, + 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, 0x74FF, 0x74FE, 0x74FD, + 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, 0x760F, 0x7603, 0x75F7, + 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, 0x75FB, 0x75F6, 0x75ED, + 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD, 0x7755, 0x775F, 0x7760, + 0x7752, 0x7756, 0x775A, 0x7769, 0x7767, 0x7754, 0x7759, 0x776D, + 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F, 0x7884, 0x7895, 0x7885, + 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787B, + 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, 0x7A18, 0x7A19, 0x7A12, + 0x7A17, 0x7A15, 0x7A22, 0x7A13, 0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, + 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, 0x7B6D, 0x7B74, 0x7B69, 0x7B72, + 0x7B65, 0x7B73, 0x7B71, 0x7B70, 0x7B61, 0x7B78, 0x7B76, 0x7B63, + 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, + 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B, 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, + 0x7D84, 0x7D7D, 0x7D92, 0x7F6D, 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, + 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB, 0x7FDC, 0x8021, 0x8164, 0x8160, + 0x8177, 0x815C, 0x8169, 0x815B, 0x8162, 0x8172, 0x6721, 0x815E, +plane 71 +at 0x00 + 0x8176, 0x8167, 0x816F, 0x66D5, 0x66D0, 0x66D1, 0x66CE, 0x66D7, + 0x6A7D, 0x6A8A, 0x6AA7, 0x6A99, 0x6A82, 0x6A88, 0x6A86, 0x6A98, + 0x6A9D, 0x6A8F, 0x6AAA, 0x6B5D, 0x6C0A, 0x6FD7, 0x6FD6, 0x6FE5, + 0x6FD9, 0x6FDA, 0x6FEA, 0x6FF6, 0x71E3, 0x71E9, 0x71EB, 0x71EF, + 0x71F3, 0x71EA, 0x7371, 0x74AE, 0x8144, 0x8161, 0x821D, 0x8249, + 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1, 0x843F, 0x8456, 0x8476, + 0x8479, 0x848F, 0x848D, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, + 0x8430, 0x844D, 0x847D, 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, + 0x8507, 0x845E, 0x8437, 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, + 0x8432, 0x8445, 0x8429, 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, + 0x845F, 0x8470, 0x8439, 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, + 0x848E, 0x843B, 0x8447, 0x8436, 0x8433, 0x8468, 0x847E, 0x8444, + 0x842B, 0x8460, 0x8454, 0x846E, 0x8450, 0x870B, 0x8704, 0x86F7, + 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D, 0x86F8, 0x870E, 0x8709, + 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6, 0x88CB, 0x88CD, 0x88CE, + 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, + 0x89E5, 0x89E4, 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, + 0x8A86, 0x8A7F, 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, + 0x8A83, 0x8A81, 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, + 0x8C64, 0x8C66, 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, + 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, 0x8D90, + 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, 0x8DE9, + 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, 0x8EFF, + 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, 0x9052, + 0x903F, 0x74B3, 0x74AC, 0x7583, 0x7645, 0x764E, 0x7644, 0x76A3, + 0x76A5, 0x77A6, 0x77A4, 0x77A9, 0x77AF, 0x78F0, 0x78F8, 0x78F1, + 0x7A49, 0x7AC2, 0x7AF2, 0x7AF3, 0x7BFA, 0x7BF6, 0x7BFC, 0x7C18, + 0x7C08, 0x7C12, 0x7CDB, 0x7CDA, 0x7E2C, 0x7E4D, 0x7F46, 0x7FF6, + 0x802B, 0x8074, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, + 0x9111, 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, + 0x9252, 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, + 0x922E, 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, +plane 72 +at 0x00 + 0x926F, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, + 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, + 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, + 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, + 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, + 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, + 0x9EFD, 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, + 0x50DD, 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0, + 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, + 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613, + 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C, + 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A, + 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894, + 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, + 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, + 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, 0x81B8, + 0x81C8, 0x8592, 0x8593, 0x857F, 0x85AB, 0x8597, 0x85AC, 0x87CE, + 0x87CD, 0x87C1, 0x87B1, 0x87C7, 0x8940, 0x893F, 0x8939, 0x8943, + 0x89AB, 0x8B1F, 0x8B09, 0x8B0C, 0x8C40, 0x8C96, 0x8CF6, 0x8CF7, + 0x8E46, 0x8E4F, 0x8F3D, 0x8F41, 0x9366, 0x9378, 0x935D, 0x9369, + 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, 0x5D81, + 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D, 0x5D79, + 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7, 0x5ECE, + 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43, 0x5F6F, + 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, 0x6152, + 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, 0x615B, + 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, 0x622B, + 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, 0x6473, + 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, 0x645C, + 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C, 0x646B, + 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0, 0x669F, + 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, 0x69A0, 0x69CE, +plane 73 +at 0x00 + 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, 0x698E, 0x69A7, + 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD, 0x69A4, + 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993, 0x69AA, + 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5, 0x69A5, + 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BC3, + 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25, 0x6EF8, + 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, 0x6F1A, 0x6F27, + 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0x9374, 0x937D, 0x936E, + 0x9372, 0x9373, 0x9362, 0x9348, 0x9353, 0x935F, 0x9368, 0x937F, + 0x936B, 0x95C4, 0x96AF, 0x96AD, 0x96B2, 0x971A, 0x971B, 0x979B, + 0x979F, 0x9840, 0x9847, 0x98B7, 0x99A2, 0x9A00, 0x99F3, 0x99F5, + 0x9ABD, 0x9B00, 0x9B02, 0x9B34, 0x9B49, 0x9B9F, 0x6F36, 0x6F73, + 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, 0x6F35, 0x6EEB, + 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, 0x6F1C, + 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187, + 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186, + 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, + 0x734D, 0x7351, 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, + 0x7467, 0x746E, 0x7500, 0x7502, 0x7503, 0x757D, 0x7590, 0x7616, + 0x7608, 0x760C, 0x7615, 0x7611, 0x760A, 0x7614, 0x76B8, 0x7781, + 0x777C, 0x7785, 0x7782, 0x776E, 0x7780, 0x776F, 0x777E, 0x7783, + 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, 0x787E, 0x78AB, 0x789E, + 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, 0x798B, + 0x7996, 0x7995, 0x7994, 0x7993, 0x7997, 0x7988, 0x7992, 0x7990, + 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, + 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96, + 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99, + 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, + 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, + 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, + 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, + 0x7FE3, 0x7FE5, 0x7FDE, 0x9BA3, 0x9BCD, 0x9B99, 0x9B9D, 0x9D39, +plane 74 +at 0x00 + 0x9D44, 0x9D35, 0x9EAF, 0x512F, 0x9F8E, 0x569F, 0x569B, 0x569E, + 0x5696, 0x5694, 0x56A0, 0x5B3B, 0x5B3A, 0x5DC1, 0x5F4D, 0x5F5D, + 0x61F3, 0x64F6, 0x64E5, 0x64EA, 0x64E7, 0x6505, 0x64F9, 0x6AAB, + 0x6AED, 0x6AB2, 0x6AB0, 0x6AB5, 0x8024, 0x805D, 0x805C, 0x8189, + 0x8186, 0x8183, 0x8187, 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, + 0x84A4, 0x84A1, 0x849F, 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, + 0x84AB, 0x84B9, 0x84B4, 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, + 0x84D0, 0x849D, 0x84A7, 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, + 0x849B, 0x84A9, 0x84AF, 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, + 0x84A0, 0x84D7, 0x84D4, 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, + 0x8733, 0x8723, 0x8728, 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, + 0x8719, 0x871B, 0x8743, 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, + 0x8732, 0x872A, 0x872D, 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, + 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, + 0x88F7, 0x88E7, 0x88F1, 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, + 0x88F6, 0x88FB, 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, + 0x899E, 0x89E9, 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, + 0x8A8F, 0x8A96, 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, + 0x8D96, 0x8E09, 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, + 0x8E07, 0x8E06, 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, + 0x8F0E, 0x8F0D, 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, + 0x911A, 0x9124, 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, + 0x92A5, 0x92A4, 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, + 0x928D, 0x6ABE, 0x6AC1, 0x6AC8, 0x6AC0, 0x6ABC, 0x6AB1, 0x6AC4, + 0x6ABF, 0x7008, 0x7003, 0x6FFD, 0x7010, 0x7002, 0x7013, 0x71FA, + 0x7200, 0x74B9, 0x74BC, 0x765B, 0x7651, 0x764F, 0x76EB, 0x77B8, + 0x77B9, 0x77C1, 0x77C0, 0x77BE, 0x790B, 0x7907, 0x790A, 0x7908, + 0x790D, 0x7906, 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, + 0x92A3, 0x92EE, 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, + 0x92A1, 0x928A, 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, + 0x92A9, 0x929D, 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, + 0x977D, 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, +plane 75 +at 0x00 + 0x9781, 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, + 0x9900, 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, + 0x99C2, 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, + 0x9B60, 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, + 0x5103, 0x5130, 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, + 0x510C, 0x50FD, 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, + 0x5642, 0x564C, 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658, + 0x565A, 0x5640, 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, + 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, + 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, + 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, + 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, + 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, + 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, + 0x618B, 0x6183, 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, 0x7915, + 0x79AF, 0x7AF5, 0x7C2E, 0x7C1B, 0x7C1A, 0x7C24, 0x7CE6, 0x7CE3, + 0x7E5D, 0x7E4F, 0x7E66, 0x7E5B, 0x7F47, 0x7FB4, 0x7FFA, 0x802E, + 0x81CE, 0x8219, 0x85CC, 0x85B2, 0x85BB, 0x85C1, 0x87E9, 0x87EE, + 0x87F0, 0x87D6, 0x880E, 0x87DA, 0x8948, 0x894A, 0x894E, 0x894D, + 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, 0x6192, 0x61AA, 0x61A1, + 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, 0x6496, 0x64A0, + 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C, 0x64A3, + 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579, 0x657B, + 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7, 0x66AA, + 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15, 0x69F1, + 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D, 0x69FE, + 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, 0x69E7, 0x6A40, 0x6A08, + 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, 0x6A09, 0x6A04, 0x6A18, + 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, 0x69F4, 0x6A16, 0x6B51, + 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, 0x6BFF, 0x6C02, + 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92, 0x6F8D, 0x6F89, + 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96, 0x6F76, 0x6F6C, +plane 76 +at 0x00 + 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57, 0x6F94, 0x6F93, + 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67, 0x6F90, 0x6F53, + 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, 0x6F77, 0x6F6A, 0x6F7B, + 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, 0x719A, 0x71A9, 0x71B5, + 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, 0x71AA, 0x719C, 0x71A7, + 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, 0x735E, 0x735F, 0x7360, + 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, 0x89B1, 0x89B0, 0x89B3, + 0x8B38, 0x8B32, 0x8B2D, 0x8B34, 0x8B29, 0x8C74, 0x8D03, 0x8DA9, + 0x8E58, 0x8EBF, 0x8EC1, 0x8F4A, 0x8FAC, 0x9089, 0x913D, 0x913C, + 0x91A9, 0x93A0, 0x9390, 0x9393, 0x938B, 0x93AD, 0x93BB, 0x93B8, + 0x939C, 0x95D8, 0x95D7, 0x975D, 0x97A9, 0x97DA, 0x7362, 0x7487, + 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, 0x7485, 0x7488, 0x747C, + 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, 0x761E, 0x7619, 0x761D, + 0x761C, 0x7623, 0x761A, 0x7628, 0x761B, 0x769C, 0x769D, 0x769E, + 0x769B, 0x778D, 0x778F, 0x7789, 0x7788, 0x78CD, 0x78BB, 0x78CF, + 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8, 0x78C3, 0x78C4, 0x78C9, + 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2, 0x799B, 0x6B76, 0x7A39, + 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, 0x7BBE, 0x7BAC, 0x7BCE, + 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, 0x7CC8, 0x7CCC, 0x7CCB, + 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, 0x7DE1, 0x7E03, 0x7DFA, + 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, 0x7DDF, 0x7F76, 0x7FAC, + 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, 0x7FEC, 0x7FE6, 0x7FE8, + 0x8064, 0x8067, 0x81A3, 0x819F, 0x819E, 0x8195, 0x81A2, 0x8199, + 0x8197, 0x8216, 0x824F, 0x8253, 0x8252, 0x8250, 0x824E, 0x8251, + 0x8524, 0x853B, 0x850F, 0x8500, 0x8529, 0x850E, 0x8509, 0x850D, + 0x851F, 0x850A, 0x8527, 0x851C, 0x84FB, 0x852B, 0x84FA, 0x8508, + 0x850C, 0x84F4, 0x852A, 0x84F2, 0x8515, 0x84F7, 0x84EB, 0x84F3, + 0x84FC, 0x8512, 0x84EA, 0x84E9, 0x8516, 0x84FE, 0x8528, 0x851D, + 0x852E, 0x8502, 0x84FD, 0x851E, 0x84F6, 0x8531, 0x8526, 0x84E7, + 0x84E8, 0x84F0, 0x84EF, 0x84F9, 0x8518, 0x8520, 0x8530, 0x850B, + 0x8519, 0x852F, 0x8662, 0x9854, 0x9855, 0x984B, 0x983F, 0x98B9, + 0x9938, 0x9936, 0x9940, 0x993B, 0x9939, 0x99A4, 0x9A08, 0x9A0C, +plane 77 +at 0x00 + 0x9A10, 0x9B07, 0x9BD2, 0x9BC2, 0x9BBB, 0x9BCC, 0x9BCB, 0x9D4D, + 0x9D63, 0x9D4E, 0x9D50, 0x9D55, 0x9D5E, 0x9E90, 0x9EB2, 0x9EB1, + 0x9ECA, 0x9F02, 0x9F27, 0x9F26, 0x8756, 0x8763, 0x8764, 0x8777, + 0x87E1, 0x8773, 0x8758, 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, + 0x8751, 0x875E, 0x876D, 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, + 0x876F, 0x876C, 0x877A, 0x876E, 0x875C, 0x8765, 0x874F, 0x877B, + 0x8775, 0x8762, 0x8767, 0x8769, 0x885A, 0x8905, 0x890C, 0x8914, + 0x890B, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890E, + 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED, 0x89F0, 0x89EC, 0x8ACF, + 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, + 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, + 0x8C3E, 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, + 0x8CDD, 0x8CE7, 0x8DA0, 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, + 0x8E25, 0x8E24, 0x8E2E, 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, + 0x8E26, 0x8E27, 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, 0x8E17, + 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, 0x8F16, + 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, 0x912B, + 0x9129, 0x912A, 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, 0x918A, + 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, + 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, + 0x92DD, 0x92CC, 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, + 0x92E6, 0x92CD, 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, + 0x92D3, 0x56AF, 0x58E0, 0x58DC, 0x5B39, 0x5B7C, 0x5BF3, 0x5C6B, + 0x5DC4, 0x650B, 0x6508, 0x650A, 0x65DC, 0x66E1, 0x66DF, 0x6ACE, + 0x6AD4, 0x6AE3, 0x6AD7, 0x6AE2, 0x6AD8, 0x6AD5, 0x6AD2, 0x701E, + 0x702C, 0x7025, 0x6FF3, 0x7204, 0x7208, 0x7215, 0x74C4, 0x74C9, + 0x74C7, 0x74C8, 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, + 0x95AB, 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, + 0x9702, 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, + 0x981D, 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, + 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, + 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, +plane 78 +at 0x00 + 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, + 0x9AF1, 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, + 0x9B75, 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, + 0x9CFF, 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, + 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, + 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E, + 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C, + 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC, + 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, + 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, + 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, + 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, + 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8, + 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, 0x76A9, + 0x77C6, 0x77C5, 0x7918, 0x791A, 0x7920, 0x7A66, 0x7A64, 0x7A6A, + 0x7C35, 0x7C34, 0x7E6C, 0x7E6E, 0x7E71, 0x81D4, 0x81D6, 0x821A, + 0x8262, 0x8265, 0x8276, 0x85DB, 0x85D6, 0x85E7, 0x85F4, 0x87FD, + 0x87D5, 0x8807, 0x880F, 0x87F8, 0x8987, 0x89B5, 0x89F5, 0x8B3F, + 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF, 0x64C9, + 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533, 0x657F, + 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, 0x66CF, + 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, 0x6A49, + 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, 0x6A5B, + 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, 0x6A64, + 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, 0x6A5E, + 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54, 0x6B56, + 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03, 0x6C06, + 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8, 0x6F5E, + 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5, 0x6FAE, + 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8, 0x6FA2, 0x6FC9, + 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, 0x71C2, 0x71BF, + 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, 0x71CA, 0x71C7, +plane 79 +at 0x00 + 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, 0x71DB, 0x729D, + 0x729E, 0x7369, 0x7366, 0x7367, 0x736C, 0x7365, 0x736B, 0x736A, + 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495, 0x74A1, 0x750B, + 0x7580, 0x762F, 0x762D, 0x7631, 0x763D, 0x7633, 0x763C, 0x7635, + 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D, 0x77A1, 0x779C, + 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799, 0x8B43, 0x8B4C, 0x8D0B, + 0x8E6B, 0x8E68, 0x8E70, 0x8E75, 0x8E77, 0x8EC3, 0x93E9, 0x93EA, + 0x93CB, 0x93C5, 0x93C6, 0x93ED, 0x93D3, 0x93E5, 0x93DB, 0x93EB, + 0x93E0, 0x93C1, 0x95DD, 0x97B2, 0x97B4, 0x97B1, 0x97B5, 0x97F2, + 0x9856, 0x9944, 0x9A26, 0x9A1F, 0x9A18, 0x9A21, 0x7797, 0x78DD, + 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, 0x78DB, 0x78E1, 0x78E2, + 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, 0x7A48, 0x7A47, 0x7AB6, + 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3, 0x7BE7, 0x7BDD, + 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4, 0x7BEA, 0x7BE2, + 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4, 0x7CD7, 0x7CD0, + 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, 0x7E1F, 0x7E20, 0x7E13, + 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, 0x7E0B, 0x7E0F, 0x7E16, + 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, 0x7F7B, 0x7F7C, 0x7F7A, + 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, 0x81B1, 0x81A6, 0x81AE, + 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, 0x81B4, 0x81B2, 0x81B7, + 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856B, + 0x854D, 0x8553, 0x8561, 0x8558, 0x8540, 0x8546, 0x8564, 0x8541, + 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853E, 0x855B, 0x8571, + 0x854E, 0x856E, 0x8575, 0x8555, 0x8567, 0x8560, 0x858C, 0x8566, + 0x855D, 0x8554, 0x8565, 0x856C, 0x8663, 0x8665, 0x8664, 0x879B, + 0x878F, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, + 0x8779, 0x8787, 0x87A3, 0x8785, 0x8790, 0x8791, 0x879D, 0x8784, + 0x8794, 0x879C, 0x879A, 0x8789, 0x891E, 0x8926, 0x8930, 0x892D, + 0x892E, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892F, 0x892C, + 0x891F, 0x89F1, 0x8AE0, 0x9A17, 0x9B09, 0x9BC5, 0x9BDF, 0x9BE3, + 0x9BE9, 0x9BEE, 0x9D66, 0x9D7A, 0x9D6E, 0x9D91, 0x9D83, 0x9D76, + 0x9D7E, 0x9D6D, 0x9E95, 0x9EE3, 0x9F03, 0x9F04, 0x9F17, 0x5136, +plane 80 +at 0x00 + 0x5336, 0x5B42, 0x5B44, 0x5B46, 0x5B7E, 0x5DCA, 0x5DC8, 0x5DCC, + 0x5EF0, 0x6585, 0x66E5, 0x66E7, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, + 0x8ADD, 0x8B14, 0x8AE4, 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, + 0x8AE8, 0x8AFF, 0x8AEF, 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, + 0x8CEE, 0x8CF1, 0x8CF0, 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, + 0x8E33, 0x8E3E, 0x8E38, 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, + 0x8E41, 0x8E30, 0x8E3F, 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, + 0x8F39, 0x8F37, 0x8F34, 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, + 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, + 0x9327, 0x931E, 0x9308, 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, + 0x933C, 0x931B, 0x9323, 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, + 0x930D, 0x92CB, 0x931D, 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, + 0x9334, 0x9302, 0x9324, 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, + 0x9314, 0x930C, 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, + 0x95BC, 0x95CD, 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, + 0x95BD, 0x96A9, 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, + 0x9794, 0x97F0, 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, + 0x9927, 0x9929, 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, + 0x99E3, 0x99EA, 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, + 0x9AF6, 0x9AFA, 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, + 0x9B7C, 0x9B7E, 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, + 0x9B95, 0x6AF4, 0x6AE9, 0x703D, 0x7036, 0x7216, 0x7212, 0x720F, + 0x7217, 0x7211, 0x720B, 0x74CD, 0x74D0, 0x74CC, 0x74CE, 0x74D1, + 0x7589, 0x7A6F, 0x7C4B, 0x7C44, 0x7C55, 0x7E7F, 0x8B71, 0x802F, + 0x807A, 0x807B, 0x807C, 0x85FC, 0x8610, 0x8602, 0x85EE, 0x8603, + 0x860D, 0x8613, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E, + 0x9D14, 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F, + 0x9E88, 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, + 0x9F12, 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, + 0x52F4, 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, + 0x5682, 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, + 0x5B25, 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, +plane 81 +at 0x00 + 0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, + 0x61C3, 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, + 0x61DE, 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, + 0x6580, 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, + 0x6A89, 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, + 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, + 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, + 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, + 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, + 0x71E4, 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, + 0x74AB, 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, + 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, + 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, 0x8608, + 0x860F, 0x8818, 0x8812, 0x8967, 0x8965, 0x89BB, 0x8B69, 0x8B62, + 0x8B6E, 0x8B61, 0x8B64, 0x8B4D, 0x8C51, 0x8E83, 0x8EC6, 0x941F, + 0x9404, 0x9417, 0x9408, 0x9405, 0x93F3, 0x941E, 0x9402, 0x941A, + 0x941B, 0x9427, 0x941C, 0x96B5, 0x9733, 0x9734, 0x9731, 0x97B8, + 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, 0x78FB, + 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, 0x79A8, + 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, 0x7AC0, + 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, 0x7C0E, + 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, 0x7BF8, + 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, 0x7E2D, + 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, 0x7E40, + 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, 0x7E3A, + 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, 0x81BB, + 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, 0x825B, + 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, 0x85A0, + 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, 0x8577, 0x857C, + 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, 0x8596, 0x8586, + 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, 0x8588, 0x8585, + 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, 0x8668, 0x87BE, 0x87AA, +plane 82 +at 0x00 + 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, 0x87BC, 0x87AE, + 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, 0x87C4, 0x87CA, + 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, 0x87B2, 0x8935, + 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937, 0x8942, 0x89AD, + 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, 0x97BA, 0x97FC, 0x98C3, + 0x994D, 0x9A2F, 0x9AC9, 0x9AC8, 0x9AC4, 0x9B2A, 0x9B38, 0x9B50, + 0x9C0A, 0x9BFB, 0x9C04, 0x9BFC, 0x9BFE, 0x9C02, 0x9BF6, 0x9C1B, + 0x9BF9, 0x9C15, 0x9C10, 0x9BFF, 0x9C00, 0x9C0C, 0x9D95, 0x9DA5, + 0x9E98, 0x9EC1, 0x9F5A, 0x5164, 0x56BB, 0x58E6, 0x8B18, 0x8B16, + 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, 0x8B12, 0x8B15, 0x8B07, + 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13, 0x8B1A, 0x8C4F, 0x8C70, + 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94, 0x8CF9, 0x8D6F, 0x8E4E, + 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47, 0x8F43, 0x8F40, 0x9085, + 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, 0x9199, 0x919F, 0x91A1, + 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, 0x9364, 0x9356, 0x9347, + 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, + 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, 0x9357, 0x9355, 0x9352, + 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, 0x935E, 0x9363, 0x9367, + 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0, 0x95C9, 0x95C3, 0x95C5, + 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720, 0x971F, 0x9718, 0x971D, + 0x9719, 0x979A, 0x97A1, 0x979C, 0x979E, 0x979D, 0x97D5, 0x97D4, + 0x97F1, 0x9841, 0x9844, 0x984A, 0x9849, 0x9845, 0x9843, 0x9925, + 0x992B, 0x992C, 0x992A, 0x9933, 0x9932, 0x992F, 0x992D, 0x9931, + 0x9930, 0x9998, 0x99A3, 0x99A1, 0x9A02, 0x99FA, 0x99F4, 0x99F7, + 0x99F9, 0x99F8, 0x99F6, 0x99FB, 0x99FD, 0x99FE, 0x99FC, 0x9A03, + 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, + 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1, 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, + 0x9BA0, 0x9BAF, 0x9D33, 0x9D41, 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, + 0x9D31, 0x9D38, 0x9D30, 0x5B49, 0x5BF7, 0x5DD0, 0x5FC2, 0x6511, + 0x6AFF, 0x6AFE, 0x6AFD, 0x6B01, 0x704B, 0x704D, 0x7047, 0x74D3, + 0x7668, 0x7667, 0x77D1, 0x7930, 0x7932, 0x792E, 0x9F9D, 0x7AC9, + 0x7AC8, 0x7C56, 0x7C51, 0x7E85, 0x7E89, 0x7E8E, 0x7E84, 0x826A, +plane 83 +at 0x00 + 0x862B, 0x862F, 0x8628, 0x8616, 0x9D45, 0x9D42, 0x9D43, 0x9D3E, + 0x9D37, 0x9D40, 0x9D3D, 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, + 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, 0x9F22, + 0x9F54, 0x9FA0, 0x5131, 0x512D, 0x512E, 0x5698, 0x569C, 0x5697, + 0x569A, 0x569D, 0x5699, 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, + 0x5E6D, 0x5E6E, 0x61D8, 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, + 0x61F0, 0x61EB, 0x61D6, 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, + 0x6501, 0x6503, 0x64FC, 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, + 0x6AC5, 0x6AB9, 0x6ABD, 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, + 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, 0x700C, + 0x700D, 0x7001, 0x7005, 0x7014, 0x700E, 0x6FFF, 0x7000, 0x6FFB, + 0x7026, 0x6FFC, 0x6FF7, 0x700A, 0x7201, 0x71FF, 0x71F9, 0x7203, + 0x71FD, 0x7376, 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, 0x74B6, + 0x74BB, 0x74C2, 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, + 0x7653, 0x7657, 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, + 0x78FF, 0x790C, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, + 0x79AD, 0x79AC, 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, + 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, 0x7E5C, + 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, 0x7E60, + 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, 0x81D1, + 0x81D2, 0x8615, 0x861D, 0x881A, 0x89BC, 0x8B75, 0x8B7C, 0x8D11, + 0x8D12, 0x8F5C, 0x91BB, 0x93F4, 0x942D, 0x96E4, 0x9737, 0x9736, + 0x9767, 0x97BE, 0x97BD, 0x97E2, 0x9868, 0x9866, 0x98C8, 0x98CA, + 0x98C7, 0x98DC, 0x994F, 0x99A9, 0x9A3C, 0x9A3B, 0x9ACE, 0x9B14, + 0x9B53, 0x9C2E, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, + 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, + 0x85CB, 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, + 0x85B8, 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, + 0x87EB, 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, + 0x87D3, 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, + 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, + 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, +plane 84 +at 0x00 + 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, + 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, + 0x8C75, 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, + 0x8E5C, 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67, + 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, + 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5, + 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B, + 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395, + 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4, + 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3, + 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, + 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, 0x9C1F, + 0x9DB0, 0x9DBD, 0x9DAE, 0x9DC4, 0x9E7B, 0x9E9E, 0x9F05, 0x9F69, + 0x9FA1, 0x56C7, 0x571D, 0x5B4A, 0x5DD3, 0x5F72, 0x6202, 0x6235, + 0x6527, 0x651E, 0x651F, 0x6B07, 0x6B06, 0x7054, 0x721C, 0x7220, + 0x7AF8, 0x7C5D, 0x7C58, 0x7E92, 0x7F4E, 0x8827, 0x8B81, 0x8B83, + 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850, + 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, 0x9A0B, + 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, 0x9A06, + 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, 0x9B4A, + 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, 0x9BB5, + 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53, + 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57, + 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF, + 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28, + 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB, + 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, 0x58DB, + 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, 0x5FBF, 0x61FB, + 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, 0x6584, 0x65DE, + 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, 0x6ACB, + 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60, + 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021, +plane 85 +at 0x00 + 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x702A, 0x720C, + 0x720A, 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, + 0x72A1, 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, 0x7660, 0x77C9, + 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B, 0x8C44, 0x9442, 0x944D, + 0x9454, 0x944E, 0x9443, 0x973C, 0x9740, 0x97C0, 0x995A, 0x9A51, + 0x9ADD, 0x9C38, 0x9C45, 0x9C3A, 0x9C35, 0x9EF1, 0x9F93, 0x529A, + 0x8641, 0x5DD7, 0x6528, 0x7053, 0x7059, 0x7221, 0x766F, 0x7937, + 0x79B5, 0x7C62, 0x7C5E, 0x7CF5, 0x863D, 0x882D, 0x7921, 0x791C, + 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, 0x7C39, + 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, + 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, + 0x7F83, 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, + 0x8264, 0x8261, 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, + 0x85E8, 0x85DA, 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, + 0x85E3, 0x85DC, 0x85D1, 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, + 0x8800, 0x87FA, 0x8803, 0x87F6, 0x87F7, 0x8809, 0x880C, 0x880B, + 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A, 0x8802, 0x8962, 0x895A, + 0x895B, 0x8957, 0x8961, 0x895C, 0x8958, 0x895D, 0x8959, 0x8988, + 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, 0x8B53, + 0x8B56, 0x8B54, 0x8B4B, 0x8B55, 0x8B51, 0x8B42, 0x8B52, 0x8B57, + 0x8C43, 0x8C77, 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, + 0x8DAA, 0x8DAD, 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, + 0x8E7B, 0x8EC2, 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, + 0x9140, 0x913F, 0x91B0, 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, + 0x93DA, 0x93D0, 0x93F9, 0x93EC, 0x93CC, 0x93D9, 0x93A9, 0x93E6, + 0x93CA, 0x93D4, 0x93EE, 0x93E3, 0x93D5, 0x93C4, 0x93CE, 0x93C0, + 0x93D2, 0x93E7, 0x957D, 0x95DA, 0x95DB, 0x96E1, 0x9729, 0x972B, + 0x972C, 0x9728, 0x9726, 0x8989, 0x8B8D, 0x8B87, 0x8B90, 0x8D1A, + 0x8E99, 0x945F, 0x9456, 0x9461, 0x945B, 0x945A, 0x945C, 0x9465, + 0x9741, 0x986E, 0x986C, 0x986D, 0x99AA, 0x9A5C, 0x9A58, 0x9ADE, + 0x9C4F, 0x9C51, 0x9C53, 0x9DFC, 0x9F39, 0x513E, 0x56D2, 0x5B4F, + 0x6B14, 0x7A72, 0x7A73, 0x8B91, 0x97B3, 0x97B7, 0x97B6, 0x97DD, +plane 86 +at 0x00 + 0x97DE, 0x97DF, 0x985C, 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, + 0x98BB, 0x98BE, 0x9948, 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, + 0x9A15, 0x9A25, 0x9A1D, 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, + 0x9A23, 0x9A1E, 0x9A1C, 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, + 0x9B0C, 0x9B37, 0x9BEA, 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, + 0x9BE2, 0x9BF0, 0x9BD4, 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, + 0x9BD5, 0x9BE1, 0x9BDA, 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, + 0x9D71, 0x9D80, 0x9D78, 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, + 0x9D74, 0x9D75, 0x9D70, 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, + 0x9D6F, 0x9D79, 0x9D7F, 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, + 0x9EFC, 0x9F2D, 0x9F40, 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, + 0x5337, 0x56B2, 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, + 0x5EEE, 0x5EEF, 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, + 0x6513, 0x65DF, 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, + 0x6AE8, 0x6AF9, 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, + 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, + 0x7040, 0x703B, 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, + 0x737C, 0x74BA, 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, + 0x77CF, 0x77CD, 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, + 0x7929, 0x91BF, 0x946C, 0x96E6, 0x9745, 0x97C8, 0x97E4, 0x995D, + 0x9B21, 0x9B2C, 0x9B57, 0x9C5D, 0x9C61, 0x9C65, 0x9E08, 0x9F45, + 0x6205, 0x66EF, 0x6B1B, 0x6B1D, 0x7225, 0x7224, 0x7C6D, 0x8642, + 0x8649, 0x8978, 0x898A, 0x8B97, 0x8C9B, 0x8D1C, 0x8EA2, 0x9C6C, + 0x9C6F, 0x9E0E, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, + 0x7C48, 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, + 0x7E80, 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x820B, 0x8268, + 0x8269, 0x8622, 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, + 0x8604, 0x8609, 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, + 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, + 0x8B6A, 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, + 0x8E86, 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, + 0x8F5A, 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, +plane 87 +at 0x00 + 0x940B, 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, + 0x9410, 0x9428, 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, + 0x940E, 0x9416, 0x9412, 0x93FA, 0x9409, 0x93F8, 0x940A, 0x93FF, + 0x93FC, 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, + 0x972E, 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, + 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, + 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, + 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, + 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, + 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, + 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, 0x9F08, + 0x9F1D, 0x9FA3, 0x5F60, 0x6B1C, 0x7CF3, 0x8B9B, 0x8EA7, 0x91C4, + 0x947A, 0x9A61, 0x9A63, 0x9AD7, 0x9C76, 0x9FA5, 0x7067, 0x72AB, + 0x864A, 0x897D, 0x8B9D, 0x8C53, 0x8F65, 0x947B, 0x98CD, 0x98DD, + 0x9B30, 0x9E16, 0x96E7, 0x9E18, 0x9EA2, 0x9F7C, 0x7E9E, 0x9484, + 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, 0x9DA2, + 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, 0x9DA7, + 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, 0x9F30, + 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, 0x513A, + 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, 0x5B47, + 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, 0x6B03, + 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049, 0x7045, + 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A, 0x77D0, + 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, 0x7E87, + 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, 0x81DD, + 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, 0x861C, 0x8619, 0x8627, + 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, 0x8625, 0x8829, 0x881D, + 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A, 0x896D, 0x8969, + 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45, 0x8B7A, 0x8B7B, + 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, 0x8F5B, 0x8F5D, + 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B, 0x9436, 0x9429, + 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, 0x9437, 0x942C, 0x9440, +plane 88 +at 0x00 + 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, 0x973A, 0x97BF, 0x97E1, + 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, 0x9956, 0x9A39, 0x9A3D, + 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, 0x9E1C, 0x7C71, 0x97CA, + 0x9EA3, 0x9C7B, 0x9F97, 0x9750, 0x4E40, 0x4E41, 0x4E5A, 0x4E02, + 0x4E29, 0x5202, 0x5DDC, 0x5342, 0x536A, 0x5B52, 0x5FC4, 0x624C, + 0x72AD, 0x4E12, 0x4E2F, 0x4E96, 0x4ED0, 0x5142, 0x5183, 0x5383, + 0x53B8, 0x5928, 0x5C23, 0x5E01, 0x5F00, 0x706C, 0x9A3F, 0x9ACD, + 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, 0x9B52, 0x9C2B, 0x9C1D, + 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, 0x9C24, 0x9C21, 0x9DB7, + 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, 0x9DCF, 0x9DBE, 0x9DC5, + 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, 0x9DBA, 0x9DAC, 0x9DC8, + 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD, 0x9DB2, 0x9E7A, 0x9E9C, + 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18, 0x9F1A, 0x9F31, 0x9F4E, + 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6, 0x56C5, 0x56CB, 0x5971, + 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, 0x6521, 0x6520, 0x6526, + 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, 0x7055, 0x7056, 0x7057, + 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, 0x74D8, 0x74D5, 0x74D9, + 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, 0x7A70, 0x7A71, 0x7C57, + 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A, 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, + 0x7F87, 0x81DE, 0x826B, 0x8634, 0x8635, 0x8633, 0x862C, 0x8632, + 0x8636, 0x882C, 0x8828, 0x8826, 0x882A, 0x8825, 0x8971, 0x89BF, + 0x89BE, 0x89FB, 0x8B7E, 0x8B84, 0x8B82, 0x8B86, 0x8B85, 0x8B7F, + 0x8D15, 0x8E95, 0x8E94, 0x8E9A, 0x8E92, 0x8E90, 0x8E96, 0x8E97, + 0x8F60, 0x8F62, 0x9147, 0x944C, 0x9450, 0x944A, 0x944B, 0x944F, + 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973F, 0x97E3, 0x986A, + 0x9869, 0x98CB, 0x9954, 0x995B, 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, + 0x9A4F, 0x9A48, 0x9A4A, 0x722B, 0x5188, 0x8279, 0x8FB6, 0x4E17, + 0x4EE2, 0x4EDB, 0x51AD, 0x51F7, 0x531B, 0x5388, 0x5387, 0x53CF, + 0x53FD, 0x53E7, 0x56DC, 0x56D9, 0x5725, 0x5727, 0x5933, 0x5C13, + 0x5C75, 0x66F1, 0x7F52, 0x4E51, 0x4E6A, 0x4F0C, 0x4EFE, 0x4F1B, + 0x5173, 0x518E, 0x52A5, 0x52A7, 0x9A49, 0x9A52, 0x9A50, 0x9AD0, + 0x9B19, 0x9B2B, 0x9B3B, 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, +plane 89 +at 0x00 + 0x9C44, 0x9C39, 0x9C33, 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, + 0x9C3D, 0x9C36, 0x9DDB, 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, + 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, + 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35, 0x9F33, 0x9F32, 0x9F42, + 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299, 0x58E8, 0x58E7, 0x5972, + 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201, 0x6203, 0x6204, 0x6529, + 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, + 0x705A, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, + 0x7C66, 0x7E95, 0x826C, 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, + 0x863B, 0x863E, 0x8830, 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, + 0x8973, 0x89FE, 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, + 0x8E98, 0x8F64, 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, 0x9457, + 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, 0x9B1F, + 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, 0x9C55, + 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, 0x9DEB, + 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, + 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, + 0x9EF2, 0x9EF3, 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, + 0x9F4F, 0x52A4, 0x53BD, 0x5402, 0x572B, 0x591B, 0x5935, 0x5C17, + 0x5C70, 0x5C7D, 0x5DE9, 0x5F19, 0x5F1C, 0x5F75, 0x5FC8, 0x6C12, + 0x72B3, 0x7390, 0x7536, 0x8281, 0x8FB8, 0x4E23, 0x4F2E, 0x514F, + 0x51BA, 0x5222, 0x52AF, 0x52B0, 0x52B1, 0x5364, 0x53D3, 0x593F, + 0x598B, 0x5991, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, + 0x5B4E, 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, + 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, + 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, + 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, + 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, + 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, + 0x9C67, 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, + 0x9E03, 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, + 0x9E04, 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, +plane 90 +at 0x00 + 0x652E, 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, + 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, + 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648, + 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5, + 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, + 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, + 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, + 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, + 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74, + 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, 0x5995, + 0x5B8A, 0x5C87, 0x5E0D, 0x5E8E, 0x5F7A, 0x6290, 0x629A, 0x653C, + 0x653A, 0x6598, 0x6765, 0x79C2, 0x809E, 0x81EB, 0x8289, 0x8296, + 0x8287, 0x8FC0, 0x8FC3, 0x9578, 0x9625, 0x4E75, 0x4E74, 0x4F99, + 0x4F71, 0x5153, 0x51BF, 0x51C0, 0x51EE, 0x523D, 0x52BD, 0x530C, + 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D, 0x883F, + 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874, 0x98CC, + 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, 0x9E17, + 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, 0x9480, + 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, 0x8B9F, + 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069, + 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0x7881, 0x92B9, 0x88CF, + 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554, 0x2566, 0x2557, 0x2560, + 0x256C, 0x2563, 0x255A, 0x2569, 0x255D, 0x2552, 0x2564, 0x2555, + 0x255E, 0x256A, 0x2561, 0x2558, 0x2567, 0x255B, 0x2553, 0x2565, + 0x2556, 0x255F, 0x256B, 0x2562, 0x2559, 0x2568, 0x255C, 0x2551, + 0x2550, 0x2554, 0x2557, 0x255A, 0x255D, 0x2588, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 91 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0x7F37, 0x53C0, 0x546E, + 0x5483, 0x545E, 0x545D, 0x577E, 0x5779, 0x577A, 0x576C, 0x5787, + 0x591D, 0x5946, 0x5943, 0x5B61, 0x5B66, 0x5B90, 0x5C29, 0x5CB2, + 0x5CC0, 0x601F, 0x5FE2, 0x6616, 0x65F9, 0x6788, 0x679B, 0x676E, + 0x679E, 0x6B24, 0x6B7D, 0x6CE6, 0x6CCB, 0x6CB5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x7097, 0x709B, 0x726B, 0x72D5, 0x7543, + 0x759C, 0x77E4, 0x7ACE, 0x8013, 0x80B7, 0x80B9, 0x81E4, 0x81FD, + 0x820F, 0x82BF, 0x82CA, 0x82C1, 0x8FD0, 0x90AE, 0x9638, 0x4FBC, + 0x4FE9, 0x4FBD, 0x4FE2, 0x5158, 0x52C6, 0x52C8, 0x5328, 0x5329, + 0x57B4, 0x57A9, 0x5B68, 0x5F2B, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 92 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x5F8D, 0x6018, 0x6057, 0x6048, 0x6038, 0x6071, 0x6312, + 0x630A, 0x6323, 0x662A, 0x67E0, 0x67BE, 0x6B29, 0x6D43, 0x70A6, + 0x70C0, 0x722F, 0x7271, 0x74EA, 0x7520, 0x75A9, 0x7685, 0x7706, + 0x76F6, 0x7700, 0x7702, 0x8009, 0x82DA, 0x830A, 0x9655, 0x9652, + 0x4E35, 0x5034, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 93 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x5001, + 0x500A, 0x5258, 0x532B, 0x54EC, 0x5515, 0x54FE, 0x54E3, 0x5516, + 0x57D3, 0x5959, 0x5A27, 0x5A28, 0x5A10, 0x5A0E, 0x5BAF, 0x5BBA, + 0x5BB1, 0x5CFC, 0x5CF2, 0x5CFE, 0x5DF8, 0x5F2C, 0x6082, 0x6091, + 0x608F, 0x6547, 0x654C, 0x658A, 0x67E1, 0x684A, 0x683F, 0x67BD, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 94 +at 0x00 + 0, 0, 0, 0, 0, 0x70C9, 0x73BA, 0x75C6, + 0x75B7, 0x768C, 0x768D, 0x7717, 0x771C, 0x7714, 0x7B0C, 0x7D23, + 0x7F98, 0x7F90, 0x803A, 0x8226, 0x832E, 0x8355, 0x831A, 0x833D, + 0x8330, 0x8651, 0x8688, 0x898E, 0x898D, 0x8A09, 0x8A14, 0x9007, + 0x9579, 0x9584, 0x9657, 0x96BA, 0x5067, 0x5318, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubig5.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubig5.map new file mode 100644 index 00000000..5ff26d43 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubig5.map @@ -0,0 +1,1861 @@ +# +# Creating compact CJK type1 fonts from Unicode +# Chinese Big5 encoding fonts. +# +plane 01 +at 0x00 + 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2027, 0xFF1B, 0xFF1A, + 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFE51, 0xFE52, + 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31, + 0x2014, 0xFE33, 0x2574, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, + 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, + 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, + 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, + 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, 0xFE5B, + 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, 0x201D, 0x301D, + 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, 0x203B, 0x00A7, + 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, 0x2606, 0x2605, + 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, 0x32A3, 0x2105, + 0x00AF, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49, 0xFE4A, 0xFE4D, 0xFE4E, + 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, 0xFF0D, 0x00D7, + 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, 0x2266, 0x2267, + 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, 0xFE64, 0xFE65, + 0xFE66, 0xFF5E, 0x2229, 0x222A, 0x22A5, 0x2220, 0x221F, 0x22BF, + 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, 0x2640, 0x2642, + 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, + 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F, 0xFF3C, 0x2215, 0xFE68, + 0xFF04, 0xFFE5, 0x3012, 0xFFE0, 0xFFE1, 0xFF05, 0xFF20, 0x2103, + 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, 0x339C, 0x339D, 0x339E, + 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, 0x00B0, 0x5159, 0x515B, + 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, 0x74E9, 0x7CCE, 0x2581, + 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258F, + 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x253C, 0x2534, + 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, 0x2502, 0x2595, 0x250C, + 0x2510, 0x2514, 0x2518, 0x256D, 0x256E, 0x2570, 0x256F, 0x2550, + 0x255E, 0x256A, 0x2561, 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, + 0x2572, 0x2573, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, + 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, + 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, +plane 02 +at 0x00 + 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x5341, + 0x5344, 0x5345, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, + 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, + 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, + 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF41, 0xFF42, 0xFF43, 0xFF44, + 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, + 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, + 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x0391, 0x0392, + 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, + 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, + 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, + 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, + 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x3105, 0x3106, + 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, + 0x310F, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, + 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, + 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, + 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, 0x02CA, 0x02C7, 0x02CB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x20AC, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x4E00, + 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, + 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B, 0x5315, + 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, + 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, + 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F, 0x58EB, +plane 03 +at 0x00 + 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, 0x5B53, 0x5BF8, 0x5C0F, + 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, + 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, 0x624D, 0x4E11, 0x4E10, + 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B, 0x5C39, 0x4E88, 0x4E91, + 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, + 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4, 0x5143, 0x5141, 0x5167, + 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6, 0x5206, 0x5207, 0x5208, + 0x52FB, 0x52FE, 0x52FF, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, + 0x535E, 0x5384, 0x53CB, 0x53CA, 0x53CD, 0x58EC, 0x5929, 0x592B, + 0x592A, 0x592D, 0x5B54, 0x5C11, 0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, + 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, 0x5FC3, 0x6208, 0x6236, 0x624B, + 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4, 0x65B9, 0x65E5, 0x66F0, + 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, + 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236, 0x723B, 0x7247, 0x7259, + 0x725B, 0x72AC, 0x738B, 0x4E19, 0x4E16, 0x4E15, 0x4E14, 0x4E18, + 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, + 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, 0x4ED9, 0x4EDE, 0x5145, 0x5144, + 0x5189, 0x518A, 0x51AC, 0x51F9, 0x51FA, 0x51F8, 0x520A, 0x52A0, + 0x529F, 0x5305, 0x5306, 0x5317, 0x531D, 0x4EDF, 0x534A, 0x5349, + 0x5361, 0x5360, 0x536F, 0x536E, 0x53BB, 0x53EF, 0x53E4, 0x53F3, + 0x53EC, 0x53EE, 0x53E9, 0x53E8, 0x53FC, 0x53F8, 0x53F5, 0x53EB, + 0x53E6, 0x53EA, 0x53F2, 0x53F1, 0x53F0, 0x53E5, 0x53ED, 0x53FB, + 0x56DB, 0x56DA, 0x5916, 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, + 0x5B83, 0x5C3C, 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, + 0x5E7C, 0x5F01, 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, + 0x6252, 0x6251, 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, + 0x672D, 0x6B63, 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, + 0x6C3E, 0x72AF, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, + 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, + 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, + 0x7A74, 0x7ACB, 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, + 0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, +plane 04 +at 0x00 + 0x4F0D, 0x4F10, 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, + 0x4EF3, 0x4EFD, 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, + 0x5168, 0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, + 0x5216, 0x52A3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, + 0x540F, 0x540C, 0x540A, 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, + 0x540D, 0x5408, 0x5403, 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, + 0x56DD, 0x5733, 0x5730, 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, + 0x5919, 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, + 0x5979, 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, + 0x5B89, 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, + 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, 0x6210, + 0x6263, 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, 0x65ED, + 0x66F2, 0x66F3, 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, 0x6B21, + 0x6B64, 0x6B7B, 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, 0x6C60, + 0x6C50, 0x6C55, 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070, 0x725F, + 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, + 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x808B, + 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, 0x821F, + 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, 0x897F, + 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, 0x4F5E, + 0x4F34, 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, 0x4F3A, + 0x4F38, 0x4F43, 0x4F54, 0x4F3C, 0x4F46, 0x4F63, 0x4F5C, 0x4F60, + 0x4F2F, 0x4F4E, 0x4F36, 0x4F59, 0x4F5D, 0x4F48, 0x4F5A, 0x514C, + 0x514B, 0x514D, 0x5175, 0x51B6, 0x51B7, 0x5225, 0x5224, 0x5229, + 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, 0x52AC, 0x5323, 0x5373, + 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426, 0x544E, 0x5427, + 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B, 0x5429, 0x544A, + 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436, 0x5420, 0x543C, + 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA, 0x56F0, 0x56E4, + 0x56EB, 0x574A, 0x5751, 0x5740, 0x574D, 0x5747, 0x574E, 0x573E, + 0x5750, 0x574F, 0x573B, 0x58EF, 0x593E, 0x599D, 0x5992, 0x59A8, + 0x599E, 0x59A3, 0x5999, 0x5996, 0x598D, 0x59A4, 0x5993, 0x598A, +plane 05 +at 0x00 + 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, + 0x5C2C, 0x5C40, 0x5C41, 0x5C3F, 0x5C3E, 0x5C90, 0x5C91, 0x5C94, + 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, + 0x5F1F, 0x5F64, 0x5F62, 0x5F77, 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, + 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, 0x5FEA, 0x6212, 0x6211, 0x6284, + 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626D, 0x628A, 0x627C, + 0x627E, 0x6279, 0x6273, 0x6292, 0x626F, 0x6298, 0x626E, 0x6295, + 0x6293, 0x6291, 0x6286, 0x6539, 0x653B, 0x6538, 0x65F1, 0x66F4, + 0x675F, 0x674E, 0x674F, 0x6750, 0x6751, 0x675C, 0x6756, 0x675E, + 0x6749, 0x6746, 0x6760, 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, + 0x6C5E, 0x6C99, 0x6C81, 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, + 0x6C7A, 0x6C90, 0x6C70, 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, + 0x6C83, 0x6C72, 0x6C7E, 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, + 0x6C98, 0x6C82, 0x7076, 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, + 0x7260, 0x72C4, 0x72C2, 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, + 0x7682, 0x76EF, 0x77E3, 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, + 0x7F55, 0x8096, 0x8093, 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, + 0x826F, 0x8292, 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, + 0x8C46, 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, + 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, + 0x90A2, 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, + 0x962E, 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, + 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, + 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, + 0x4F88, 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, + 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, + 0x51FD, 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, + 0x5241, 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, + 0x5377, 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475, + 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492, + 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462, + 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, +plane 06 +at 0x00 + 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, + 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, + 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, + 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, + 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, 0x5C46, + 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1, 0x5CB3, 0x5E18, + 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, 0x5E9A, 0x5E97, + 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, 0x5F29, 0x5F80, + 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, + 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, 0x6015, 0x6021, + 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, 0x623F, 0x623E, + 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF, 0x62C2, 0x62B9, + 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB, 0x62C8, 0x62A8, + 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD, 0x62B5, 0x62DA, + 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC, 0x62CE, 0x653E, + 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, 0x6606, 0x6602, + 0x660E, 0x6600, 0x660F, 0x6615, 0x660A, 0x6607, 0x670D, 0x670B, + 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, 0x6773, 0x6777, 0x6787, + 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, 0x6789, 0x677E, 0x6790, + 0x6775, 0x679A, 0x6793, 0x677C, 0x676A, 0x6772, 0x6B23, 0x6B66, + 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, + 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, + 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, + 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, 0x6CDB, 0x6CCA, 0x6CAC, + 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, 0x7095, 0x708E, 0x7092, 0x708A, + 0x7099, 0x722C, 0x722D, 0x7238, 0x7248, 0x7267, 0x7269, 0x72C0, + 0x72CE, 0x72D9, 0x72D7, 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, + 0x73A5, 0x753D, 0x759D, 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, + 0x76F4, 0x77E5, 0x77FD, 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, + 0x7A7A, 0x7A79, 0x7AFA, 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, + 0x80BA, 0x80A5, 0x80A2, 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, + 0x80AA, 0x80AF, 0x81E5, 0x81FE, 0x820D, 0x82B3, 0x829D, 0x8299, +plane 07 +at 0x00 + 0x82AD, 0x82BD, 0x829F, 0x82B9, 0x82B1, 0x82AC, 0x82A5, 0x82AF, + 0x82B8, 0x82A3, 0x82B0, 0x82BE, 0x82B7, 0x864E, 0x8671, 0x521D, + 0x8868, 0x8ECB, 0x8FCE, 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, 0x90B1, + 0x90B6, 0x91C7, 0x91D1, 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, + 0x963B, 0x9644, 0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, + 0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, + 0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, + 0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, + 0x5157, 0x5192, 0x5191, 0x51A0, 0x524E, 0x5243, 0x524A, 0x524D, + 0x524C, 0x524B, 0x5247, 0x52C7, 0x52C9, 0x52C3, 0x52C1, 0x530D, + 0x5357, 0x537B, 0x539A, 0x53DB, 0x54AC, 0x54C0, 0x54A8, 0x54CE, + 0x54C9, 0x54B8, 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, 0x54AA, + 0x54C1, 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9, + 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2, + 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950, + 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA, + 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, + 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, + 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, + 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, 0x5F8A, 0x5F8B, + 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, 0x600E, + 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C, + 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC, + 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7, 0x62EF, + 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545, 0x65AB, + 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, 0x6627, 0x662F, 0x661F, + 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, 0x67D3, 0x67F1, 0x67D4, + 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, 0x67E9, 0x67EF, 0x67C4, + 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, 0x67DE, 0x67F3, + 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83, 0x6B86, + 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, + 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17, 0x6D3B, 0x6D3D, +plane 08 +at 0x00 + 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, 0x6D39, 0x6D27, 0x6D38, 0x6D29, + 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, 0x70AB, 0x70BA, 0x70B3, 0x70AC, + 0x70AF, 0x70AD, 0x70B8, 0x70AE, 0x70A4, 0x7230, 0x7272, 0x726F, + 0x7274, 0x72E9, 0x72E0, 0x72E1, 0x73B7, 0x73CA, 0x73BB, 0x73B2, + 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D, 0x754F, 0x754C, 0x754E, + 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2, 0x75A3, 0x7678, 0x7686, + 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3, 0x76C5, 0x7701, 0x76F9, + 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC, 0x7707, 0x77DC, 0x7802, + 0x7814, 0x780C, 0x780D, 0x7946, 0x7949, 0x7948, 0x7947, 0x79B9, + 0x79BA, 0x79D1, 0x79D2, 0x79CB, 0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, + 0x7C7D, 0x7D02, 0x7D05, 0x7D00, 0x7D09, 0x7D07, 0x7D04, 0x7D06, + 0x7F38, 0x7F8E, 0x7FBF, 0x8004, 0x8010, 0x800D, 0x8011, 0x8036, + 0x80D6, 0x80E5, 0x80DA, 0x80C3, 0x80C4, 0x80CC, 0x80E1, 0x80DB, + 0x80CE, 0x80DE, 0x80E4, 0x80DD, 0x81F4, 0x8222, 0x82E7, 0x8303, + 0x8305, 0x82E3, 0x82DB, 0x82E6, 0x8304, 0x82E5, 0x8302, 0x8309, + 0x82D2, 0x82D7, 0x82F1, 0x8301, 0x82DC, 0x82D4, 0x82D1, 0x82DE, + 0x82D3, 0x82DF, 0x82EF, 0x8306, 0x8650, 0x8679, 0x867B, 0x867A, + 0x884D, 0x886B, 0x8981, 0x89D4, 0x8A08, 0x8A02, 0x8A03, 0x8C9E, + 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, + 0x8FE2, 0x8FEA, 0x8FE5, 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, + 0x90CE, 0x90C1, 0x90C3, 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, + 0x964B, 0x964C, 0x964D, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, + 0x9801, 0x98A8, 0x98DB, 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, + 0x500C, 0x500D, 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, + 0x5016, 0x5006, 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, + 0x5000, 0x5014, 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, + 0x4FF3, 0x4FEE, 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, + 0x51A4, 0x51A5, 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, + 0x525C, 0x5254, 0x525B, 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, + 0x53DF, 0x54E8, 0x5510, 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, + 0x5506, 0x54FA, 0x5514, 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, + 0x54EA, 0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, +plane 09 +at 0x00 + 0x57C2, 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, + 0x595A, 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, + 0x5A20, 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, + 0x5BB0, 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, + 0x5C04, 0x5C51, 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, + 0x5CE8, 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, + 0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, + 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, 0x6069, 0x606F, 0x6084, + 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, 0x6096, 0x6247, + 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, 0x6342, + 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, 0x632B, + 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, 0x65C5, + 0x6642, 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, 0x6641, + 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, + 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817, 0x684C, + 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843, 0x682A, + 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7, 0x6C23, + 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95, 0x6D88, + 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93, 0x6D6C, 0x6D89, + 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, 0x6D79, 0x6D85, + 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9, 0x70C8, 0x70CF, + 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8, 0x72F7, 0x7386, + 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA, 0x73DE, 0x7554, 0x755D, + 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5, 0x75C7, 0x75B2, 0x75B3, + 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8, 0x768B, 0x76B0, 0x76CA, + 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, 0x7728, 0x77E9, 0x7830, + 0x7827, 0x7838, 0x781D, 0x7834, 0x7837, 0x7825, 0x782D, 0x7820, + 0x781F, 0x7832, 0x7955, 0x7950, 0x7960, 0x795F, 0x7956, 0x795E, + 0x795D, 0x7957, 0x795A, 0x79E4, 0x79E3, 0x79E7, 0x79DF, 0x79E6, + 0x79E9, 0x79D8, 0x7A84, 0x7A88, 0x7AD9, 0x7B06, 0x7B11, 0x7C89, + 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, 0x7D20, 0x7D22, 0x7D14, 0x7D10, + 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, +plane 10 +at 0x00 + 0x7F94, 0x7FC5, 0x7FC1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, + 0x803D, 0x803F, 0x80F1, 0x8102, 0x80F0, 0x8105, 0x80ED, 0x80F4, + 0x8106, 0x80F8, 0x80F3, 0x8108, 0x80FD, 0x810A, 0x80FC, 0x80EF, + 0x81ED, 0x81EC, 0x8200, 0x8210, 0x822A, 0x822B, 0x8228, 0x822C, + 0x82BB, 0x832B, 0x8352, 0x8354, 0x834A, 0x8338, 0x8350, 0x8349, + 0x8335, 0x8334, 0x834F, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, + 0x8331, 0x8328, 0x8343, 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, + 0x86A9, 0x868C, 0x86A3, 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, + 0x887D, 0x8879, 0x8A18, 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, + 0x8A17, 0x8A13, 0x8A16, 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, + 0x8CA1, 0x8CA2, 0x8D77, 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, + 0x9001, 0x9006, 0x8FF7, 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, + 0x9005, 0x8FF8, 0x9095, 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, + 0x914C, 0x91D8, 0x91DD, 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, + 0x9663, 0x9661, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, + 0x98E2, 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, + 0x507A, 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, + 0x5065, 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, + 0x500F, 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, + 0x52D2, 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, + 0x5340, 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, + 0x555E, 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, + 0x552F, 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, + 0x5541, 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, + 0x5806, 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, + 0x5920, 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40, + 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, + 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, + 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, + 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2, + 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, + 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, +plane 11 +at 0x00 + 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3, + 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, 0x60C5, + 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, 0x60C6, 0x60DF, + 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, 0x63A0, 0x63A7, + 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367, 0x6398, 0x63AA, + 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B, 0x63A8, 0x6384, + 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F, 0x6380, 0x637B, + 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551, 0x6559, 0x6557, + 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, 0x659B, 0x65AC, + 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, 0x6664, 0x6668, + 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, 0x68AF, 0x68A2, + 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, 0x6897, 0x68B0, + 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, 0x689D, 0x68A8, + 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA, 0x6BEB, 0x6BEC, 0x6C2B, + 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, + 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, + 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, 0x6DC5, 0x6DD2, 0x6E1A, + 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, 0x6DF1, 0x6DEE, 0x6DE8, + 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, 0x6DE6, 0x70F9, 0x7109, + 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, 0x7281, 0x731C, 0x731B, + 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740A, 0x7403, 0x7406, + 0x73FE, 0x740D, 0x74E0, 0x74F6, 0x74F7, 0x751C, 0x7522, 0x7565, + 0x7566, 0x7562, 0x7570, 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, + 0x75CD, 0x768E, 0x76D4, 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, + 0x7736, 0x7738, 0x773A, 0x786B, 0x7843, 0x784E, 0x7965, 0x7968, + 0x796D, 0x79FB, 0x7A92, 0x7A95, 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, + 0x7B26, 0x7B19, 0x7B1E, 0x7B2E, 0x7C92, 0x7C97, 0x7C95, 0x7D46, + 0x7D43, 0x7D71, 0x7D2E, 0x7D39, 0x7D3C, 0x7D40, 0x7D30, 0x7D33, + 0x7D44, 0x7D2F, 0x7D42, 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, + 0x7FCC, 0x7FCE, 0x7FD2, 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, + 0x8123, 0x812B, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, + 0x8236, 0x8239, 0x838E, 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, +plane 12 +at 0x00 + 0x83BD, 0x83AB, 0x8392, 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, + 0x837B, 0x837C, 0x8386, 0x83A7, 0x8655, 0x5F6A, 0x86C7, 0x86C0, + 0x86B6, 0x86C4, 0x86B5, 0x86C6, 0x86CB, 0x86B1, 0x86AF, 0x86C9, + 0x8853, 0x889E, 0x8888, 0x88AB, 0x8892, 0x8896, 0x888D, 0x888B, + 0x8993, 0x898F, 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, 0x8A2D, + 0x8A1F, 0x8A1B, 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, + 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, + 0x8EDF, 0x9019, 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, + 0x9010, 0x9015, 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, + 0x9014, 0x90E8, 0x90ED, 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6, + 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, 0x966A, 0x9675, 0x9673, + 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966C, 0x96C0, 0x96EA, + 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, 0x9CE5, 0x9E75, + 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, 0x5091, + 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274, + 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B, + 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C, + 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F, + 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589, + 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, 0x5834, 0x5824, 0x5830, + 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, 0x58FA, 0x5960, 0x5A77, + 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, 0x5B71, 0x5BD2, + 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C, 0x5D50, + 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43, 0x5E7E, + 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, + 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C, 0x6123, + 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1, 0x610E, + 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, 0x6249, 0x63A3, 0x638C, + 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, 0x63CD, 0x63D2, 0x63E3, + 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE, 0x6376, 0x63F4, 0x63EA, + 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E, 0x6566, 0x6562, 0x6563, + 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670, 0x6674, 0x6676, 0x666F, +plane 13 +at 0x00 + 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE, 0x66FF, 0x671F, 0x671D, + 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7, 0x6905, 0x68DF, 0x68F5, + 0x68EE, 0x68E7, 0x68F9, 0x68D2, 0x68F2, 0x68E3, 0x68CB, 0x68CD, + 0x690D, 0x6912, 0x690E, 0x68C9, 0x68DA, 0x696E, 0x68FB, 0x6B3E, + 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, 0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, + 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, 0x6E21, 0x6E32, 0x6E67, 0x6E4A, + 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B, 0x6E58, 0x6E24, 0x6E56, + 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, + 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, 0x6E89, 0x6E19, 0x6E4E, 0x6E63, + 0x6E44, 0x6E72, 0x6E69, 0x6E5F, 0x7119, 0x711A, 0x7126, 0x7130, + 0x7121, 0x7136, 0x716E, 0x711C, 0x724C, 0x7284, 0x7280, 0x7336, + 0x7325, 0x7334, 0x7329, 0x743A, 0x742A, 0x7433, 0x7422, 0x7425, + 0x7435, 0x7436, 0x7434, 0x742F, 0x741B, 0x7426, 0x7428, 0x7525, + 0x7526, 0x756B, 0x756A, 0x75E2, 0x75DB, 0x75E3, 0x75D9, 0x75D8, + 0x75DE, 0x75E0, 0x767B, 0x767C, 0x7696, 0x7693, 0x76B4, 0x76DC, + 0x774F, 0x77ED, 0x785D, 0x786C, 0x786F, 0x7A0D, 0x7A08, 0x7A0B, + 0x7A05, 0x7A00, 0x7A98, 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, + 0x7B56, 0x7B46, 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, + 0x7B51, 0x7C9F, 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, + 0x7D6E, 0x7D72, 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, + 0x7FD4, 0x7FD5, 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, + 0x8151, 0x814E, 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, + 0x8212, 0x821C, 0x83E9, 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, + 0x840B, 0x83C1, 0x83EF, 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, + 0x840C, 0x83CC, 0x83FD, 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, + 0x83DC, 0x8407, 0x83D4, 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, + 0x86D4, 0x86DB, 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, + 0x88B1, 0x8983, 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, + 0x8A41, 0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, + 0x8A56, 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, + 0x8CBB, 0x8CC0, 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, + 0x8D85, 0x8D81, 0x8DCE, 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, +plane 14 +at 0x00 + 0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, + 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, + 0x9163, 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, + 0x920D, 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, + 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, 0x9685, + 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, 0x96C6, + 0x96C7, 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, 0x98E7, + 0x98EA, 0x98EF, 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, 0x9EC3, + 0x9ECD, 0x9ED1, 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3, 0x50C5, + 0x50BE, 0x50AC, 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F, 0x5277, + 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F, 0x55DF, + 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1, 0x55E3, + 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, 0x55C9, + 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, 0x5854, + 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, 0x5967, + 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, + 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, 0x5EC8, 0x5F12, + 0x5F59, 0x5FAC, 0x5FAE, 0x611A, 0x610F, 0x6148, 0x611F, 0x60F3, + 0x611B, 0x60F9, 0x6101, 0x6108, 0x614E, 0x614C, 0x6144, 0x614D, + 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, 0x6137, 0x6221, 0x6222, + 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D, 0x642C, 0x640F, + 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417, 0x6406, 0x656C, + 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, + 0x6698, 0x668D, 0x6703, 0x6994, 0x696D, 0x695A, 0x6977, 0x6960, + 0x6954, 0x6975, 0x6930, 0x6982, 0x694A, 0x6968, 0x696B, 0x695E, + 0x6953, 0x6979, 0x6986, 0x695D, 0x6963, 0x695B, 0x6B47, 0x6B72, + 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD, 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, + 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, + 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, + 0x6EA7, 0x6EB4, 0x714E, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, + 0x715C, 0x716C, 0x7166, 0x714C, 0x7165, 0x715E, 0x7146, 0x7168, + 0x7156, 0x723A, 0x7252, 0x7337, 0x7345, 0x733F, 0x733E, 0x746F, +plane 15 +at 0x00 + 0x745A, 0x7455, 0x745F, 0x745E, 0x7441, 0x743F, 0x7459, 0x745B, + 0x745C, 0x7576, 0x7578, 0x7600, 0x75F0, 0x7601, 0x75F2, 0x75F1, + 0x75FA, 0x75FF, 0x75F4, 0x75F3, 0x76DE, 0x76DF, 0x775B, 0x776B, + 0x7766, 0x775E, 0x7763, 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, + 0x7768, 0x7762, 0x77EE, 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, + 0x7889, 0x787C, 0x7891, 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, + 0x842C, 0x79BD, 0x7A1C, 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, + 0x7A9F, 0x7AA0, 0x7B77, 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, + 0x7CB3, 0x7CB5, 0x7D93, 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, + 0x7F6E, 0x7F69, 0x7F6A, 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, + 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, + 0x8173, 0x816B, 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, + 0x8477, 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, + 0x845B, 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, + 0x865E, 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, + 0x86FE, 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, + 0x88D4, 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, + 0x88D2, 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, + 0x8A70, 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, + 0x8A62, 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, + 0x8C8A, 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, + 0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, + 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, + 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C, + 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E, + 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237, + 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, + 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, + 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, + 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, + 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, 0x98FD, + 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, +plane 16 +at 0x00 + 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6, 0x50ED, 0x50DA, + 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, 0x5162, 0x51F3, + 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, 0x561B, 0x5617, + 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, 0x55F7, 0x5616, + 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, 0x5875, 0x587E, + 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, 0x58FD, 0x5925, + 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, + 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, + 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D, 0x5C62, 0x5D84, + 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54, 0x5ED3, 0x5ED6, + 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147, 0x613F, 0x614B, 0x6177, + 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, 0x6175, 0x622A, 0x6487, + 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, 0x647A, 0x6451, 0x6467, + 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, 0x65D7, 0x65D6, 0x66A2, + 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995, 0x69C1, 0x69AE, 0x69D3, + 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB, 0x69B4, 0x69D0, 0x69CD, + 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3, 0x6B49, 0x6B4C, 0x6C33, + 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4, 0x6F29, 0x6F3E, 0x6F20, + 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, + 0x6F38, 0x6F32, 0x6F23, 0x6F15, 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, + 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC, 0x6EF7, 0x7194, 0x7199, 0x717D, + 0x718A, 0x7184, 0x7192, 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, + 0x7464, 0x7463, 0x746A, 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, + 0x760D, 0x760B, 0x7609, 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, + 0x777F, 0x7761, 0x78C1, 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, + 0x798E, 0x798F, 0x798D, 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, + 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B, 0x7B75, 0x7B97, 0x7B9D, 0x7B94, + 0x7B8F, 0x7BB8, 0x7B87, 0x7B84, 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, + 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE, 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, + 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, + 0x7DC7, 0x7DAC, 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, + 0x8087, 0x8150, 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, +plane 17 +at 0x00 + 0x81E7, 0x81FA, 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, + 0x84C6, 0x84C4, 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, + 0x84C0, 0x84D3, 0x8490, 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, + 0x873B, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, + 0x88F3, 0x8902, 0x88F4, 0x88F9, 0x88F8, 0x88FD, 0x88E8, 0x891A, + 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, + 0x8AA4, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, 0x8AA7, + 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, + 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060, + 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B, + 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, + 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, + 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, + 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, + 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, + 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, + 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, + 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC, 0x5287, + 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E, 0x563B, + 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E, 0x5657, + 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, 0x589F, 0x589E, 0x58B3, + 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, 0x5B09, 0x5AFB, 0x5B0B, + 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, + 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, 0x5E61, 0x5EE2, 0x5EDA, + 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, 0x5FB7, 0x5FB5, + 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182, 0x617C, 0x6170, + 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB, 0x618E, 0x61AC, 0x619A, + 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469, 0x646F, 0x6479, 0x649E, + 0x64B2, 0x6488, 0x6490, 0x64B0, 0x64A5, 0x6493, 0x6495, 0x64A9, + 0x6492, 0x64AE, 0x64AD, 0x64AB, 0x649A, 0x64AC, 0x6499, 0x64A2, + 0x64B3, 0x6575, 0x6577, 0x6578, 0x66AE, 0x66AB, 0x66B4, 0x66B1, + 0x6A23, 0x6A1F, 0x69E8, 0x6A01, 0x6A1E, 0x6A19, 0x69FD, 0x6A21, +plane 18 +at 0x00 + 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05, 0x69ED, 0x6A11, 0x6B50, + 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F, 0x6F7C, 0x6F84, 0x6F51, + 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, + 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, + 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8, 0x7256, 0x729B, 0x734E, + 0x7357, 0x7469, 0x748B, 0x7483, 0x747E, 0x7480, 0x757F, 0x7620, + 0x7629, 0x761F, 0x7624, 0x7626, 0x7621, 0x7622, 0x769A, 0x76BA, + 0x76E4, 0x778E, 0x7787, 0x778C, 0x7791, 0x778B, 0x78CB, 0x78C5, + 0x78BA, 0x78CA, 0x78BE, 0x78D5, 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, + 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, + 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, + 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, + 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, + 0x7F75, 0x7F77, 0x7FAF, 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, + 0x81A0, 0x819A, 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, + 0x852D, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, + 0x84FF, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, + 0x8768, 0x8759, 0x8757, 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, + 0x8907, 0x8912, 0x8913, 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, + 0x8AC4, 0x8A95, 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, + 0x8AB0, 0x8AD6, 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, + 0x8C6C, 0x8CE0, 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, + 0x8CE3, 0x8CDC, 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, + 0x8E10, 0x8E1D, 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, + 0x8EBA, 0x8F1D, 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, + 0x8F1E, 0x8F25, 0x9069, 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, + 0x912D, 0x9127, 0x9131, 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, + 0x92BB, 0x92B7, 0x92EA, 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, + 0x92D2, 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, + 0x9707, 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, + 0x981C, 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, + 0x99DF, 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, +plane 19 +at 0x00 + 0x9AEF, 0x9B27, 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, + 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112, 0x5118, + 0x5114, 0x5110, 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291, 0x5293, + 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, 0x5664, 0x5678, 0x566A, + 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, 0x5676, 0x58C1, + 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, 0x5BF0, + 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, 0x61B6, + 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, 0x64BB, + 0x64BC, 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, 0x64D2, + 0x64D4, 0x64BE, 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, 0x66C7, + 0x66B8, 0x6A3D, 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, 0x6A39, + 0x6A44, 0x6A62, 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F, 0x6A48, + 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1, 0x6FC3, 0x6FA4, + 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, + 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8, 0x71D5, 0x71B9, + 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368, 0x749C, 0x74A3, + 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D, 0x7634, 0x7638, + 0x763A, 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F, 0x77A5, 0x78E8, + 0x78DA, 0x78EC, 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, + 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, + 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, 0x7E0A, 0x7E11, 0x7E08, 0x7E1B, + 0x7E23, 0x7E1E, 0x7E1D, 0x7E09, 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, + 0x7FF1, 0x7FEE, 0x8028, 0x81B3, 0x81A9, 0x81A8, 0x81FB, 0x8208, + 0x8258, 0x8259, 0x854A, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, + 0x8549, 0x856D, 0x856A, 0x855E, 0x8783, 0x879F, 0x879E, 0x87A2, + 0x878D, 0x8861, 0x892A, 0x8932, 0x8925, 0x892B, 0x8921, 0x89AA, + 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB, 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, + 0x8AEE, 0x8AFE, 0x8B01, 0x8B02, 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, + 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93, 0x8CF4, 0x8E44, 0x8E31, 0x8E34, + 0x8E42, 0x8E39, 0x8E35, 0x8F3B, 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, + 0x8FA6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907C, 0x907A, 0x9134, + 0x9192, 0x9320, 0x9336, 0x92F8, 0x9333, 0x932F, 0x9322, 0x92FC, +plane 20 +at 0x00 + 0x932B, 0x9304, 0x931A, 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, + 0x9319, 0x95BB, 0x96A7, 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, + 0x9716, 0x970D, 0x9713, 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, + 0x9830, 0x9838, 0x983B, 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, + 0x9928, 0x991E, 0x991B, 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, + 0x9AB8, 0x9ABC, 0x9AFB, 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, + 0x9D26, 0x9D28, 0x9D12, 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, + 0x512A, 0x511F, 0x5121, 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, + 0x5685, 0x5687, 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, + 0x5B2A, 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, + 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, + 0x61CB, 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, + 0x64E6, 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, + 0x66D6, 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, + 0x6A7E, 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, + 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, + 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, + 0x71DF, 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, + 0x7235, 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, + 0x7646, 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC, + 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, + 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, + 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, + 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, + 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35, + 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070, + 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF, + 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, 0x8584, + 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, 0x8587, 0x85A8, + 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, 0x87C6, 0x87AB, + 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, 0x8944, 0x8938, + 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, 0x8B0A, 0x8B20, +plane 21 +at 0x00 + 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, + 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B, 0x8E48, 0x8E4A, + 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F, 0x907D, 0x9084, + 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E, 0x919C, 0x934D, + 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, 0x9318, 0x937E, + 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, 0x95CB, 0x95CC, + 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, 0x971E, 0x97A0, + 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01, 0x99FF, 0x9BAE, 0x9BAB, + 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, + 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2, 0x5695, 0x56AE, 0x58D9, + 0x58D8, 0x5B38, 0x5F5D, 0x61E3, 0x6233, 0x64F4, 0x64F2, 0x64FE, + 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7, 0x66DC, 0x6726, 0x6AB3, + 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, 0x6AAE, 0x6AAF, 0x6B5F, + 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, 0x7006, 0x6FFA, 0x7011, + 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, 0x7377, 0x7375, 0x74A7, + 0x74BF, 0x7515, 0x7656, 0x7658, 0x7652, 0x77BD, 0x77BF, 0x77BB, + 0x77BC, 0x790E, 0x79AE, 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, + 0x7C2B, 0x7C27, 0x7C2A, 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, + 0x7E55, 0x7E5E, 0x7E5A, 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, + 0x7FFB, 0x8077, 0x8076, 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, + 0x85CD, 0x85D0, 0x85C9, 0x85B0, 0x85BA, 0x85B9, 0x85A6, 0x87EF, + 0x87EC, 0x87F2, 0x87E0, 0x8986, 0x89B2, 0x89F4, 0x8B28, 0x8B39, + 0x8B2C, 0x8B2B, 0x8C50, 0x8D05, 0x8E59, 0x8E63, 0x8E66, 0x8E64, + 0x8E5F, 0x8E55, 0x8EC0, 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, + 0x91AB, 0x91AC, 0x91D0, 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, + 0x93AE, 0x93AC, 0x93B0, 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, + 0x95D0, 0x95D5, 0x96E2, 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, + 0x97A3, 0x97A6, 0x97AD, 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, + 0x9853, 0x98BA, 0x993E, 0x993F, 0x993D, 0x992E, 0x99A5, 0x9A0E, + 0x9AC1, 0x9B03, 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, + 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, + 0x9F2C, 0x5133, 0x56A5, 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, +plane 22 +at 0x00 + 0x5EEC, 0x61F2, 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, + 0x66DD, 0x6AE5, 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, + 0x701A, 0x701D, 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, + 0x7378, 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, + 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, + 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, + 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, + 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, + 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, + 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, + 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, + 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, + 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, + 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, + 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, 0x97FB, 0x985E, 0x9858, + 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, 0x9A19, 0x9B0D, 0x9BE8, + 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, 0x9D72, 0x9D6A, 0x9D6C, + 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56A8, 0x56B7, 0x56B6, + 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, + 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727, 0x6AEC, + 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662, 0x7665, + 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, + 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, 0x7E7C, 0x7E82, 0x7F4C, + 0x8000, 0x81DA, 0x8266, 0x85FB, 0x85F9, 0x8611, 0x85FA, 0x8606, + 0x860B, 0x8607, 0x860A, 0x8814, 0x8815, 0x8964, 0x89BA, 0x89F8, + 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, + 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4, 0x91CB, 0x9418, 0x9403, + 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952, 0x9951, 0x99A8, 0x9A2B, + 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, + 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, 0x5137, 0x5138, 0x56C1, 0x56C0, + 0x56C2, 0x5914, 0x5C6C, 0x5DCD, 0x61FC, 0x61FE, 0x651D, 0x651C, + 0x6595, 0x66E9, 0x6AFB, 0x6B04, 0x6AFA, 0x6BB2, 0x704C, 0x721B, +plane 23 +at 0x00 + 0x72A7, 0x74D6, 0x74D4, 0x7669, 0x77D3, 0x7C50, 0x7E8F, 0x7E8C, + 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823, 0x8822, 0x8821, 0x881F, + 0x896A, 0x896C, 0x89BD, 0x8B74, 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, + 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, 0x91BA, 0x942E, 0x9433, 0x9435, + 0x943A, 0x9438, 0x9432, 0x942B, 0x95E2, 0x9738, 0x9739, 0x9732, + 0x97FF, 0x9867, 0x9865, 0x9957, 0x9A45, 0x9A43, 0x9A40, 0x9A3E, + 0x9ACF, 0x9B54, 0x9B51, 0x9C2D, 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, + 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, 0x9F5C, 0x9F66, 0x9F67, 0x513C, + 0x513B, 0x56C8, 0x56CA, 0x56C9, 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, + 0x61FF, 0x6524, 0x6B0A, 0x6B61, 0x7051, 0x7058, 0x7380, 0x74E4, + 0x758A, 0x766E, 0x766C, 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, + 0x81DF, 0x8972, 0x896F, 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, + 0x8E93, 0x8F61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, + 0x97C3, 0x97C1, 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, + 0x9C49, 0x9C31, 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, + 0x9F6A, 0x9F94, 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, + 0x66EC, 0x6B10, 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, + 0x7E96, 0x7E94, 0x81E2, 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, + 0x908F, 0x9463, 0x9460, 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, + 0x9A5B, 0x9A57, 0x9AD3, 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, + 0x9DE5, 0x9E9F, 0x9EF4, 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, + 0x7672, 0x77D7, 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, + 0x8B92, 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, + 0x9744, 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, + 0x9DFA, 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, + 0x7063, 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, + 0x9470, 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, + 0x8B9A, 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, + 0x91C5, 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, + 0x947F, 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, + 0xF6B1, 0xF6B2, 0xF6B3, 0xF6B4, 0xF6B5, 0xF6B6, 0xF6B7, 0xF6B8, + 0xF6B9, 0xF6BA, 0xF6BB, 0xF6BC, 0xF6BD, 0xF6BE, 0xF6BF, 0xF6C0, +plane 24 +at 0x00 + 0xF6C1, 0xF6C2, 0xF6C3, 0xF6C4, 0xF6C5, 0xF6C6, 0xF6C7, 0xF6C8, + 0xF6C9, 0xF6CA, 0xF6CB, 0xF6CC, 0xF6CD, 0xF6CE, 0xF6CF, 0xF6D0, + 0xF6D1, 0xF6D2, 0xF6D3, 0xF6D4, 0xF6D5, 0xF6D6, 0xF6D7, 0xF6D8, + 0xF6D9, 0xF6DA, 0xF6DB, 0xF6DC, 0xF6DD, 0xF6DE, 0xF6DF, 0xF6E0, + 0xF6E1, 0xF6E2, 0xF6E3, 0xF6E4, 0xF6E5, 0xF6E6, 0xF6E7, 0xF6E8, + 0xF6E9, 0xF6EA, 0xF6EB, 0xF6EC, 0xF6ED, 0xF6EE, 0xF6EF, 0xF6F0, + 0xF6F1, 0xF6F2, 0xF6F3, 0xF6F4, 0xF6F5, 0xF6F6, 0xF6F7, 0xF6F8, + 0xF6F9, 0xF6FA, 0xF6FB, 0xF6FC, 0xF6FD, 0xF6FE, 0xF6FF, 0xF700, + 0xF701, 0xF702, 0xF703, 0xF704, 0xF705, 0xF706, 0xF707, 0xF708, + 0xF709, 0xF70A, 0xF70B, 0xF70C, 0xF70D, 0xF70E, 0xF70F, 0xF710, + 0xF711, 0xF712, 0xF713, 0xF714, 0xF715, 0xF716, 0xF717, 0xF718, + 0xF719, 0xF71A, 0xF71B, 0xF71C, 0xF71D, 0xF71E, 0xF71F, 0xF720, + 0xF721, 0xF722, 0xF723, 0xF724, 0xF725, 0xF726, 0xF727, 0xF728, + 0xF729, 0xF72A, 0xF72B, 0xF72C, 0xF72D, 0xF72E, 0xF72F, 0xF730, + 0xF731, 0xF732, 0xF733, 0xF734, 0xF735, 0xF736, 0xF737, 0xF738, + 0xF739, 0xF73A, 0xF73B, 0xF73C, 0xF73D, 0xF73E, 0xF73F, 0xF740, + 0xF741, 0xF742, 0xF743, 0xF744, 0xF745, 0xF746, 0xF747, 0xF748, + 0xF749, 0xF74A, 0xF74B, 0xF74C, 0xF74D, 0xF74E, 0xF74F, 0xF750, + 0xF751, 0xF752, 0xF753, 0xF754, 0xF755, 0xF756, 0xF757, 0xF758, + 0xF759, 0xF75A, 0xF75B, 0xF75C, 0xF75D, 0xF75E, 0xF75F, 0xF760, + 0xF761, 0xF762, 0xF763, 0xF764, 0xF765, 0xF766, 0xF767, 0xF768, + 0xF769, 0xF76A, 0xF76B, 0xF76C, 0xF76D, 0xF76E, 0xF76F, 0xF770, + 0xF771, 0xF772, 0xF773, 0xF774, 0xF775, 0xF776, 0xF777, 0xF778, + 0xF779, 0xF77A, 0xF77B, 0xF77C, 0xF77D, 0xF77E, 0xF77F, 0xF780, + 0xF781, 0xF782, 0xF783, 0xF784, 0xF785, 0xF786, 0xF787, 0xF788, + 0xF789, 0xF78A, 0xF78B, 0xF78C, 0xF78D, 0xF78E, 0xF78F, 0xF790, + 0xF791, 0xF792, 0xF793, 0xF794, 0xF795, 0xF796, 0xF797, 0xF798, + 0xF799, 0xF79A, 0xF79B, 0xF79C, 0xF79D, 0xF79E, 0xF79F, 0xF7A0, + 0xF7A1, 0xF7A2, 0xF7A3, 0xF7A4, 0xF7A5, 0xF7A6, 0xF7A7, 0xF7A8, + 0xF7A9, 0xF7AA, 0xF7AB, 0xF7AC, 0xF7AD, 0xF7AE, 0xF7AF, 0xF7B0, + 0xF7B1, 0xF7B2, 0xF7B3, 0xF7B4, 0xF7B5, 0xF7B6, 0xF7B7, 0xF7B8, + 0xF7B9, 0xF7BA, 0xF7BB, 0xF7BC, 0xF7BD, 0xF7BE, 0xF7BF, 0xF7C0, +plane 25 +at 0x00 + 0xF7C1, 0xF7C2, 0xF7C3, 0xF7C4, 0xF7C5, 0xF7C6, 0xF7C7, 0xF7C8, + 0xF7C9, 0xF7CA, 0xF7CB, 0xF7CC, 0xF7CD, 0xF7CE, 0xF7CF, 0xF7D0, + 0xF7D1, 0xF7D2, 0xF7D3, 0xF7D4, 0xF7D5, 0xF7D6, 0xF7D7, 0xF7D8, + 0xF7D9, 0xF7DA, 0xF7DB, 0xF7DC, 0xF7DD, 0xF7DE, 0xF7DF, 0xF7E0, + 0xF7E1, 0xF7E2, 0xF7E3, 0xF7E4, 0xF7E5, 0xF7E6, 0xF7E7, 0xF7E8, + 0xF7E9, 0xF7EA, 0xF7EB, 0xF7EC, 0xF7ED, 0xF7EE, 0xF7EF, 0xF7F0, + 0xF7F1, 0xF7F2, 0xF7F3, 0xF7F4, 0xF7F5, 0xF7F6, 0xF7F7, 0xF7F8, + 0xF7F9, 0xF7FA, 0xF7FB, 0xF7FC, 0xF7FD, 0xF7FE, 0xF7FF, 0xF800, + 0xF801, 0xF802, 0xF803, 0xF804, 0xF805, 0xF806, 0xF807, 0xF808, + 0xF809, 0xF80A, 0xF80B, 0xF80C, 0xF80D, 0xF80E, 0xF80F, 0xF810, + 0xF811, 0xF812, 0xF813, 0xF814, 0xF815, 0xF816, 0xF817, 0xF818, + 0xF819, 0xF81A, 0xF81B, 0xF81C, 0xF81D, 0xF81E, 0xF81F, 0xF820, + 0xF821, 0xF822, 0xF823, 0xF824, 0xF825, 0xF826, 0xF827, 0xF828, + 0xF829, 0xF82A, 0xF82B, 0xF82C, 0xF82D, 0xF82E, 0xF82F, 0xF830, + 0xF831, 0xF832, 0xF833, 0xF834, 0xF835, 0xF836, 0xF837, 0xF838, + 0xF839, 0xF83A, 0xF83B, 0xF83C, 0xF83D, 0xF83E, 0xF83F, 0xF840, + 0xF841, 0xF842, 0xF843, 0xF844, 0xF845, 0xF846, 0xF847, 0xF848, + 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, + 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, + 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, + 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, + 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, + 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723, + 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73, + 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, 0x6C36, + 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, 0x79B8, 0x808A, + 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, 0x4EF1, 0x4F00, + 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, 0x4F13, 0x4F04, + 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210, 0x52A6, 0x5322, + 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF, 0x572E, 0x572A, + 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B, 0x597E, 0x5977, + 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A, 0x5C7B, 0x5C7E, +plane 26 +at 0x00 + 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74, 0x5FD5, 0x5FD4, + 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, + 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E, 0x6739, 0x6738, + 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, 0x6C46, 0x6C52, + 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B, 0x6C4C, 0x7071, 0x725E, + 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, 0x7A75, 0x7F51, 0x8278, + 0x827C, 0x8280, 0x827D, 0x827F, 0x864D, 0x897E, 0x9099, 0x9097, + 0x9098, 0x909B, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4F56, + 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64, 0x4F3E, 0x4F67, 0x4F52, + 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33, 0x4F3F, 0x4F61, 0x518F, + 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, 0x52AE, 0x5309, 0x5363, + 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, 0x542A, 0x5454, 0x5445, + 0x5419, 0x541C, 0x5425, 0x5418, 0x543D, 0x544F, 0x5441, 0x5428, + 0x5424, 0x5447, 0x56EE, 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, + 0x5749, 0x574B, 0x5752, 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, + 0x5997, 0x598E, 0x59A2, 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, + 0x5B92, 0x5C28, 0x5C2A, 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, + 0x5C92, 0x5C8A, 0x5C86, 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, + 0x5E8B, 0x5E89, 0x5E8C, 0x5E88, 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, + 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0, 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, + 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA, 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, + 0x5FF4, 0x623A, 0x6283, 0x628C, 0x628E, 0x628F, 0x6294, 0x6287, + 0x6271, 0x627B, 0x627A, 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, + 0x6272, 0x6274, 0x6537, 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, + 0x6745, 0x6747, 0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, + 0x675A, 0x674B, 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, + 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, + 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73, 0x6C65, 0x6C7B, 0x6C8E, + 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD, 0x72C3, 0x72C6, 0x72C1, + 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753A, + 0x7539, 0x7594, 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, + 0x8090, 0x8092, 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, +plane 27 +at 0x00 + 0x8293, 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F, + 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F, + 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87, + 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, 0x4F4C, 0x4F97, 0x4F6A, + 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, 0x4F9C, 0x4F94, 0x4F9E, + 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, 0x51BC, 0x51BE, + 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, 0x530B, + 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482, + 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466, + 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, + 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770, + 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, 0x5774, 0x5762, 0x5768, + 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, 0x59CF, 0x59CE, 0x59B2, + 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, 0x59D6, 0x59B1, 0x59BD, + 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, 0x5B93, 0x5B95, + 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF, 0x5CA8, + 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7, 0x5C9D, + 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19, 0x5F28, + 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D, 0x5FDE, + 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, 0x600B, 0x6034, 0x600A, + 0x6017, 0x6033, 0x601A, 0x601E, 0x602C, 0x6022, 0x600D, 0x6010, + 0x602E, 0x6013, 0x6011, 0x600C, 0x6009, 0x601C, 0x6214, 0x623D, + 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA, 0x62B6, 0x62CA, 0x62AE, + 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0, 0x62B8, 0x653D, 0x65A8, + 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612, 0x6608, 0x65FB, 0x6603, + 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611, 0x6610, 0x66F6, 0x670A, + 0x6785, 0x676C, 0x678E, 0x6792, 0x6776, 0x677B, 0x6798, 0x6786, + 0x6784, 0x6774, 0x678D, 0x678C, 0x677A, 0x679F, 0x6791, 0x6799, + 0x6783, 0x677D, 0x6781, 0x6778, 0x6779, 0x6794, 0x6B25, 0x6B80, + 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC, 0x6CEB, 0x6CEE, 0x6CD9, + 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7, 0x6CD0, 0x6CC2, 0x6CBA, + 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, +plane 28 +at 0x00 + 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, + 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, 0x7094, 0x7098, 0x7085, 0x7093, + 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709A, 0x7083, 0x726A, + 0x72D6, 0x72CB, 0x72D8, 0x72C9, 0x72DC, 0x72D2, 0x72D4, 0x72DA, + 0x72CC, 0x72D1, 0x73A4, 0x73A1, 0x73AD, 0x73A6, 0x73A2, 0x73A0, + 0x73AC, 0x739D, 0x74DD, 0x74E8, 0x753F, 0x7540, 0x753E, 0x758C, + 0x7598, 0x76AF, 0x76F3, 0x76F1, 0x76F0, 0x76F5, 0x77F8, 0x77FC, + 0x77F9, 0x77FB, 0x77FA, 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, + 0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, + 0x80B8, 0x80B5, 0x80AD, 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, + 0x8298, 0x829B, 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, + 0x82B4, 0x82A8, 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, + 0x82A2, 0x8670, 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, + 0x8FD3, 0x8FCD, 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, + 0x90B3, 0x90B0, 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, + 0x4FC5, 0x4FD3, 0x4FB2, 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, + 0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, + 0x4FB9, 0x4FEC, 0x5244, 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, + 0x5397, 0x5396, 0x5399, 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, + 0x54CF, 0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, + 0x54C6, 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, + 0x54B0, 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, + 0x579B, 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, + 0x58F4, 0x590D, 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, + 0x59DD, 0x59FA, 0x59FD, 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, + 0x59DB, 0x59E9, 0x59F3, 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, + 0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, + 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3, 0x5CD4, + 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, 0x5E21, + 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, 0x5E9B, + 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, 0x6039, + 0x6054, 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, 0x605B, +plane 29 +at 0x00 + 0x604C, 0x6040, 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, 0x6066, + 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5, 0x630E, + 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6, 0x6300, + 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541, 0x6543, + 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, 0x661C, 0x6626, + 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, 0x662E, + 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA, 0x67DC, 0x67BB, + 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB, 0x67E4, 0x67DF, + 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE, 0x67E3, 0x67C2, + 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2, 0x67FC, 0x67C6, 0x67ED, + 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA, 0x67C9, 0x67CA, 0x67C3, + 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84, 0x6BB6, 0x6BD6, 0x6BD8, + 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, 0x6D2D, 0x6D1F, 0x6D3C, + 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, 0x6D19, 0x6D3A, + 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42, 0x6D01, 0x6D18, 0x6D37, + 0x6D03, 0x6D0F, 0x6D40, 0x6D07, 0x6D20, 0x6D2C, 0x6D08, 0x6D22, + 0x6D09, 0x6D10, 0x70B7, 0x709F, 0x70BE, 0x70B1, 0x70B0, 0x70A1, + 0x70B4, 0x70B5, 0x70A9, 0x7241, 0x7249, 0x724A, 0x726C, 0x7270, + 0x7273, 0x726E, 0x72CA, 0x72E4, 0x72E8, 0x72EB, 0x72DF, 0x72EA, + 0x72E6, 0x72E3, 0x7385, 0x73CC, 0x73C2, 0x73C8, 0x73C5, 0x73B9, + 0x73B6, 0x73B5, 0x73B4, 0x73EB, 0x73BF, 0x73C7, 0x73BE, 0x73C3, + 0x73C6, 0x73B8, 0x73CB, 0x74EC, 0x74EE, 0x752E, 0x7547, 0x7548, + 0x75A7, 0x75AA, 0x7679, 0x76C4, 0x7708, 0x7703, 0x7704, 0x7705, + 0x770A, 0x76F7, 0x76FB, 0x76FA, 0x77E7, 0x77E8, 0x7806, 0x7811, + 0x7812, 0x7805, 0x7810, 0x780F, 0x780E, 0x7809, 0x7803, 0x7813, + 0x794A, 0x794C, 0x794B, 0x7945, 0x7944, 0x79D5, 0x79CD, 0x79CF, + 0x79D6, 0x79CE, 0x7A80, 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, + 0x7C78, 0x7C79, 0x7C7F, 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, + 0x7F58, 0x7F91, 0x7F8D, 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, + 0x8037, 0x80D8, 0x80C7, 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, + 0x80C5, 0x80E3, 0x80D9, 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, + 0x80D7, 0x80E6, 0x80CD, 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, +plane 30 +at 0x00 + 0x82F9, 0x8307, 0x82E8, 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, + 0x82F4, 0x82EC, 0x82E1, 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, + 0x82F0, 0x82EA, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, + 0x8674, 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, + 0x89D3, 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, + 0x90F1, 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, + 0x90C8, 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, + 0x964E, 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, + 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, + 0x501C, 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, + 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, + 0x525A, 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, + 0x539E, 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, + 0x551A, 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1, + 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, + 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6, + 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9, + 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15, + 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, + 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, + 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, + 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, 0x6041, + 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D, 0x6083, 0x6095, + 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219, 0x6246, 0x62F2, + 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336, 0x6343, 0x63E4, + 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341, 0x6334, 0x6358, + 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, 0x6351, 0x6338, + 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, 0x65C3, 0x65C4, + 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, 0x6713, 0x681F, + 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, 0x684F, 0x6816, + 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, 0x684E, 0x6844, + 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828, 0x682E, 0x684D, +plane 31 +at 0x00 + 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D, 0x6B31, 0x6B34, + 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4, 0x6BE8, 0x6BE3, 0x6BE2, + 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, 0x6D76, 0x6D0D, 0x6D61, + 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, 0x6D91, 0x6D8D, 0x6DEF, + 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, 0x6D97, 0x6D70, 0x6D7C, + 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, 0x6D8B, 0x6D7E, 0x6D80, + 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, 0x6D75, 0x6D90, 0x70DC, + 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39, 0x70E2, 0x70D7, 0x70D2, + 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5, 0x70C6, 0x70C7, 0x70DA, + 0x70CE, 0x70E1, 0x7242, 0x7278, 0x7277, 0x7276, 0x7300, 0x72FA, + 0x72F4, 0x72FE, 0x72F6, 0x72F3, 0x72FB, 0x7301, 0x73D3, 0x73D9, + 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3, 0x73E9, 0x73DC, 0x73D2, + 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7, 0x73D8, 0x73E8, 0x74DE, + 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B, 0x755F, 0x75B0, 0x75C1, + 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, + 0x771D, 0x771B, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, + 0x7719, 0x771A, 0x7722, 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, + 0x782F, 0x7828, 0x782E, 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, + 0x7831, 0x7954, 0x795B, 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, + 0x79EB, 0x79EC, 0x79E0, 0x79EE, 0x79ED, 0x79EA, 0x79DC, 0x79DE, + 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, + 0x7AD8, 0x7B10, 0x7B04, 0x7B13, 0x7B05, 0x7B0F, 0x7B08, 0x7B0A, + 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, 0x7C88, + 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, + 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, + 0x7F60, 0x7F5D, 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, + 0x8016, 0x803E, 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, + 0x80FB, 0x8100, 0x8201, 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, + 0x8319, 0x8351, 0x8325, 0x8356, 0x833F, 0x8341, 0x8326, 0x831C, + 0x8322, 0x8342, 0x834E, 0x831B, 0x832A, 0x8308, 0x833C, 0x834D, + 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, 0x8347, 0x8345, + 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, 0x8653, +plane 32 +at 0x00 + 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687, + 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1, + 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843, + 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F, + 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57, + 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, + 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, 0x8FFF, 0x8FFB, 0x9004, + 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, 0x90E3, 0x90DF, + 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150, 0x914E, + 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC, 0x98E3, + 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E, 0x5060, + 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041, 0x505B, + 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, 0x5069, 0x506B, 0x5063, + 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, 0x5057, 0x5051, 0x51D0, + 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, 0x52D3, 0x532D, 0x539C, + 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, 0x5534, 0x552A, 0x5551, + 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x550C, 0x5532, + 0x5565, 0x554E, 0x5539, 0x5548, 0x552D, 0x553B, 0x5540, 0x554B, + 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2, 0x57F6, 0x57DC, 0x57F4, + 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8, 0x580B, 0x57F3, 0x57CF, + 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5, 0x57EC, 0x57E1, 0x580E, + 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C, 0x57F1, 0x57E9, 0x57F0, + 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58, 0x5A55, 0x5A67, 0x5A5E, + 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F, 0x5A65, 0x5A6C, 0x5A53, + 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52, 0x5A44, 0x5A5B, 0x5A48, + 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C, 0x5A70, 0x5A69, 0x5A47, + 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72, 0x5B6E, 0x5BC1, 0x5BC0, + 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A, 0x5D20, 0x5D0C, 0x5D28, + 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, 0x5D30, 0x5D12, 0x5D23, 0x5D1F, + 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, + 0x5F36, 0x5F38, 0x5F9B, 0x5F96, 0x5F9F, 0x608A, 0x6090, 0x6086, + 0x60BE, 0x60B0, 0x60BA, 0x60D3, 0x60D4, 0x60CF, 0x60E4, 0x60D9, +plane 33 +at 0x00 + 0x60DD, 0x60C8, 0x60B1, 0x60DB, 0x60B7, 0x60CA, 0x60BF, 0x60C3, + 0x60CD, 0x60C0, 0x6332, 0x6365, 0x638A, 0x6382, 0x637D, 0x63BD, + 0x639E, 0x63AD, 0x639D, 0x6397, 0x63AB, 0x638E, 0x636F, 0x6387, + 0x6390, 0x636E, 0x63AF, 0x6375, 0x639C, 0x636D, 0x63AE, 0x637C, + 0x63A4, 0x633B, 0x639F, 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, + 0x6370, 0x6553, 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, + 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, + 0x68AE, 0x68AB, 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, + 0x6874, 0x68B2, 0x688F, 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, + 0x68AA, 0x6880, 0x6871, 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, + 0x6889, 0x68A4, 0x6878, 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, + 0x6B36, 0x6B33, 0x6B37, 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, + 0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, + 0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, + 0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, + 0x6DCA, 0x6DBD, 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, + 0x6DC9, 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, + 0x6DBB, 0x70FA, 0x710D, 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, + 0x7104, 0x70F3, 0x7110, 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, + 0x70F8, 0x70F6, 0x710B, 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, + 0x727F, 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, + 0x72FF, 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, + 0x7401, 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, + 0x740B, 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, + 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, 0x7739, + 0x772F, 0x772D, 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, 0x7725, + 0x773B, 0x7735, 0x7848, 0x7852, 0x7849, 0x784D, 0x784A, 0x784C, + 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796A, 0x7963, + 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7, 0x7A8F, + 0x7A94, 0x7A90, 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30, 0x7B22, + 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, 0x7B2D, + 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, 0x7C96, +plane 34 +at 0x00 + 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, 0x7D2C, + 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, 0x7D28, + 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, 0x7FCD, + 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9, 0x801F, 0x801E, 0x801B, + 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811B, 0x812D, + 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, 0x8127, 0x811D, 0x8122, + 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232, 0x8274, 0x8390, + 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4, 0x8374, 0x838F, + 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9, 0x837D, 0x8383, + 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E, 0x83A5, 0x83AF, + 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387, 0x83AE, 0x8376, + 0x839A, 0x8659, 0x8656, 0x86BF, 0x86B7, 0x86C2, 0x86C1, 0x86C5, + 0x86BA, 0x86B0, 0x86C8, 0x86B9, 0x86B3, 0x86B8, 0x86CC, 0x86B4, + 0x86BB, 0x86BC, 0x86C3, 0x86BD, 0x86BE, 0x8852, 0x8889, 0x8895, + 0x88A8, 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1, 0x889F, 0x8898, + 0x88A7, 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC, 0x888C, 0x8893, + 0x888E, 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30, 0x8A27, 0x8A2C, + 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, + 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, + 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1, 0x9024, 0x900B, + 0x9011, 0x901C, 0x900C, 0x9021, 0x90EF, 0x90EA, 0x90F0, 0x90F4, + 0x90F2, 0x90F3, 0x90D4, 0x90EB, 0x90EC, 0x90E9, 0x9156, 0x9158, + 0x915A, 0x9153, 0x9155, 0x91EC, 0x91F4, 0x91F1, 0x91F3, 0x91F8, + 0x91E4, 0x91F9, 0x91EA, 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, + 0x9586, 0x9588, 0x967C, 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, + 0x976A, 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, + 0x508B, 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, + 0x5092, 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, + 0x53A7, 0x5591, 0x55A8, 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, + 0x5593, 0x5588, 0x558F, 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, + 0x557D, 0x558C, 0x55A6, 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, + 0x5829, 0x5837, 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, +plane 35 +at 0x00 + 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, + 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, + 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, + 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, + 0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, + 0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, + 0x5C0C, 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, + 0x5D35, 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, + 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, + 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, + 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114, + 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, + 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, + 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, + 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, + 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, + 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0, + 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568, + 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, 0x667C, + 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, 0x6672, 0x6701, + 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, 0x68EA, 0x68F1, + 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, 0x6913, 0x6910, + 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, 0x68B4, 0x6911, + 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD, 0x68FC, 0x68E8, + 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD, 0x68DE, 0x68E6, + 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915, 0x6925, 0x68C7, + 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97, 0x6B99, 0x6B95, + 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, 0x6E46, 0x6E47, + 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, 0x6E62, 0x6E2B, + 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, 0x6E4B, 0x6E40, + 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0x6E68, 0x6E5C, 0x6E61, + 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39, 0x6E22, 0x6E30, +plane 36 +at 0x00 + 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, 0x6E77, 0x6E55, 0x6E79, + 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, 0x7120, 0x711E, 0x712F, + 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711F, + 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, 0x7288, 0x7289, 0x7286, + 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322, 0x7331, 0x7333, + 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335, 0x730C, 0x742E, + 0x742C, 0x7430, 0x742B, 0x7416, 0x741A, 0x7421, 0x742D, 0x7431, + 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, + 0x756F, 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, + 0x75E4, 0x75D7, 0x7695, 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, + 0x774D, 0x7745, 0x774A, 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, + 0x7860, 0x7864, 0x7865, 0x785C, 0x786D, 0x7871, 0x786A, 0x786E, + 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, 0x7974, 0x7973, 0x7972, + 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04, 0x7A99, 0x7AE6, + 0x7AE4, 0x7B4A, 0x7B3B, 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, 0x7B40, + 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, + 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, + 0x7D6B, 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, + 0x7F3F, 0x7F65, 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, + 0x804F, 0x8050, 0x80FE, 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, + 0x8147, 0x813D, 0x814D, 0x813A, 0x81E6, 0x81EE, 0x81F7, 0x81F8, + 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, 0x8275, 0x833B, 0x83CF, + 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7, 0x83E4, 0x83FC, + 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, 0x8401, + 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, + 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, + 0x83F3, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x83C3, + 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB, + 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA, + 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1, + 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, 0x88B9, 0x88B8, 0x88C0, + 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, 0x88B2, 0x8901, 0x88C9, +plane 37 +at 0x00 + 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, 0x8A4E, 0x8A4D, + 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, 0x8A52, + 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80, + 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89, + 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, + 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA, 0x8EF9, + 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6, 0x8EEB, + 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, 0x9034, 0x902F, 0x9106, + 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, 0x90F9, 0x90FB, 0x9101, + 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915F, 0x9162, + 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226, 0x920F, + 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204, 0x9227, + 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957B, + 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, 0x9688, 0x9689, 0x9683, + 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1, 0x96F0, 0x976C, 0x9770, + 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6, 0x9EF9, 0x4E83, 0x4E84, + 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE, 0x50C4, 0x50CA, 0x50B4, + 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA, 0x50B1, 0x50CB, 0x50C9, + 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278, 0x527B, 0x527C, 0x55C3, + 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA, 0x55DD, 0x55C0, 0x55D4, + 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D, 0x55CF, 0x55D5, 0x55E2, + 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9, 0x55C2, 0x5714, 0x5853, + 0x5868, 0x5864, 0x584F, 0x584D, 0x5849, 0x586F, 0x5855, 0x584E, + 0x585D, 0x5859, 0x5865, 0x585B, 0x583D, 0x5863, 0x5871, 0x58FC, + 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8, 0x5AB1, 0x5AB5, 0x5AB0, + 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, + 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, + 0x5C33, 0x5D71, 0x5D63, 0x5D4A, 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, + 0x5D68, 0x5D67, 0x5D62, 0x5DF0, 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, + 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, + 0x5FAD, 0x60F7, 0x6149, 0x614A, 0x612B, 0x6145, 0x6136, 0x6132, + 0x612E, 0x6146, 0x612F, 0x614F, 0x6129, 0x6140, 0x6220, 0x9168, +plane 38 +at 0x00 + 0x6223, 0x6225, 0x6224, 0x63C5, 0x63F1, 0x63EB, 0x6410, 0x6412, + 0x6409, 0x6420, 0x6424, 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, + 0x6439, 0x6437, 0x6422, 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, + 0x6441, 0x6435, 0x642F, 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, + 0x640B, 0x63E7, 0x641B, 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, + 0x65D3, 0x6686, 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, + 0x6694, 0x6678, 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, + 0x6971, 0x693F, 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, + 0x697A, 0x6948, 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, + 0x68F0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, + 0x6958, 0x6941, 0x6974, 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, + 0x694F, 0x6951, 0x6932, 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, + 0x6B45, 0x6B43, 0x6B42, 0x6B48, 0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, + 0x6BFC, 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, + 0x6EC0, 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, + 0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, + 0x6EA6, 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, + 0x6E92, 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, + 0x6ECA, 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, + 0x7160, 0x7141, 0x715D, 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, + 0x7142, 0x7158, 0x7143, 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, + 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, 0x7291, 0x7290, + 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, 0x7349, + 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, 0x744F, + 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, 0x74FF, + 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, 0x760F, + 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, 0x75FB, + 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD, 0x7755, + 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769, 0x7767, 0x7754, + 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F, 0x7884, + 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899, 0x7880, + 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, 0x7A18, +plane 39 +at 0x00 + 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13, 0x7A1B, 0x7A10, + 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, 0x7B6D, 0x7B74, + 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70, 0x7B61, 0x7B78, + 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, 0x7D86, 0x7D80, + 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B, 0x7D83, 0x7D7C, + 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D, 0x7F6B, 0x7F67, + 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB, 0x7FDC, 0x8021, + 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B, 0x8162, 0x8172, + 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, 0x8144, 0x8161, 0x821D, + 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1, 0x843F, 0x8456, + 0x8476, 0x8479, 0x848F, 0x848D, 0x8465, 0x8451, 0x8440, 0x8486, + 0x8467, 0x8430, 0x844D, 0x847D, 0x845A, 0x8459, 0x8474, 0x8473, + 0x845D, 0x8507, 0x845E, 0x8437, 0x843A, 0x8434, 0x847A, 0x8443, + 0x8478, 0x8432, 0x8445, 0x8429, 0x83D9, 0x844B, 0x842F, 0x8442, + 0x842D, 0x845F, 0x8470, 0x8439, 0x844E, 0x844C, 0x8452, 0x846F, + 0x84C5, 0x848E, 0x843B, 0x8447, 0x8436, 0x8433, 0x8468, 0x847E, + 0x8444, 0x842B, 0x8460, 0x8454, 0x846E, 0x8450, 0x870B, 0x8704, + 0x86F7, 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D, 0x86F8, 0x870E, + 0x8709, 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6, 0x88CB, 0x88CD, + 0x88CE, 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0, 0x8985, 0x899B, + 0x89DF, 0x89E5, 0x89E4, 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, + 0x8A76, 0x8A86, 0x8A7F, 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, + 0x8A75, 0x8A83, 0x8A81, 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, + 0x8C65, 0x8C64, 0x8C66, 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, + 0x8D69, 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, + 0x8D90, 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, + 0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, + 0x8EFF, 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, + 0x9052, 0x903F, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, + 0x9111, 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, + 0x9252, 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, + 0x922E, 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, +plane 40 +at 0x00 + 0x926F, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, + 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, + 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, + 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, + 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, + 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, + 0x9EFD, 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, + 0x50DD, 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0, + 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, + 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613, + 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C, + 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A, + 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894, + 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, + 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, + 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, 0x5BE3, + 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, 0x5D81, 0x5D77, + 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D, 0x5D79, 0x5D7F, + 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7, 0x5ECE, 0x5EDC, + 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43, 0x5F6F, 0x5FB6, + 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, 0x6152, 0x6153, + 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, 0x615B, 0x6165, + 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, 0x622B, 0x642B, + 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, 0x6473, 0x647D, + 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, 0x645C, 0x644B, + 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C, 0x646B, 0x6459, + 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0, 0x669F, 0x6705, + 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, 0x69A0, 0x69CE, 0x6996, + 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, 0x698E, 0x69A7, 0x698D, + 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD, 0x69A4, 0x69D4, + 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993, 0x69AA, 0x69A1, + 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5, 0x69A5, 0x69C6, +plane 41 +at 0x00 + 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BC3, 0x6BC4, + 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25, 0x6EF8, 0x6F37, + 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, 0x6F1A, 0x6F27, 0x6F18, + 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, + 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, + 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, + 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187, 0x7190, 0x7189, + 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186, 0x7181, 0x7197, + 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, + 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, + 0x7500, 0x7502, 0x7503, 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, + 0x7615, 0x7611, 0x760A, 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, + 0x7782, 0x776E, 0x7780, 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, + 0x78B4, 0x78AD, 0x78A8, 0x787E, 0x78AB, 0x789E, 0x78A5, 0x78A0, + 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, 0x798B, 0x7996, 0x7995, + 0x7994, 0x7993, 0x7997, 0x7988, 0x7992, 0x7990, 0x7A2B, 0x7A4A, + 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, + 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, + 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, + 0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, + 0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, + 0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, + 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, + 0x7FDE, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186, 0x8183, 0x8187, + 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, 0x84A1, 0x849F, + 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, 0x84B4, + 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7, + 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF, + 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4, + 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, + 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719, 0x871B, 0x8743, + 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732, 0x872A, 0x872D, +plane 42 +at 0x00 + 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, + 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, 0x88E7, 0x88F1, + 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB, 0x88F0, + 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9, 0x89EB, + 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96, 0x8C3D, + 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09, 0x8E02, + 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06, 0x8E05, + 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E, 0x8F0D, 0x9123, + 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A, 0x9124, 0x9121, + 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5, 0x92A4, 0x9276, + 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D, 0x92A6, 0x929A, + 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, 0x92EE, 0x928E, 0x9282, + 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, 0x928A, 0x9286, 0x928C, + 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, 0x929D, 0x928B, 0x922D, + 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, 0x977A, 0x977E, 0x9783, + 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, 0x977F, 0x97CE, 0x97CD, + 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, 0x9907, 0x999D, 0x999C, + 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, 0x99BD, 0x99C7, 0x9AB1, + 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, 0x9B61, 0x9B5F, 0x9CF1, + 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, 0x5130, 0x50F8, 0x5106, + 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, 0x50FD, 0x510A, 0x528B, + 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, 0x564C, 0x5635, 0x5641, + 0x564A, 0x5649, 0x5646, 0x5658, 0x565A, 0x5640, 0x5633, 0x563D, + 0x562C, 0x563E, 0x5638, 0x562A, 0x563A, 0x571A, 0x58AB, 0x589D, + 0x58B1, 0x58A0, 0x58A3, 0x58AF, 0x58AC, 0x58A5, 0x58A1, 0x58FF, + 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, + 0x5AF9, 0x5B01, 0x5B07, 0x5B05, 0x5B0F, 0x5C67, 0x5D99, 0x5D97, + 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, + 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, + 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, 0x618B, 0x6183, 0x6179, 0x61B1, + 0x61B0, 0x61A2, 0x6189, 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, + 0x6192, 0x61AA, 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, +plane 43 +at 0x00 + 0x6470, 0x6496, 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, + 0x648A, 0x648C, 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, + 0x657A, 0x6579, 0x657B, 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, + 0x66B2, 0x66B7, 0x66AA, 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, + 0x69F8, 0x6A15, 0x69F1, 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, + 0x6A1B, 0x6A1D, 0x69FE, 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, + 0x69E7, 0x6A40, 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, + 0x6A09, 0x6A04, 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, + 0x69F4, 0x6A16, 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, + 0x6C00, 0x6BFF, 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, + 0x6F92, 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, + 0x6F96, 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, + 0x6F57, 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, + 0x6F67, 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, + 0x6F77, 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, + 0x719A, 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, + 0x71AA, 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, + 0x735E, 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, + 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, 0x7485, + 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, 0x761E, + 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628, 0x761B, 0x769C, + 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789, 0x7788, 0x78CD, + 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8, 0x78C3, + 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2, 0x799B, + 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, 0x7BBE, + 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, 0x7CC8, + 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, 0x7DE1, + 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, 0x7DDF, + 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, 0x7FEC, + 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F, 0x819E, 0x8195, + 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253, 0x8252, 0x8250, + 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500, 0x8529, 0x850E, +plane 44 +at 0x00 + 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C, 0x84FB, 0x852B, + 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2, 0x8515, 0x84F7, + 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9, 0x8516, 0x84FE, + 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E, 0x84F6, 0x8531, + 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9, 0x8518, 0x8520, + 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, 0x8756, 0x8763, 0x8764, + 0x8777, 0x87E1, 0x8773, 0x8758, 0x8754, 0x875B, 0x8752, 0x8761, + 0x875A, 0x8751, 0x875E, 0x876D, 0x876A, 0x8750, 0x874E, 0x875F, + 0x875D, 0x876F, 0x876C, 0x877A, 0x876E, 0x875C, 0x8765, 0x874F, + 0x877B, 0x8775, 0x8762, 0x8767, 0x8769, 0x885A, 0x8905, 0x890C, + 0x8914, 0x890B, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, + 0x890E, 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED, 0x89F0, 0x89EC, + 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, + 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, + 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, + 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, + 0x8E23, 0x8E25, 0x8E24, 0x8E2E, 0x8E15, 0x8E1B, 0x8E16, 0x8E11, + 0x8E19, 0x8E26, 0x8E27, 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, + 0x8E17, 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, + 0x8F16, 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, + 0x912B, 0x9129, 0x912A, 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, + 0x918A, 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, + 0x92C0, 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, + 0x92D7, 0x92DD, 0x92CC, 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, + 0x92CE, 0x92E6, 0x92CD, 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, + 0x92D1, 0x92D3, 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, + 0x95AB, 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, + 0x9702, 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, + 0x981D, 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, + 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, + 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, + 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, +plane 45 +at 0x00 + 0x9AF1, 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, + 0x9B75, 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, + 0x9CFF, 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, + 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, + 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E, + 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C, + 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC, + 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, + 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, + 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, + 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, + 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8, + 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, 0x61BF, + 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF, 0x64C9, 0x64BD, + 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533, 0x657F, 0x657C, + 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, 0x66CF, 0x66BD, + 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, 0x6A49, 0x6A67, + 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, 0x6A5B, 0x6A51, + 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, 0x6A64, 0x6A50, + 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, 0x6A5E, 0x6A56, + 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54, 0x6B56, 0x6BA7, + 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03, 0x6C06, 0x6FAD, + 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, + 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5, 0x6FAE, 0x6FBA, + 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8, 0x6FA2, 0x6FC9, 0x6FAB, + 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, 0x71C2, 0x71BF, 0x71B8, + 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, 0x71CA, 0x71C7, 0x71CF, + 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, 0x71DB, 0x729D, 0x729E, + 0x7369, 0x7366, 0x7367, 0x736C, 0x7365, 0x736B, 0x736A, 0x747F, + 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495, 0x74A1, 0x750B, 0x7580, + 0x762F, 0x762D, 0x7631, 0x763D, 0x7633, 0x763C, 0x7635, 0x7632, + 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D, 0x77A1, 0x779C, 0x779B, +plane 46 +at 0x00 + 0x77A2, 0x77A3, 0x7795, 0x7799, 0x7797, 0x78DD, 0x78E9, 0x78E5, + 0x78EA, 0x78DE, 0x78E3, 0x78DB, 0x78E1, 0x78E2, 0x78ED, 0x78DF, + 0x78E0, 0x79A4, 0x7A44, 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, + 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, + 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, + 0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, + 0x7E21, 0x7E17, 0x7E0C, 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, + 0x7E15, 0x7E1A, 0x7E22, 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, + 0x7E25, 0x7E24, 0x7F43, 0x7F7B, 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, + 0x802A, 0x8029, 0x806C, 0x81B1, 0x81A6, 0x81AE, 0x81B9, 0x81B5, + 0x81AB, 0x81B0, 0x81AC, 0x81B4, 0x81B2, 0x81B7, 0x81A7, 0x81F2, + 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856B, 0x854D, 0x8553, + 0x8561, 0x8558, 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, + 0x8551, 0x8547, 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, + 0x8575, 0x8555, 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, + 0x8565, 0x856C, 0x8663, 0x8665, 0x8664, 0x879B, 0x878F, 0x8797, + 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, + 0x87A3, 0x8785, 0x8790, 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, + 0x879A, 0x8789, 0x891E, 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, + 0x8931, 0x8922, 0x8929, 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, + 0x8AE0, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, + 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, + 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, + 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, + 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, + 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, + 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, + 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, 0x9327, 0x931E, 0x9308, + 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, 0x933C, 0x931B, 0x9323, + 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, + 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324, + 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C, 0x930B, +plane 47 +at 0x00 + 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD, 0x95BE, + 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9, 0x96D4, + 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97F0, 0x97F8, + 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, 0x9927, 0x9929, 0x999E, + 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, 0x99E3, 0x99EA, 0x99E9, + 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, 0x9AFA, 0x9AF9, + 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E, 0x9B7B, + 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95, 0x9B7D, 0x9B88, + 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14, 0x9D29, 0x9D1D, 0x9D18, + 0x9D22, 0x9D10, 0x9D19, 0x9D1F, 0x9E88, 0x9E86, 0x9E87, 0x9EAE, + 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, 0x9F12, 0x9F3D, 0x5126, 0x5125, + 0x5122, 0x5124, 0x5120, 0x5129, 0x52F4, 0x5693, 0x568C, 0x568D, + 0x5686, 0x5684, 0x5683, 0x567E, 0x5682, 0x567F, 0x5681, 0x58D6, + 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25, 0x5B32, 0x5B23, 0x5B2C, + 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, + 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, 0x61C3, 0x61B5, 0x61BC, 0x61E7, + 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE, 0x64EF, 0x64E9, 0x64E3, + 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580, 0x65B6, 0x65DA, 0x66D2, + 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89, 0x6A9F, 0x6A9B, 0x6AA1, + 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, + 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, + 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, + 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, + 0x71E1, 0x71F1, 0x71E8, 0x71F2, 0x71E4, 0x71F0, 0x71E2, 0x7373, + 0x736E, 0x736F, 0x7497, 0x74B2, 0x74AB, 0x7490, 0x74AA, 0x74AD, + 0x74B1, 0x74A5, 0x74AF, 0x7510, 0x7511, 0x7512, 0x750F, 0x7584, + 0x7643, 0x7648, 0x7649, 0x7647, 0x76A4, 0x76E9, 0x77B5, 0x77AB, + 0x77B2, 0x77B7, 0x77B6, 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, + 0x78FD, 0x7902, 0x78FB, 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, + 0x7904, 0x79AB, 0x79A8, 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, + 0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, + 0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, +plane 48 +at 0x00 + 0x7C03, 0x7C01, 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, + 0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, + 0x7E2A, 0x7E49, 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, + 0x7E36, 0x7E44, 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, + 0x7FF2, 0x802C, 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, + 0x81BC, 0x81E9, 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, + 0x85A7, 0x8595, 0x85A0, 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, + 0x859E, 0x8577, 0x857C, 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, + 0x858E, 0x8596, 0x8586, 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, + 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, + 0x8668, 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, + 0x87B5, 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, + 0x87AF, 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, + 0x87DE, 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, + 0x8937, 0x8942, 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, + 0x8B18, 0x8B16, 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, 0x8B12, + 0x8B15, 0x8B07, 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13, 0x8B1A, + 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94, 0x8CF9, + 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47, 0x8F43, + 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, 0x9199, + 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, 0x9364, + 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, 0x9350, + 0x9351, 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, 0x9357, + 0x9355, 0x9352, 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, 0x935E, + 0x9363, 0x9367, 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0, 0x95C9, + 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720, 0x971F, + 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C, 0x979E, 0x979D, + 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A, 0x9849, 0x9845, + 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933, 0x9932, 0x992F, + 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1, 0x9A02, 0x99FA, + 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB, 0x99FD, 0x99FE, + 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, 0x9AFC, 0x9B48, +plane 49 +at 0x00 + 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1, 0x9BA5, 0x9BA4, + 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33, 0x9D41, 0x9D67, 0x9D36, + 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30, 0x9D45, 0x9D42, 0x9D43, + 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, + 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, + 0x9F22, 0x9F54, 0x9FA0, 0x5131, 0x512D, 0x512E, 0x5698, 0x569C, + 0x5697, 0x569A, 0x569D, 0x5699, 0x5970, 0x5B3C, 0x5C69, 0x5C6A, + 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, 0x61DF, 0x61ED, 0x61EE, 0x61F1, + 0x61EA, 0x61F0, 0x61EB, 0x61D6, 0x61E9, 0x64FF, 0x6504, 0x64FD, + 0x64F8, 0x6501, 0x6503, 0x64FC, 0x6594, 0x65DB, 0x66DA, 0x66DB, + 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, + 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, + 0x700C, 0x700D, 0x7001, 0x7005, 0x7014, 0x700E, 0x6FFF, 0x7000, + 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, 0x700A, 0x7201, 0x71FF, 0x71F9, + 0x7203, 0x71FD, 0x7376, 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, + 0x74B6, 0x74BB, 0x74C2, 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, + 0x7650, 0x7653, 0x7657, 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, + 0x77BA, 0x78FF, 0x790C, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, + 0x7911, 0x79AD, 0x79AC, 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, + 0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, + 0x7E5C, 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, + 0x7E60, 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, + 0x81D1, 0x81D2, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, + 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, + 0x85CB, 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, + 0x85B8, 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, + 0x87EB, 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, + 0x87D3, 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, + 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, + 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, + 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, + 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, +plane 50 +at 0x00 + 0x8C75, 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, + 0x8E5C, 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67, + 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, + 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5, + 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B, + 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395, + 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4, + 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3, + 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, + 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, 0x97A2, + 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850, 0x9851, + 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, 0x9A0B, 0x9A09, + 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, 0x9A06, 0x9AC0, + 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, 0x9B4A, 0x9B4C, + 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, 0x9BB5, 0x9BB8, + 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53, 0x9D4F, + 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57, 0x9D52, + 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF, 0x9F01, + 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28, 0x9F4C, + 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB, 0x56AD, + 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, 0x58DB, 0x5912, + 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, 0x5FBF, 0x61FB, 0x6507, + 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, 0x6584, 0x65DE, 0x65DD, + 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, 0x6ACB, 0x6ADF, + 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60, 0x6BB0, + 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021, 0x7022, + 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x702A, 0x720C, 0x720A, + 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, 0x72A1, + 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, 0x7660, 0x77C9, 0x77CA, + 0x77C4, 0x77F1, 0x791D, 0x791B, 0x7921, 0x791C, 0x7917, 0x791E, + 0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, + 0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F, +plane 51 +at 0x00 + 0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86, + 0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, 0x8264, 0x8261, + 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, + 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, + 0x85D1, 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, + 0x8803, 0x87F6, 0x87F7, 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, + 0x8808, 0x87FF, 0x880A, 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, + 0x8961, 0x895C, 0x8958, 0x895D, 0x8959, 0x8988, 0x89B7, 0x89B6, + 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, 0x8B53, 0x8B56, 0x8B54, + 0x8B4B, 0x8B55, 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43, 0x8C77, + 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, + 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, + 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, + 0x91B0, 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, + 0x93F9, 0x93EC, 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, + 0x93EE, 0x93E3, 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93E7, + 0x957D, 0x95DA, 0x95DB, 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, + 0x9726, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE, 0x97DF, 0x985C, + 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB, 0x98BE, 0x9948, + 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, 0x9A25, 0x9A1D, + 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, 0x9A1C, + 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, + 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, + 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, + 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78, + 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70, + 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F, 0x9D79, 0x9D7F, + 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC, 0x9F2D, 0x9F40, + 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, 0x56B2, 0x56B5, + 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF, 0x5FC0, + 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF, 0x66E8, + 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9, 0x6AF1, +plane 52 +at 0x00 + 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034, 0x7031, + 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x7040, 0x703B, 0x7033, + 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA, 0x76AB, + 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, 0x77CF, 0x77CD, 0x77F2, + 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79B2, 0x7A6E, + 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48, 0x7C4A, 0x7C47, 0x7C45, + 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80, 0x7FBA, 0x7FFF, 0x8079, + 0x81DB, 0x81D9, 0x820B, 0x8268, 0x8269, 0x8622, 0x85FF, 0x8601, + 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, 0x8609, 0x8605, 0x860C, + 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, + 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, 0x8B5D, 0x8B68, 0x8B63, + 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, 0x8E88, 0x8E84, 0x8F59, + 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, 0x908D, 0x9143, 0x9141, + 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, 0x9413, 0x93FB, 0x9420, + 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, 0x9428, 0x9419, 0x940D, + 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, 0x9416, 0x9412, 0x93FA, + 0x9409, 0x93F8, 0x940A, 0x93FF, 0x93FC, 0x940C, 0x93F6, 0x9411, + 0x9406, 0x95DE, 0x95E0, 0x95DF, 0x972E, 0x972F, 0x97B9, 0x97BB, + 0x97FD, 0x97FE, 0x9860, 0x9862, 0x9863, 0x985F, 0x98C1, 0x98C2, + 0x9950, 0x994E, 0x9959, 0x994C, 0x994B, 0x9953, 0x9A32, 0x9A34, + 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, + 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, 0x9B12, 0x9B11, 0x9C0B, 0x9C08, + 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, 0x9C40, 0x9C07, 0x9C0E, 0x9C06, + 0x9C17, 0x9C14, 0x9C09, 0x9D9F, 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, + 0x9D98, 0x9D90, 0x9D9B, 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, + 0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, + 0x9D96, 0x9DA6, 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, + 0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, + 0x9F59, 0x9F91, 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, + 0x56BE, 0x5B48, 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, + 0x6B02, 0x6AFC, 0x6B03, 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, + 0x7048, 0x7049, 0x7045, 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, +plane 53 +at 0x00 + 0x7517, 0x766A, 0x77D0, 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, + 0x7CF2, 0x7E8A, 0x7E87, 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, + 0x7FBB, 0x8030, 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, + 0x861C, 0x8619, 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, + 0x8625, 0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, + 0x884A, 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, + 0x8B45, 0x8B7A, 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, + 0x8F5E, 0x8F5B, 0x8F5D, 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, + 0x943B, 0x9436, 0x9429, 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, + 0x9437, 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, + 0x973A, 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, + 0x9956, 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, + 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, 0x9B52, + 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, 0x9C24, + 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, 0x9DCF, + 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, 0x9DBA, + 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD, 0x9DB2, + 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18, 0x9F1A, + 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6, 0x56C5, + 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, 0x6521, + 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, 0x7055, + 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, 0x74D8, + 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, 0x7A70, + 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A, 0x7CF4, 0x7CF1, + 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634, 0x8635, 0x8633, + 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826, 0x882A, 0x8825, + 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84, 0x8B82, 0x8B86, + 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A, 0x8E92, 0x8E90, + 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C, 0x9450, 0x944A, + 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973F, + 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B, 0x9A4E, 0x9A53, + 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, 0x9A49, 0x9A52, 0x9A50, +plane 54 +at 0x00 + 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, 0x9B56, 0x9B55, 0x9C46, 0x9C48, + 0x9C3F, 0x9C44, 0x9C39, 0x9C33, 0x9C41, 0x9C3C, 0x9C37, 0x9C34, + 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, + 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, + 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35, 0x9F33, 0x9F32, + 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299, 0x58E8, 0x58E7, + 0x5972, 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201, 0x6203, 0x6204, + 0x6529, 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, + 0x705B, 0x705A, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77D4, + 0x7C67, 0x7C66, 0x7E95, 0x826C, 0x863A, 0x8640, 0x8639, 0x863C, + 0x8631, 0x863B, 0x863E, 0x8830, 0x8832, 0x882E, 0x8833, 0x8976, + 0x8974, 0x8973, 0x89FE, 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, + 0x8D19, 0x8E98, 0x8F64, 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, + 0x9457, 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, + 0x9B1F, 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, + 0x9C55, 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, + 0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, + 0x9DF0, 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, + 0x9ED0, 0x9EF2, 0x9EF3, 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, + 0x9F43, 0x9F4F, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, + 0x5B4E, 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, + 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, + 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, + 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, + 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, + 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, + 0x9C67, 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, + 0x9E03, 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, + 0x9E04, 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, + 0x652E, 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, + 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, + 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648, +plane 55 +at 0x00 + 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5, + 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, + 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, + 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, + 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, + 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74, + 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, 0x9FA4, + 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D, 0x883F, 0x8B9E, + 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874, 0x98CC, 0x9961, + 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, 0x9E17, 0x9F48, + 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, 0x9480, 0x9481, + 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, 0x8B9F, 0x9483, + 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069, 0x706A, + 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0x7881, 0x92B9, 0x88CF, 0x58BB, + 0x6052, 0x7CA7, 0x5AFA, 0x2554, 0x2566, 0x2557, 0x2560, 0x256C, + 0x2563, 0x255A, 0x2569, 0x255D, 0x2552, 0x2564, 0x2555, 0x255E, + 0x256A, 0x2561, 0x2558, 0x2567, 0x255B, 0x2553, 0x2565, 0x2556, + 0x255F, 0x256B, 0x2562, 0x2559, 0x2568, 0x255C, 0x2551, 0x2550, + 0x256D, 0x256E, 0x2570, 0x256F, 0x2593, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugb.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugb.map new file mode 100644 index 00000000..46adc115 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugb.map @@ -0,0 +1,1181 @@ +# +# For Unicode GB 2312-80 Chinese font to create compact +# CJK fonts Type1 fonts. +# +plane 01 +at 0x00 + 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003, + 0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C, + 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, + 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1, + 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A, + 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312, + 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D, + 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234, + 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4, + 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB, + 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, + 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x2488, 0x2489, + 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2491, + 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, + 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, + 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, + 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, + 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, + 0, 0, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, + 0x3226, 0x3227, 0x3228, 0x3229, 0, 0, 0x2160, 0x2161, + 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, + 0x216A, 0x216B, 0, 0, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, + 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, + 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, + 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, + 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, + 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, + 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, + 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, + 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, +plane 02 +at 0x00 + 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, + 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, + 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, + 0xFF5D, 0xFFE3, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, + 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, + 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, + 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, + 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, + 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, + 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, + 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, + 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, + 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, + 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, + 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, + 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, + 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, + 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, + 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, + 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, + 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, + 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, + 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0, 0, + 0, 0, 0, 0, 0, 0, 0x0391, 0x0392, + 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, + 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0, 0, + 0, 0, 0, 0, 0, 0, 0x03B1, 0x03B2, + 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, +plane 03 +at 0x00 + 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, + 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x0410, 0x0411, 0x0412, 0x0413, + 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, + 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, + 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, + 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x0430, 0x0431, 0x0432, 0x0433, + 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, + 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, + 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, + 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, + 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, + 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, + 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x3105, 0x3106, + 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, + 0x310F, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, + 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, + 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, + 0x3127, 0x3128, 0x3129, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, + 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, +plane 04 +at 0x00 + 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, + 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, + 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, + 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, + 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, + 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, + 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, + 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 05 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 06 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, + 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, + 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, + 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, + 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, + 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, + 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, + 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, + 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, + 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, + 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, + 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, + 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, 0x62A5, + 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, 0x5351, + 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, 0x5907, + 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, 0x5D29, +plane 07 +at 0x00 + 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, 0x6BD4, + 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, 0x6BD9, + 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, 0x5FC5, + 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, 0x7F16, + 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, 0x8FAB, + 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, 0x522B, + 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, 0x5175, + 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, 0x75C5, 0x5E76, + 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2, 0x535A, 0x52C3, + 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236, 0x8116, 0x818A, + 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA, 0x8865, 0x57E0, + 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016, 0x64E6, 0x731C, + 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29, 0x91C7, 0x5F69, + 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B, 0x60ED, 0x60E8, + 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF, 0x64CD, 0x7CD9, + 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7, 0x518C, 0x6D4B, + 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336, 0x67E5, 0x78B4, + 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6, 0x67F4, 0x8C7A, + 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20, 0x94F2, 0x4EA7, + 0x9610, 0x98A4, 0x660C, 0x7316, 0x573A, 0x5C1D, 0x5E38, 0x957F, + 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, + 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, + 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, + 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, + 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, + 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, + 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, + 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, + 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, + 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, + 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, + 0x9664, 0x695A, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, +plane 08 +at 0x00 + 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, + 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, + 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, + 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, + 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, + 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, + 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, + 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, + 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, + 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, + 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, + 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, 0x80C6, + 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, 0x86CB, + 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, 0x8E48, + 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, 0x9053, + 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, 0x7B49, + 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, 0x654C, + 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, 0x5730, + 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, 0x6382, + 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, 0x4F43, + 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, 0x53FC, + 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, 0x8DCC, + 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, 0x4E01, 0x76EF, + 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A, 0x8BA2, 0x4E22, + 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B, 0x4F97, 0x606B, + 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661, 0x8C46, 0x9017, + 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC, 0x8BFB, 0x5835, + 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6, 0x6E21, 0x5992, + 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E, 0x5806, 0x5151, + 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566, 0x987F, 0x56E4, + 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A, 0x593A, 0x579B, + 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0, 0x5815, 0x86FE, +plane 09 +at 0x00 + 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25, 0x6076, 0x5384, + 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C, 0x513F, 0x8033, + 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, + 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, + 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, + 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, + 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, + 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, + 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, + 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, + 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, + 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, + 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, + 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, + 0x4FD8, 0x670D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, + 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, + 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, + 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, + 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, + 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, + 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, + 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, + 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, + 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, + 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, + 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, + 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, 0x9F9A, + 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, 0x62F1, + 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, 0x57A2, + 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, 0x4F30, + 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, 0x8C37, + 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, 0x5250, +plane 10 +at 0x00 + 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, 0x5173, + 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, 0x704C, + 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, 0x7845, + 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, 0x6842, + 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, 0x9505, + 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, 0x9AB8, 0x5B69, + 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163, 0x61A8, 0x90AF, + 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A, 0x7F55, 0x7FF0, + 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A, 0x6C57, 0x6C49, + 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A, 0x6BEB, 0x90DD, + 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D, 0x8377, 0x83CF, + 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2, 0x8C89, 0x9602, + 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A, 0x563F, 0x9ED1, + 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8, 0x6A2A, 0x8861, + 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F, 0x6D2A, 0x5B8F, + 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C, 0x539A, 0x5019, + 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6, 0x846B, 0x80E1, + 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0x5F27, 0x864E, 0x552C, 0x62A4, + 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, + 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, + 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, + 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, + 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, + 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, + 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, + 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, + 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, + 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, + 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, + 0x79EF, 0x7B95, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, + 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, + 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, +plane 11 +at 0x00 + 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, + 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, + 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, + 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, + 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, + 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, + 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, + 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, + 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, + 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, 0x5EFA, + 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, 0x6868, + 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, 0x7901, + 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, 0x56BC, + 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, 0x997A, + 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, 0x53EB, + 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, 0x622A, + 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, 0x6D01, + 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, 0x501F, + 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, 0x91D1, + 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, 0x8FDB, + 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, 0x5C3D, 0x52B2, + 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8, 0x4EAC, 0x60CA, + 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F, 0x9888, 0x9759, + 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756, 0x7ADF, 0x7ADE, + 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0, 0x7396, 0x97ED, + 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551, 0x65E7, 0x81FC, + 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8, 0x72D9, 0x75BD, + 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9, 0x4E3E, 0x6CAE, + 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD, 0x8E1E, 0x952F, + 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350, 0x9E43, 0x5A1F, + 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B, 0x6289, 0x6398, + 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD, 0x5747, 0x83CC, +plane 12 +at 0x00 + 0x94A7, 0x519B, 0x541B, 0x5CFB, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, + 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, + 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, + 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, + 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, + 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, + 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, + 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, + 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, + 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, + 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, + 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, + 0x9B41, 0x5080, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, + 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, + 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, + 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, + 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, + 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, + 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, + 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, + 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, + 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, + 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, + 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, + 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, 0x54E9, + 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, 0x6D9F, + 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, 0x7CAE, + 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, 0x667E, + 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, 0x5BE5, + 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, 0x5217, + 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, 0x9716, + 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, 0x62CE, +plane 13 +at 0x00 + 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, 0x51CC, + 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, 0x7409, + 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, 0x67F3, + 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, 0x9686, 0x5784, + 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3, 0x6F0F, 0x964B, + 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3, 0x5364, 0x864F, + 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42, 0x9E7F, 0x6F5E, + 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415, 0x94DD, 0x4FA3, + 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F, 0x5F8B, 0x7387, + 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6, 0x5375, 0x4E71, + 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, + 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523, 0x7BA9, 0x9AA1, + 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988, 0x9EBB, 0x739B, + 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417, 0x57CB, 0x4E70, + 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992, 0x86EE, 0x6EE1, + 0x8513, 0x66FC, 0x6162, 0x6F2B, 0x8C29, 0x8292, 0x832B, 0x76F2, + 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, + 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, + 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, + 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, + 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, + 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, + 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, + 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, + 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, + 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, + 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, + 0x8C2C, 0x6478, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, + 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, + 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, + 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, + 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, +plane 14 +at 0x00 + 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, + 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, + 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, + 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, + 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, + 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, + 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, + 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, 0x6D53, + 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, 0x8650, + 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, 0x9E25, + 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, 0x722C, + 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, 0x6E43, + 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, 0x5224, + 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, 0x5486, + 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, 0x57F9, + 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, 0x76C6, + 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, 0x787C, + 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, 0x7812, + 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, 0x5564, 0x813E, + 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41, 0x8B6C, 0x7BC7, + 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2, 0x7968, 0x6487, + 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058, 0x4E52, 0x576A, + 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4, 0x5C4F, 0x5761, + 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB, 0x7C95, 0x5256, + 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9, 0x84B2, 0x57D4, + 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD, 0x7011, 0x671F, + 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4, 0x6F06, 0x67D2, + 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566, 0x5D0E, 0x8110, + 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77, 0x5C82, 0x4E5E, + 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14, 0x8FC4, 0x5F03, + 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0x6070, 0x6D3D, 0x7275, 0x6266, + 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, +plane 15 +at 0x00 + 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, + 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, + 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, + 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, + 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, + 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, + 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, + 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, + 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, + 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, + 0x9A71, 0x6E20, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, + 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, + 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, + 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, + 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, + 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, + 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, + 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, + 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, + 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, + 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, + 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, + 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, 0x626B, + 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, 0x7802, + 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, 0x7B5B, + 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, 0x886B, + 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, 0x6247, + 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, 0x5C1A, + 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, 0x97F6, + 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, 0x820C, + 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, 0x8BBE, + 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, +plane 16 +at 0x00 + 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, 0x6E17, + 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, 0x7701, 0x76DB, + 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE, 0x65BD, 0x6E7F, + 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE, 0x65F6, 0x4EC0, + 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2, 0x4F7F, 0x5C4E, + 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16, 0x67FF, 0x4E8B, + 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC, 0x566C, 0x9002, + 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02, 0x6043, 0x5BA4, + 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88, 0x5BFF, 0x6388, + 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2, 0x68B3, 0x6B8A, + 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F, 0x4E66, 0x8D4E, + 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72, 0x8700, 0x9ECD, + 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F, 0x620D, 0x7AD6, + 0x5885, 0x5EB6, 0x6570, 0x6F31, 0x6055, 0x5237, 0x800D, 0x6454, + 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, + 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, + 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, + 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, + 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, + 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, + 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, + 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, + 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, + 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, + 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, + 0x5979, 0x5854, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, + 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, + 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, + 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, + 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, + 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, + 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, +plane 17 +at 0x00 + 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, + 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, + 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, + 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, + 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, + 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, 0x901A, + 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, 0x6876, + 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, 0x900F, + 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, 0x5C60, + 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, 0x817F, + 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, 0x6258, + 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, 0x62D3, + 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, 0x889C, + 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, 0x4E38, + 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, 0x5B9B, + 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, 0x7F51, + 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, 0x5DCD, 0x5FAE, + 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F, 0x60DF, 0x4E3A, + 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, + 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3, 0x5582, 0x9B4F, + 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B, 0x761F, 0x6E29, + 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33, 0x7D0A, 0x95EE, + 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1, 0x7A9D, 0x6211, + 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C, 0x94A8, 0x4E4C, + 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7, 0x543E, 0x5434, + 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E, 0x4F0D, 0x4FAE, + 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF, 0x52A1, 0x609F, + 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852, 0x77FD, 0x6670, + 0x563B, 0x5438, 0x9521, 0x727A, 0x7A00, 0x606F, 0x5E0C, 0x6089, + 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, + 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, + 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, +plane 18 +at 0x00 + 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, + 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, + 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, + 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, + 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, + 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, + 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, + 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, + 0x6DC6, 0x6653, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, + 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, + 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, + 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, + 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, + 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, + 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, + 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, + 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, + 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, + 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, + 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, + 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, 0x7A74, + 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, + 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, 0x8FC5, + 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, 0x7259, + 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, 0x8BB6, + 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, 0x7814, + 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, 0x6CBF, + 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, 0x71D5, + 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, 0x8C1A, + 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, 0x4F6F, + 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, 0x517B, + 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, 0x6447, 0x5C27, +plane 19 +at 0x00 + 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200, 0x836F, 0x8981, + 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE, 0x51B6, 0x4E5F, + 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B, 0x591C, 0x6DB2, + 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D, 0x4F0A, 0x8863, + 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0, 0x7591, 0x6C82, + 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A, 0x5DF2, 0x4E59, + 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091, 0x5C79, 0x4EBF, + 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6, 0x88D4, 0x610F, + 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, + 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335, 0x836B, 0x56E0, + 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6, 0x6DEB, 0x5BC5, + 0x996E, 0x5C39, 0x5F15, 0x9690, 0x5370, 0x82F1, 0x6A31, 0x5A74, + 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, + 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, + 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, + 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, + 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, + 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, + 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, + 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, + 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, + 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, + 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, + 0x80B2, 0x8A89, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, + 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, + 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, + 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, + 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, + 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, + 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, + 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, + 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, +plane 20 +at 0x00 + 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, + 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, + 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, + 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, 0x70B8, + 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, 0x77BB, + 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, 0x5D2D, + 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, 0x7EFD, + 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, 0x6756, + 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, 0x62DB, + 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, 0x8087, + 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, 0x9517, + 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, 0x7827, + 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, 0x9707, + 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, 0x72F0, + 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, 0x5E27, 0x75C7, + 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431, 0x8718, 0x77E5, + 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C, 0x76F4, 0x690D, + 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307, 0x6B62, 0x8DBE, + 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7, 0x81F3, 0x81F4, + 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9, 0x7A1A, 0x8D28, + 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D, 0x76C5, 0x5FE0, + 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD, 0x4EF2, 0x4F17, + 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5, 0x8F74, 0x8098, + 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4, 0x73E0, 0x682A, + 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010, 0x7AF9, 0x70DB, + 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457, 0x67F1, 0x52A9, + 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, + 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, + 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, + 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, + 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, + 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, +plane 21 +at 0x00 + 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, + 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, + 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, + 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, + 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, + 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0, 0, 0, + 0, 0, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, + 0x4E15, 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, + 0x4E3F, 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, + 0x80E4, 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, + 0x4E5C, 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, + 0x538D, 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, + 0x53F5, 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, + 0x5208, 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, + 0x5261, 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, + 0x5182, 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, + 0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, + 0x4F27, 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, + 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, + 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, + 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, + 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, + 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, 0x5043, + 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, + 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, + 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, + 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, + 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, + 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, + 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, 0x51C7, 0x5196, + 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, + 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, +plane 22 +at 0x00 + 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, + 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, + 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, + 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, + 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, + 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, + 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, 0x963C, 0x9642, 0x9649, + 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, 0x9674, 0x9688, 0x968D, + 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, + 0x90B4, 0x90B3, 0x90B6, 0x90BA, 0x90B8, 0x90B0, 0x90CF, 0x90C5, + 0x90BE, 0x90D0, 0x90C4, 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, + 0x90D7, 0x90DB, 0x90EB, 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, + 0x9123, 0x9131, 0x912F, 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, + 0x52A2, 0x52AC, 0x52AD, 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, + 0x53DF, 0x71EE, 0x77CD, 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, + 0x5F01, 0x755A, 0x5DEF, 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, + 0x58C5, 0x58D1, 0x5729, 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, + 0x572F, 0x575C, 0x573B, 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, + 0x577C, 0x577B, 0x5768, 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, + 0x578C, 0x57B2, 0x57CF, 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, + 0x57D8, 0x57DA, 0x57D9, 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, + 0x57E4, 0x57DD, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, + 0x5819, 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, + 0x5880, 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, + 0x828A, 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, + 0x82B8, 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, + 0x82AE, 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, + 0x829F, 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, + 0x830F, 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, + 0x82D3, 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, + 0x831C, 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, + 0x8331, 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, +plane 23 +at 0x00 + 0x8340, 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, + 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, + 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, + 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, + 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, + 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, + 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, + 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, + 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, 0x843C, + 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, + 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, + 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, + 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, 0x8556, 0x853B, + 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, 0x8564, 0x855E, 0x857A, + 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, + 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, + 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, 0x8629, 0x8616, 0x863C, + 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, 0x5955, 0x595A, 0x5958, + 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, + 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, + 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, + 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, + 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, + 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, 0x640C, 0x6426, 0x6421, + 0x645E, 0x6484, 0x646D, 0x6496, 0x647A, 0x64B7, 0x64B8, 0x6499, + 0x64BA, 0x64C0, 0x64D0, 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, + 0x652E, 0x5F0B, 0x5FD2, 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, + 0x53E9, 0x53E8, 0x53FB, 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, + 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, + 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, + 0x5484, 0x5476, 0x5466, 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, + 0x54D2, 0x54A7, 0x54A6, 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, +plane 24 +at 0x00 + 0x54BB, 0x54BF, 0x54CC, 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, + 0x54A4, 0x54DD, 0x54CF, 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, + 0x5514, 0x54F3, 0x5522, 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, + 0x5567, 0x558F, 0x55B5, 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, + 0x5550, 0x553C, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, + 0x5530, 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, + 0x5581, 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, + 0x55BE, 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, + 0x55EB, 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, + 0x55F2, 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, + 0x561E, 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, + 0x5627, 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, + 0x5659, 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, + 0x567B, 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, + 0x56E1, 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, + 0x571C, 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, + 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, + 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, + 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, + 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, + 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, + 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, + 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, + 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, + 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, + 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, + 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, + 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, 0x72FB, 0x7317, + 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, 0x7315, 0x7322, 0x7339, + 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, 0x734D, 0x7357, 0x7360, + 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, + 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x9974, +plane 25 +at 0x00 + 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, 0x998A, 0x998D, 0x9990, + 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, + 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, + 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, + 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, + 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, + 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, 0x603F, 0x6021, 0x6078, + 0x6079, 0x607B, 0x607A, 0x6042, 0x606A, 0x607D, 0x6096, 0x609A, + 0x60AD, 0x609D, 0x6083, 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, + 0x60B1, 0x60DD, 0x60D8, 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, + 0x6115, 0x6123, 0x60F4, 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, + 0x61AC, 0x6194, 0x61A7, 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, + 0x95E9, 0x95EB, 0x95F1, 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, + 0x9603, 0x9604, 0x9606, 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, + 0x960F, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, + 0x723F, 0x6215, 0x6C35, 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, + 0x6C90, 0x6C94, 0x6C8C, 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, + 0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, + 0x6CB2, 0x6CE0, 0x6CD6, 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, + 0x6CEF, 0x6CFE, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, + 0x6D04, 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, + 0x6D4F, 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, + 0x6D5E, 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, + 0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, + 0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, + 0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, + 0x6E25, 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, + 0x6EA5, 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, + 0x6E8F, 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, + 0x6EF9, 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, + 0x6F89, 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, + 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, +plane 26 +at 0x00 + 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, 0x704F, + 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, + 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, + 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, + 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, 0x900D, + 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, 0x9051, + 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, + 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, + 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, + 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, + 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, 0x5997, 0x59CA, + 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, + 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, + 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, + 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, + 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, + 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, + 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, + 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, + 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, + 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, + 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, + 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, + 0x7EC1, 0x7EC2, 0x7EC9, 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, + 0x7EDB, 0x7EE0, 0x7EE1, 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, + 0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, + 0x7F03, 0x7F07, 0x7F08, 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, + 0x7F17, 0x7F19, 0x7F1C, 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, + 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, + 0x7F2F, 0x7F30, 0x7F31, 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, + 0x5DDB, 0x753E, 0x9095, 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, + 0x73CF, 0x73C2, 0x73D1, 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, +plane 27 +at 0x00 + 0x73E5, 0x73D9, 0x987C, 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, + 0x73F2, 0x740F, 0x742A, 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, + 0x742E, 0x742C, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, + 0x7459, 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, + 0x7487, 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, + 0x74BA, 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, + 0x6769, 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, + 0x67A8, 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, + 0x67D8, 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, + 0x67B3, 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, + 0x67FD, 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, + 0x6864, 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, + 0x683E, 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, + 0x6893, 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, + 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, + 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, 0x6998, + 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, + 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, + 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, + 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, + 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, + 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, + 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, + 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, + 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, + 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, 0x8F8D, 0x8F8E, + 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, + 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, + 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, + 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, + 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665F, 0x6654, + 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668C, +plane 28 +at 0x00 + 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, + 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, + 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, + 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, + 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, 0x728B, 0x728D, 0x728F, + 0x7292, 0x6308, 0x6332, 0x63B0, 0x643F, 0x64D8, 0x8004, 0x6BEA, + 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, + 0x6C15, 0x6C18, 0x6C19, 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, + 0x6C32, 0x6535, 0x6555, 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, + 0x8662, 0x5216, 0x809F, 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, + 0x80B1, 0x80AB, 0x80AD, 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, + 0x80EA, 0x80DB, 0x80C2, 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, + 0x80DD, 0x80EB, 0x80F1, 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, + 0x80FC, 0x6715, 0x8112, 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, + 0x8132, 0x8148, 0x814C, 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, + 0x8160, 0x8169, 0x817C, 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, + 0x8188, 0x8182, 0x8191, 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, + 0x81CA, 0x81BB, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, + 0x6B46, 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, + 0x6BB3, 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, + 0x65C6, 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, + 0x709C, 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, + 0x70E8, 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, + 0x715C, 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, + 0x71B3, 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, + 0x721D, 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, + 0x6243, 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, + 0x795C, 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, + 0x797A, 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, + 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, + 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, + 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, +plane 29 +at 0x00 + 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, + 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, 0x7823, + 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, + 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, + 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, + 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, + 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, + 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, 0x7738, + 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, 0x7762, 0x7765, + 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, + 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, 0x754E, 0x754B, 0x7548, + 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, + 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, + 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, 0x948A, 0x948C, 0x948D, + 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, 0x949A, 0x949B, 0x949C, + 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, + 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, + 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, + 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, + 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, + 0x94E5, 0x94E7, 0x94E8, 0x94EA, 0x94E9, 0x94EB, 0x94EE, 0x94EF, + 0x94F3, 0x94F4, 0x94F5, 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, + 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, + 0x950F, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, + 0x951D, 0x951E, 0x951F, 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, + 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, + 0x953F, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, + 0x954E, 0x954F, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, + 0x9559, 0x955B, 0x955E, 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, + 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, + 0x956F, 0x9571, 0x9572, 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, + 0x79D5, 0x79ED, 0x79E3, 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, +plane 30 +at 0x00 + 0x7A1E, 0x7A14, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, + 0x7688, 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, + 0x9E20, 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, + 0x9E31, 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, + 0x9E42, 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, + 0x9E4E, 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, + 0x9E63, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, + 0x9E71, 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, + 0x75AC, 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, + 0x75C3, 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, + 0x75EB, 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, + 0x7605, 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, + 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, 0x763F, + 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, 0x765C, + 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, + 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, + 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, + 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, + 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, + 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, 0x8966, + 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, + 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, + 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, 0x8052, + 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, 0x9889, 0x988C, + 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, + 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, 0x866C, 0x866E, 0x867F, + 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, + 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, + 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, + 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, + 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, + 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, 0x871E, 0x8725, 0x872E, +plane 31 +at 0x00 + 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873F, + 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, 0x8760, 0x8770, 0x874C, + 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, 0x8764, 0x8759, 0x8765, + 0x8793, 0x87AF, 0x87A8, 0x87D2, 0x87C6, 0x8788, 0x8785, 0x87AD, + 0x8797, 0x8783, 0x87AB, 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, + 0x87D3, 0x87BD, 0x87D1, 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, + 0x87EE, 0x8816, 0x8813, 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, + 0x883C, 0x7F36, 0x7F42, 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, + 0x7B08, 0x7B03, 0x7B04, 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, + 0x7B38, 0x7B2A, 0x7B19, 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, + 0x7B33, 0x7B3E, 0x7B1E, 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, + 0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, + 0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, + 0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, + 0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, + 0x7C16, 0x7C0B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, + 0x81FE, 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, + 0x8223, 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, + 0x8234, 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, + 0x8268, 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, + 0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, + 0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, + 0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, + 0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, + 0x7FEE, 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, + 0x9EB8, 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, + 0x8D6D, 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, + 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, 0x9172, + 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, + 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, + 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, + 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, +plane 32 +at 0x00 + 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, + 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, + 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, + 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, + 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, + 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, + 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, 0x89E5, 0x89EB, + 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, + 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, 0x972D, 0x9730, 0x973E, + 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, + 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, + 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, + 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, + 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, + 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, + 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, + 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, + 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, + 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, + 0x9CD0, 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, + 0x9CDD, 0x9CDF, 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, + 0x97AF, 0x97AB, 0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, + 0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, + 0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, + 0x9B4D, 0x9B51, 0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, + 0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, + 0x9B0F, 0x9B13, 0x9B1F, 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, + 0x9E87, 0x9E88, 0x9E8B, 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, + 0x9EDC, 0x9EDD, 0x9EE0, 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, + 0x9EEA, 0x9EEF, 0x9F22, 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, + 0x9F3E, 0x9F44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 33 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 34 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 35 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + +# # diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugbk.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugbk.map new file mode 100644 index 00000000..34889ff5 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugbk.map @@ -0,0 +1,3185 @@ +# +# For Creating Unicode GBK encoding Chinese Type1 +# compact CJK fonts. +# +plane 01 +at 0x00 + 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, + 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, + 0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, + 0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62, + 0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, + 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77, + 0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80, + 0x4E81, 0x4E82, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, 0x4E90, + 0x4E96, 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4E9E, 0x4EA3, 0x4EAA, + 0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, + 0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, + 0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, + 0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, + 0x4EFC, 0x4EFE, 0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, 0x4F06, + 0x4F07, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, 0x4F15, + 0x4F16, 0x4F1C, 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, 0x4F2C, + 0x4F2D, 0x4F2E, 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, + 0x4F3E, 0x4F3F, 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, 0x4F47, + 0x4F48, 0x4F49, 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, + 0x4F61, 0x4F62, 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, + 0x4F71, 0x4F72, 0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, + 0x4F80, 0x4F81, 0x4F82, 0x4F85, 0x4F86, 0x4F87, 0x4F8A, 0x4F8C, + 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F95, 0x4F96, 0x4F98, 0x4F99, + 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, 0x4FA1, 0x4FA2, 0x4FA4, 0x4FAB, + 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, 0x4FB3, 0x4FB4, 0x4FB6, 0x4FB7, + 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB, 0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, + 0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, 0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, + 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5, 0x4FD6, 0x4FD9, 0x4FDB, + 0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB, 0x4FEC, 0x4FF0, + 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9, 0x4FFB, 0x4FFC, + 0x4FFD, 0x4FFF, 0x5000, 0x5001, 0x5002, 0x5003, 0x5004, 0x5005, + 0x5006, 0x5007, 0x5008, 0x5009, 0x500A, 0x500B, 0x500E, 0x5010, +plane 02 +at 0x00 + 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, 0x501B, 0x501D, 0x501E, + 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502B, 0x502F, 0x5030, + 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, 0x5037, 0x5038, + 0x5039, 0x503B, 0x503D, 0x503F, 0x5040, 0x5041, 0x5042, 0x5044, + 0x5045, 0x5046, 0x5049, 0x504A, 0x504B, 0x504D, 0x5050, 0x5051, + 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, 0x5058, 0x5059, 0x505B, + 0x505D, 0x505E, 0x505F, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, + 0x5066, 0x5067, 0x5068, 0x5069, 0x506A, 0x506B, 0x506D, 0x506E, + 0x506F, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5078, + 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, 0x5082, 0x5083, 0x5084, + 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, 0x508C, 0x508E, 0x508F, + 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5096, 0x5097, + 0x5098, 0x5099, 0x509A, 0x509B, 0x509C, 0x509D, 0x509E, 0x509F, + 0x50A0, 0x50A1, 0x50A2, 0x50A4, 0x50A6, 0x50AA, 0x50AB, 0x50AD, + 0x50AE, 0x50AF, 0x50B0, 0x50B1, 0x50B3, 0x50B4, 0x50B5, 0x50B6, + 0x50B7, 0x50B8, 0x50B9, 0x50BC, 0x50BD, 0x50BE, 0x50BF, 0x50C0, + 0x50C1, 0x50C2, 0x50C3, 0x50C4, 0x50C5, 0x50C6, 0x50C7, 0x50C8, + 0x50C9, 0x50CA, 0x50CB, 0x50CC, 0x50CD, 0x50CE, 0x50D0, 0x50D1, + 0x50D2, 0x50D3, 0x50D4, 0x50D5, 0x50D7, 0x50D8, 0x50D9, 0x50DB, + 0x50DC, 0x50DD, 0x50DE, 0x50DF, 0x50E0, 0x50E1, 0x50E2, 0x50E3, + 0x50E4, 0x50E5, 0x50E8, 0x50E9, 0x50EA, 0x50EB, 0x50EF, 0x50F0, + 0x50F1, 0x50F2, 0x50F4, 0x50F6, 0x50F7, 0x50F8, 0x50F9, 0x50FA, + 0x50FC, 0x50FD, 0x50FE, 0x50FF, 0x5100, 0x5101, 0x5102, 0x5103, + 0x5104, 0x5105, 0x5108, 0x5109, 0x510A, 0x510C, 0x510D, 0x510E, + 0x510F, 0x5110, 0x5111, 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, + 0x5118, 0x5119, 0x511A, 0x511B, 0x511C, 0x511D, 0x511E, 0x511F, + 0x5120, 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, + 0x5129, 0x512A, 0x512B, 0x512C, 0x512D, 0x512E, 0x512F, 0x5130, + 0x5131, 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, + 0x5139, 0x513A, 0x513B, 0x513C, 0x513D, 0x513E, 0x5142, 0x5147, + 0x514A, 0x514C, 0x514E, 0x514F, 0x5150, 0x5152, 0x5153, 0x5157, + 0x5158, 0x5159, 0x515B, 0x515D, 0x515E, 0x515F, 0x5160, 0x5161, +plane 03 +at 0x00 + 0x5163, 0x5164, 0x5166, 0x5167, 0x5169, 0x516A, 0x516F, 0x5172, + 0x517A, 0x517E, 0x517F, 0x5183, 0x5184, 0x5186, 0x5187, 0x518A, + 0x518B, 0x518E, 0x518F, 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, + 0x519A, 0x519D, 0x519E, 0x519F, 0x51A1, 0x51A3, 0x51A6, 0x51A7, + 0x51A8, 0x51A9, 0x51AA, 0x51AD, 0x51AE, 0x51B4, 0x51B8, 0x51B9, + 0x51BA, 0x51BE, 0x51BF, 0x51C1, 0x51C2, 0x51C3, 0x51C5, 0x51C8, + 0x51CA, 0x51CD, 0x51CE, 0x51D0, 0x51D2, 0x51D3, 0x51D4, 0x51D5, + 0x51D6, 0x51D7, 0x51D8, 0x51D9, 0x51DA, 0x51DC, 0x51DE, 0x51DF, + 0x51E2, 0x51E3, 0x51E5, 0x51E6, 0x51E7, 0x51E8, 0x51E9, 0x51EA, + 0x51EC, 0x51EE, 0x51F1, 0x51F2, 0x51F4, 0x51F7, 0x51FE, 0x5204, + 0x5205, 0x5209, 0x520B, 0x520C, 0x520F, 0x5210, 0x5213, 0x5214, + 0x5215, 0x521C, 0x521E, 0x521F, 0x5221, 0x5222, 0x5223, 0x5225, + 0x5226, 0x5227, 0x522A, 0x522C, 0x522F, 0x5231, 0x5232, 0x5234, + 0x5235, 0x523C, 0x523E, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, + 0x5249, 0x524B, 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, + 0x5258, 0x5259, 0x525A, 0x525B, 0x525D, 0x525F, 0x5260, 0x5262, + 0x5263, 0x5264, 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x526E, + 0x5270, 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, + 0x5279, 0x527A, 0x527B, 0x527C, 0x527E, 0x5280, 0x5283, 0x5284, + 0x5285, 0x5286, 0x5287, 0x5289, 0x528A, 0x528B, 0x528C, 0x528D, + 0x528E, 0x528F, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, + 0x5298, 0x5299, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, + 0x52AE, 0x52AF, 0x52B0, 0x52B4, 0x52B5, 0x52B6, 0x52B7, 0x52B8, + 0x52B9, 0x52BA, 0x52BB, 0x52BC, 0x52BD, 0x52C0, 0x52C1, 0x52C2, + 0x52C4, 0x52C5, 0x52C6, 0x52C8, 0x52CA, 0x52CC, 0x52CD, 0x52CE, + 0x52CF, 0x52D1, 0x52D3, 0x52D4, 0x52D5, 0x52D7, 0x52D9, 0x52DA, + 0x52DB, 0x52DC, 0x52DD, 0x52DE, 0x52E0, 0x52E1, 0x52E2, 0x52E3, + 0x52E5, 0x52E6, 0x52E7, 0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, + 0x52ED, 0x52EE, 0x52EF, 0x52F1, 0x52F2, 0x52F3, 0x52F4, 0x52F5, + 0x52F6, 0x52F7, 0x52F8, 0x52FB, 0x52FC, 0x52FD, 0x5301, 0x5302, + 0x5303, 0x5304, 0x5307, 0x5309, 0x530A, 0x530B, 0x530C, 0x530E, + 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B, 0x531C, 0x531E, +plane 04 +at 0x00 + 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, + 0x532C, 0x532D, 0x532F, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, + 0x5335, 0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5340, 0x5342, + 0x5344, 0x5346, 0x534B, 0x534C, 0x534D, 0x5350, 0x5354, 0x5358, + 0x5359, 0x535B, 0x535D, 0x5365, 0x5368, 0x536A, 0x536C, 0x536D, + 0x5372, 0x5376, 0x5379, 0x537B, 0x537C, 0x537D, 0x537E, 0x5380, + 0x5381, 0x5383, 0x5387, 0x5388, 0x538A, 0x538E, 0x538F, 0x5390, + 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, 0x539B, + 0x539C, 0x539E, 0x53A0, 0x53A1, 0x53A4, 0x53A7, 0x53AA, 0x53AB, + 0x53AC, 0x53AD, 0x53AF, 0x53B0, 0x53B1, 0x53B2, 0x53B3, 0x53B4, + 0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, 0x53BE, + 0x53C0, 0x53C3, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, 0x53CF, + 0x53D0, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, 0x53DE, + 0x53E1, 0x53E2, 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, 0x5400, + 0x5402, 0x5405, 0x5407, 0x540B, 0x5414, 0x5418, 0x5419, 0x541A, + 0x541C, 0x5422, 0x5424, 0x5425, 0x542A, 0x5430, 0x5433, 0x5436, + 0x5437, 0x543A, 0x543D, 0x543F, 0x5441, 0x5442, 0x5444, 0x5445, + 0x5447, 0x5449, 0x544C, 0x544D, 0x544E, 0x544F, 0x5451, 0x545A, + 0x545D, 0x545E, 0x545F, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, + 0x5469, 0x546A, 0x546B, 0x546C, 0x546D, 0x546E, 0x546F, 0x5470, + 0x5474, 0x5479, 0x547A, 0x547E, 0x547F, 0x5481, 0x5483, 0x5485, + 0x5487, 0x5488, 0x5489, 0x548A, 0x548D, 0x5491, 0x5493, 0x5497, + 0x5498, 0x549C, 0x549E, 0x549F, 0x54A0, 0x54A1, 0x54A2, 0x54A5, + 0x54AE, 0x54B0, 0x54B2, 0x54B5, 0x54B6, 0x54B7, 0x54B9, 0x54BA, + 0x54BC, 0x54BE, 0x54C3, 0x54C5, 0x54CA, 0x54CB, 0x54D6, 0x54D8, + 0x54DB, 0x54E0, 0x54E1, 0x54E2, 0x54E3, 0x54E4, 0x54EB, 0x54EC, + 0x54EF, 0x54F0, 0x54F1, 0x54F4, 0x54F5, 0x54F6, 0x54F7, 0x54F8, + 0x54F9, 0x54FB, 0x54FE, 0x5500, 0x5502, 0x5503, 0x5504, 0x5505, + 0x5508, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E, 0x5512, 0x5513, + 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551A, 0x551C, 0x551D, + 0x551E, 0x551F, 0x5521, 0x5525, 0x5526, 0x5528, 0x5529, 0x552B, + 0x552D, 0x5532, 0x5534, 0x5535, 0x5536, 0x5538, 0x5539, 0x553A, +plane 05 +at 0x00 + 0x553B, 0x553D, 0x5540, 0x5542, 0x5545, 0x5547, 0x5548, 0x554B, + 0x554C, 0x554D, 0x554E, 0x554F, 0x5551, 0x5552, 0x5553, 0x5554, + 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, 0x555D, 0x555E, 0x555F, + 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556B, 0x556F, 0x5570, + 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557A, 0x557D, 0x557F, + 0x5585, 0x5586, 0x558C, 0x558D, 0x558E, 0x5590, 0x5592, 0x5593, + 0x5595, 0x5596, 0x5597, 0x559A, 0x559B, 0x559E, 0x55A0, 0x55A1, + 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, 0x55A8, 0x55A9, 0x55AA, + 0x55AB, 0x55AC, 0x55AD, 0x55AE, 0x55AF, 0x55B0, 0x55B2, 0x55B4, + 0x55B6, 0x55B8, 0x55BA, 0x55BC, 0x55BF, 0x55C0, 0x55C1, 0x55C2, + 0x55C3, 0x55C6, 0x55C7, 0x55C8, 0x55CA, 0x55CB, 0x55CE, 0x55CF, + 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, 0x55DA, 0x55DB, 0x55DE, + 0x55E0, 0x55E2, 0x55E7, 0x55E9, 0x55ED, 0x55EE, 0x55F0, 0x55F1, + 0x55F4, 0x55F6, 0x55F8, 0x55F9, 0x55FA, 0x55FB, 0x55FC, 0x55FF, + 0x5602, 0x5603, 0x5604, 0x5605, 0x5606, 0x5607, 0x560A, 0x560B, + 0x560D, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x5615, 0x5616, + 0x5617, 0x5619, 0x561A, 0x561C, 0x561D, 0x5620, 0x5621, 0x5622, + 0x5625, 0x5626, 0x5628, 0x5629, 0x562A, 0x562B, 0x562E, 0x562F, + 0x5630, 0x5633, 0x5635, 0x5637, 0x5638, 0x563A, 0x563C, 0x563D, + 0x563E, 0x5640, 0x5641, 0x5642, 0x5643, 0x5644, 0x5645, 0x5646, + 0x5647, 0x5648, 0x5649, 0x564A, 0x564B, 0x564F, 0x5650, 0x5651, + 0x5652, 0x5653, 0x5655, 0x5656, 0x565A, 0x565B, 0x565D, 0x565E, + 0x565F, 0x5660, 0x5661, 0x5663, 0x5665, 0x5666, 0x5667, 0x566D, + 0x566E, 0x566F, 0x5670, 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, + 0x5678, 0x5679, 0x567A, 0x567D, 0x567E, 0x567F, 0x5680, 0x5681, + 0x5682, 0x5683, 0x5684, 0x5687, 0x5688, 0x5689, 0x568A, 0x568B, + 0x568C, 0x568D, 0x5690, 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, + 0x5697, 0x5698, 0x5699, 0x569A, 0x569B, 0x569C, 0x569D, 0x569E, + 0x569F, 0x56A0, 0x56A1, 0x56A2, 0x56A4, 0x56A5, 0x56A6, 0x56A7, + 0x56A8, 0x56A9, 0x56AA, 0x56AB, 0x56AC, 0x56AD, 0x56AE, 0x56B0, + 0x56B1, 0x56B2, 0x56B3, 0x56B4, 0x56B5, 0x56B6, 0x56B8, 0x56B9, + 0x56BA, 0x56BB, 0x56BD, 0x56BE, 0x56BF, 0x56C0, 0x56C1, 0x56C2, +plane 06 +at 0x00 + 0x56C3, 0x56C4, 0x56C5, 0x56C6, 0x56C7, 0x56C8, 0x56C9, 0x56CB, + 0x56CC, 0x56CD, 0x56CE, 0x56CF, 0x56D0, 0x56D1, 0x56D2, 0x56D3, + 0x56D5, 0x56D6, 0x56D8, 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, + 0x56E7, 0x56E8, 0x56E9, 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, + 0x56F3, 0x56F6, 0x56F7, 0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, + 0x5702, 0x5705, 0x5707, 0x570B, 0x570C, 0x570D, 0x570E, 0x570F, + 0x5710, 0x5711, 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, + 0x5718, 0x5719, 0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, + 0x5722, 0x5724, 0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, + 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, + 0x5741, 0x5743, 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, + 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, + 0x5763, 0x5765, 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, + 0x5774, 0x5775, 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, + 0x5780, 0x5781, 0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, + 0x578F, 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, + 0x5799, 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, + 0x57AA, 0x57AC, 0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, + 0x57B7, 0x57B9, 0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, + 0x57C0, 0x57C1, 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, + 0x57CA, 0x57CC, 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, + 0x57DB, 0x57DC, 0x57DE, 0x57E1, 0x57E2, 0x57E3, 0x57E5, 0x57E6, + 0x57E7, 0x57E8, 0x57E9, 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, + 0x57F1, 0x57F2, 0x57F3, 0x57F5, 0x57F6, 0x57F7, 0x57FB, 0x57FC, + 0x57FE, 0x57FF, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, + 0x580A, 0x580C, 0x580E, 0x580F, 0x5810, 0x5812, 0x5813, 0x5814, + 0x5816, 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581D, 0x581F, + 0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B, + 0x582C, 0x582D, 0x582E, 0x582F, 0x5831, 0x5832, 0x5833, 0x5834, + 0x5836, 0x5837, 0x5838, 0x5839, 0x583A, 0x583B, 0x583C, 0x583D, + 0x583E, 0x583F, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, + 0x5847, 0x5848, 0x5849, 0x584A, 0x584B, 0x584E, 0x584F, 0x5850, +plane 07 +at 0x00 + 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585A, 0x585B, + 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, + 0x5866, 0x5867, 0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, + 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, + 0x5878, 0x5879, 0x587A, 0x587B, 0x587C, 0x587D, 0x587F, 0x5882, + 0x5884, 0x5886, 0x5887, 0x5888, 0x588A, 0x588B, 0x588C, 0x588D, + 0x588E, 0x588F, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897, + 0x5898, 0x589B, 0x589C, 0x589D, 0x58A0, 0x58A1, 0x58A2, 0x58A3, + 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB, 0x58AC, 0x58AD, + 0x58AE, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B3, 0x58B4, 0x58B5, + 0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BB, 0x58BD, 0x58BE, + 0x58BF, 0x58C0, 0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C7, 0x58C8, + 0x58C9, 0x58CA, 0x58CB, 0x58CC, 0x58CD, 0x58CE, 0x58CF, 0x58D0, + 0x58D2, 0x58D3, 0x58D4, 0x58D6, 0x58D7, 0x58D8, 0x58D9, 0x58DA, + 0x58DB, 0x58DC, 0x58DD, 0x58DE, 0x58DF, 0x58E0, 0x58E1, 0x58E2, + 0x58E3, 0x58E5, 0x58E6, 0x58E7, 0x58E8, 0x58E9, 0x58EA, 0x58ED, + 0x58EF, 0x58F1, 0x58F2, 0x58F4, 0x58F5, 0x58F7, 0x58F8, 0x58FA, + 0x58FB, 0x58FC, 0x58FD, 0x58FE, 0x58FF, 0x5900, 0x5901, 0x5903, + 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C, 0x590E, + 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B, 0x591D, + 0x591E, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, 0x592C, + 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B, 0x593D, 0x593E, + 0x593F, 0x5940, 0x5943, 0x5945, 0x5946, 0x594A, 0x594C, 0x594D, + 0x5950, 0x5952, 0x5953, 0x5959, 0x595B, 0x595C, 0x595D, 0x595E, + 0x595F, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, 0x5968, 0x5969, + 0x596A, 0x596B, 0x596C, 0x596D, 0x596E, 0x596F, 0x5970, 0x5971, + 0x5972, 0x5975, 0x5977, 0x597A, 0x597B, 0x597C, 0x597E, 0x597F, + 0x5980, 0x5985, 0x5989, 0x598B, 0x598C, 0x598E, 0x598F, 0x5990, + 0x5991, 0x5994, 0x5995, 0x5998, 0x599A, 0x599B, 0x599C, 0x599D, + 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, 0x59A7, 0x59AC, 0x59AD, + 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, 0x59B6, 0x59B7, 0x59B8, + 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, 0x59C1, 0x59C2, 0x59C3, +plane 08 +at 0x00 + 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, 0x59CC, 0x59CD, 0x59CE, + 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, 0x59DE, 0x59DF, 0x59E0, + 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, 0x59E9, 0x59EA, 0x59EB, + 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1, 0x59F2, 0x59F3, 0x59F4, + 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA, 0x59FC, 0x59FD, 0x59FE, + 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, 0x5A0E, 0x5A0F, 0x5A10, + 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, 0x5A19, 0x5A1A, 0x5A1B, + 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, 0x5A26, 0x5A27, 0x5A28, + 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, 0x5A2F, 0x5A30, 0x5A33, + 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, 0x5A3B, 0x5A3D, 0x5A3E, + 0x5A3F, 0x5A41, 0x5A42, 0x5A43, 0x5A44, 0x5A45, 0x5A47, 0x5A48, + 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, 0x5A50, 0x5A51, 0x5A52, + 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58, 0x5A59, 0x5A5B, 0x5A5C, + 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, 0x5A61, 0x5A63, 0x5A64, 0x5A65, + 0x5A66, 0x5A68, 0x5A69, 0x5A6B, 0x5A6C, 0x5A6D, 0x5A6E, 0x5A6F, + 0x5A70, 0x5A71, 0x5A72, 0x5A73, 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, + 0x5A7D, 0x5A7E, 0x5A80, 0x5A81, 0x5A82, 0x5A83, 0x5A84, 0x5A85, + 0x5A86, 0x5A87, 0x5A88, 0x5A89, 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, + 0x5A8E, 0x5A8F, 0x5A90, 0x5A91, 0x5A93, 0x5A94, 0x5A95, 0x5A96, + 0x5A97, 0x5A98, 0x5A99, 0x5A9C, 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, + 0x5AA1, 0x5AA2, 0x5AA3, 0x5AA4, 0x5AA5, 0x5AA6, 0x5AA7, 0x5AA8, + 0x5AA9, 0x5AAB, 0x5AAC, 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, + 0x5AB4, 0x5AB6, 0x5AB7, 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, + 0x5ABF, 0x5AC0, 0x5AC3, 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, + 0x5ACA, 0x5ACB, 0x5ACD, 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, + 0x5AD5, 0x5AD7, 0x5AD9, 0x5ADA, 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, + 0x5AE2, 0x5AE4, 0x5AE5, 0x5AE7, 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, + 0x5AEE, 0x5AEF, 0x5AF0, 0x5AF2, 0x5AF3, 0x5AF4, 0x5AF5, 0x5AF6, + 0x5AF7, 0x5AF8, 0x5AF9, 0x5AFA, 0x5AFB, 0x5AFC, 0x5AFD, 0x5AFE, + 0x5AFF, 0x5B00, 0x5B01, 0x5B02, 0x5B03, 0x5B04, 0x5B05, 0x5B06, + 0x5B07, 0x5B08, 0x5B0A, 0x5B0B, 0x5B0C, 0x5B0D, 0x5B0E, 0x5B0F, + 0x5B10, 0x5B11, 0x5B12, 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B19, +plane 09 +at 0x00 + 0x5B1A, 0x5B1B, 0x5B1C, 0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B21, + 0x5B22, 0x5B23, 0x5B24, 0x5B25, 0x5B26, 0x5B27, 0x5B28, 0x5B29, + 0x5B2A, 0x5B2B, 0x5B2C, 0x5B2D, 0x5B2E, 0x5B2F, 0x5B30, 0x5B31, + 0x5B33, 0x5B35, 0x5B36, 0x5B38, 0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, + 0x5B3D, 0x5B3E, 0x5B3F, 0x5B41, 0x5B42, 0x5B43, 0x5B44, 0x5B45, + 0x5B46, 0x5B47, 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4C, 0x5B4D, + 0x5B4E, 0x5B4F, 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67, + 0x5B68, 0x5B6B, 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, + 0x5B77, 0x5B78, 0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, + 0x5B86, 0x5B8A, 0x5B8D, 0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, + 0x5B96, 0x5B9F, 0x5BA7, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, + 0x5BAF, 0x5BB1, 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, + 0x5BC1, 0x5BC3, 0x5BC8, 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, + 0x5BCF, 0x5BD1, 0x5BD4, 0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, + 0x5BDA, 0x5BDB, 0x5BDC, 0x5BE0, 0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, + 0x5BE9, 0x5BEA, 0x5BEB, 0x5BEC, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, + 0x5BF3, 0x5BF4, 0x5BF5, 0x5BF6, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, + 0x5C02, 0x5C03, 0x5C05, 0x5C07, 0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, + 0x5C0E, 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E, + 0x5C1F, 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A, + 0x5C2B, 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35, + 0x5C36, 0x5C37, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, + 0x5C52, 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, + 0x5C5C, 0x5C5D, 0x5C5F, 0x5C62, 0x5C64, 0x5C67, 0x5C68, 0x5C69, + 0x5C6A, 0x5C6B, 0x5C6C, 0x5C6D, 0x5C70, 0x5C72, 0x5C73, 0x5C74, + 0x5C75, 0x5C76, 0x5C77, 0x5C78, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, + 0x5C80, 0x5C83, 0x5C84, 0x5C85, 0x5C86, 0x5C87, 0x5C89, 0x5C8A, + 0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, 0x5C93, 0x5C95, 0x5C9D, 0x5C9E, + 0x5C9F, 0x5CA0, 0x5CA1, 0x5CA4, 0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8, + 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, + 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, + 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, +plane 10 +at 0x00 + 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, + 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, + 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF, + 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF4, 0x5CF5, 0x5CF6, 0x5CF7, 0x5CF8, + 0x5CF9, 0x5CFA, 0x5CFC, 0x5CFD, 0x5CFE, 0x5CFF, 0x5D00, 0x5D01, + 0x5D04, 0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, 0x5D0D, + 0x5D0F, 0x5D10, 0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D17, 0x5D18, + 0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, 0x5D1F, 0x5D20, 0x5D21, 0x5D22, + 0x5D23, 0x5D25, 0x5D28, 0x5D2A, 0x5D2B, 0x5D2C, 0x5D2F, 0x5D30, + 0x5D31, 0x5D32, 0x5D33, 0x5D35, 0x5D36, 0x5D37, 0x5D38, 0x5D39, + 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, 0x5D40, 0x5D41, 0x5D42, 0x5D43, + 0x5D44, 0x5D45, 0x5D46, 0x5D48, 0x5D49, 0x5D4D, 0x5D4E, 0x5D4F, + 0x5D50, 0x5D51, 0x5D52, 0x5D53, 0x5D54, 0x5D55, 0x5D56, 0x5D57, + 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F, 0x5D60, 0x5D61, 0x5D62, + 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67, 0x5D68, 0x5D6A, 0x5D6D, + 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73, 0x5D75, 0x5D76, 0x5D77, + 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C, 0x5D7D, 0x5D7E, 0x5D7F, + 0x5D80, 0x5D81, 0x5D83, 0x5D84, 0x5D85, 0x5D86, 0x5D87, 0x5D88, + 0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F, 0x5D90, + 0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D97, 0x5D98, + 0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA0, 0x5DA1, 0x5DA2, + 0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, 0x5DA7, 0x5DA8, 0x5DA9, 0x5DAA, + 0x5DAB, 0x5DAC, 0x5DAD, 0x5DAE, 0x5DAF, 0x5DB0, 0x5DB1, 0x5DB2, + 0x5DB3, 0x5DB4, 0x5DB5, 0x5DB6, 0x5DB8, 0x5DB9, 0x5DBA, 0x5DBB, + 0x5DBC, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1, 0x5DC2, 0x5DC3, + 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA, 0x5DCB, 0x5DCC, + 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD2, 0x5DD3, 0x5DD4, 0x5DD5, + 0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC, 0x5DDF, 0x5DE0, + 0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, 0x5DF0, 0x5DF5, 0x5DF6, + 0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, 0x5DFC, 0x5DFF, 0x5E00, 0x5E04, + 0x5E07, 0x5E09, 0x5E0A, 0x5E0B, 0x5E0D, 0x5E0E, 0x5E12, 0x5E13, + 0x5E17, 0x5E1E, 0x5E1F, 0x5E20, 0x5E21, 0x5E22, 0x5E23, 0x5E24, +plane 11 +at 0x00 + 0x5E25, 0x5E28, 0x5E29, 0x5E2A, 0x5E2B, 0x5E2C, 0x5E2F, 0x5E30, + 0x5E32, 0x5E33, 0x5E34, 0x5E35, 0x5E36, 0x5E39, 0x5E3A, 0x5E3E, + 0x5E3F, 0x5E40, 0x5E41, 0x5E43, 0x5E46, 0x5E47, 0x5E48, 0x5E49, + 0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, 0x5E50, 0x5E51, 0x5E52, + 0x5E53, 0x5E56, 0x5E57, 0x5E58, 0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, + 0x5E5F, 0x5E60, 0x5E63, 0x5E64, 0x5E65, 0x5E66, 0x5E67, 0x5E68, + 0x5E69, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D, 0x5E6E, 0x5E6F, 0x5E70, + 0x5E71, 0x5E75, 0x5E77, 0x5E79, 0x5E7E, 0x5E81, 0x5E82, 0x5E83, + 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, 0x5E8E, 0x5E92, 0x5E98, + 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, 0x5EA4, 0x5EA8, 0x5EA9, + 0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, 0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, + 0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, 0x5EBF, 0x5EC0, 0x5EC1, + 0x5EC2, 0x5EC3, 0x5EC4, 0x5EC5, 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, + 0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF, 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, + 0x5ED8, 0x5ED9, 0x5EDA, 0x5EDC, 0x5EDD, 0x5EDE, 0x5EDF, 0x5EE0, + 0x5EE1, 0x5EE2, 0x5EE3, 0x5EE4, 0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, + 0x5EEB, 0x5EEC, 0x5EED, 0x5EEE, 0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, + 0x5EF3, 0x5EF5, 0x5EF8, 0x5EF9, 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, + 0x5F06, 0x5F07, 0x5F09, 0x5F0C, 0x5F0D, 0x5F0E, 0x5F10, 0x5F12, + 0x5F14, 0x5F16, 0x5F19, 0x5F1A, 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, + 0x5F22, 0x5F23, 0x5F24, 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, + 0x5F32, 0x5F33, 0x5F34, 0x5F35, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, + 0x5F3D, 0x5F3E, 0x5F3F, 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, + 0x5F46, 0x5F47, 0x5F48, 0x5F49, 0x5F4A, 0x5F4B, 0x5F4C, 0x5F4D, + 0x5F4E, 0x5F4F, 0x5F51, 0x5F54, 0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, + 0x5F5E, 0x5F5F, 0x5F60, 0x5F63, 0x5F65, 0x5F67, 0x5F68, 0x5F6B, + 0x5F6E, 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F76, 0x5F78, 0x5F7A, + 0x5F7D, 0x5F7E, 0x5F7F, 0x5F83, 0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, + 0x5F91, 0x5F93, 0x5F94, 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, + 0x5F9F, 0x5FA0, 0x5FA2, 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, + 0x5FA9, 0x5FAB, 0x5FAC, 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, + 0x5FB4, 0x5FB6, 0x5FB8, 0x5FB9, 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, +plane 12 +at 0x00 + 0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7, 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, + 0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA, 0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, + 0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6, 0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, + 0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4, 0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, + 0x5FFC, 0x6007, 0x6008, 0x6009, 0x600B, 0x600C, 0x6010, 0x6011, + 0x6013, 0x6017, 0x6018, 0x601A, 0x601E, 0x601F, 0x6022, 0x6023, + 0x6024, 0x602C, 0x602D, 0x602E, 0x6030, 0x6031, 0x6032, 0x6033, + 0x6034, 0x6036, 0x6037, 0x6038, 0x6039, 0x603A, 0x603D, 0x603E, + 0x6040, 0x6044, 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604A, + 0x604C, 0x604E, 0x604F, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, + 0x6058, 0x605B, 0x605C, 0x605E, 0x605F, 0x6060, 0x6061, 0x6065, + 0x6066, 0x606E, 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607E, + 0x6080, 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608A, + 0x608B, 0x608E, 0x608F, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, + 0x6098, 0x6099, 0x609C, 0x609E, 0x60A1, 0x60A2, 0x60A4, 0x60A5, + 0x60A7, 0x60A9, 0x60AA, 0x60AE, 0x60B0, 0x60B3, 0x60B5, 0x60B6, + 0x60B7, 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF, 0x60C0, 0x60C1, + 0x60C2, 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9, 0x60CC, 0x60CD, + 0x60CE, 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4, 0x60D6, 0x60D7, + 0x60D9, 0x60DB, 0x60DE, 0x60E1, 0x60E2, 0x60E3, 0x60E4, 0x60E5, + 0x60EA, 0x60F1, 0x60F2, 0x60F5, 0x60F7, 0x60F8, 0x60FB, 0x60FC, + 0x60FD, 0x60FE, 0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, + 0x610A, 0x610B, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, + 0x6116, 0x6117, 0x6118, 0x6119, 0x611B, 0x611C, 0x611D, 0x611E, + 0x6121, 0x6122, 0x6125, 0x6128, 0x6129, 0x612A, 0x612C, 0x612D, + 0x612E, 0x612F, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, + 0x6136, 0x6137, 0x6138, 0x6139, 0x613A, 0x613B, 0x613C, 0x613D, + 0x613E, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, + 0x6147, 0x6149, 0x614B, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153, + 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615A, 0x615B, 0x615C, + 0x615E, 0x615F, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, + 0x6169, 0x616A, 0x616B, 0x616C, 0x616D, 0x616E, 0x616F, 0x6171, +plane 13 +at 0x00 + 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617A, 0x617B, + 0x617C, 0x617D, 0x617E, 0x617F, 0x6180, 0x6181, 0x6182, 0x6183, + 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618A, 0x618C, + 0x618D, 0x618F, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0x6196, + 0x6197, 0x6198, 0x6199, 0x619A, 0x619B, 0x619C, 0x619E, 0x619F, + 0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A4, 0x61A5, 0x61A6, 0x61AA, + 0x61AB, 0x61AD, 0x61AE, 0x61AF, 0x61B0, 0x61B1, 0x61B2, 0x61B3, + 0x61B4, 0x61B5, 0x61B6, 0x61B8, 0x61B9, 0x61BA, 0x61BB, 0x61BC, + 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3, 0x61C4, 0x61C5, 0x61C6, + 0x61C7, 0x61C9, 0x61CC, 0x61CD, 0x61CE, 0x61CF, 0x61D0, 0x61D3, + 0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, 0x61DC, + 0x61DD, 0x61DE, 0x61DF, 0x61E0, 0x61E1, 0x61E2, 0x61E3, 0x61E4, + 0x61E5, 0x61E7, 0x61E8, 0x61E9, 0x61EA, 0x61EB, 0x61EC, 0x61ED, + 0x61EE, 0x61EF, 0x61F0, 0x61F1, 0x61F2, 0x61F3, 0x61F4, 0x61F6, + 0x61F7, 0x61F8, 0x61F9, 0x61FA, 0x61FB, 0x61FC, 0x61FD, 0x61FE, + 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, 0x6209, + 0x6213, 0x6214, 0x6219, 0x621C, 0x621D, 0x621E, 0x6220, 0x6223, + 0x6226, 0x6227, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F, 0x6230, + 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, 0x623B, + 0x623C, 0x6242, 0x6244, 0x6245, 0x6246, 0x624A, 0x624F, 0x6250, + 0x6255, 0x6256, 0x6257, 0x6259, 0x625A, 0x625C, 0x625D, 0x625E, + 0x625F, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, + 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627A, 0x627B, 0x627D, + 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628B, + 0x628C, 0x628D, 0x628E, 0x628F, 0x6290, 0x6294, 0x6299, 0x629C, + 0x629D, 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, 0x62AA, 0x62AD, + 0x62AE, 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, 0x62B6, 0x62B7, + 0x62B8, 0x62BA, 0x62BE, 0x62C0, 0x62C1, 0x62C3, 0x62CB, 0x62CF, + 0x62D1, 0x62D5, 0x62DD, 0x62DE, 0x62E0, 0x62E1, 0x62E4, 0x62EA, + 0x62EB, 0x62F0, 0x62F2, 0x62F5, 0x62F8, 0x62F9, 0x62FA, 0x62FB, + 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, 0x630A, 0x630B, 0x630C, + 0x630D, 0x630F, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, +plane 14 +at 0x00 + 0x6318, 0x6319, 0x631C, 0x6326, 0x6327, 0x6329, 0x632C, 0x632D, + 0x632E, 0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, + 0x6338, 0x633B, 0x633C, 0x633E, 0x633F, 0x6340, 0x6341, 0x6344, + 0x6347, 0x6348, 0x634A, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, + 0x6357, 0x6358, 0x6359, 0x635A, 0x635B, 0x635C, 0x635D, 0x6360, + 0x6364, 0x6365, 0x6366, 0x6368, 0x636A, 0x636B, 0x636C, 0x636F, + 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, 0x6378, 0x6379, 0x637C, + 0x637D, 0x637E, 0x637F, 0x6381, 0x6383, 0x6384, 0x6385, 0x6386, + 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397, 0x6399, + 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, 0x639F, 0x63A1, 0x63A4, + 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, 0x63B5, 0x63B6, 0x63B9, + 0x63BB, 0x63BD, 0x63BF, 0x63C0, 0x63C1, 0x63C2, 0x63C3, 0x63C5, + 0x63C7, 0x63C8, 0x63CA, 0x63CB, 0x63CC, 0x63D1, 0x63D3, 0x63D4, + 0x63D5, 0x63D7, 0x63D8, 0x63D9, 0x63DA, 0x63DB, 0x63DC, 0x63DD, + 0x63DF, 0x63E2, 0x63E4, 0x63E5, 0x63E6, 0x63E7, 0x63E8, 0x63EB, + 0x63EC, 0x63EE, 0x63EF, 0x63F0, 0x63F1, 0x63F3, 0x63F5, 0x63F7, + 0x63F9, 0x63FA, 0x63FB, 0x63FC, 0x63FE, 0x6403, 0x6404, 0x6406, + 0x6407, 0x6408, 0x6409, 0x640A, 0x640D, 0x640E, 0x6411, 0x6412, + 0x6415, 0x6416, 0x6417, 0x6418, 0x6419, 0x641A, 0x641D, 0x641F, + 0x6422, 0x6423, 0x6424, 0x6425, 0x6427, 0x6428, 0x6429, 0x642B, + 0x642E, 0x642F, 0x6430, 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, + 0x6437, 0x6438, 0x6439, 0x643B, 0x643C, 0x643E, 0x6440, 0x6442, + 0x6443, 0x6449, 0x644B, 0x644C, 0x644D, 0x644E, 0x644F, 0x6450, + 0x6451, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459, 0x645A, 0x645B, + 0x645C, 0x645D, 0x645F, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, + 0x6465, 0x6466, 0x6468, 0x646A, 0x646B, 0x646C, 0x646E, 0x646F, + 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, + 0x647B, 0x647C, 0x647D, 0x647E, 0x647F, 0x6480, 0x6481, 0x6483, + 0x6486, 0x6488, 0x6489, 0x648A, 0x648B, 0x648C, 0x648D, 0x648E, + 0x648F, 0x6490, 0x6493, 0x6494, 0x6497, 0x6498, 0x649A, 0x649B, + 0x649C, 0x649D, 0x649F, 0x64A0, 0x64A1, 0x64A2, 0x64A3, 0x64A5, + 0x64A6, 0x64A7, 0x64A8, 0x64AA, 0x64AB, 0x64AF, 0x64B1, 0x64B2, +plane 15 +at 0x00 + 0x64B3, 0x64B4, 0x64B6, 0x64B9, 0x64BB, 0x64BD, 0x64BE, 0x64BF, + 0x64C1, 0x64C3, 0x64C4, 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64CA, + 0x64CB, 0x64CC, 0x64CF, 0x64D1, 0x64D3, 0x64D4, 0x64D5, 0x64D6, + 0x64D9, 0x64DA, 0x64DB, 0x64DC, 0x64DD, 0x64DF, 0x64E0, 0x64E1, + 0x64E3, 0x64E5, 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB, 0x64EC, + 0x64ED, 0x64EE, 0x64EF, 0x64F0, 0x64F1, 0x64F2, 0x64F3, 0x64F4, + 0x64F5, 0x64F6, 0x64F7, 0x64F8, 0x64F9, 0x64FA, 0x64FB, 0x64FC, + 0x64FD, 0x64FE, 0x64FF, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, + 0x6506, 0x6507, 0x6508, 0x650A, 0x650B, 0x650C, 0x650D, 0x650E, + 0x650F, 0x6510, 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, + 0x6519, 0x651A, 0x651B, 0x651C, 0x651D, 0x651E, 0x651F, 0x6520, + 0x6521, 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, + 0x652A, 0x652C, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, + 0x653A, 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, + 0x6546, 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550, 0x6552, + 0x6553, 0x6554, 0x6557, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560, + 0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D, + 0x656E, 0x656F, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, + 0x657A, 0x657B, 0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, + 0x6582, 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658A, + 0x658D, 0x658E, 0x658F, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, + 0x659A, 0x659D, 0x659E, 0x65A0, 0x65A2, 0x65A3, 0x65A6, 0x65A8, + 0x65AA, 0x65AC, 0x65AE, 0x65B1, 0x65B2, 0x65B3, 0x65B4, 0x65B5, + 0x65B6, 0x65B7, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF, 0x65C0, + 0x65C2, 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0, 0x65D1, + 0x65D3, 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB, 0x65DC, + 0x65DD, 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA, 0x65EB, + 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB, 0x65FC, + 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, + 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, + 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622, 0x6623, + 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, +plane 16 +at 0x00 + 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B, 0x663D, + 0x663F, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, + 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, 0x6659, + 0x665B, 0x665C, 0x665D, 0x665E, 0x6660, 0x6662, 0x6663, 0x6665, + 0x6667, 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, 0x6672, + 0x6673, 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, 0x667F, + 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, 0x668A, + 0x668B, 0x668D, 0x668E, 0x668F, 0x6690, 0x6692, 0x6693, 0x6694, + 0x6695, 0x6698, 0x6699, 0x669A, 0x669B, 0x669C, 0x669E, 0x669F, + 0x66A0, 0x66A1, 0x66A2, 0x66A3, 0x66A4, 0x66A5, 0x66A6, 0x66A9, + 0x66AA, 0x66AB, 0x66AC, 0x66AD, 0x66AF, 0x66B0, 0x66B1, 0x66B2, + 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8, 0x66BA, 0x66BB, 0x66BC, + 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2, 0x66C3, 0x66C4, 0x66C5, + 0x66C6, 0x66C7, 0x66C8, 0x66C9, 0x66CA, 0x66CB, 0x66CC, 0x66CD, + 0x66CE, 0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, 0x66D5, + 0x66D6, 0x66D7, 0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E0, 0x66E1, + 0x66E2, 0x66E3, 0x66E4, 0x66E5, 0x66E7, 0x66E8, 0x66EA, 0x66EB, + 0x66EC, 0x66ED, 0x66EE, 0x66EF, 0x66F1, 0x66F5, 0x66F6, 0x66F8, + 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702, 0x6703, 0x6704, 0x6705, + 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711, 0x6712, 0x6713, + 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E, 0x6720, 0x6721, + 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, 0x672E, 0x6730, + 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673B, 0x673C, + 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, 0x674A, 0x674B, + 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759, 0x675A, + 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767, 0x676B, + 0x676C, 0x676E, 0x6771, 0x6774, 0x6776, 0x6778, 0x6779, 0x677A, + 0x677B, 0x677D, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788, + 0x678A, 0x678C, 0x678D, 0x678E, 0x678F, 0x6791, 0x6792, 0x6793, + 0x6794, 0x6796, 0x6799, 0x679B, 0x679F, 0x67A0, 0x67A1, 0x67A4, + 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, 0x67B2, 0x67B4, 0x67B9, + 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, 0x67BF, 0x67C0, 0x67C2, +plane 17 +at 0x00 + 0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, 0x67CA, 0x67CB, 0x67CC, + 0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, 0x67DB, 0x67DF, 0x67E1, + 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, 0x67EA, 0x67EB, 0x67ED, + 0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, 0x67F8, 0x67F9, 0x67FA, + 0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806, + 0x680D, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681A, + 0x681B, 0x681C, 0x681E, 0x681F, 0x6820, 0x6822, 0x6823, 0x6824, + 0x6825, 0x6826, 0x6827, 0x6828, 0x682B, 0x682C, 0x682D, 0x682E, + 0x682F, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683A, 0x683B, + 0x683F, 0x6847, 0x684B, 0x684D, 0x684F, 0x6852, 0x6856, 0x6857, + 0x6858, 0x6859, 0x685A, 0x685B, 0x685C, 0x685D, 0x685E, 0x685F, + 0x686A, 0x686C, 0x686D, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872, + 0x6873, 0x6875, 0x6878, 0x6879, 0x687A, 0x687B, 0x687C, 0x687D, + 0x687E, 0x687F, 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889, + 0x688A, 0x688B, 0x688C, 0x688D, 0x688E, 0x6890, 0x6891, 0x6892, + 0x6894, 0x6895, 0x6896, 0x6898, 0x6899, 0x689A, 0x689B, 0x689C, + 0x689D, 0x689E, 0x689F, 0x68A0, 0x68A1, 0x68A3, 0x68A4, 0x68A5, + 0x68A9, 0x68AA, 0x68AB, 0x68AC, 0x68AE, 0x68B1, 0x68B2, 0x68B4, + 0x68B6, 0x68B7, 0x68B8, 0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, + 0x68BE, 0x68BF, 0x68C1, 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, + 0x68C8, 0x68CA, 0x68CC, 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, + 0x68D4, 0x68D6, 0x68D7, 0x68D9, 0x68DB, 0x68DC, 0x68DD, 0x68DE, + 0x68DF, 0x68E1, 0x68E2, 0x68E4, 0x68E5, 0x68E6, 0x68E7, 0x68E8, + 0x68E9, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68EF, 0x68F2, 0x68F3, + 0x68F4, 0x68F6, 0x68F7, 0x68F8, 0x68FB, 0x68FD, 0x68FE, 0x68FF, + 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, + 0x690A, 0x690C, 0x690F, 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, + 0x6917, 0x6918, 0x6919, 0x691A, 0x691B, 0x691C, 0x691D, 0x691E, + 0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, + 0x692A, 0x692B, 0x692C, 0x692E, 0x692F, 0x6931, 0x6932, 0x6933, + 0x6935, 0x6936, 0x6937, 0x6938, 0x693A, 0x693B, 0x693C, 0x693E, + 0x6940, 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, +plane 18 +at 0x00 + 0x6949, 0x694A, 0x694B, 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, + 0x6951, 0x6952, 0x6953, 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, + 0x695C, 0x695F, 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, + 0x6969, 0x696A, 0x696C, 0x696D, 0x696F, 0x6970, 0x6972, 0x6973, + 0x6974, 0x6975, 0x6976, 0x697A, 0x697B, 0x697D, 0x697E, 0x697F, + 0x6981, 0x6983, 0x6985, 0x698A, 0x698B, 0x698C, 0x698E, 0x698F, + 0x6990, 0x6991, 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699A, + 0x699D, 0x699E, 0x699F, 0x69A0, 0x69A1, 0x69A2, 0x69A3, 0x69A4, + 0x69A5, 0x69A6, 0x69A9, 0x69AA, 0x69AC, 0x69AE, 0x69AF, 0x69B0, + 0x69B2, 0x69B3, 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA, 0x69BC, + 0x69BD, 0x69BE, 0x69BF, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5, + 0x69C6, 0x69C7, 0x69C8, 0x69C9, 0x69CB, 0x69CD, 0x69CF, 0x69D1, + 0x69D2, 0x69D3, 0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, + 0x69DC, 0x69DD, 0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, + 0x69E6, 0x69E7, 0x69E8, 0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, + 0x69EF, 0x69F0, 0x69F1, 0x69F3, 0x69F4, 0x69F5, 0x69F6, 0x69F7, + 0x69F8, 0x69F9, 0x69FA, 0x69FB, 0x69FC, 0x69FE, 0x6A00, 0x6A01, + 0x6A02, 0x6A03, 0x6A04, 0x6A05, 0x6A06, 0x6A07, 0x6A08, 0x6A09, + 0x6A0B, 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11, 0x6A12, + 0x6A13, 0x6A14, 0x6A15, 0x6A16, 0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, + 0x6A1D, 0x6A1E, 0x6A20, 0x6A22, 0x6A23, 0x6A24, 0x6A25, 0x6A26, + 0x6A27, 0x6A29, 0x6A2B, 0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, + 0x6A33, 0x6A34, 0x6A36, 0x6A37, 0x6A38, 0x6A39, 0x6A3A, 0x6A3B, + 0x6A3C, 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43, 0x6A45, 0x6A46, + 0x6A48, 0x6A49, 0x6A4A, 0x6A4B, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, + 0x6A51, 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A, + 0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, 0x6A60, 0x6A62, 0x6A63, 0x6A64, + 0x6A66, 0x6A67, 0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, + 0x6A6E, 0x6A6F, 0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, + 0x6A77, 0x6A78, 0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, + 0x6A82, 0x6A83, 0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A89, 0x6A8A, + 0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, 0x6A92, 0x6A93, 0x6A94, 0x6A95, +plane 19 +at 0x00 + 0x6A96, 0x6A98, 0x6A99, 0x6A9A, 0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E, + 0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, 0x6AA4, 0x6AA5, 0x6AA6, 0x6AA7, + 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AAF, 0x6AB0, 0x6AB1, 0x6AB2, + 0x6AB3, 0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB8, 0x6AB9, 0x6ABA, + 0x6ABB, 0x6ABC, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, 0x6AC2, + 0x6AC3, 0x6AC4, 0x6AC5, 0x6AC6, 0x6AC7, 0x6AC8, 0x6AC9, 0x6ACA, + 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, 0x6ACF, 0x6AD0, 0x6AD1, 0x6AD2, + 0x6AD3, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7, 0x6AD8, 0x6AD9, 0x6ADA, + 0x6ADB, 0x6ADC, 0x6ADD, 0x6ADE, 0x6ADF, 0x6AE0, 0x6AE1, 0x6AE2, + 0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, 0x6AE7, 0x6AE8, 0x6AE9, 0x6AEA, + 0x6AEB, 0x6AEC, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0, 0x6AF1, 0x6AF2, + 0x6AF3, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF8, 0x6AF9, 0x6AFA, + 0x6AFB, 0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01, 0x6B02, + 0x6B03, 0x6B04, 0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, 0x6B0A, + 0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, 0x6B0F, 0x6B10, 0x6B11, 0x6B12, + 0x6B13, 0x6B14, 0x6B15, 0x6B16, 0x6B17, 0x6B18, 0x6B19, 0x6B1A, + 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1E, 0x6B1F, 0x6B25, 0x6B26, 0x6B28, + 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E, 0x6B2F, 0x6B30, + 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, 0x6B3B, 0x6B3C, + 0x6B3D, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, 0x6B45, 0x6B48, + 0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B50, 0x6B51, 0x6B52, + 0x6B53, 0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58, 0x6B5A, 0x6B5B, + 0x6B5C, 0x6B5D, 0x6B5E, 0x6B5F, 0x6B60, 0x6B61, 0x6B68, 0x6B69, + 0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, 0x6B6F, 0x6B70, 0x6B71, 0x6B72, + 0x6B73, 0x6B74, 0x6B75, 0x6B76, 0x6B77, 0x6B78, 0x6B7A, 0x6B7D, + 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, 0x6B8C, 0x6B8E, 0x6B8F, + 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, 0x6B98, 0x6B99, 0x6B9C, + 0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA4, 0x6BA5, + 0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAB, 0x6BAC, 0x6BAD, 0x6BAE, + 0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, 0x6BB6, 0x6BB8, 0x6BB9, 0x6BBA, + 0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, 0x6BC3, 0x6BC4, 0x6BC6, + 0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1, +plane 20 +at 0x00 + 0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2, + 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC, + 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, 0x6BF4, 0x6BF6, 0x6BF7, + 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, 0x6BFF, 0x6C00, 0x6C01, + 0x6C02, 0x6C03, 0x6C04, 0x6C08, 0x6C09, 0x6C0A, 0x6C0B, 0x6C0C, + 0x6C0E, 0x6C12, 0x6C17, 0x6C1C, 0x6C1D, 0x6C1E, 0x6C20, 0x6C23, + 0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, 0x6C31, 0x6C33, 0x6C36, 0x6C37, + 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, 0x6C3F, 0x6C43, 0x6C44, + 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, 0x6C4E, 0x6C4F, 0x6C51, + 0x6C52, 0x6C53, 0x6C56, 0x6C58, 0x6C59, 0x6C5A, 0x6C62, 0x6C63, + 0x6C65, 0x6C66, 0x6C67, 0x6C6B, 0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, + 0x6C71, 0x6C73, 0x6C75, 0x6C77, 0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, + 0x6C7F, 0x6C80, 0x6C84, 0x6C87, 0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, + 0x6C91, 0x6C92, 0x6C95, 0x6C96, 0x6C97, 0x6C98, 0x6C9A, 0x6C9C, + 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, 0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, + 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, 0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, + 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, 0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, + 0x6CD1, 0x6CD2, 0x6CD8, 0x6CD9, 0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, + 0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, 0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, + 0x6CF9, 0x6CFF, 0x6D00, 0x6D02, 0x6D03, 0x6D05, 0x6D06, 0x6D08, + 0x6D09, 0x6D0A, 0x6D0D, 0x6D0F, 0x6D10, 0x6D11, 0x6D13, 0x6D14, + 0x6D15, 0x6D16, 0x6D18, 0x6D1C, 0x6D1D, 0x6D1F, 0x6D20, 0x6D21, + 0x6D22, 0x6D23, 0x6D24, 0x6D26, 0x6D28, 0x6D29, 0x6D2C, 0x6D2D, + 0x6D2F, 0x6D30, 0x6D34, 0x6D36, 0x6D37, 0x6D38, 0x6D3A, 0x6D3F, + 0x6D40, 0x6D42, 0x6D44, 0x6D49, 0x6D4C, 0x6D50, 0x6D55, 0x6D56, + 0x6D57, 0x6D58, 0x6D5B, 0x6D5D, 0x6D5F, 0x6D61, 0x6D62, 0x6D64, + 0x6D65, 0x6D67, 0x6D68, 0x6D6B, 0x6D6C, 0x6D6D, 0x6D70, 0x6D71, + 0x6D72, 0x6D73, 0x6D75, 0x6D76, 0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, + 0x6D7E, 0x6D7F, 0x6D80, 0x6D81, 0x6D83, 0x6D84, 0x6D86, 0x6D87, + 0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97, + 0x6D98, 0x6D99, 0x6D9A, 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, + 0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, +plane 21 +at 0x00 + 0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, + 0x6DC9, 0x6DCA, 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, + 0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, + 0x6DE3, 0x6DE5, 0x6DE7, 0x6DE8, 0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, + 0x6DF0, 0x6DF2, 0x6DF4, 0x6DF5, 0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, + 0x6DFE, 0x6DFF, 0x6E00, 0x6E01, 0x6E02, 0x6E03, 0x6E04, 0x6E06, + 0x6E07, 0x6E08, 0x6E09, 0x6E0B, 0x6E0F, 0x6E12, 0x6E13, 0x6E15, + 0x6E18, 0x6E19, 0x6E1B, 0x6E1C, 0x6E1E, 0x6E1F, 0x6E22, 0x6E26, + 0x6E27, 0x6E28, 0x6E2A, 0x6E2C, 0x6E2E, 0x6E30, 0x6E31, 0x6E33, + 0x6E35, 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, + 0x6E3F, 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47, 0x6E48, + 0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51, 0x6E52, + 0x6E55, 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E5E, 0x6E60, + 0x6E61, 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68, + 0x6E69, 0x6E6A, 0x6E6C, 0x6E6D, 0x6E6F, 0x6E70, 0x6E71, 0x6E72, + 0x6E73, 0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, + 0x6E7B, 0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, + 0x6E88, 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, + 0x6E93, 0x6E94, 0x6E95, 0x6E96, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, + 0x6E9D, 0x6E9E, 0x6EA0, 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, + 0x6EA9, 0x6EAB, 0x6EAC, 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, + 0x6EB8, 0x6EB9, 0x6EBC, 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, + 0x6EC5, 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, + 0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, + 0x6EE3, 0x6EE7, 0x6EEA, 0x6EEB, 0x6EEC, 0x6EED, 0x6EEE, 0x6EEF, + 0x6EF0, 0x6EF1, 0x6EF2, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8, + 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, 0x6EFE, 0x6EFF, 0x6F00, 0x6F01, + 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, + 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16, 0x6F17, 0x6F18, + 0x6F19, 0x6F1A, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F, 0x6F21, + 0x6F22, 0x6F23, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2C, 0x6F2E, + 0x6F30, 0x6F32, 0x6F34, 0x6F35, 0x6F37, 0x6F38, 0x6F39, 0x6F3A, +plane 22 +at 0x00 + 0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, 0x6F40, 0x6F41, 0x6F42, 0x6F43, + 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C, 0x6F4E, 0x6F4F, + 0x6F50, 0x6F51, 0x6F52, 0x6F53, 0x6F54, 0x6F55, 0x6F56, 0x6F57, + 0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, 0x6F63, + 0x6F64, 0x6F65, 0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, 0x6F6C, + 0x6F6F, 0x6F70, 0x6F71, 0x6F73, 0x6F75, 0x6F76, 0x6F77, 0x6F79, + 0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, 0x6F80, 0x6F81, 0x6F82, 0x6F83, + 0x6F85, 0x6F86, 0x6F87, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90, 0x6F91, + 0x6F92, 0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F97, 0x6F98, 0x6F99, + 0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA0, 0x6FA2, 0x6FA3, + 0x6FA4, 0x6FA5, 0x6FA6, 0x6FA8, 0x6FA9, 0x6FAA, 0x6FAB, 0x6FAC, + 0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB1, 0x6FB2, 0x6FB4, 0x6FB5, + 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE, 0x6FBF, + 0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, + 0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, 0x6FD4, + 0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, 0x6FD9, 0x6FDA, 0x6FDB, 0x6FDC, + 0x6FDD, 0x6FDF, 0x6FE2, 0x6FE3, 0x6FE4, 0x6FE5, 0x6FE6, 0x6FE7, + 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEB, 0x6FEC, 0x6FED, 0x6FF0, 0x6FF1, + 0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, 0x6FF8, 0x6FF9, + 0x6FFA, 0x6FFB, 0x6FFC, 0x6FFD, 0x6FFE, 0x6FFF, 0x7000, 0x7001, + 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, 0x7008, 0x7009, + 0x700A, 0x700B, 0x700C, 0x700D, 0x700E, 0x700F, 0x7010, 0x7012, + 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, 0x7019, 0x701C, + 0x701D, 0x701E, 0x701F, 0x7020, 0x7021, 0x7022, 0x7024, 0x7025, + 0x7026, 0x7027, 0x7028, 0x7029, 0x702A, 0x702B, 0x702C, 0x702D, + 0x702E, 0x702F, 0x7030, 0x7031, 0x7032, 0x7033, 0x7034, 0x7036, + 0x7037, 0x7038, 0x703A, 0x703B, 0x703C, 0x703D, 0x703E, 0x703F, + 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045, 0x7046, 0x7047, + 0x7048, 0x7049, 0x704A, 0x704B, 0x704D, 0x704E, 0x7050, 0x7051, + 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057, 0x7058, 0x7059, + 0x705A, 0x705B, 0x705C, 0x705D, 0x705F, 0x7060, 0x7061, 0x7062, + 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706A, +plane 23 +at 0x00 + 0x706E, 0x7071, 0x7072, 0x7073, 0x7074, 0x7077, 0x7079, 0x707A, + 0x707B, 0x707D, 0x7081, 0x7082, 0x7083, 0x7084, 0x7086, 0x7087, + 0x7088, 0x708B, 0x708C, 0x708D, 0x708F, 0x7090, 0x7091, 0x7093, + 0x7097, 0x7098, 0x709A, 0x709B, 0x709E, 0x709F, 0x70A0, 0x70A1, + 0x70A2, 0x70A3, 0x70A4, 0x70A5, 0x70A6, 0x70A7, 0x70A8, 0x70A9, + 0x70AA, 0x70B0, 0x70B2, 0x70B4, 0x70B5, 0x70B6, 0x70BA, 0x70BE, + 0x70BF, 0x70C4, 0x70C5, 0x70C6, 0x70C7, 0x70C9, 0x70CB, 0x70CC, + 0x70CD, 0x70CE, 0x70CF, 0x70D0, 0x70D1, 0x70D2, 0x70D3, 0x70D4, + 0x70D5, 0x70D6, 0x70D7, 0x70DA, 0x70DC, 0x70DD, 0x70DE, 0x70E0, + 0x70E1, 0x70E2, 0x70E3, 0x70E5, 0x70EA, 0x70EE, 0x70F0, 0x70F1, + 0x70F2, 0x70F3, 0x70F4, 0x70F5, 0x70F6, 0x70F8, 0x70FA, 0x70FB, + 0x70FC, 0x70FE, 0x70FF, 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, + 0x7105, 0x7106, 0x7107, 0x7108, 0x710B, 0x710C, 0x710D, 0x710E, + 0x710F, 0x7111, 0x7112, 0x7114, 0x7117, 0x711B, 0x711C, 0x711D, + 0x711E, 0x711F, 0x7120, 0x7121, 0x7122, 0x7123, 0x7124, 0x7125, + 0x7127, 0x7128, 0x7129, 0x712A, 0x712B, 0x712C, 0x712D, 0x712E, + 0x7132, 0x7133, 0x7134, 0x7135, 0x7137, 0x7138, 0x7139, 0x713A, + 0x713B, 0x713C, 0x713D, 0x713E, 0x713F, 0x7140, 0x7141, 0x7142, + 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, 0x7149, 0x714B, 0x714D, + 0x714F, 0x7150, 0x7151, 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, + 0x7157, 0x7158, 0x7159, 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, + 0x7161, 0x7162, 0x7163, 0x7165, 0x7169, 0x716A, 0x716B, 0x716C, + 0x716D, 0x716F, 0x7170, 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, + 0x7179, 0x717B, 0x717C, 0x717E, 0x717F, 0x7180, 0x7181, 0x7182, + 0x7183, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x718B, 0x718C, + 0x718D, 0x718E, 0x7190, 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, + 0x7197, 0x719A, 0x719B, 0x719C, 0x719D, 0x719E, 0x71A1, 0x71A2, + 0x71A3, 0x71A4, 0x71A5, 0x71A6, 0x71A7, 0x71A9, 0x71AA, 0x71AB, + 0x71AD, 0x71AE, 0x71AF, 0x71B0, 0x71B1, 0x71B2, 0x71B4, 0x71B6, + 0x71B7, 0x71B8, 0x71BA, 0x71BB, 0x71BC, 0x71BD, 0x71BE, 0x71BF, + 0x71C0, 0x71C1, 0x71C2, 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C8, + 0x71C9, 0x71CA, 0x71CB, 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, +plane 24 +at 0x00 + 0x71D2, 0x71D3, 0x71D6, 0x71D7, 0x71D8, 0x71D9, 0x71DA, 0x71DB, + 0x71DC, 0x71DD, 0x71DE, 0x71DF, 0x71E1, 0x71E2, 0x71E3, 0x71E4, + 0x71E6, 0x71E8, 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71ED, 0x71EF, + 0x71F0, 0x71F1, 0x71F2, 0x71F3, 0x71F4, 0x71F5, 0x71F6, 0x71F7, + 0x71F8, 0x71FA, 0x71FB, 0x71FC, 0x71FD, 0x71FE, 0x71FF, 0x7200, + 0x7201, 0x7202, 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, + 0x720A, 0x720B, 0x720C, 0x720D, 0x720E, 0x720F, 0x7210, 0x7211, + 0x7212, 0x7213, 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, + 0x721A, 0x721B, 0x721C, 0x721E, 0x721F, 0x7220, 0x7221, 0x7222, + 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722B, 0x722D, + 0x722E, 0x722F, 0x7232, 0x7233, 0x7234, 0x723A, 0x723C, 0x723E, + 0x7240, 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, + 0x724A, 0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, + 0x7255, 0x7257, 0x7258, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, + 0x7264, 0x7265, 0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, + 0x7271, 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, + 0x727D, 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, + 0x728C, 0x728E, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, + 0x7297, 0x7298, 0x7299, 0x729A, 0x729B, 0x729C, 0x729D, 0x729E, + 0x72A0, 0x72A1, 0x72A2, 0x72A3, 0x72A4, 0x72A5, 0x72A6, 0x72A7, + 0x72A8, 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1, 0x72B2, 0x72B3, + 0x72B5, 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE, 0x72BF, 0x72C0, + 0x72C5, 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC, 0x72CF, + 0x72D1, 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA, 0x72DB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 25 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003, + 0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C, + 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, + 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1, + 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A, + 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312, + 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D, + 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234, + 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4, + 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB, + 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, + 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x2170, 0x2171, + 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, + 0, 0, 0, 0, 0, 0, 0x2488, 0x2489, + 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2491, + 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, +plane 26 +at 0x00 + 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, + 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, + 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, + 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, + 0, 0, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, + 0x3226, 0x3227, 0x3228, 0x3229, 0, 0, 0x2160, 0x2161, + 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, + 0x216A, 0x216B, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, + 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, + 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, + 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, + 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, + 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, + 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, + 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, + 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, + 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, + 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, + 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, + 0xFF5D, 0xFFE3, 0, 0, 0, 0, 0, 0, +plane 27 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, + 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, + 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, + 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, + 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, + 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, + 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, + 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, + 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, + 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, + 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 28 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, + 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, + 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, + 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, + 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, + 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, + 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, + 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, + 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, + 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x0391, 0x0392, + 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, + 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0, 0, + 0, 0, 0, 0, 0, 0, 0x03B1, 0x03B2, + 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, +plane 29 +at 0x00 + 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, + 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0, 0, + 0, 0, 0, 0, 0, 0xFE35, 0xFE36, 0xFE39, + 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, + 0xFE44, 0, 0, 0xFE3B, 0xFE3C, 0xFE37, 0xFE38, 0xFE31, + 0, 0xFE33, 0xFE34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x0410, 0x0411, 0x0412, 0x0413, + 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, + 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, + 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, + 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x0430, 0x0431, 0x0432, 0x0433, + 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, + 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, + 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, + 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2015, 0x2025, + 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, +plane 30 +at 0x00 + 0x221F, 0x2223, 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550, 0x2551, + 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, + 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, + 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, + 0x256A, 0x256B, 0x256C, 0x256D, 0x256E, 0x256F, 0x2570, 0x2571, + 0x2572, 0x2573, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, + 0x2587, 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D, 0x258E, + 0x258F, 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2, 0x25E3, + 0x25E4, 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, + 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, + 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, + 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0xE7C7, 0x0144, 0x0148, + 0xE7C8, 0x0261, 0, 0, 0, 0, 0x3105, 0x3106, + 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, + 0x310F, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, + 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, + 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, + 0x3127, 0x3128, 0x3129, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, + 0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1, + 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4, + 0, 0x2121, 0x3231, 0, 0x2010, 0, 0, 0, + 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE, 0x3006, 0x309D, 0x309E, + 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, + 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE59, 0xFE5A, + 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, 0xFE60, 0xFE61, 0xFE62, + 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68, 0xFE69, 0xFE6A, 0xFE6B, + 0xE7E7, 0xE7E8, 0xE7E9, 0xE7EA, 0xE7EB, 0xE7EC, 0xE7ED, 0xE7EE, +plane 31 +at 0x00 + 0xE7EF, 0xE7F0, 0xE7F1, 0xE7F2, 0xE7F3, 0x3007, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, + 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, + 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, + 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, + 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, + 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, + 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, + 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, + 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, + 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x72DC, 0x72DD, + 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5, 0x72E6, 0x72E7, 0x72EA, + 0x72EB, 0x72F5, 0x72F6, 0x72F9, 0x72FD, 0x72FE, 0x72FF, 0x7300, + 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309, 0x730B, + 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, 0x7314, 0x7318, + 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, 0x7326, 0x7327, + 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, 0x7335, 0x7336, + 0x733A, 0x733B, 0x733C, 0x733D, 0x7340, 0x7341, 0x7342, 0x7343, + 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0x7349, 0x734A, 0x734B, + 0x734C, 0x734E, 0x734F, 0x7351, 0x7353, 0x7354, 0x7355, 0x7356, + 0x7358, 0x7359, 0x735A, 0x735B, 0x735C, 0x735D, 0x735E, 0x735F, + 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, + 0x7369, 0x736A, 0x736B, 0x736E, 0x7370, 0x7371, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 32 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x7372, 0x7373, 0x7374, 0x7375, + 0x7376, 0x7377, 0x7378, 0x7379, 0x737A, 0x737B, 0x737C, 0x737D, + 0x737F, 0x7380, 0x7381, 0x7382, 0x7383, 0x7385, 0x7386, 0x7388, + 0x738A, 0x738C, 0x738D, 0x738F, 0x7390, 0x7392, 0x7393, 0x7394, + 0x7395, 0x7397, 0x7398, 0x7399, 0x739A, 0x739C, 0x739D, 0x739E, + 0x73A0, 0x73A1, 0x73A3, 0x73A4, 0x73A5, 0x73A6, 0x73A7, 0x73A8, + 0x73AA, 0x73AC, 0x73AD, 0x73B1, 0x73B4, 0x73B5, 0x73B6, 0x73B8, + 0x73B9, 0x73BC, 0x73BD, 0x73BE, 0x73BF, 0x73C1, 0x73C3, 0x73C4, + 0x73C5, 0x73C6, 0x73C7, 0x73CB, 0x73CC, 0x73CE, 0x73D2, 0x73D3, + 0x73D4, 0x73D5, 0x73D6, 0x73D7, 0x73D8, 0x73DA, 0x73DB, 0x73DC, + 0x73DD, 0x73DF, 0x73E1, 0x73E2, 0x73E3, 0x73E4, 0x73E6, 0x73E8, + 0x73EA, 0x73EB, 0x73EC, 0x73EE, 0x73EF, 0x73F0, 0x73F1, 0x73F3, + 0x73F4, 0x73F5, 0x73F6, 0x73F7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x73F8, 0x73F9, 0x73FA, 0x73FB, 0x73FC, 0x73FD, + 0x73FE, 0x73FF, 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, + 0x740B, 0x740C, 0x740D, 0x740E, 0x7411, 0x7412, 0x7413, 0x7414, +plane 33 +at 0x00 + 0x7415, 0x7416, 0x7417, 0x7418, 0x7419, 0x741C, 0x741D, 0x741E, + 0x741F, 0x7420, 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742B, + 0x742D, 0x742F, 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743A, + 0x743B, 0x743D, 0x743E, 0x743F, 0x7440, 0x7442, 0x7443, 0x7444, + 0x7445, 0x7446, 0x7447, 0x7448, 0x7449, 0x744A, 0x744B, 0x744C, + 0x744D, 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, + 0x7456, 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, + 0x7465, 0x7466, 0x7467, 0x7468, 0x7469, 0x746A, 0x746B, 0x746C, + 0x746E, 0x746F, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, + 0x7479, 0x747A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486, + 0x7488, 0x7489, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, + 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A, + 0x749B, 0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A3, 0x74A4, + 0x74A5, 0x74A6, 0x74AA, 0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, + 0x74B0, 0x74B1, 0x74B2, 0x74B3, 0x74B4, 0x74B5, 0x74B6, 0x74B7, + 0x74B8, 0x74B9, 0x74BB, 0x74BC, 0x74BD, 0x74BE, 0x74BF, 0x74C0, + 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5, 0x74C6, 0x74C7, 0x74C8, + 0x74C9, 0x74CA, 0x74CB, 0x74CC, 0x74CD, 0x74CE, 0x74CF, 0x74D0, + 0x74D1, 0x74D3, 0x74D4, 0x74D5, 0x74D6, 0x74D7, 0x74D8, 0x74D9, + 0x74DA, 0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, 0x74E8, +plane 34 +at 0x00 + 0x74E9, 0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, 0x74F2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x74F3, 0x74F5, + 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, 0x74FE, 0x7500, + 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508, 0x7509, + 0x750A, 0x750B, 0x750C, 0x750E, 0x7510, 0x7512, 0x7514, 0x7515, + 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, 0x7521, 0x7522, + 0x7523, 0x7524, 0x7526, 0x7527, 0x752A, 0x752E, 0x7534, 0x7536, + 0x7539, 0x753C, 0x753D, 0x753F, 0x7541, 0x7542, 0x7543, 0x7544, + 0x7546, 0x7547, 0x7549, 0x754A, 0x754D, 0x7550, 0x7551, 0x7552, + 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0x755D, 0x755E, 0x755F, + 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7567, 0x7568, 0x7569, + 0x756B, 0x756C, 0x756D, 0x756E, 0x756F, 0x7570, 0x7571, 0x7573, + 0x7575, 0x7576, 0x7577, 0x757A, 0x757B, 0x757C, 0x757D, 0x757E, + 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, 0x7587, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 35 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x7588, 0x7589, 0x758A, 0x758C, + 0x758D, 0x758E, 0x7590, 0x7593, 0x7595, 0x7598, 0x759B, 0x759C, + 0x759E, 0x75A2, 0x75A6, 0x75A7, 0x75A8, 0x75A9, 0x75AA, 0x75AD, + 0x75B6, 0x75B7, 0x75BA, 0x75BB, 0x75BF, 0x75C0, 0x75C1, 0x75C6, + 0x75CB, 0x75CC, 0x75CE, 0x75CF, 0x75D0, 0x75D1, 0x75D3, 0x75D7, + 0x75D9, 0x75DA, 0x75DC, 0x75DD, 0x75DF, 0x75E0, 0x75E1, 0x75E5, + 0x75E9, 0x75EC, 0x75ED, 0x75EE, 0x75EF, 0x75F2, 0x75F3, 0x75F5, + 0x75F6, 0x75F7, 0x75F8, 0x75FA, 0x75FB, 0x75FD, 0x75FE, 0x7602, + 0x7604, 0x7606, 0x7607, 0x7608, 0x7609, 0x760B, 0x760D, 0x760E, + 0x760F, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761A, 0x761C, + 0x761D, 0x761E, 0x7621, 0x7623, 0x7627, 0x7628, 0x762C, 0x762E, + 0x762F, 0x7631, 0x7632, 0x7636, 0x7637, 0x7639, 0x763A, 0x763B, + 0x763D, 0x7641, 0x7642, 0x7644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764A, + 0x764B, 0x764E, 0x764F, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, + 0x7657, 0x7658, 0x7659, 0x765A, 0x765B, 0x765D, 0x765F, 0x7660, + 0x7661, 0x7662, 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, +plane 36 +at 0x00 + 0x766A, 0x766C, 0x766D, 0x766E, 0x7670, 0x7671, 0x7672, 0x7673, + 0x7674, 0x7675, 0x7676, 0x7677, 0x7679, 0x767A, 0x767C, 0x767F, + 0x7680, 0x7681, 0x7683, 0x7685, 0x7689, 0x768A, 0x768C, 0x768D, + 0x768F, 0x7690, 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769A, + 0x769B, 0x769C, 0x769D, 0x769E, 0x769F, 0x76A0, 0x76A1, 0x76A2, + 0x76A3, 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76A9, 0x76AA, 0x76AB, + 0x76AC, 0x76AD, 0x76AF, 0x76B0, 0x76B3, 0x76B5, 0x76B6, 0x76B7, + 0x76B8, 0x76B9, 0x76BA, 0x76BB, 0x76BC, 0x76BD, 0x76BE, 0x76C0, + 0x76C1, 0x76C3, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, + 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, + 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, + 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, + 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, + 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, + 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, + 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, + 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, + 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, + 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, + 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, + 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC, 0x76D3, 0x76D5, 0x76D9, + 0x76DA, 0x76DC, 0x76DD, 0x76DE, 0x76E0, 0x76E1, 0x76E2, 0x76E3, + 0x76E4, 0x76E6, 0x76E7, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, + 0x76ED, 0x76F0, 0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, + 0x76FD, 0x76FF, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, + 0x770C, 0x770E, 0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, + 0x7715, 0x7716, 0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E, + 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772A, 0x772B, 0x772C, + 0x772E, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773B, + 0x773D, 0x773E, 0x773F, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, + 0x7749, 0x774A, 0x774B, 0x774C, 0x774D, 0x774E, 0x774F, 0x7752, + 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775C, +plane 37 +at 0x00 + 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, 0x62A5, + 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, 0x5351, + 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, 0x5907, + 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, 0x5D29, + 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, 0x6BD4, + 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, 0x6BD9, + 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, 0x5FC5, + 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, 0x7F16, + 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, 0x8FAB, + 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, 0x522B, + 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, 0x5175, + 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, 0x775D, 0x775E, + 0x775F, 0x7760, 0x7764, 0x7767, 0x7769, 0x776A, 0x776D, 0x776E, + 0x776F, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, + 0x7777, 0x7778, 0x777A, 0x777B, 0x777C, 0x7781, 0x7782, 0x7783, + 0x7786, 0x7787, 0x7788, 0x7789, 0x778A, 0x778B, 0x778F, 0x7790, + 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, 0x7799, 0x779A, + 0x779B, 0x779C, 0x779D, 0x779E, 0x77A1, 0x77A3, 0x77A4, 0x77A6, + 0x77A8, 0x77AB, 0x77AD, 0x77AE, 0x77AF, 0x77B1, 0x77B2, 0x77B4, + 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA, 0x77BC, 0x77BE, 0x77C0, + 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, 0x77C6, 0x77C7, 0x77C8, + 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, 0x77CF, 0x77D0, 0x77D1, + 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, 0x77D8, 0x77D9, 0x77DA, + 0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, 0x77E4, 0x75C5, 0x5E76, + 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2, 0x535A, 0x52C3, + 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236, 0x8116, 0x818A, + 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA, 0x8865, 0x57E0, + 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016, 0x64E6, 0x731C, + 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29, 0x91C7, 0x5F69, + 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B, 0x60ED, 0x60E8, + 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF, 0x64CD, 0x7CD9, + 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7, 0x518C, 0x6D4B, +plane 38 +at 0x00 + 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336, 0x67E5, 0x78B4, + 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6, 0x67F4, 0x8C7A, + 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20, 0x94F2, 0x4EA7, + 0x9610, 0x98A4, 0x660C, 0x7316, 0x77E6, 0x77E8, 0x77EA, 0x77EF, + 0x77F0, 0x77F1, 0x77F2, 0x77F4, 0x77F5, 0x77F7, 0x77F9, 0x77FA, + 0x77FB, 0x77FC, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807, 0x7808, + 0x780A, 0x780B, 0x780E, 0x780F, 0x7810, 0x7813, 0x7815, 0x7819, + 0x781B, 0x781E, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828, 0x782A, + 0x782B, 0x782E, 0x782F, 0x7831, 0x7832, 0x7833, 0x7835, 0x7836, + 0x783D, 0x783F, 0x7841, 0x7842, 0x7843, 0x7844, 0x7846, 0x7848, + 0x7849, 0x784A, 0x784B, 0x784D, 0x784F, 0x7851, 0x7853, 0x7854, + 0x7858, 0x7859, 0x785A, 0x785B, 0x785C, 0x785E, 0x785F, 0x7860, + 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, + 0x7869, 0x786F, 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, + 0x7876, 0x7878, 0x7879, 0x787A, 0x787B, 0x787D, 0x787E, 0x787F, + 0x7880, 0x7881, 0x7882, 0x7883, 0x573A, 0x5C1D, 0x5E38, 0x957F, + 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, + 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, + 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, + 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, + 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, + 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, + 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, + 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, + 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, + 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, + 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, + 0x9664, 0x695A, 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, + 0x788F, 0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, + 0x789E, 0x78A0, 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78A9, 0x78AA, + 0x78AB, 0x78AC, 0x78AD, 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, + 0x78B8, 0x78BA, 0x78BB, 0x78BC, 0x78BD, 0x78BF, 0x78C0, 0x78C2, +plane 39 +at 0x00 + 0x78C3, 0x78C4, 0x78C6, 0x78C7, 0x78C8, 0x78CC, 0x78CD, 0x78CE, + 0x78CF, 0x78D1, 0x78D2, 0x78D3, 0x78D6, 0x78D7, 0x78D8, 0x78DA, + 0x78DB, 0x78DC, 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1, 0x78E2, + 0x78E3, 0x78E4, 0x78E5, 0x78E6, 0x78E7, 0x78E9, 0x78EA, 0x78EB, + 0x78ED, 0x78EE, 0x78EF, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, + 0x78F8, 0x78F9, 0x78FB, 0x78FC, 0x78FD, 0x78FE, 0x78FF, 0x7900, + 0x7902, 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790A, + 0x790B, 0x790C, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, + 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, + 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, + 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, + 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, + 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, + 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, + 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, + 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, + 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, + 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, + 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, + 0x790D, 0x790E, 0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, + 0x7916, 0x7917, 0x7918, 0x7919, 0x791A, 0x791B, 0x791C, 0x791D, + 0x791F, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, + 0x7928, 0x7929, 0x792A, 0x792B, 0x792C, 0x792D, 0x792E, 0x792F, + 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, + 0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, + 0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951, + 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964, + 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, 0x7971, + 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, 0x797C, + 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988, + 0x7989, 0x798B, 0x798C, 0x798D, 0x798E, 0x7990, 0x7991, 0x7992, + 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, 0x80C6, +plane 40 +at 0x00 + 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, 0x86CB, + 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, 0x8E48, + 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, 0x9053, + 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, 0x7B49, + 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, 0x654C, + 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, 0x5730, + 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, 0x6382, + 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, 0x4F43, + 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, 0x53FC, + 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, 0x8DCC, + 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, 0x7993, 0x7994, + 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, 0x799C, 0x799D, + 0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, 0x79A4, 0x79A5, + 0x79A6, 0x79A8, 0x79A9, 0x79AA, 0x79AB, 0x79AC, 0x79AD, 0x79AE, + 0x79AF, 0x79B0, 0x79B1, 0x79B2, 0x79B4, 0x79B5, 0x79B6, 0x79B7, + 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4, 0x79C5, 0x79C7, 0x79C8, + 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0, 0x79D3, 0x79D4, 0x79D6, + 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC, 0x79DD, 0x79DE, 0x79E0, + 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA, 0x79EC, 0x79EE, 0x79F1, + 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6, 0x79F7, 0x79F9, 0x79FA, + 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04, 0x7A05, 0x7A07, 0x7A08, + 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10, 0x7A11, 0x7A12, 0x7A13, + 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B, 0x7A1C, 0x4E01, 0x76EF, + 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A, 0x8BA2, 0x4E22, + 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B, 0x4F97, 0x606B, + 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661, 0x8C46, 0x9017, + 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC, 0x8BFB, 0x5835, + 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6, 0x6E21, 0x5992, + 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E, 0x5806, 0x5151, + 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566, 0x987F, 0x56E4, + 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A, 0x593A, 0x579B, + 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0, 0x5815, 0x86FE, +plane 41 +at 0x00 + 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25, 0x6076, 0x5384, + 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C, 0x513F, 0x8033, + 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, + 0x7A24, 0x7A25, 0x7A26, 0x7A27, 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, + 0x7A2C, 0x7A2D, 0x7A2E, 0x7A2F, 0x7A30, 0x7A31, 0x7A32, 0x7A34, + 0x7A35, 0x7A36, 0x7A38, 0x7A3A, 0x7A3E, 0x7A40, 0x7A41, 0x7A42, + 0x7A43, 0x7A44, 0x7A45, 0x7A47, 0x7A48, 0x7A49, 0x7A4A, 0x7A4B, + 0x7A4C, 0x7A4D, 0x7A4E, 0x7A4F, 0x7A50, 0x7A52, 0x7A53, 0x7A54, + 0x7A55, 0x7A56, 0x7A58, 0x7A59, 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, + 0x7A5E, 0x7A5F, 0x7A60, 0x7A61, 0x7A62, 0x7A63, 0x7A64, 0x7A65, + 0x7A66, 0x7A67, 0x7A68, 0x7A69, 0x7A6A, 0x7A6B, 0x7A6C, 0x7A6D, + 0x7A6E, 0x7A6F, 0x7A71, 0x7A72, 0x7A73, 0x7A75, 0x7A7B, 0x7A7C, + 0x7A7D, 0x7A7E, 0x7A82, 0x7A85, 0x7A87, 0x7A89, 0x7A8A, 0x7A8B, + 0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, 0x7A93, 0x7A94, 0x7A99, 0x7A9A, + 0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, + 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, + 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, + 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, + 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, + 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, + 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, + 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, + 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, + 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, + 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, + 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, + 0x4FD8, 0x670D, 0x7AA3, 0x7AA4, 0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, + 0x7AAE, 0x7AAF, 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4, 0x7AB5, 0x7AB6, + 0x7AB7, 0x7AB8, 0x7AB9, 0x7ABA, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE, + 0x7AC0, 0x7AC1, 0x7AC2, 0x7AC3, 0x7AC4, 0x7AC5, 0x7AC6, 0x7AC7, + 0x7AC8, 0x7AC9, 0x7ACA, 0x7ACC, 0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, + 0x7AD1, 0x7AD2, 0x7AD3, 0x7AD4, 0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, +plane 42 +at 0x00 + 0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, + 0x7AE9, 0x7AEA, 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0, 0x7AF1, 0x7AF2, + 0x7AF3, 0x7AF4, 0x7AF5, 0x7AF6, 0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, + 0x7AFE, 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09, 0x7B0C, + 0x7B0D, 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17, 0x7B18, + 0x7B1A, 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23, 0x7B27, + 0x7B29, 0x7B2D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, + 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, + 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, + 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, + 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, + 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, + 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, + 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, + 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, + 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, + 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, + 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, + 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35, 0x7B36, 0x7B37, 0x7B39, + 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B42, 0x7B43, 0x7B44, + 0x7B46, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53, 0x7B55, 0x7B57, + 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63, 0x7B64, 0x7B65, + 0x7B66, 0x7B67, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D, + 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A, 0x7B7C, + 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86, 0x7B87, + 0x7B88, 0x7B89, 0x7B8A, 0x7B8B, 0x7B8C, 0x7B8E, 0x7B8F, 0x7B91, + 0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, 0x7B9E, + 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, 0x7BB0, + 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, 0x7BBB, + 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC0, 0x7BC2, 0x7BC3, 0x7BC4, + 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, 0x9F9A, + 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, 0x62F1, +plane 43 +at 0x00 + 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, 0x57A2, + 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, 0x4F30, + 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, 0x8C37, + 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, 0x5250, + 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, 0x5173, + 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, 0x704C, + 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, 0x7845, + 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, 0x6842, + 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, 0x9505, + 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, 0x7BC5, 0x7BC8, + 0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, 0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, + 0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, + 0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, 0x7BE4, 0x7BE7, 0x7BE8, 0x7BE9, + 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, 0x7BF0, 0x7BF2, 0x7BF3, 0x7BF4, + 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFB, 0x7BFD, 0x7BFF, + 0x7C00, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05, 0x7C06, 0x7C08, + 0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, 0x7C10, 0x7C11, 0x7C12, 0x7C13, + 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, 0x7C1A, 0x7C1B, 0x7C1C, + 0x7C1D, 0x7C1E, 0x7C20, 0x7C21, 0x7C22, 0x7C23, 0x7C24, 0x7C25, + 0x7C28, 0x7C29, 0x7C2B, 0x7C2C, 0x7C2D, 0x7C2E, 0x7C2F, 0x7C30, + 0x7C31, 0x7C32, 0x7C33, 0x7C34, 0x7C35, 0x7C36, 0x7C37, 0x7C39, + 0x7C3A, 0x7C3B, 0x7C3C, 0x7C3D, 0x7C3E, 0x7C42, 0x9AB8, 0x5B69, + 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163, 0x61A8, 0x90AF, + 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A, 0x7F55, 0x7FF0, + 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A, 0x6C57, 0x6C49, + 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A, 0x6BEB, 0x90DD, + 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D, 0x8377, 0x83CF, + 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2, 0x8C89, 0x9602, + 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A, 0x563F, 0x9ED1, + 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8, 0x6A2A, 0x8861, + 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F, 0x6D2A, 0x5B8F, + 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C, 0x539A, 0x5019, +plane 44 +at 0x00 + 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6, 0x846B, 0x80E1, + 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0x7C43, 0x7C44, 0x7C45, 0x7C46, + 0x7C47, 0x7C48, 0x7C49, 0x7C4A, 0x7C4B, 0x7C4C, 0x7C4E, 0x7C4F, + 0x7C50, 0x7C51, 0x7C52, 0x7C53, 0x7C54, 0x7C55, 0x7C56, 0x7C57, + 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5C, 0x7C5D, 0x7C5E, 0x7C5F, + 0x7C60, 0x7C61, 0x7C62, 0x7C63, 0x7C64, 0x7C65, 0x7C66, 0x7C67, + 0x7C68, 0x7C69, 0x7C6A, 0x7C6B, 0x7C6C, 0x7C6D, 0x7C6E, 0x7C6F, + 0x7C70, 0x7C71, 0x7C72, 0x7C75, 0x7C76, 0x7C77, 0x7C78, 0x7C79, + 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, 0x7C81, 0x7C82, 0x7C83, 0x7C84, + 0x7C85, 0x7C86, 0x7C87, 0x7C88, 0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, + 0x7C8E, 0x7C8F, 0x7C90, 0x7C93, 0x7C94, 0x7C96, 0x7C99, 0x7C9A, + 0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, 0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, + 0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, 0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, + 0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, 0x5F27, 0x864E, 0x552C, 0x62A4, + 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, + 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, + 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, + 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, + 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, + 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, + 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, + 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, + 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, + 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, + 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, + 0x79EF, 0x7B95, 0x7CBF, 0x7CC0, 0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, + 0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF, 0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, + 0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB, 0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, + 0x7CE3, 0x7CE4, 0x7CE5, 0x7CE6, 0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, + 0x7CEC, 0x7CED, 0x7CEE, 0x7CF0, 0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, + 0x7CF5, 0x7CF6, 0x7CF7, 0x7CF9, 0x7CFA, 0x7CFC, 0x7CFD, 0x7CFE, + 0x7CFF, 0x7D00, 0x7D01, 0x7D02, 0x7D03, 0x7D04, 0x7D05, 0x7D06, +plane 45 +at 0x00 + 0x7D07, 0x7D08, 0x7D09, 0x7D0B, 0x7D0C, 0x7D0D, 0x7D0E, 0x7D0F, + 0x7D10, 0x7D11, 0x7D12, 0x7D13, 0x7D14, 0x7D15, 0x7D16, 0x7D17, + 0x7D18, 0x7D19, 0x7D1A, 0x7D1B, 0x7D1C, 0x7D1D, 0x7D1E, 0x7D1F, + 0x7D21, 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, + 0x7D2C, 0x7D2D, 0x7D2E, 0x7D30, 0x7D31, 0x7D32, 0x7D33, 0x7D34, + 0x7D35, 0x7D36, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, + 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, + 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, + 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, + 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, + 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, + 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, + 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, + 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, + 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, + 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, + 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, + 0x7D37, 0x7D38, 0x7D39, 0x7D3A, 0x7D3B, 0x7D3C, 0x7D3D, 0x7D3E, + 0x7D3F, 0x7D40, 0x7D41, 0x7D42, 0x7D43, 0x7D44, 0x7D45, 0x7D46, + 0x7D47, 0x7D48, 0x7D49, 0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4E, + 0x7D4F, 0x7D50, 0x7D51, 0x7D52, 0x7D53, 0x7D54, 0x7D55, 0x7D56, + 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B, 0x7D5C, 0x7D5D, 0x7D5E, + 0x7D5F, 0x7D60, 0x7D61, 0x7D62, 0x7D63, 0x7D64, 0x7D65, 0x7D66, + 0x7D67, 0x7D68, 0x7D69, 0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, + 0x7D70, 0x7D71, 0x7D72, 0x7D73, 0x7D74, 0x7D75, 0x7D76, 0x7D78, + 0x7D79, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F, 0x7D80, + 0x7D81, 0x7D82, 0x7D83, 0x7D84, 0x7D85, 0x7D86, 0x7D87, 0x7D88, + 0x7D89, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D, 0x7D8E, 0x7D8F, 0x7D90, + 0x7D91, 0x7D92, 0x7D93, 0x7D94, 0x7D95, 0x7D96, 0x7D97, 0x7D98, + 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, 0x5EFA, + 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, 0x6868, + 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, 0x7901, +plane 46 +at 0x00 + 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, 0x56BC, + 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, 0x997A, + 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, 0x53EB, + 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, 0x622A, + 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, 0x6D01, + 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, 0x501F, + 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, 0x91D1, + 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, 0x8FDB, + 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, 0x7D99, 0x7D9A, + 0x7D9B, 0x7D9C, 0x7D9D, 0x7D9E, 0x7D9F, 0x7DA0, 0x7DA1, 0x7DA2, + 0x7DA3, 0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, 0x7DAA, 0x7DAB, + 0x7DAC, 0x7DAD, 0x7DAF, 0x7DB0, 0x7DB1, 0x7DB2, 0x7DB3, 0x7DB4, + 0x7DB5, 0x7DB6, 0x7DB7, 0x7DB8, 0x7DB9, 0x7DBA, 0x7DBB, 0x7DBC, + 0x7DBD, 0x7DBE, 0x7DBF, 0x7DC0, 0x7DC1, 0x7DC2, 0x7DC3, 0x7DC4, + 0x7DC5, 0x7DC6, 0x7DC7, 0x7DC8, 0x7DC9, 0x7DCA, 0x7DCB, 0x7DCC, + 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, 0x7DD1, 0x7DD2, 0x7DD3, 0x7DD4, + 0x7DD5, 0x7DD6, 0x7DD7, 0x7DD8, 0x7DD9, 0x7DDA, 0x7DDB, 0x7DDC, + 0x7DDD, 0x7DDE, 0x7DDF, 0x7DE0, 0x7DE1, 0x7DE2, 0x7DE3, 0x7DE4, + 0x7DE5, 0x7DE6, 0x7DE7, 0x7DE8, 0x7DE9, 0x7DEA, 0x7DEB, 0x7DEC, + 0x7DED, 0x7DEE, 0x7DEF, 0x7DF0, 0x7DF1, 0x7DF2, 0x7DF3, 0x7DF4, + 0x7DF5, 0x7DF6, 0x7DF7, 0x7DF8, 0x7DF9, 0x7DFA, 0x5C3D, 0x52B2, + 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8, 0x4EAC, 0x60CA, + 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F, 0x9888, 0x9759, + 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756, 0x7ADF, 0x7ADE, + 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0, 0x7396, 0x97ED, + 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551, 0x65E7, 0x81FC, + 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8, 0x72D9, 0x75BD, + 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9, 0x4E3E, 0x6CAE, + 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD, 0x8E1E, 0x952F, + 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350, 0x9E43, 0x5A1F, + 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B, 0x6289, 0x6398, + 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD, 0x5747, 0x83CC, +plane 47 +at 0x00 + 0x94A7, 0x519B, 0x541B, 0x5CFB, 0x7DFB, 0x7DFC, 0x7DFD, 0x7DFE, + 0x7DFF, 0x7E00, 0x7E01, 0x7E02, 0x7E03, 0x7E04, 0x7E05, 0x7E06, + 0x7E07, 0x7E08, 0x7E09, 0x7E0A, 0x7E0B, 0x7E0C, 0x7E0D, 0x7E0E, + 0x7E0F, 0x7E10, 0x7E11, 0x7E12, 0x7E13, 0x7E14, 0x7E15, 0x7E16, + 0x7E17, 0x7E18, 0x7E19, 0x7E1A, 0x7E1B, 0x7E1C, 0x7E1D, 0x7E1E, + 0x7E1F, 0x7E20, 0x7E21, 0x7E22, 0x7E23, 0x7E24, 0x7E25, 0x7E26, + 0x7E27, 0x7E28, 0x7E29, 0x7E2A, 0x7E2B, 0x7E2C, 0x7E2D, 0x7E2E, + 0x7E2F, 0x7E30, 0x7E31, 0x7E32, 0x7E33, 0x7E34, 0x7E35, 0x7E36, + 0x7E37, 0x7E38, 0x7E39, 0x7E3A, 0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, + 0x7E40, 0x7E42, 0x7E43, 0x7E44, 0x7E45, 0x7E46, 0x7E48, 0x7E49, + 0x7E4A, 0x7E4B, 0x7E4C, 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, + 0x7E52, 0x7E53, 0x7E54, 0x7E55, 0x7E56, 0x7E57, 0x7E58, 0x7E59, + 0x7E5A, 0x7E5B, 0x7E5C, 0x7E5D, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, + 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, + 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, + 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, + 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, + 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, + 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, + 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, + 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, + 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, + 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, + 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, + 0x9B41, 0x5080, 0x7E5E, 0x7E5F, 0x7E60, 0x7E61, 0x7E62, 0x7E63, + 0x7E64, 0x7E65, 0x7E66, 0x7E67, 0x7E68, 0x7E69, 0x7E6A, 0x7E6B, + 0x7E6C, 0x7E6D, 0x7E6E, 0x7E6F, 0x7E70, 0x7E71, 0x7E72, 0x7E73, + 0x7E74, 0x7E75, 0x7E76, 0x7E77, 0x7E78, 0x7E79, 0x7E7A, 0x7E7B, + 0x7E7C, 0x7E7D, 0x7E7E, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, + 0x7E85, 0x7E86, 0x7E87, 0x7E88, 0x7E89, 0x7E8A, 0x7E8B, 0x7E8C, + 0x7E8D, 0x7E8E, 0x7E8F, 0x7E90, 0x7E91, 0x7E92, 0x7E93, 0x7E94, + 0x7E95, 0x7E96, 0x7E97, 0x7E98, 0x7E99, 0x7E9A, 0x7E9C, 0x7E9D, +plane 48 +at 0x00 + 0x7E9E, 0x7EAE, 0x7EB4, 0x7EBB, 0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, + 0x7EF9, 0x7F0A, 0x7F10, 0x7F1E, 0x7F37, 0x7F39, 0x7F3B, 0x7F3C, + 0x7F3D, 0x7F3E, 0x7F3F, 0x7F40, 0x7F41, 0x7F43, 0x7F46, 0x7F47, + 0x7F48, 0x7F49, 0x7F4A, 0x7F4B, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F4F, + 0x7F52, 0x7F53, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, + 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, + 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, + 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, + 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, + 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, + 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, + 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, + 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, + 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, + 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, + 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, + 0x7F56, 0x7F59, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F5E, 0x7F60, 0x7F63, + 0x7F64, 0x7F65, 0x7F66, 0x7F67, 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, + 0x7F70, 0x7F73, 0x7F75, 0x7F76, 0x7F77, 0x7F78, 0x7F7A, 0x7F7B, + 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83, 0x7F84, 0x7F85, + 0x7F86, 0x7F87, 0x7F88, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, + 0x7F91, 0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, + 0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8, + 0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, 0x7FB3, + 0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, 0x7FC0, + 0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, + 0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, 0x7FD2, 0x7FD3, 0x7FD6, 0x7FD7, + 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, 0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, + 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, 0x54E9, + 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, 0x6D9F, + 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, 0x7CAE, + 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, 0x667E, +plane 49 +at 0x00 + 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, 0x5BE5, + 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, 0x5217, + 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, 0x9716, + 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, 0x62CE, + 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, 0x51CC, + 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, 0x7409, + 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, 0x67F3, + 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, 0x7FE4, 0x7FE7, + 0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, + 0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, 0x7FF9, 0x7FFA, 0x7FFD, 0x7FFE, + 0x7FFF, 0x8002, 0x8007, 0x8008, 0x8009, 0x800A, 0x800E, 0x800F, + 0x8011, 0x8013, 0x801A, 0x801B, 0x801D, 0x801E, 0x801F, 0x8021, + 0x8023, 0x8024, 0x802B, 0x802C, 0x802D, 0x802E, 0x802F, 0x8030, + 0x8032, 0x8034, 0x8039, 0x803A, 0x803C, 0x803E, 0x8040, 0x8041, + 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804E, 0x804F, 0x8050, + 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0x8059, 0x805B, 0x805C, + 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, + 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, 0x806C, 0x806D, 0x806E, + 0x806F, 0x8070, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077, + 0x8078, 0x8079, 0x807A, 0x807B, 0x807C, 0x807D, 0x9686, 0x5784, + 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3, 0x6F0F, 0x964B, + 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3, 0x5364, 0x864F, + 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42, 0x9E7F, 0x6F5E, + 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415, 0x94DD, 0x4FA3, + 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F, 0x5F8B, 0x7387, + 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6, 0x5375, 0x4E71, + 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, + 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523, 0x7BA9, 0x9AA1, + 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988, 0x9EBB, 0x739B, + 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417, 0x57CB, 0x4E70, + 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992, 0x86EE, 0x6EE1, + 0x8513, 0x66FC, 0x6162, 0x6F2B, 0x807E, 0x8081, 0x8082, 0x8085, +plane 50 +at 0x00 + 0x8088, 0x808A, 0x808D, 0x808E, 0x808F, 0x8090, 0x8091, 0x8092, + 0x8094, 0x8095, 0x8097, 0x8099, 0x809E, 0x80A3, 0x80A6, 0x80A7, + 0x80A8, 0x80AC, 0x80B0, 0x80B3, 0x80B5, 0x80B6, 0x80B8, 0x80B9, + 0x80BB, 0x80C5, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x80CB, 0x80CF, + 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x80D4, 0x80D5, 0x80D8, 0x80DF, + 0x80E0, 0x80E2, 0x80E3, 0x80E6, 0x80EE, 0x80F5, 0x80F7, 0x80F9, + 0x80FB, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8103, 0x8104, 0x8105, + 0x8107, 0x8108, 0x810B, 0x810C, 0x8115, 0x8117, 0x8119, 0x811B, + 0x811C, 0x811D, 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, + 0x8125, 0x8126, 0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, + 0x812E, 0x8130, 0x8133, 0x8134, 0x8135, 0x8137, 0x8139, 0x813A, + 0x813B, 0x813C, 0x813D, 0x813F, 0x8C29, 0x8292, 0x832B, 0x76F2, + 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, + 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, + 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, + 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, + 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, + 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, + 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, + 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, + 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, + 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, + 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, + 0x8C2C, 0x6478, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, + 0x8147, 0x8149, 0x814D, 0x814E, 0x814F, 0x8152, 0x8156, 0x8157, + 0x8158, 0x815B, 0x815C, 0x815D, 0x815E, 0x815F, 0x8161, 0x8162, + 0x8163, 0x8164, 0x8166, 0x8168, 0x816A, 0x816B, 0x816C, 0x816F, + 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, + 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818B, 0x818C, 0x818D, + 0x818E, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, + 0x8199, 0x819A, 0x819E, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x81A4, + 0x81A5, 0x81A7, 0x81A9, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, +plane 51 +at 0x00 + 0x81B0, 0x81B1, 0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, + 0x81B9, 0x81BC, 0x81BD, 0x81BE, 0x81BF, 0x81C4, 0x81C5, 0x81C7, + 0x81C8, 0x81C9, 0x81CB, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, + 0x81D2, 0x81D3, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, + 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, + 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, + 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, + 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, + 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, + 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, + 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, + 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, + 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, + 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, + 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, + 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x81D9, 0x81DA, 0x81DB, + 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x81E0, 0x81E1, 0x81E2, 0x81E4, + 0x81E5, 0x81E6, 0x81E8, 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, + 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FA, + 0x81FD, 0x81FF, 0x8203, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, + 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, + 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, + 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0x8240, + 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, 0x824C, + 0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, + 0x8256, 0x8257, 0x8259, 0x825B, 0x825C, 0x825D, 0x825E, 0x8260, + 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8269, + 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, 0x6D53, + 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, 0x8650, + 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, 0x9E25, + 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, 0x722C, + 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, 0x6E43, +plane 52 +at 0x00 + 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, 0x5224, + 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, 0x5486, + 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, 0x57F9, + 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, 0x76C6, + 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, 0x787C, + 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, 0x7812, + 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, 0x826A, 0x826B, + 0x826C, 0x826D, 0x8271, 0x8275, 0x8276, 0x8277, 0x8278, 0x827B, + 0x827C, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, 0x8287, 0x8289, + 0x828C, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, 0x829A, 0x829B, + 0x829E, 0x82A0, 0x82A2, 0x82A3, 0x82A7, 0x82B2, 0x82B5, 0x82B6, + 0x82BA, 0x82BB, 0x82BC, 0x82BF, 0x82C0, 0x82C2, 0x82C3, 0x82C5, + 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9, 0x82DA, 0x82DD, 0x82E2, + 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED, 0x82EE, 0x82F0, + 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0x82FA, 0x82FC, 0x82FD, + 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, 0x830D, 0x8310, 0x8312, + 0x8313, 0x8316, 0x8318, 0x8319, 0x831D, 0x831E, 0x831F, 0x8320, + 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8329, 0x832A, + 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, 0x833D, 0x5564, 0x813E, + 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41, 0x8B6C, 0x7BC7, + 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2, 0x7968, 0x6487, + 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058, 0x4E52, 0x576A, + 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4, 0x5C4F, 0x5761, + 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB, 0x7C95, 0x5256, + 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9, 0x84B2, 0x57D4, + 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD, 0x7011, 0x671F, + 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4, 0x6F06, 0x67D2, + 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566, 0x5D0E, 0x8110, + 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77, 0x5C82, 0x4E5E, + 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14, 0x8FC4, 0x5F03, + 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0x833E, 0x833F, 0x8341, 0x8342, + 0x8344, 0x8345, 0x8348, 0x834A, 0x834B, 0x834C, 0x834D, 0x834E, +plane 53 +at 0x00 + 0x8353, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835D, 0x8362, + 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8379, + 0x837A, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, + 0x8387, 0x8388, 0x838A, 0x838B, 0x838C, 0x838D, 0x838F, 0x8390, + 0x8391, 0x8394, 0x8395, 0x8396, 0x8397, 0x8399, 0x839A, 0x839D, + 0x839F, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, + 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF, + 0x83C2, 0x83C3, 0x83C4, 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD, + 0x83CE, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9, + 0x83DA, 0x83DB, 0x83DE, 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7, + 0x83E8, 0x83EB, 0x83EC, 0x83ED, 0x6070, 0x6D3D, 0x7275, 0x6266, + 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, + 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, + 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, + 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, + 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, + 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, + 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, + 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, + 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, + 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, + 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, + 0x9A71, 0x6E20, 0x83EE, 0x83EF, 0x83F3, 0x83F4, 0x83F5, 0x83F6, + 0x83F7, 0x83FA, 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400, 0x8402, + 0x8405, 0x8407, 0x8408, 0x8409, 0x840A, 0x8410, 0x8412, 0x8413, + 0x8414, 0x8415, 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, + 0x841F, 0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, + 0x842C, 0x842D, 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, + 0x8435, 0x8436, 0x8437, 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, + 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, + 0x8449, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, + 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845D, 0x845E, +plane 54 +at 0x00 + 0x845F, 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, + 0x846A, 0x846E, 0x846F, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, + 0x847B, 0x847C, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, + 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, + 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, + 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, + 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, + 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, + 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, + 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, + 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, + 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, + 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, + 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, + 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, + 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492, 0x8493, + 0x8494, 0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, + 0x849F, 0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, + 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0, + 0x84B1, 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BC, 0x84BE, + 0x84C0, 0x84C2, 0x84C3, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CB, + 0x84CC, 0x84CE, 0x84CF, 0x84D2, 0x84D4, 0x84D5, 0x84D7, 0x84D8, + 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DE, 0x84E1, 0x84E2, 0x84E4, + 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x84EB, 0x84ED, 0x84EE, 0x84EF, + 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7, 0x84F8, + 0x84F9, 0x84FA, 0x84FB, 0x84FD, 0x84FE, 0x8500, 0x8501, 0x8502, + 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, 0x626B, + 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, 0x7802, + 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, 0x7B5B, + 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, 0x886B, + 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, 0x6247, + 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, 0x5C1A, +plane 55 +at 0x00 + 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, 0x97F6, + 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, 0x820C, + 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, 0x8BBE, + 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, + 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, 0x6E17, + 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, 0x8503, 0x8504, + 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850A, 0x850B, 0x850D, + 0x850E, 0x850F, 0x8510, 0x8512, 0x8514, 0x8515, 0x8516, 0x8518, + 0x8519, 0x851B, 0x851C, 0x851D, 0x851E, 0x8520, 0x8522, 0x8523, + 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, 0x852A, 0x852D, + 0x852E, 0x852F, 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, + 0x8536, 0x853E, 0x853F, 0x8540, 0x8541, 0x8542, 0x8544, 0x8545, + 0x8546, 0x8547, 0x854B, 0x854C, 0x854D, 0x854E, 0x854F, 0x8550, + 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8557, 0x8558, 0x855A, + 0x855B, 0x855C, 0x855D, 0x855F, 0x8560, 0x8561, 0x8562, 0x8563, + 0x8565, 0x8566, 0x8567, 0x8569, 0x856A, 0x856B, 0x856C, 0x856D, + 0x856E, 0x856F, 0x8570, 0x8571, 0x8573, 0x8575, 0x8576, 0x8577, + 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, 0x8581, 0x7701, 0x76DB, + 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE, 0x65BD, 0x6E7F, + 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE, 0x65F6, 0x4EC0, + 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2, 0x4F7F, 0x5C4E, + 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16, 0x67FF, 0x4E8B, + 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC, 0x566C, 0x9002, + 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02, 0x6043, 0x5BA4, + 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88, 0x5BFF, 0x6388, + 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2, 0x68B3, 0x6B8A, + 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F, 0x4E66, 0x8D4E, + 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72, 0x8700, 0x9ECD, + 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F, 0x620D, 0x7AD6, + 0x5885, 0x5EB6, 0x6570, 0x6F31, 0x8582, 0x8583, 0x8586, 0x8588, + 0x8589, 0x858A, 0x858B, 0x858C, 0x858D, 0x858E, 0x8590, 0x8591, + 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, +plane 56 +at 0x00 + 0x859A, 0x859D, 0x859E, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, + 0x85A5, 0x85A6, 0x85A7, 0x85A9, 0x85AB, 0x85AC, 0x85AD, 0x85B1, + 0x85B2, 0x85B3, 0x85B4, 0x85B5, 0x85B6, 0x85B8, 0x85BA, 0x85BB, + 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C2, 0x85C3, 0x85C4, + 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85CA, 0x85CB, 0x85CC, 0x85CD, + 0x85CE, 0x85D1, 0x85D2, 0x85D4, 0x85D6, 0x85D7, 0x85D8, 0x85D9, + 0x85DA, 0x85DB, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, + 0x85E3, 0x85E5, 0x85E6, 0x85E7, 0x85E8, 0x85EA, 0x85EB, 0x85EC, + 0x85ED, 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, + 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x6055, 0x5237, 0x800D, 0x6454, + 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, + 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, + 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, + 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, + 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, + 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, + 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, + 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, + 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, + 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, + 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, + 0x5979, 0x5854, 0x85F9, 0x85FA, 0x85FC, 0x85FD, 0x85FE, 0x8600, + 0x8601, 0x8602, 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, + 0x860A, 0x860B, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612, + 0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861A, 0x861B, + 0x861C, 0x861D, 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, + 0x8624, 0x8625, 0x8626, 0x8628, 0x862A, 0x862B, 0x862C, 0x862D, + 0x862E, 0x862F, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, + 0x8636, 0x8637, 0x8639, 0x863A, 0x863B, 0x863D, 0x863E, 0x863F, + 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, + 0x8648, 0x8649, 0x864A, 0x864B, 0x864C, 0x8652, 0x8653, 0x8655, + 0x8656, 0x8657, 0x8658, 0x8659, 0x865B, 0x865C, 0x865D, 0x865F, +plane 57 +at 0x00 + 0x8660, 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, + 0x8669, 0x866A, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, + 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, + 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, + 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, + 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, + 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, + 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, + 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, + 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, + 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, + 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, + 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, + 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, + 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, + 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, + 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0, + 0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2, + 0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE, + 0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD, + 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, 0x86DD, + 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, 0x86E8, + 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, 0x86FA, + 0x86FB, 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, 0x8706, + 0x870B, 0x870C, 0x870E, 0x870F, 0x8710, 0x8711, 0x8714, 0x8716, + 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, 0x901A, + 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, 0x6876, + 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, 0x900F, + 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, 0x5C60, + 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, 0x817F, + 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, 0x6258, + 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, 0x62D3, +plane 58 +at 0x00 + 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, 0x889C, + 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, 0x4E38, + 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, 0x5B9B, + 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, 0x7F51, + 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, 0x8719, 0x871B, + 0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872A, + 0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, 0x8733, 0x8735, + 0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, 0x8740, 0x8741, + 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, 0x874B, 0x874D, + 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, 0x8756, 0x8758, + 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8761, 0x8762, + 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, + 0x876F, 0x8771, 0x8772, 0x8773, 0x8775, 0x8777, 0x8778, 0x8779, + 0x877A, 0x877F, 0x8780, 0x8781, 0x8784, 0x8786, 0x8787, 0x8789, + 0x878A, 0x878C, 0x878E, 0x878F, 0x8790, 0x8791, 0x8792, 0x8794, + 0x8795, 0x8796, 0x8798, 0x8799, 0x879A, 0x879B, 0x879C, 0x879D, + 0x879E, 0x87A0, 0x87A1, 0x87A2, 0x87A3, 0x87A4, 0x5DCD, 0x5FAE, + 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F, 0x60DF, 0x4E3A, + 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, + 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3, 0x5582, 0x9B4F, + 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B, 0x761F, 0x6E29, + 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33, 0x7D0A, 0x95EE, + 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1, 0x7A9D, 0x6211, + 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C, 0x94A8, 0x4E4C, + 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7, 0x543E, 0x5434, + 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E, 0x4F0D, 0x4FAE, + 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF, 0x52A1, 0x609F, + 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852, 0x77FD, 0x6670, + 0x563B, 0x5438, 0x9521, 0x727A, 0x87A5, 0x87A6, 0x87A7, 0x87A9, + 0x87AA, 0x87AE, 0x87B0, 0x87B1, 0x87B2, 0x87B4, 0x87B6, 0x87B7, + 0x87B8, 0x87B9, 0x87BB, 0x87BC, 0x87BE, 0x87BF, 0x87C1, 0x87C2, + 0x87C3, 0x87C4, 0x87C5, 0x87C7, 0x87C8, 0x87C9, 0x87CC, 0x87CD, +plane 59 +at 0x00 + 0x87CE, 0x87CF, 0x87D0, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8, + 0x87D9, 0x87DA, 0x87DC, 0x87DD, 0x87DE, 0x87DF, 0x87E1, 0x87E2, + 0x87E3, 0x87E4, 0x87E6, 0x87E7, 0x87E8, 0x87E9, 0x87EB, 0x87EC, + 0x87ED, 0x87EF, 0x87F0, 0x87F1, 0x87F2, 0x87F3, 0x87F4, 0x87F5, + 0x87F6, 0x87F7, 0x87F8, 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FF, + 0x8800, 0x8801, 0x8802, 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, + 0x8809, 0x880B, 0x880C, 0x880D, 0x880E, 0x880F, 0x8810, 0x8811, + 0x8812, 0x8814, 0x8817, 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, + 0x881E, 0x881F, 0x8820, 0x8823, 0x7A00, 0x606F, 0x5E0C, 0x6089, + 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, + 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, + 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, + 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, + 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, + 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, + 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, + 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, + 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, + 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, + 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, + 0x6DC6, 0x6653, 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, + 0x882A, 0x882B, 0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8831, + 0x8833, 0x8834, 0x8835, 0x8836, 0x8837, 0x8838, 0x883A, 0x883B, + 0x883D, 0x883E, 0x883F, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, + 0x8848, 0x8849, 0x884A, 0x884B, 0x884E, 0x884F, 0x8850, 0x8851, + 0x8852, 0x8853, 0x8855, 0x8856, 0x8858, 0x885A, 0x885B, 0x885C, + 0x885D, 0x885E, 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, + 0x886F, 0x8871, 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, + 0x887A, 0x887B, 0x887C, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, + 0x888A, 0x888C, 0x888E, 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, + 0x8895, 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889D, 0x889E, + 0x889F, 0x88A0, 0x88A1, 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, +plane 60 +at 0x00 + 0x88A9, 0x88AA, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, + 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, + 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, + 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, + 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, + 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, + 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, + 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, + 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, + 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, + 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, + 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, + 0x88AC, 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, + 0x88B6, 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, + 0x88C0, 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CA, 0x88CB, 0x88CC, + 0x88CD, 0x88CF, 0x88D0, 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, + 0x88DB, 0x88DC, 0x88DD, 0x88DE, 0x88E0, 0x88E1, 0x88E6, 0x88E7, + 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F2, + 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB, 0x88FD, 0x88FF, 0x8900, + 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0x8909, + 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914, 0x8915, + 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F, 0x8920, + 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, 0x892C, + 0x892D, 0x892E, 0x892F, 0x8931, 0x8932, 0x8933, 0x8935, 0x8937, + 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, 0x7A74, + 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, + 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, 0x8FC5, + 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, 0x7259, + 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, 0x8BB6, + 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, 0x7814, + 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, 0x6CBF, + 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, 0x71D5, +plane 61 +at 0x00 + 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, 0x8C1A, + 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, 0x4F6F, + 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, 0x517B, + 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, 0x8938, 0x8939, + 0x893A, 0x893B, 0x893C, 0x893D, 0x893E, 0x893F, 0x8940, 0x8942, + 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894A, 0x894B, + 0x894C, 0x894D, 0x894E, 0x894F, 0x8950, 0x8951, 0x8952, 0x8953, + 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895A, 0x895B, + 0x895C, 0x895D, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, + 0x8967, 0x8968, 0x8969, 0x896A, 0x896B, 0x896C, 0x896D, 0x896E, + 0x896F, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, + 0x8977, 0x8978, 0x8979, 0x897A, 0x897C, 0x897D, 0x897E, 0x8980, + 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, 0x8989, 0x898A, 0x898B, + 0x898C, 0x898D, 0x898E, 0x898F, 0x8990, 0x8991, 0x8992, 0x8993, + 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899A, 0x899B, + 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A1, 0x6447, 0x5C27, + 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200, 0x836F, 0x8981, + 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE, 0x51B6, 0x4E5F, + 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B, 0x591C, 0x6DB2, + 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D, 0x4F0A, 0x8863, + 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0, 0x7591, 0x6C82, + 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A, 0x5DF2, 0x4E59, + 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091, 0x5C79, 0x4EBF, + 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6, 0x88D4, 0x610F, + 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, + 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335, 0x836B, 0x56E0, + 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6, 0x6DEB, 0x5BC5, + 0x996E, 0x5C39, 0x5F15, 0x9690, 0x89A2, 0x89A3, 0x89A4, 0x89A5, + 0x89A6, 0x89A7, 0x89A8, 0x89A9, 0x89AA, 0x89AB, 0x89AC, 0x89AD, + 0x89AE, 0x89AF, 0x89B0, 0x89B1, 0x89B2, 0x89B3, 0x89B4, 0x89B5, + 0x89B6, 0x89B7, 0x89B8, 0x89B9, 0x89BA, 0x89BB, 0x89BC, 0x89BD, + 0x89BE, 0x89BF, 0x89C0, 0x89C3, 0x89CD, 0x89D3, 0x89D4, 0x89D5, +plane 62 +at 0x00 + 0x89D7, 0x89D8, 0x89D9, 0x89DB, 0x89DD, 0x89DF, 0x89E0, 0x89E1, + 0x89E2, 0x89E4, 0x89E7, 0x89E8, 0x89E9, 0x89EA, 0x89EC, 0x89ED, + 0x89EE, 0x89F0, 0x89F1, 0x89F2, 0x89F4, 0x89F5, 0x89F6, 0x89F7, + 0x89F8, 0x89F9, 0x89FA, 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, + 0x8A01, 0x8A02, 0x8A03, 0x8A04, 0x8A05, 0x8A06, 0x8A08, 0x8A09, + 0x8A0A, 0x8A0B, 0x8A0C, 0x8A0D, 0x8A0E, 0x8A0F, 0x8A10, 0x8A11, + 0x8A12, 0x8A13, 0x8A14, 0x8A15, 0x8A16, 0x8A17, 0x8A18, 0x8A19, + 0x8A1A, 0x8A1B, 0x8A1C, 0x8A1D, 0x5370, 0x82F1, 0x6A31, 0x5A74, + 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, + 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, + 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, + 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, + 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, + 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, + 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, + 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, + 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, + 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, + 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, + 0x80B2, 0x8A89, 0x8A1E, 0x8A1F, 0x8A20, 0x8A21, 0x8A22, 0x8A23, + 0x8A24, 0x8A25, 0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2A, 0x8A2B, + 0x8A2C, 0x8A2D, 0x8A2E, 0x8A2F, 0x8A30, 0x8A31, 0x8A32, 0x8A33, + 0x8A34, 0x8A35, 0x8A36, 0x8A37, 0x8A38, 0x8A39, 0x8A3A, 0x8A3B, + 0x8A3C, 0x8A3D, 0x8A3F, 0x8A40, 0x8A41, 0x8A42, 0x8A43, 0x8A44, + 0x8A45, 0x8A46, 0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, + 0x8A4E, 0x8A4F, 0x8A50, 0x8A51, 0x8A52, 0x8A53, 0x8A54, 0x8A55, + 0x8A56, 0x8A57, 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, + 0x8A5E, 0x8A5F, 0x8A60, 0x8A61, 0x8A62, 0x8A63, 0x8A64, 0x8A65, + 0x8A66, 0x8A67, 0x8A68, 0x8A69, 0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, + 0x8A6E, 0x8A6F, 0x8A70, 0x8A71, 0x8A72, 0x8A73, 0x8A74, 0x8A75, + 0x8A76, 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7C, 0x8A7D, 0x8A7E, + 0x8A7F, 0x8A80, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, +plane 63 +at 0x00 + 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, + 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, + 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, + 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, + 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, + 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, + 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, + 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, + 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, + 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, + 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, + 0x8A81, 0x8A82, 0x8A83, 0x8A84, 0x8A85, 0x8A86, 0x8A87, 0x8A88, + 0x8A8B, 0x8A8C, 0x8A8D, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A92, + 0x8A94, 0x8A95, 0x8A96, 0x8A97, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B, + 0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, 0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3, + 0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, 0x8AA8, 0x8AA9, 0x8AAA, 0x8AAB, + 0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, + 0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, 0x8AB8, 0x8AB9, 0x8ABA, 0x8ABB, + 0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, 0x8AC0, 0x8AC1, 0x8AC2, 0x8AC3, + 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, 0x8AC8, 0x8AC9, 0x8ACA, 0x8ACB, + 0x8ACC, 0x8ACD, 0x8ACE, 0x8ACF, 0x8AD0, 0x8AD1, 0x8AD2, 0x8AD3, + 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8, 0x8AD9, 0x8ADA, 0x8ADB, + 0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE2, 0x8AE3, + 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, 0x70B8, + 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, 0x77BB, + 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, 0x5D2D, + 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, 0x7EFD, + 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, 0x6756, + 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, 0x62DB, + 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, 0x8087, + 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, 0x9517, + 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, 0x7827, +plane 64 +at 0x00 + 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, 0x9707, + 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, 0x72F0, + 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, 0x8AE4, 0x8AE5, + 0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEB, 0x8AEC, 0x8AED, + 0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, 0x8AF4, 0x8AF5, + 0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, 0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD, + 0x8AFE, 0x8AFF, 0x8B00, 0x8B01, 0x8B02, 0x8B03, 0x8B04, 0x8B05, + 0x8B06, 0x8B08, 0x8B09, 0x8B0A, 0x8B0B, 0x8B0C, 0x8B0D, 0x8B0E, + 0x8B0F, 0x8B10, 0x8B11, 0x8B12, 0x8B13, 0x8B14, 0x8B15, 0x8B16, + 0x8B17, 0x8B18, 0x8B19, 0x8B1A, 0x8B1B, 0x8B1C, 0x8B1D, 0x8B1E, + 0x8B1F, 0x8B20, 0x8B21, 0x8B22, 0x8B23, 0x8B24, 0x8B25, 0x8B27, + 0x8B28, 0x8B29, 0x8B2A, 0x8B2B, 0x8B2C, 0x8B2D, 0x8B2E, 0x8B2F, + 0x8B30, 0x8B31, 0x8B32, 0x8B33, 0x8B34, 0x8B35, 0x8B36, 0x8B37, + 0x8B38, 0x8B39, 0x8B3A, 0x8B3B, 0x8B3C, 0x8B3D, 0x8B3E, 0x8B3F, + 0x8B40, 0x8B41, 0x8B42, 0x8B43, 0x8B44, 0x8B45, 0x5E27, 0x75C7, + 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431, 0x8718, 0x77E5, + 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C, 0x76F4, 0x690D, + 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307, 0x6B62, 0x8DBE, + 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7, 0x81F3, 0x81F4, + 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9, 0x7A1A, 0x8D28, + 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D, 0x76C5, 0x5FE0, + 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD, 0x4EF2, 0x4F17, + 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5, 0x8F74, 0x8098, + 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4, 0x73E0, 0x682A, + 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010, 0x7AF9, 0x70DB, + 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457, 0x67F1, 0x52A9, + 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0x8B46, 0x8B47, 0x8B48, 0x8B49, + 0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D, 0x8B4E, 0x8B4F, 0x8B50, 0x8B51, + 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x8B57, 0x8B58, 0x8B59, + 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, + 0x8B62, 0x8B63, 0x8B64, 0x8B65, 0x8B67, 0x8B68, 0x8B69, 0x8B6A, + 0x8B6B, 0x8B6D, 0x8B6E, 0x8B6F, 0x8B70, 0x8B71, 0x8B72, 0x8B73, +plane 65 +at 0x00 + 0x8B74, 0x8B75, 0x8B76, 0x8B77, 0x8B78, 0x8B79, 0x8B7A, 0x8B7B, + 0x8B7C, 0x8B7D, 0x8B7E, 0x8B7F, 0x8B80, 0x8B81, 0x8B82, 0x8B83, + 0x8B84, 0x8B85, 0x8B86, 0x8B87, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, + 0x8B8C, 0x8B8D, 0x8B8E, 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, + 0x8B94, 0x8B95, 0x8B96, 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, + 0x8B9C, 0x8B9D, 0x8B9E, 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, + 0x8BD0, 0x8BEA, 0x8C09, 0x8C1E, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, + 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, + 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, + 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, + 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, + 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, + 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, + 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, + 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, + 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, + 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, + 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0, 0, 0, + 0, 0, 0x8C38, 0x8C39, 0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, + 0x8C3E, 0x8C3F, 0x8C40, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C48, + 0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, 0x8C4F, 0x8C50, 0x8C51, 0x8C52, + 0x8C53, 0x8C54, 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C, + 0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66, + 0x8C67, 0x8C68, 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, + 0x8C71, 0x8C72, 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C, + 0x8C7D, 0x8C7E, 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86, + 0x8C87, 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, + 0x8C92, 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B, + 0x8C9C, 0x8C9D, 0x8C9E, 0x8C9F, 0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, + 0x8CA4, 0x8CA5, 0x8CA6, 0x8CA7, 0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, + 0x8CAC, 0x8CAD, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, + 0x4E15, 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, +plane 66 +at 0x00 + 0x4E3F, 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, + 0x80E4, 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, + 0x4E5C, 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, + 0x538D, 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, + 0x53F5, 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, + 0x5208, 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, + 0x5261, 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, + 0x5182, 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, + 0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, + 0x4F27, 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, + 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, 0x8CB2, 0x8CB3, 0x8CB4, 0x8CB5, + 0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, 0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD, + 0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, 0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5, + 0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, 0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD, + 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, 0x8CD2, 0x8CD3, 0x8CD4, 0x8CD5, + 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD, + 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, 0x8CE2, 0x8CE3, 0x8CE4, 0x8CE5, + 0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC, 0x8CED, + 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF4, 0x8CF5, + 0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x8CFB, 0x8CFC, 0x8CFD, + 0x8CFE, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D04, 0x8D05, + 0x8D06, 0x8D07, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x8D0C, 0x8D0D, + 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, + 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, + 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, + 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, + 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, 0x5043, + 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, + 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, + 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, + 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, + 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, +plane 67 +at 0x00 + 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, + 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, 0x8D0E, 0x8D0F, + 0x8D10, 0x8D11, 0x8D12, 0x8D13, 0x8D14, 0x8D15, 0x8D16, 0x8D17, + 0x8D18, 0x8D19, 0x8D1A, 0x8D1B, 0x8D1C, 0x8D20, 0x8D51, 0x8D52, + 0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, 0x8D6C, 0x8D6E, + 0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A, 0x8D7B, 0x8D7C, + 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83, 0x8D86, 0x8D87, + 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, 0x8D90, 0x8D92, + 0x8D93, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99, 0x8D9A, 0x8D9B, + 0x8D9C, 0x8D9D, 0x8D9E, 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA4, 0x8DA5, + 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, 0x8DAB, 0x8DAC, 0x8DAD, + 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB2, 0x8DB6, 0x8DB7, 0x8DB9, 0x8DBB, + 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, 0x8DC5, 0x8DC7, 0x8DC8, 0x8DC9, + 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, 0x8DD3, 0x8DD4, 0x51C7, 0x5196, + 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, + 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, + 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, + 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, + 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, + 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, + 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, + 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, + 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, 0x963C, 0x9642, 0x9649, + 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, 0x9674, 0x9688, 0x968D, + 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, + 0x90B4, 0x90B3, 0x90B6, 0x90BA, 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, + 0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, + 0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, + 0x8DFF, 0x8E00, 0x8E01, 0x8E02, 0x8E03, 0x8E04, 0x8E06, 0x8E07, + 0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, 0x8E10, 0x8E11, 0x8E12, 0x8E13, + 0x8E15, 0x8E16, 0x8E17, 0x8E18, 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, + 0x8E20, 0x8E21, 0x8E24, 0x8E25, 0x8E26, 0x8E27, 0x8E28, 0x8E2B, +plane 68 +at 0x00 + 0x8E2D, 0x8E30, 0x8E32, 0x8E33, 0x8E34, 0x8E36, 0x8E37, 0x8E38, + 0x8E3B, 0x8E3C, 0x8E3E, 0x8E3F, 0x8E43, 0x8E45, 0x8E46, 0x8E4C, + 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, 0x8E53, 0x8E54, 0x8E55, 0x8E56, + 0x8E57, 0x8E58, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, + 0x8E60, 0x8E61, 0x8E62, 0x8E63, 0x8E64, 0x8E65, 0x8E67, 0x8E68, + 0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, 0x90B8, 0x90B0, 0x90CF, 0x90C5, + 0x90BE, 0x90D0, 0x90C4, 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, + 0x90D7, 0x90DB, 0x90EB, 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, + 0x9123, 0x9131, 0x912F, 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, + 0x52A2, 0x52AC, 0x52AD, 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, + 0x53DF, 0x71EE, 0x77CD, 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, + 0x5F01, 0x755A, 0x5DEF, 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, + 0x58C5, 0x58D1, 0x5729, 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, + 0x572F, 0x575C, 0x573B, 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, + 0x577C, 0x577B, 0x5768, 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, + 0x578C, 0x57B2, 0x57CF, 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, + 0x57D8, 0x57DA, 0x57D9, 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, + 0x57E4, 0x57DD, 0x8E73, 0x8E75, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, + 0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, 0x8E82, 0x8E83, 0x8E84, 0x8E86, + 0x8E88, 0x8E89, 0x8E8A, 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, + 0x8E92, 0x8E93, 0x8E95, 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, + 0x8E9B, 0x8E9D, 0x8E9F, 0x8EA0, 0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, + 0x8EA5, 0x8EA6, 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAA, 0x8EAD, 0x8EAE, + 0x8EB0, 0x8EB1, 0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, + 0x8EB9, 0x8EBB, 0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC0, 0x8EC1, + 0x8EC2, 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, + 0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, + 0x8ED3, 0x8ED4, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, + 0x8EDB, 0x8EDC, 0x8EDD, 0x8EDE, 0x8EDF, 0x8EE0, 0x8EE1, 0x8EE2, + 0x8EE3, 0x8EE4, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, + 0x5819, 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, + 0x5880, 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, +plane 69 +at 0x00 + 0x828A, 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, + 0x82B8, 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, + 0x82AE, 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, + 0x829F, 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, + 0x830F, 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, + 0x82D3, 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, + 0x831C, 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, + 0x8331, 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, + 0x8340, 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, + 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, + 0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF2, 0x8EF3, 0x8EF4, + 0x8EF5, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, + 0x8EFD, 0x8EFE, 0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F03, 0x8F04, + 0x8F05, 0x8F06, 0x8F07, 0x8F08, 0x8F09, 0x8F0A, 0x8F0B, 0x8F0C, + 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F12, 0x8F13, 0x8F14, + 0x8F15, 0x8F16, 0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F1B, 0x8F1C, + 0x8F1D, 0x8F1E, 0x8F1F, 0x8F20, 0x8F21, 0x8F22, 0x8F23, 0x8F24, + 0x8F25, 0x8F26, 0x8F27, 0x8F28, 0x8F29, 0x8F2A, 0x8F2B, 0x8F2C, + 0x8F2D, 0x8F2E, 0x8F2F, 0x8F30, 0x8F31, 0x8F32, 0x8F33, 0x8F34, + 0x8F35, 0x8F36, 0x8F37, 0x8F38, 0x8F39, 0x8F3A, 0x8F3B, 0x8F3C, + 0x8F3D, 0x8F3E, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43, 0x8F44, + 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, + 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, + 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, + 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, + 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, + 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, + 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, + 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, 0x843C, + 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, + 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, + 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, +plane 70 +at 0x00 + 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, 0x8F45, 0x8F46, + 0x8F47, 0x8F48, 0x8F49, 0x8F4A, 0x8F4B, 0x8F4C, 0x8F4D, 0x8F4E, + 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F54, 0x8F55, 0x8F56, + 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C, 0x8F5D, 0x8F5E, + 0x8F5F, 0x8F60, 0x8F61, 0x8F62, 0x8F63, 0x8F64, 0x8F65, 0x8F6A, + 0x8F80, 0x8F8C, 0x8F92, 0x8F9D, 0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, + 0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, 0x8FAC, 0x8FAD, 0x8FAE, 0x8FAF, + 0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB, + 0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0x8FC9, 0x8FCA, 0x8FCB, + 0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0, + 0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, 0x8FF1, 0x8FF2, 0x8FF4, + 0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, 0x8FFE, 0x8FFF, 0x9007, + 0x9008, 0x900C, 0x900E, 0x9013, 0x9015, 0x9018, 0x8556, 0x853B, + 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, 0x8564, 0x855E, 0x857A, + 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, + 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, + 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, 0x8629, 0x8616, 0x863C, + 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, 0x5955, 0x595A, 0x5958, + 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, + 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, + 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, + 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, + 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, + 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, 0x640C, 0x6426, 0x6421, + 0x645E, 0x6484, 0x646D, 0x6496, 0x9019, 0x901C, 0x9023, 0x9024, + 0x9025, 0x9027, 0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x9030, + 0x9031, 0x9032, 0x9033, 0x9034, 0x9037, 0x9039, 0x903A, 0x903D, + 0x903F, 0x9040, 0x9043, 0x9045, 0x9046, 0x9048, 0x9049, 0x904A, + 0x904B, 0x904C, 0x904E, 0x9054, 0x9055, 0x9056, 0x9059, 0x905A, + 0x905C, 0x905D, 0x905E, 0x905F, 0x9060, 0x9061, 0x9064, 0x9066, + 0x9067, 0x9069, 0x906A, 0x906B, 0x906C, 0x906F, 0x9070, 0x9071, + 0x9072, 0x9073, 0x9076, 0x9077, 0x9078, 0x9079, 0x907A, 0x907B, +plane 71 +at 0x00 + 0x907C, 0x907E, 0x9081, 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, + 0x908A, 0x908C, 0x908D, 0x908E, 0x908F, 0x9090, 0x9092, 0x9094, + 0x9096, 0x9098, 0x909A, 0x909C, 0x909E, 0x909F, 0x90A0, 0x90A4, + 0x90A5, 0x90A7, 0x90A8, 0x90A9, 0x90AB, 0x90AD, 0x90B2, 0x90B7, + 0x90BC, 0x90BD, 0x90BF, 0x90C0, 0x647A, 0x64B7, 0x64B8, 0x6499, + 0x64BA, 0x64C0, 0x64D0, 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, + 0x652E, 0x5F0B, 0x5FD2, 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, + 0x53E9, 0x53E8, 0x53FB, 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, + 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, + 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, + 0x5484, 0x5476, 0x5466, 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, + 0x54D2, 0x54A7, 0x54A6, 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, + 0x54BB, 0x54BF, 0x54CC, 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, + 0x54A4, 0x54DD, 0x54CF, 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, + 0x5514, 0x54F3, 0x5522, 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, + 0x5567, 0x558F, 0x55B5, 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, + 0x5550, 0x553C, 0x90C2, 0x90C3, 0x90C6, 0x90C8, 0x90C9, 0x90CB, + 0x90CC, 0x90CD, 0x90D2, 0x90D4, 0x90D5, 0x90D6, 0x90D8, 0x90D9, + 0x90DA, 0x90DE, 0x90DF, 0x90E0, 0x90E3, 0x90E4, 0x90E5, 0x90E9, + 0x90EA, 0x90EC, 0x90EE, 0x90F0, 0x90F1, 0x90F2, 0x90F3, 0x90F5, + 0x90F6, 0x90F7, 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FF, 0x9100, + 0x9101, 0x9103, 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910A, + 0x910B, 0x910C, 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9112, + 0x9113, 0x9114, 0x9115, 0x9116, 0x9117, 0x9118, 0x911A, 0x911B, + 0x911C, 0x911D, 0x911F, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, + 0x9127, 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, + 0x9130, 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, + 0x913A, 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, + 0x9142, 0x9144, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, + 0x5530, 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, + 0x5581, 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, + 0x55BE, 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, +plane 72 +at 0x00 + 0x55EB, 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, + 0x55F2, 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, + 0x561E, 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, + 0x5627, 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, + 0x5659, 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, + 0x567B, 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, + 0x56E1, 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, + 0x571C, 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, + 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, + 0x9158, 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, + 0x9168, 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, + 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, + 0x918F, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, + 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, + 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AB, 0x91AC, 0x91B0, 0x91B1, + 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BB, 0x91BC, + 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, 0x91C4, + 0x91C5, 0x91C6, 0x91C8, 0x91CB, 0x91D0, 0x91D2, 0x91D3, 0x91D4, + 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DD, + 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5, + 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, + 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, + 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, + 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, + 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, + 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, + 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, + 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, + 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, + 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, + 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, + 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, 0x91E6, 0x91E7, +plane 73 +at 0x00 + 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, + 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5, 0x91F6, 0x91F7, + 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, + 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, 0x9206, 0x9207, + 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, 0x920E, 0x920F, + 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, 0x9216, 0x9217, + 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, 0x921E, 0x921F, + 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0x9225, 0x9226, 0x9227, + 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922E, 0x922F, + 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235, 0x9236, 0x9237, + 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, 0x923D, 0x923E, 0x923F, + 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x72FB, 0x7317, + 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, 0x7315, 0x7322, 0x7339, + 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, 0x734D, 0x7357, 0x7360, + 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, + 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x9974, + 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, 0x998A, 0x998D, 0x9990, + 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, + 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, + 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, + 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, + 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, + 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, 0x603F, 0x6021, 0x6078, + 0x6079, 0x607B, 0x607A, 0x6042, 0x9246, 0x9247, 0x9248, 0x9249, + 0x924A, 0x924B, 0x924C, 0x924D, 0x924E, 0x924F, 0x9250, 0x9251, + 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, + 0x925A, 0x925B, 0x925C, 0x925D, 0x925E, 0x925F, 0x9260, 0x9261, + 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, + 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, 0x9271, + 0x9272, 0x9273, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927A, + 0x927B, 0x927C, 0x927D, 0x927E, 0x927F, 0x9280, 0x9281, 0x9282, + 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, +plane 74 +at 0x00 + 0x928B, 0x928C, 0x928D, 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, + 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, + 0x929C, 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, + 0x92A4, 0x92A5, 0x92A6, 0x92A7, 0x606A, 0x607D, 0x6096, 0x609A, + 0x60AD, 0x609D, 0x6083, 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, + 0x60B1, 0x60DD, 0x60D8, 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, + 0x6115, 0x6123, 0x60F4, 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, + 0x61AC, 0x6194, 0x61A7, 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, + 0x95E9, 0x95EB, 0x95F1, 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, + 0x9603, 0x9604, 0x9606, 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, + 0x960F, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, + 0x723F, 0x6215, 0x6C35, 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, + 0x6C90, 0x6C94, 0x6C8C, 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, + 0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, + 0x6CB2, 0x6CE0, 0x6CD6, 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, + 0x6CEF, 0x6CFE, 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, + 0x92AF, 0x92B0, 0x92B1, 0x92B2, 0x92B3, 0x92B4, 0x92B5, 0x92B6, + 0x92B7, 0x92B8, 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, + 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C4, 0x92C5, 0x92C6, + 0x92C7, 0x92C9, 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, + 0x92D0, 0x92D1, 0x92D2, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7, + 0x92D8, 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, + 0x92E0, 0x92E1, 0x92E2, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, + 0x92E8, 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, + 0x92F0, 0x92F1, 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, + 0x92F8, 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, + 0x9300, 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, + 0x9308, 0x9309, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, + 0x6D04, 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, + 0x6D4F, 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, + 0x6D5E, 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, + 0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, +plane 75 +at 0x00 + 0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, + 0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, + 0x6E25, 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, + 0x6EA5, 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, + 0x6E8F, 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, + 0x6EF9, 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, + 0x6F89, 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, + 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, + 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, + 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, + 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, + 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, + 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, + 0x933A, 0x933B, 0x933C, 0x933D, 0x933F, 0x9340, 0x9341, 0x9342, + 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934A, + 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351, 0x9352, + 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, + 0x935B, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361, 0x9362, + 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936B, + 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, + 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, 0x704F, + 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, + 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, + 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, + 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, 0x900D, + 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, 0x9051, + 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, + 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, + 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, + 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, + 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, 0x936C, 0x936D, + 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, +plane 76 +at 0x00 + 0x9376, 0x9377, 0x9378, 0x9379, 0x937A, 0x937B, 0x937C, 0x937D, + 0x937E, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, + 0x9386, 0x9387, 0x9388, 0x9389, 0x938A, 0x938B, 0x938C, 0x938D, + 0x938E, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, + 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, 0x939E, + 0x939F, 0x93A0, 0x93A1, 0x93A2, 0x93A3, 0x93A4, 0x93A5, 0x93A6, + 0x93A7, 0x93A8, 0x93A9, 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, + 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, 0x93B4, 0x93B5, 0x93B6, + 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE, + 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, 0x93C4, 0x93C5, 0x93C6, + 0x93C7, 0x93C8, 0x93C9, 0x93CB, 0x93CC, 0x93CD, 0x5997, 0x59CA, + 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, + 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, + 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, + 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, + 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, + 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, + 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, + 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, + 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, + 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, + 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, + 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, 0x93CE, 0x93CF, 0x93D0, 0x93D1, + 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D7, 0x93D8, 0x93D9, 0x93DA, + 0x93DB, 0x93DC, 0x93DD, 0x93DE, 0x93DF, 0x93E0, 0x93E1, 0x93E2, + 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0x93E7, 0x93E8, 0x93E9, 0x93EA, + 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, + 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0x93F7, 0x93F8, 0x93F9, 0x93FA, + 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, + 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409, 0x940A, + 0x940B, 0x940C, 0x940D, 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, + 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419, 0x941A, +plane 77 +at 0x00 + 0x941B, 0x941C, 0x941D, 0x941E, 0x941F, 0x9420, 0x9421, 0x9422, + 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, + 0x942B, 0x942C, 0x942D, 0x942E, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, + 0x7EC1, 0x7EC2, 0x7EC9, 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, + 0x7EDB, 0x7EE0, 0x7EE1, 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, + 0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, + 0x7F03, 0x7F07, 0x7F08, 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, + 0x7F17, 0x7F19, 0x7F1C, 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, + 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, + 0x7F2F, 0x7F30, 0x7F31, 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, + 0x5DDB, 0x753E, 0x9095, 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, + 0x73CF, 0x73C2, 0x73D1, 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, + 0x73E5, 0x73D9, 0x987C, 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, + 0x73F2, 0x740F, 0x742A, 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, + 0x742E, 0x742C, 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, + 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, + 0x943D, 0x943F, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, + 0x9446, 0x9447, 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, + 0x944E, 0x944F, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, + 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, + 0x945E, 0x945F, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, + 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946C, 0x946D, 0x946E, + 0x946F, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, + 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D, 0x947E, + 0x947F, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, + 0x9498, 0x94C7, 0x94CF, 0x94D3, 0x94D4, 0x94DA, 0x94E6, 0x94FB, + 0x951C, 0x9520, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, + 0x7459, 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, + 0x7487, 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, + 0x74BA, 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, + 0x6769, 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, + 0x67A8, 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, +plane 78 +at 0x00 + 0x67D8, 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, + 0x67B3, 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, + 0x67FD, 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, + 0x6864, 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, + 0x683E, 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, + 0x6893, 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, + 0x9527, 0x9533, 0x953D, 0x9543, 0x9548, 0x954B, 0x9555, 0x955A, + 0x9560, 0x956E, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957A, + 0x957B, 0x957C, 0x957D, 0x957E, 0x9580, 0x9581, 0x9582, 0x9583, + 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958A, 0x958B, + 0x958C, 0x958D, 0x958E, 0x958F, 0x9590, 0x9591, 0x9592, 0x9593, + 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959A, 0x959B, + 0x959C, 0x959D, 0x959E, 0x959F, 0x95A0, 0x95A1, 0x95A2, 0x95A3, + 0x95A4, 0x95A5, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0x95AA, 0x95AB, + 0x95AC, 0x95AD, 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B2, 0x95B3, + 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0x95B8, 0x95B9, 0x95BA, 0x95BB, + 0x95BC, 0x95BD, 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0x95C2, 0x95C3, + 0x95C4, 0x95C5, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0x95CA, 0x95CB, + 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, + 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, 0x6998, + 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, + 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, + 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, + 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, + 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, + 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, + 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, + 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, + 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, + 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, 0x95CC, 0x95CD, + 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2, 0x95D3, 0x95D4, 0x95D5, + 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA, 0x95DB, 0x95DC, 0x95DD, +plane 79 +at 0x00 + 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2, 0x95E3, 0x95E4, 0x95E5, + 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, 0x9618, 0x961B, + 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, + 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, 0x9637, 0x9638, + 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, 0x964E, 0x964F, + 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9658, 0x9659, 0x965A, + 0x965C, 0x965D, 0x965E, 0x9660, 0x9663, 0x9665, 0x9666, 0x966B, + 0x966D, 0x966E, 0x966F, 0x9670, 0x9671, 0x9673, 0x9678, 0x9679, + 0x967A, 0x967B, 0x967C, 0x967D, 0x967E, 0x967F, 0x9680, 0x9681, + 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968A, 0x8F8D, 0x8F8E, + 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, + 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, + 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, + 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, + 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665F, 0x6654, + 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668C, + 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, + 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, + 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, + 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, + 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, 0x728B, 0x728D, 0x728F, + 0x7292, 0x6308, 0x6332, 0x63B0, 0x968C, 0x968E, 0x9691, 0x9692, + 0x9693, 0x9695, 0x9696, 0x969A, 0x969B, 0x969D, 0x969E, 0x969F, + 0x96A0, 0x96A1, 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A8, + 0x96A9, 0x96AA, 0x96AB, 0x96AC, 0x96AD, 0x96AE, 0x96AF, 0x96B1, + 0x96B2, 0x96B4, 0x96B5, 0x96B7, 0x96B8, 0x96BA, 0x96BB, 0x96BF, + 0x96C2, 0x96C3, 0x96C8, 0x96CA, 0x96CB, 0x96D0, 0x96D1, 0x96D3, + 0x96D4, 0x96D6, 0x96D7, 0x96D8, 0x96D9, 0x96DA, 0x96DB, 0x96DC, + 0x96DD, 0x96DE, 0x96DF, 0x96E1, 0x96E2, 0x96E3, 0x96E4, 0x96E5, + 0x96E6, 0x96E7, 0x96EB, 0x96EC, 0x96ED, 0x96EE, 0x96F0, 0x96F1, + 0x96F2, 0x96F4, 0x96F5, 0x96F8, 0x96FA, 0x96FB, 0x96FC, 0x96FD, + 0x96FF, 0x9702, 0x9703, 0x9705, 0x970A, 0x970B, 0x970C, 0x9710, +plane 80 +at 0x00 + 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718, 0x9719, 0x971A, + 0x971B, 0x971D, 0x971F, 0x9720, 0x643F, 0x64D8, 0x8004, 0x6BEA, + 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, + 0x6C15, 0x6C18, 0x6C19, 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, + 0x6C32, 0x6535, 0x6555, 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, + 0x8662, 0x5216, 0x809F, 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, + 0x80B1, 0x80AB, 0x80AD, 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, + 0x80EA, 0x80DB, 0x80C2, 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, + 0x80DD, 0x80EB, 0x80F1, 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, + 0x80FC, 0x6715, 0x8112, 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, + 0x8132, 0x8148, 0x814C, 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, + 0x8160, 0x8169, 0x817C, 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, + 0x8188, 0x8182, 0x8191, 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, + 0x81CA, 0x81BB, 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, + 0x9727, 0x9728, 0x9729, 0x972B, 0x972C, 0x972E, 0x972F, 0x9731, + 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, 0x973A, 0x973B, 0x973C, + 0x973D, 0x973F, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, + 0x9746, 0x9747, 0x9748, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, + 0x974E, 0x974F, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, + 0x975A, 0x975C, 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, + 0x9768, 0x976A, 0x976B, 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, + 0x9771, 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, + 0x977D, 0x977E, 0x977F, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, + 0x9786, 0x9787, 0x9788, 0x9789, 0x978A, 0x978C, 0x978E, 0x978F, + 0x9790, 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979B, + 0x979C, 0x979D, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, + 0x6B46, 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, + 0x6BB3, 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, + 0x65C6, 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, + 0x709C, 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, + 0x70E8, 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, + 0x715C, 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, +plane 81 +at 0x00 + 0x71B3, 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, + 0x721D, 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, + 0x6243, 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, + 0x795C, 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, + 0x797A, 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, + 0x979E, 0x979F, 0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A6, 0x97A7, + 0x97A8, 0x97A9, 0x97AA, 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, + 0x97B5, 0x97B6, 0x97B7, 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, + 0x97BD, 0x97BE, 0x97BF, 0x97C0, 0x97C1, 0x97C2, 0x97C3, 0x97C4, + 0x97C5, 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, + 0x97CD, 0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D3, 0x97D4, + 0x97D5, 0x97D6, 0x97D7, 0x97D8, 0x97D9, 0x97DA, 0x97DB, 0x97DC, + 0x97DD, 0x97DE, 0x97DF, 0x97E0, 0x97E1, 0x97E2, 0x97E3, 0x97E4, + 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, 0x97F4, + 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB, 0x97FC, 0x97FD, 0x97FE, + 0x97FF, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, + 0x9807, 0x9808, 0x9809, 0x980A, 0x980B, 0x980C, 0x980D, 0x980E, + 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, + 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, + 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, + 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, + 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, 0x7823, + 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, + 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, + 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, + 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, + 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, + 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, 0x7738, + 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, 0x980F, 0x9810, + 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, 0x9817, 0x9818, + 0x9819, 0x981A, 0x981B, 0x981C, 0x981D, 0x981E, 0x981F, 0x9820, + 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, 0x9827, 0x9828, +plane 82 +at 0x00 + 0x9829, 0x982A, 0x982B, 0x982C, 0x982D, 0x982E, 0x982F, 0x9830, + 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, 0x9837, 0x9838, + 0x9839, 0x983A, 0x983B, 0x983C, 0x983D, 0x983E, 0x983F, 0x9840, + 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, + 0x9849, 0x984A, 0x984B, 0x984C, 0x984D, 0x984E, 0x984F, 0x9850, + 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, + 0x9859, 0x985A, 0x985B, 0x985C, 0x985D, 0x985E, 0x985F, 0x9860, + 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, + 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, 0x986E, 0x7762, 0x7765, + 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, + 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, 0x754E, 0x754B, 0x7548, + 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, + 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, + 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, 0x948A, 0x948C, 0x948D, + 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, 0x949A, 0x949B, 0x949C, + 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, + 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, + 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, + 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, + 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, + 0x94E5, 0x94E7, 0x94E8, 0x94EA, 0x986F, 0x9870, 0x9871, 0x9872, + 0x9873, 0x9874, 0x988B, 0x988E, 0x9892, 0x9895, 0x9899, 0x98A3, + 0x98A8, 0x98A9, 0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98AE, 0x98AF, + 0x98B0, 0x98B1, 0x98B2, 0x98B3, 0x98B4, 0x98B5, 0x98B6, 0x98B7, + 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BC, 0x98BD, 0x98BE, 0x98BF, + 0x98C0, 0x98C1, 0x98C2, 0x98C3, 0x98C4, 0x98C5, 0x98C6, 0x98C7, + 0x98C8, 0x98C9, 0x98CA, 0x98CB, 0x98CC, 0x98CD, 0x98CF, 0x98D0, + 0x98D4, 0x98D6, 0x98D7, 0x98DB, 0x98DC, 0x98DD, 0x98E0, 0x98E1, + 0x98E2, 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98E9, 0x98EA, 0x98EB, + 0x98EC, 0x98ED, 0x98EE, 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, + 0x98F4, 0x98F5, 0x98F6, 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, + 0x98FC, 0x98FD, 0x98FE, 0x98FF, 0x9900, 0x9901, 0x9902, 0x9903, +plane 83 +at 0x00 + 0x9904, 0x9905, 0x9906, 0x9907, 0x94E9, 0x94EB, 0x94EE, 0x94EF, + 0x94F3, 0x94F4, 0x94F5, 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, + 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, + 0x950F, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, + 0x951D, 0x951E, 0x951F, 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, + 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, + 0x953F, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, + 0x954E, 0x954F, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, + 0x9559, 0x955B, 0x955E, 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, + 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, + 0x956F, 0x9571, 0x9572, 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, + 0x79D5, 0x79ED, 0x79E3, 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, + 0x7A1E, 0x7A14, 0x9908, 0x9909, 0x990A, 0x990B, 0x990C, 0x990E, + 0x990F, 0x9911, 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, + 0x9918, 0x9919, 0x991A, 0x991B, 0x991C, 0x991D, 0x991E, 0x991F, + 0x9920, 0x9921, 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, + 0x9928, 0x9929, 0x992A, 0x992B, 0x992C, 0x992D, 0x992F, 0x9930, + 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, + 0x9939, 0x993A, 0x993B, 0x993C, 0x993D, 0x993E, 0x993F, 0x9940, + 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, + 0x9949, 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, + 0x9951, 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995A, + 0x995B, 0x995C, 0x995D, 0x995E, 0x995F, 0x9960, 0x9961, 0x9962, + 0x9964, 0x9966, 0x9973, 0x9978, 0x9979, 0x997B, 0x997E, 0x9982, + 0x9983, 0x9989, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, + 0x7688, 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, + 0x9E20, 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, + 0x9E31, 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, + 0x9E42, 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, + 0x9E4E, 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, + 0x9E63, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, + 0x9E71, 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, +plane 84 +at 0x00 + 0x75AC, 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, + 0x75C3, 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, + 0x75EB, 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, + 0x7605, 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, + 0x998C, 0x998E, 0x999A, 0x999B, 0x999C, 0x999D, 0x999E, 0x999F, + 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9, + 0x99AA, 0x99AB, 0x99AC, 0x99AD, 0x99AE, 0x99AF, 0x99B0, 0x99B1, + 0x99B2, 0x99B3, 0x99B4, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, + 0x99BA, 0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C1, + 0x99C2, 0x99C3, 0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, + 0x99CA, 0x99CB, 0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D0, 0x99D1, + 0x99D2, 0x99D3, 0x99D4, 0x99D5, 0x99D6, 0x99D7, 0x99D8, 0x99D9, + 0x99DA, 0x99DB, 0x99DC, 0x99DD, 0x99DE, 0x99DF, 0x99E0, 0x99E1, + 0x99E2, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7, 0x99E8, 0x99E9, + 0x99EA, 0x99EB, 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0x99F0, 0x99F1, + 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, 0x99F9, + 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, 0x763F, + 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, 0x765C, + 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, + 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, + 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, + 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, + 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, + 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, 0x8966, + 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, + 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, + 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, 0x8052, + 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, 0x99FA, 0x99FB, + 0x99FC, 0x99FD, 0x99FE, 0x99FF, 0x9A00, 0x9A01, 0x9A02, 0x9A03, + 0x9A04, 0x9A05, 0x9A06, 0x9A07, 0x9A08, 0x9A09, 0x9A0A, 0x9A0B, + 0x9A0C, 0x9A0D, 0x9A0E, 0x9A0F, 0x9A10, 0x9A11, 0x9A12, 0x9A13, + 0x9A14, 0x9A15, 0x9A16, 0x9A17, 0x9A18, 0x9A19, 0x9A1A, 0x9A1B, +plane 85 +at 0x00 + 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21, 0x9A22, 0x9A23, + 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29, 0x9A2A, 0x9A2B, + 0x9A2C, 0x9A2D, 0x9A2E, 0x9A2F, 0x9A30, 0x9A31, 0x9A32, 0x9A33, + 0x9A34, 0x9A35, 0x9A36, 0x9A37, 0x9A38, 0x9A39, 0x9A3A, 0x9A3B, + 0x9A3C, 0x9A3D, 0x9A3E, 0x9A3F, 0x9A40, 0x9A41, 0x9A42, 0x9A43, + 0x9A44, 0x9A45, 0x9A46, 0x9A47, 0x9A48, 0x9A49, 0x9A4A, 0x9A4B, + 0x9A4C, 0x9A4D, 0x9A4E, 0x9A4F, 0x9A50, 0x9A51, 0x9A52, 0x9A53, + 0x9A54, 0x9A55, 0x9A56, 0x9A57, 0x9A58, 0x9A59, 0x9889, 0x988C, + 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, + 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, 0x866C, 0x866E, 0x867F, + 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, + 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, + 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, + 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, + 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, + 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, 0x871E, 0x8725, 0x872E, + 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873F, + 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, 0x8760, 0x8770, 0x874C, + 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, 0x8764, 0x8759, 0x8765, + 0x8793, 0x87AF, 0x87A8, 0x87D2, 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, + 0x9A5E, 0x9A5F, 0x9A60, 0x9A61, 0x9A62, 0x9A63, 0x9A64, 0x9A65, + 0x9A66, 0x9A67, 0x9A68, 0x9A69, 0x9A6A, 0x9A6B, 0x9A72, 0x9A83, + 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, 0x9A95, 0x9A99, 0x9AA6, 0x9AA9, + 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, + 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, + 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, + 0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4, 0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, + 0x9ADA, 0x9ADB, 0x9ADC, 0x9ADD, 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, + 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8, 0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, + 0x9AF0, 0x9AF1, 0x9AF2, 0x9AF3, 0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, + 0x9AF8, 0x9AFA, 0x9AFC, 0x9AFD, 0x9AFE, 0x9AFF, 0x9B00, 0x9B01, + 0x9B02, 0x9B04, 0x9B05, 0x9B06, 0x87C6, 0x8788, 0x8785, 0x87AD, +plane 86 +at 0x00 + 0x8797, 0x8783, 0x87AB, 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, + 0x87D3, 0x87BD, 0x87D1, 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, + 0x87EE, 0x8816, 0x8813, 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, + 0x883C, 0x7F36, 0x7F42, 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, + 0x7B08, 0x7B03, 0x7B04, 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, + 0x7B38, 0x7B2A, 0x7B19, 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, + 0x7B33, 0x7B3E, 0x7B1E, 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, + 0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, + 0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, + 0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, + 0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, + 0x7C16, 0x7C0B, 0x9B07, 0x9B09, 0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, + 0x9B0E, 0x9B10, 0x9B11, 0x9B12, 0x9B14, 0x9B15, 0x9B16, 0x9B17, + 0x9B18, 0x9B19, 0x9B1A, 0x9B1B, 0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, + 0x9B21, 0x9B22, 0x9B24, 0x9B25, 0x9B26, 0x9B27, 0x9B28, 0x9B29, + 0x9B2A, 0x9B2B, 0x9B2C, 0x9B2D, 0x9B2E, 0x9B30, 0x9B31, 0x9B33, + 0x9B34, 0x9B35, 0x9B36, 0x9B37, 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, + 0x9B3E, 0x9B3F, 0x9B40, 0x9B46, 0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, + 0x9B50, 0x9B52, 0x9B53, 0x9B55, 0x9B56, 0x9B57, 0x9B58, 0x9B59, + 0x9B5A, 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60, 0x9B61, + 0x9B62, 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68, 0x9B69, + 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, 0x9B70, 0x9B71, + 0x9B72, 0x9B73, 0x9B74, 0x9B75, 0x9B76, 0x9B77, 0x9B78, 0x9B79, + 0x9B7A, 0x9B7B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, + 0x81FE, 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, + 0x8223, 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, + 0x8234, 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, + 0x8268, 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, + 0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, + 0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, + 0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, + 0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, +plane 87 +at 0x00 + 0x7FEE, 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, + 0x9EB8, 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, + 0x8D6D, 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, + 0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B81, 0x9B82, 0x9B83, + 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, + 0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, 0x9B90, 0x9B91, 0x9B92, 0x9B93, + 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99, 0x9B9A, 0x9B9B, + 0x9B9C, 0x9B9D, 0x9B9E, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, + 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAA, 0x9BAB, + 0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, 0x9BB0, 0x9BB1, 0x9BB2, 0x9BB3, + 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8, 0x9BB9, 0x9BBA, 0x9BBB, + 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC0, 0x9BC1, 0x9BC2, 0x9BC3, + 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC7, 0x9BC8, 0x9BC9, 0x9BCA, 0x9BCB, + 0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, 0x9BD3, + 0x9BD4, 0x9BD5, 0x9BD6, 0x9BD7, 0x9BD8, 0x9BD9, 0x9BDA, 0x9BDB, + 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, 0x9172, + 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, + 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, + 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, + 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, + 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, + 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, + 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, + 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, + 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, + 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, + 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, 0x9BDC, 0x9BDD, + 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE1, 0x9BE2, 0x9BE3, 0x9BE4, 0x9BE5, + 0x9BE6, 0x9BE7, 0x9BE8, 0x9BE9, 0x9BEA, 0x9BEB, 0x9BEC, 0x9BED, + 0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, 0x9BF2, 0x9BF3, 0x9BF4, 0x9BF5, + 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA, 0x9BFB, 0x9BFC, 0x9BFD, + 0x9BFE, 0x9BFF, 0x9C00, 0x9C01, 0x9C02, 0x9C03, 0x9C04, 0x9C05, +plane 88 +at 0x00 + 0x9C06, 0x9C07, 0x9C08, 0x9C09, 0x9C0A, 0x9C0B, 0x9C0C, 0x9C0D, + 0x9C0E, 0x9C0F, 0x9C10, 0x9C11, 0x9C12, 0x9C13, 0x9C14, 0x9C15, + 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A, 0x9C1B, 0x9C1C, 0x9C1D, + 0x9C1E, 0x9C1F, 0x9C20, 0x9C21, 0x9C22, 0x9C23, 0x9C24, 0x9C25, + 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, 0x9C2B, 0x9C2C, 0x9C2D, + 0x9C2E, 0x9C2F, 0x9C30, 0x9C31, 0x9C32, 0x9C33, 0x9C34, 0x9C35, + 0x9C36, 0x9C37, 0x9C38, 0x9C39, 0x9C3A, 0x9C3B, 0x89E5, 0x89EB, + 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, + 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, 0x972D, 0x9730, 0x973E, + 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, + 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, + 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, + 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, + 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, + 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, + 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, + 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, + 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, + 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, 0x9C3C, 0x9C3D, 0x9C3E, 0x9C3F, + 0x9C40, 0x9C41, 0x9C42, 0x9C43, 0x9C44, 0x9C45, 0x9C46, 0x9C47, + 0x9C48, 0x9C49, 0x9C4A, 0x9C4B, 0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, + 0x9C50, 0x9C51, 0x9C52, 0x9C53, 0x9C54, 0x9C55, 0x9C56, 0x9C57, + 0x9C58, 0x9C59, 0x9C5A, 0x9C5B, 0x9C5C, 0x9C5D, 0x9C5E, 0x9C5F, + 0x9C60, 0x9C61, 0x9C62, 0x9C63, 0x9C64, 0x9C65, 0x9C66, 0x9C67, + 0x9C68, 0x9C69, 0x9C6A, 0x9C6B, 0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, + 0x9C70, 0x9C71, 0x9C72, 0x9C73, 0x9C74, 0x9C75, 0x9C76, 0x9C77, + 0x9C78, 0x9C79, 0x9C7A, 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80, 0x9C83, + 0x9C84, 0x9C89, 0x9C8A, 0x9C8C, 0x9C8F, 0x9C93, 0x9C96, 0x9C97, + 0x9C98, 0x9C99, 0x9C9D, 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, + 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, + 0x9CDA, 0x9CDB, 0x9CE0, 0x9CE1, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, + 0x9CD0, 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, +plane 89 +at 0x00 + 0x9CDD, 0x9CDF, 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, + 0x97AF, 0x97AB, 0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, + 0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, + 0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, + 0x9B4D, 0x9B51, 0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, + 0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, + 0x9B0F, 0x9B13, 0x9B1F, 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, + 0x9E87, 0x9E88, 0x9E8B, 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, + 0x9EDC, 0x9EDD, 0x9EE0, 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, + 0x9EEA, 0x9EEF, 0x9F22, 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, + 0x9F3E, 0x9F44, 0x9CE3, 0x9CE4, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, + 0x9CE9, 0x9CEA, 0x9CEB, 0x9CEC, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, + 0x9CF1, 0x9CF2, 0x9CF3, 0x9CF4, 0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, + 0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, + 0x9D01, 0x9D02, 0x9D03, 0x9D04, 0x9D05, 0x9D06, 0x9D07, 0x9D08, + 0x9D09, 0x9D0A, 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E, 0x9D0F, 0x9D10, + 0x9D11, 0x9D12, 0x9D13, 0x9D14, 0x9D15, 0x9D16, 0x9D17, 0x9D18, + 0x9D19, 0x9D1A, 0x9D1B, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D1F, 0x9D20, + 0x9D21, 0x9D22, 0x9D23, 0x9D24, 0x9D25, 0x9D26, 0x9D27, 0x9D28, + 0x9D29, 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D, 0x9D2E, 0x9D2F, 0x9D30, + 0x9D31, 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37, 0x9D38, + 0x9D39, 0x9D3A, 0x9D3B, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D3F, 0x9D40, + 0x9D41, 0x9D42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 90 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A, + 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D51, 0x9D52, + 0x9D53, 0x9D54, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, + 0x9D5B, 0x9D5C, 0x9D5D, 0x9D5E, 0x9D5F, 0x9D60, 0x9D61, 0x9D62, + 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, 0x9D6A, + 0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, 0x9D6F, 0x9D70, 0x9D71, 0x9D72, + 0x9D73, 0x9D74, 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, + 0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, 0x9D7F, 0x9D80, 0x9D81, 0x9D82, + 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D87, 0x9D88, 0x9D89, 0x9D8A, + 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, 0x9D91, 0x9D92, + 0x9D93, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9D99, 0x9D9A, + 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1, 0x9DA2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x9DA3, 0x9DA4, + 0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DA9, 0x9DAA, 0x9DAB, 0x9DAC, + 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0x9DB1, 0x9DB2, 0x9DB3, 0x9DB4, + 0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC, + 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2, 0x9DC3, 0x9DC4, + 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB, 0x9DCC, + 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD3, 0x9DD4, +plane 91 +at 0x00 + 0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, 0x9DD9, 0x9DDA, 0x9DDB, 0x9DDC, + 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE1, 0x9DE2, 0x9DE3, 0x9DE4, + 0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, 0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, + 0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, 0x9DF1, 0x9DF2, 0x9DF3, 0x9DF4, + 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, 0x9DFA, 0x9DFB, 0x9DFC, + 0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, 0x9E01, 0x9E02, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x9E03, 0x9E04, 0x9E05, 0x9E06, + 0x9E07, 0x9E08, 0x9E09, 0x9E0A, 0x9E0B, 0x9E0C, 0x9E0D, 0x9E0E, + 0x9E0F, 0x9E10, 0x9E11, 0x9E12, 0x9E13, 0x9E14, 0x9E15, 0x9E16, + 0x9E17, 0x9E18, 0x9E19, 0x9E1A, 0x9E1B, 0x9E1C, 0x9E1D, 0x9E1E, + 0x9E24, 0x9E27, 0x9E2E, 0x9E30, 0x9E34, 0x9E3B, 0x9E3C, 0x9E40, + 0x9E4D, 0x9E50, 0x9E52, 0x9E53, 0x9E54, 0x9E56, 0x9E59, 0x9E5D, + 0x9E5F, 0x9E60, 0x9E61, 0x9E62, 0x9E65, 0x9E6E, 0x9E6F, 0x9E72, + 0x9E74, 0x9E75, 0x9E76, 0x9E77, 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, + 0x9E7C, 0x9E7D, 0x9E80, 0x9E81, 0x9E83, 0x9E84, 0x9E85, 0x9E86, + 0x9E89, 0x9E8A, 0x9E8C, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, + 0x9E94, 0x9E95, 0x9E96, 0x9E97, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, + 0x9E9C, 0x9E9E, 0x9EA0, 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, + 0x9EA7, 0x9EA8, 0x9EA9, 0x9EAA, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 92 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, + 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB5, 0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, + 0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, + 0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, 0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, + 0x9ED5, 0x9ED6, 0x9ED7, 0x9ED9, 0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, + 0x9EE4, 0x9EE6, 0x9EE8, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, + 0x9EF1, 0x9EF2, 0x9EF3, 0x9EF4, 0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, + 0x9EFA, 0x9EFD, 0x9EFF, 0x9F00, 0x9F01, 0x9F02, 0x9F03, 0x9F04, + 0x9F05, 0x9F06, 0x9F07, 0x9F08, 0x9F09, 0x9F0A, 0x9F0C, 0x9F0F, + 0x9F11, 0x9F12, 0x9F14, 0x9F15, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, + 0x9F1C, 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, + 0x9F26, 0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, + 0x9F30, 0x9F31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 93 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A, 0x9F3C, + 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46, 0x9F47, + 0x9F48, 0x9F49, 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, + 0x9F52, 0x9F53, 0x9F54, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F59, + 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, 0x9F5F, 0x9F60, 0x9F61, + 0x9F62, 0x9F63, 0x9F64, 0x9F65, 0x9F66, 0x9F67, 0x9F68, 0x9F69, + 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, + 0x9F72, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F77, 0x9F78, 0x9F79, + 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82, 0x9F8D, + 0x9F8E, 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F93, 0x9F94, 0x9F95, + 0x9F96, 0x9F97, 0x9F98, 0x9F9C, 0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, + 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, 0xF979, 0xF995, 0xF9E7, 0xF9F1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0xFA0C, 0xFA0D, + 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, 0xFA1F, 0xFA20, + 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, 0xE815, 0xE816, + 0xE817, 0xE818, 0xE819, 0xE81A, 0xE81B, 0xE81C, 0xE81D, 0xE81E, + 0xE81F, 0xE820, 0xE821, 0xE822, 0xE823, 0xE824, 0xE825, 0xE826, + 0xE827, 0xE828, 0xE829, 0xE82A, 0xE82B, 0xE82C, 0xE82D, 0xE82E, + 0xE82F, 0xE830, 0xE831, 0xE832, 0xE833, 0xE834, 0xE835, 0xE836, + 0xE837, 0xE838, 0xE839, 0xE83A, 0xE83B, 0xE83C, 0xE83D, 0xE83E, +plane 94 +at 0x00 + 0xE83F, 0xE840, 0xE841, 0xE842, 0xE843, 0xE844, 0xE845, 0xE846, + 0xE847, 0xE848, 0xE849, 0xE84A, 0xE84B, 0xE84C, 0xE84D, 0xE84E, + 0xE84F, 0xE850, 0xE851, 0xE852, 0xE853, 0xE854, 0xE855, 0xE856, + 0xE857, 0xE858, 0xE859, 0xE85A, 0xE85B, 0xE85C, 0xE85D, 0xE85E, + 0xE85F, 0xE860, 0xE861, 0xE862, 0xE863, 0xE864, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/ubig5.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ubig5.map new file mode 100644 index 00000000..bd656821 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ubig5.map @@ -0,0 +1,2184 @@ +# BIG5 --> Unicode conversion table: +# generated by Chen Xiangyang (chenxy@sun.ihep.ac.cn) +# +# it contains 13703 characters of BIG5 character set, it also contains +# some unused codes in order to make the array easy to use. +# Code range: first byte: 0xa1 -- 0xFE 94 +# second byte: 0x40 -- 0x7F 64 +# 0xA1 -- 0xFF 96 +# code points: 94 x 160 = 15040 +# +# Usage: +# +# unsigned short BIG5_code, unicode; +# int pos; +# if ((BIG5_code&0x00FF)<=0x7F) +# pos = ((BIG5_code>>8)-0xa1)*160 + ((BIG5_code&0x00FF)-0x40); +# else +# pos = ((BIG5_code>>8)-0xa1)*160 + ((BIG5_code&0x00FF)-0x60); +# unicode = big52uni[pos]; +# +# Converted to ttf2pt1 map format by Sergey Babkin +# +plane a1 +at 0x40 + 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2022, 0xFF1B, 0xFF1A, + 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFF64, 0xFE52, + 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31, + 0x2014, 0xFE33, 0, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, + 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, + 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, + 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, + 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, 0, +at 0xA0 + 0, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, + 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, + 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, + 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, + 0x32A3, 0x2105, 0x203E, 0, 0xFF3F, 0, 0xFE49, 0xFE4A, + 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, + 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, + 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, + 0xFE64, 0xFE65, 0xFE66, 0x223C, 0x2229, 0x222A, 0x22A5, 0x2220, + 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, + 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192, + 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0, 0, +plane a2 +at 0x40 + 0, 0xFF0F, 0xFF3C, 0xFF04, 0x00A5, 0x3012, 0x00A2, 0x00A3, + 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, + 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, + 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, + 0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, + 0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, + 0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, + 0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, 0, +at 0xA0 + 0, 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, + 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10, + 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, + 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, + 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, + 0x3026, 0x3027, 0x3028, 0x3029, 0, 0x5344, 0, 0xFF21, + 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, + 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, + 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, + 0xFF3A, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0, +plane a3 +at 0x40 + 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394, + 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, + 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, + 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, + 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, + 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, + 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x3105, 0x3106, 0x3107, 0x3108, + 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, 0, +at 0xA0 + 0, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, + 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, + 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, + 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, 0x02CA, 0x02C7, 0x02CB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a4 +at 0x40 + 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C, + 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B, + 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A, + 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E, + 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F, + 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, 0x5B53, 0x5BF8, + 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, 0x5DF1, 0x5DF2, + 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, 0x624D, 0, +at 0xA0 + 0, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B, + 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1, + 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4, + 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6, + 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316, 0x5339, + 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA, 0x53CD, + 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11, 0x5C24, + 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, 0x5FC3, + 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4, + 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, + 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236, + 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19, 0, +plane a5 +at 0x40 + 0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, + 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, + 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9, + 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317, + 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E, + 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8, + 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1, + 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, 0, +at 0xA0 + 0, 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, + 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, + 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, + 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, + 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, + 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, + 0x7530, 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, + 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, + 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, + 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, + 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, + 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0, +plane a6 +at 0x40 + 0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216, + 0x52A3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F, + 0x540C, 0x540A, 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D, + 0x5408, 0x5403, 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, + 0x5733, 0x5730, 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, 0x5919, + 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, 0x5979, + 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, + 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, 0, +at 0xA0 + 0, 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, + 0x6210, 0x6263, 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, + 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, + 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, + 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070, + 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A, + 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, + 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, + 0x821F, 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, + 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, + 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, + 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C, 0x4F46, 0x4F63, 0, +plane a7 +at 0x40 + 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59, 0x4F5D, 0x4F48, + 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6, 0x51B7, 0x5225, + 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, 0x52AC, + 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426, + 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B, + 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436, + 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA, + 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740, 0x574D, 0, +at 0xA0 + 0, 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF, + 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996, + 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, + 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F, + 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, + 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77, + 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, + 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, + 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292, + 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, + 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750, + 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760, 0, +plane a8 +at 0x40 + 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81, + 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70, + 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E, + 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076, + 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2, + 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3, + 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093, + 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, 0, +at 0xA0 + 0, 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, + 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, + 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2, + 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E, + 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B, + 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F, + 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88, + 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154, + 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD, + 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, 0x5241, + 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, + 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475, 0, +plane a9 +at 0x40 + 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492, + 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462, + 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, + 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, + 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, + 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, + 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, + 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, 0, +at 0xA0 + 0, 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1, + 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, + 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, + 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, + 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, + 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, + 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF, + 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB, + 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD, + 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC, + 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, + 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A, 0, +plane aa +at 0x40 + 0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, + 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, + 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C, 0x676A, + 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3, + 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE, + 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9, + 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, + 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, 0, +at 0xA0 + 0, 0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, + 0x7238, 0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, + 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, + 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, + 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, + 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, + 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, + 0x81FE, 0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, + 0x82B9, 0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, + 0x82BE, 0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, + 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, + 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644, 0, +plane ab +at 0x40 + 0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, + 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, + 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, + 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192, + 0x5191, 0x51A0, 0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B, + 0x5247, 0x52C7, 0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B, + 0x539A, 0x53DB, 0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8, + 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1, 0, +at 0xA0 + 0, 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9, + 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2, + 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950, + 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA, + 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, + 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, + 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, + 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, 0x5F8A, 0x5F8B, + 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, 0x600E, + 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C, + 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC, + 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7, 0, +plane ac +at 0x40 + 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545, + 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, 0x6627, 0x662F, + 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, 0x67D3, 0x67F1, + 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, 0x67E9, 0x67EF, + 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, 0x67DE, + 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83, + 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32, + 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17, 0, +at 0xA0 + 0, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, 0x6D39, + 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, 0x70AB, + 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE, 0x70A4, + 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, 0x73B7, + 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D, + 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2, + 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3, + 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC, + 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946, 0x7949, + 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB, 0x7A7F, + 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00, 0x7D09, + 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8004, 0, +plane ad +at 0x40 + 0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, + 0x80C4, 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, + 0x81F4, 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, + 0x8304, 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, + 0x82DC, 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, + 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, + 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, + 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, 0, +at 0xA0 + 0, 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, + 0x90C3, 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, + 0x964D, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, + 0x98DB, 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, + 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, + 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, + 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, + 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, + 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, + 0x525B, 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, + 0x5510, 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, + 0x5514, 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, 0x54EA, 0, +plane ae +at 0x40 + 0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, 0x57C2, + 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, 0x595A, + 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, 0x5A20, + 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0, + 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, + 0x5C51, 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, + 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, + 0x5EAD, 0x5EA7, 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, 0, +at 0xA0 + 0, 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, 0x6069, 0x606F, + 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, 0x6096, + 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, + 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, + 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, + 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, + 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, + 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817, + 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843, + 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7, + 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95, + 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93, 0, +plane af +at 0x40 + 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, + 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9, + 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8, + 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA, 0x73DE, + 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5, 0x75C7, + 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8, 0x768B, + 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, 0x7728, + 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837, 0, +at 0xA0 + 0, 0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950, + 0x7960, 0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4, + 0x79E3, 0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88, + 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, + 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, + 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006, + 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102, + 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108, + 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210, + 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354, + 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332, + 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, 0, +plane b0 +at 0x40 + 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3, + 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18, + 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16, + 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77, + 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7, + 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095, + 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD, + 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661, 0, +at 0xA0 + 0, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2, + 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A, + 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, 0x5065, + 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, 0x500F, + 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2, + 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, 0x5340, + 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, 0x555E, + 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, 0x552F, + 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, 0x5541, + 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, 0x5806, + 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920, + 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40, 0, +plane b1 +at 0x40 + 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, + 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, + 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, + 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2, + 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, + 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, + 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3, + 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, 0, +at 0xA0 + 0, 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, + 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, + 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367, + 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B, + 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F, + 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551, + 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, + 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, + 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, + 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, + 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, + 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA, 0, +plane b2 +at 0x40 + 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2, + 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB, + 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, + 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, + 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, + 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, + 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, + 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6, 0, +at 0xA0 + 0, 0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, + 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, + 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, + 0x786B, 0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, + 0x7A95, 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, + 0x7B2E, 0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, + 0x7D39, 0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, + 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, + 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, + 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, + 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, + 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C, 0, +plane b3 +at 0x40 + 0x8386, 0x83A7, 0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4, + 0x86B5, 0x86C6, 0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E, + 0x8888, 0x88AB, 0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F, + 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, + 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, + 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, + 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015, + 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, 0x9014, 0, +at 0xA0 + 0, 0x90E8, 0x90ED, 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6, + 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, 0x966A, 0x9675, 0x9673, + 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966C, 0x96C0, 0x96EA, + 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, 0x9CE5, 0x9E75, + 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, 0x5091, + 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274, + 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B, + 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C, + 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F, + 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589, + 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, 0x5834, 0x5824, 0x5830, + 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, 0x58FA, 0x5960, 0, +plane b4 +at 0x40 + 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, 0x5B71, + 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C, + 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43, + 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9, + 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C, + 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1, + 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, 0x6249, 0x63A3, + 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, 0x63CD, 0, +at 0xA0 + 0, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE, + 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E, + 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670, + 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE, + 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7, + 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2, 0x68F2, + 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9, 0x68DA, + 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, 0x6BBC, + 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, 0x6E21, + 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B, + 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34, + 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, 0, +plane b5 +at 0x40 + 0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F, + 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C, + 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A, + 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F, + 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2, + 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C, + 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C, + 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, 0, +at 0xA0 + 0, 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, + 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, + 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, + 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, + 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, + 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, + 0x83E9, 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, + 0x83EF, 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, + 0x83FD, 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, + 0x83D4, 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, + 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, + 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41, 0, +plane b6 +at 0x40 + 0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, + 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, + 0x8CC0, 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, + 0x8D81, 0x8DCE, 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, + 0x8DC6, 0x8EFB, 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, + 0x9038, 0x9032, 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, + 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, 0x920D, + 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, 0, +at 0xA0 + 0, 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, + 0x9685, 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, + 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, + 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, + 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3, + 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F, + 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F, + 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1, + 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, + 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, + 0x5854, 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, + 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC, 0, +plane b7 +at 0x40 + 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, + 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A, 0x610F, 0x6148, + 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108, 0x614E, 0x614C, + 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, 0x6137, + 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D, + 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417, + 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688, + 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994, 0x696D, 0, +at 0xA0 + 0, 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, + 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D, + 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD, + 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, + 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, + 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159, + 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C, + 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337, + 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E, + 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600, + 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3, + 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763, 0, +plane b8 +at 0x40 + 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE, + 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891, + 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C, + 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77, + 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93, + 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A, + 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084, + 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, 0, +at 0xA0 + 0, 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, + 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, 0x845B, + 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, 0x865E, + 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86FE, + 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4, + 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2, + 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70, + 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62, + 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A, + 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2, + 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA, + 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, 0, +plane b9 +at 0x40 + 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C, + 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E, + 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237, + 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, + 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, + 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, + 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, + 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, 0, +at 0xA0 + 0, 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9, + 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6, + 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, + 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, + 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, + 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, + 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, + 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6, + 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7, + 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D, + 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54, + 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147, 0, +plane ba +at 0x40 + 0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, + 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, + 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, + 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995, + 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB, + 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3, + 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4, + 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, 0, +at 0xA0 + 0, 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, + 0x6F15, 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, + 0x6ECC, 0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, + 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, + 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, + 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, + 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, + 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, + 0x7B8B, 0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, + 0x7B84, 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, + 0x7DBE, 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, + 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC, 0, +plane bb +at 0x40 + 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150, + 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA, + 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4, + 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3, + 0x8490, 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722, + 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902, + 0x88F4, 0x88F9, 0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6, + 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4, 0, +at 0xA0 + 0, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, 0x8AA7, + 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, + 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060, + 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B, + 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, + 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, + 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, + 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, + 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, + 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, + 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, + 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC, 0, +plane bc +at 0x40 + 0x5287, 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E, + 0x563B, 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E, + 0x5657, 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, 0x589F, 0x589E, + 0x58B3, 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, 0x5B09, 0x5AFB, + 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, + 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, 0x5E61, 0x5EE2, + 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, 0x5FB7, + 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182, 0, +at 0xA0 + 0, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB, + 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469, + 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490, 0x64B0, 0x64A5, + 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD, 0x64AB, 0x649A, + 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, 0x6578, 0x66AE, + 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, 0x6A1E, + 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05, + 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F, + 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B, + 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58, + 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8, + 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B, 0x7483, 0, +plane bd +at 0x40 + 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624, 0x7626, + 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, 0x778C, + 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5, + 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, + 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, + 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, + 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, + 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF, 0, +at 0xA0 + 0, 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, + 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, + 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, + 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, + 0x8757, 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, + 0x8913, 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, + 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, + 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, + 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, + 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, + 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, + 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, 0, +plane be +at 0x40 + 0x8F25, 0x9069, 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, + 0x9127, 0x9131, 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, + 0x92B7, 0x92EA, 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, + 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, + 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, 0x981C, + 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, + 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, + 0x9B27, 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, 0, +at 0xA0 + 0, 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112, + 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291, + 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, 0x5664, 0x5678, + 0x566A, 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, 0x5676, + 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, + 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, + 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, + 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, + 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, + 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, + 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F, + 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1, 0, +plane bf +at 0x40 + 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, + 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8, + 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368, + 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D, + 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F, + 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, + 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4, + 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, 0x7E0A, 0, +at 0xA0 + 0, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09, + 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3, + 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559, + 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E, + 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932, + 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB, + 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02, + 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93, + 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B, + 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078, + 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8, + 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A, 0, +plane c0 +at 0x40 + 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7, + 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713, + 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B, + 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B, + 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB, + 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12, + 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121, + 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, 0, +at 0xA0 + 0, 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A, + 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8, + 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB, + 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6, + 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6, + 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E, + 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8, + 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80, + 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF, + 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235, + 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646, + 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC, 0, +plane c1 +at 0x40 + 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, + 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, + 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, + 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, + 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35, + 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070, + 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF, + 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, 0, +at 0xA0 + 0, 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, + 0x8587, 0x85A8, 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, + 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, + 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, + 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73, + 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B, + 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F, + 0x907D, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E, + 0x919C, 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, + 0x9318, 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, + 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, + 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01, 0, +plane c2 +at 0x40 + 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, + 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2, + 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D, 0x61E3, 0x6233, + 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7, + 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, + 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, + 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, + 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658, 0, +at 0xA0 + 0, 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE, + 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A, + 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A, + 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076, + 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9, + 0x85B0, 0x85BA, 0x85B9, 0x85A6, 0x87EF, 0x87EC, 0x87F2, 0x87E0, + 0x8986, 0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, + 0x8D05, 0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, + 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, + 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, + 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, + 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6, 0, +plane c3 +at 0x40 + 0x97AD, 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA, + 0x993E, 0x993F, 0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, + 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, + 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133, + 0x56A5, 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, + 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5, + 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D, + 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, 0, +at 0xA0 + 0, 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, + 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, + 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, + 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, + 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, + 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, + 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, + 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, + 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, + 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, + 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, + 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, 0x97FB, 0x985E, 0, +plane c4 +at 0x40 + 0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, 0x9A19, 0x9B0D, + 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, 0x9D72, 0x9D6A, + 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56A8, 0x56B7, + 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6, + 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727, + 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662, + 0x7665, 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C, + 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, 0x7E7C, 0, +at 0xA0 + 0, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, 0x85F9, + 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, 0x8815, + 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F, + 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4, + 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952, + 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D, + 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, 0x5137, + 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD, 0x61FC, + 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04, 0x6AFA, + 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, 0x77D3, + 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823, + 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74, 0, +plane c5 +at 0x40 + 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, + 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B, + 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957, + 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D, + 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, + 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9, + 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61, + 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, 0, +at 0xA0 + 0, 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, + 0x896F, 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, + 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, + 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, + 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, + 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, + 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, + 0x81E2, 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, + 0x9460, 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, + 0x9AD3, 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, + 0x9EF4, 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, + 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92, 0, +plane c6 +at 0x40 + 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, + 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, + 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, + 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, + 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, + 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, + 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, + 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, 0, +at 0xA0 + 0, 0x30FE, 0x309D, 0x309E, 0x3005, 0x3041, 0x3042, 0x3043, + 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, + 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, + 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, + 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, + 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, + 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, + 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, + 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, + 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, + 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, + 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0, +plane c7 +at 0x40 + 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, + 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, + 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, + 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, + 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, + 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, + 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, + 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0, +at 0xA0 + 0, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, + 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, + 0x30F6, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, + 0x041A, 0x041B, 0x041C, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, + 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, + 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, + 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, + 0x044F, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, + 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, + 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0, 0, 0, +plane c8 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane c9 +at 0x40 + 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, + 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, + 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, + 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, + 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, + 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723, + 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73, + 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, 0, +at 0xA0 + 0, 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, + 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, + 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, + 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210, + 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF, + 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B, + 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A, + 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74, + 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, + 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E, + 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, + 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B, 0, +plane ca +at 0x40 + 0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, + 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F, 0x864D, + 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622, 0x9624, + 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64, + 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33, + 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, + 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, + 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418, 0, +at 0xA0 + 0, 0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, + 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, + 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, + 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, + 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, + 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, + 0x5E88, 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, + 0x5FD0, 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, + 0x5FFA, 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, + 0x628C, 0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, + 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x6537, + 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747, 0, +plane cb +at 0x40 + 0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, 0x675A, 0x674B, + 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, + 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, + 0x6C9C, 0x6C66, 0x6C73, 0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A, + 0x7263, 0x72BF, 0x72BD, 0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5, + 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753A, 0x7539, 0x7594, + 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, + 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, 0x8293, 0, +at 0xA0 + 0, 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F, + 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F, + 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87, + 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, 0x4F4C, 0x4F97, 0x4F6A, + 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, 0x4F9C, 0x4F94, 0x4F9E, + 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, 0x51BC, 0x51BE, + 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, 0x530B, + 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482, + 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466, + 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, + 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770, + 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, 0x5774, 0x5762, 0, +plane cc +at 0x40 + 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, 0x59CF, 0x59CE, + 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, 0x59D6, 0x59B1, + 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, 0x5B93, + 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF, + 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7, + 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19, + 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D, + 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, 0x600B, 0, +at 0xA0 + 0, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C, + 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009, + 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA, + 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0, + 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612, + 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611, + 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776, + 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A, + 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779, + 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC, + 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7, + 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, 0, +plane cd +at 0x40 + 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, + 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, + 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, + 0x7082, 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, + 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, + 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, + 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, + 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, 0, +at 0xA0 + 0, 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, + 0x7C75, 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, + 0x80AD, 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, + 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, + 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, + 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, + 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, + 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, + 0x4FB2, 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, + 0x4FB3, 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, + 0x5244, 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, + 0x5399, 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, 0x54CF, 0, +plane ce +at 0x40 + 0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, 0x54C6, + 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, 0x54B0, + 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B, + 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4, + 0x590D, 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD, + 0x59FA, 0x59FD, 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB, + 0x59E9, 0x59F3, 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8, + 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, 0, +at 0xA0 + 0, 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3, + 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, + 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, + 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, + 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, + 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, + 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5, + 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6, + 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541, + 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, 0x661C, + 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, + 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA, 0, +plane cf +at 0x40 + 0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB, + 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE, + 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2, 0x67FC, + 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA, 0x67C9, + 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84, 0x6BB6, + 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, 0x6D2D, + 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, + 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42, 0, +at 0xA0 + 0, 0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07, + 0x6D20, 0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F, + 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241, + 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4, + 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC, + 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB, + 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC, + 0x74EE, 0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4, + 0x7708, 0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA, + 0x77E7, 0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F, + 0x780E, 0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945, + 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80, 0, +plane d0 +at 0x40 + 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F, + 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D, + 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7, + 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9, + 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD, + 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8, + 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1, + 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA, 0, +at 0xA0 + 0, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, 0x8674, + 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, 0x89D3, + 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, 0x90F1, + 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, 0x90C8, + 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, 0x964E, + 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, 0x4FF5, + 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, 0x501C, + 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, 0x5194, + 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, 0x525A, + 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, 0x539E, + 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, 0x551A, + 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1, 0, +plane d1 +at 0x40 + 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, + 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6, + 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9, + 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15, + 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, + 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, + 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, + 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, 0, +at 0xA0 + 0, 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D, + 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219, + 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336, + 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341, + 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, + 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, + 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, + 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, + 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, + 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828, + 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D, + 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4, 0, +plane d2 +at 0x40 + 0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, + 0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, + 0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, + 0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, + 0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, + 0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39, + 0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5, + 0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, 0, +at 0xA0 + 0, 0x7277, 0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, + 0x72F3, 0x72FB, 0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, + 0x73E7, 0x73E3, 0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, + 0x73DA, 0x73D7, 0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, + 0x7521, 0x755B, 0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, + 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, + 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, + 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, + 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, + 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, + 0x79EE, 0x79ED, 0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, + 0x7A85, 0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, 0, +plane d3 +at 0x40 + 0x7B04, 0x7B13, 0x7B05, 0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, + 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, + 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F, + 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, + 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E, + 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100, + 0x8201, 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, 0x8319, 0x8351, + 0x8325, 0x8356, 0x833F, 0x8341, 0x8326, 0x831C, 0x8322, 0, +at 0xA0 + 0, 0x8342, 0x834E, 0x831B, 0x832A, 0x8308, 0x833C, 0x834D, + 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, 0x8347, 0x8345, + 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, 0x8653, + 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687, + 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1, + 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843, + 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F, + 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57, + 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, + 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, 0x8FFF, 0x8FFB, 0x9004, + 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, 0x90E3, 0x90DF, + 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150, 0, +plane d4 +at 0x40 + 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC, + 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E, + 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041, + 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, 0x5069, 0x506B, + 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, 0x5057, 0x5051, + 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, 0x52D3, 0x532D, + 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, 0x5534, 0x552A, + 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0, +at 0xA0 + 0, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D, + 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2, + 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8, + 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5, + 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C, + 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58, + 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F, + 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52, + 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C, + 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72, + 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A, + 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, 0, +plane d5 +at 0x40 + 0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, + 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, + 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, + 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, + 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, + 0x638A, 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, + 0x63AB, 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, + 0x639C, 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, 0, +at 0xA0 + 0, 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, 0x6370, 0x6553, + 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, 0x6718, + 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, + 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, + 0x688F, 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, + 0x6871, 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, + 0x6878, 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, + 0x6B37, 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, + 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, + 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, + 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, + 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, 0, +plane d6 +at 0x40 + 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, + 0x70FA, 0x710D, 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104, + 0x70F3, 0x7110, 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8, + 0x70F6, 0x710B, 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, 0x727F, + 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, 0x72FF, + 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, 0x7401, + 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, 0x740B, + 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, 0, +at 0xA0 + 0, 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, + 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, + 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849, 0x784D, 0x784A, + 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796A, + 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7, + 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30, + 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, + 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, + 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, + 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, + 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, + 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9, 0x801F, 0, +plane d7 +at 0x40 + 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, + 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, 0x8127, + 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232, + 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4, + 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9, + 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E, + 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387, + 0x83AE, 0x8376, 0x839A, 0x8659, 0x8656, 0x86BF, 0x86B7, 0, +at 0xA0 + 0, 0x86C2, 0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9, + 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD, + 0x86BE, 0x8852, 0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A, + 0x8891, 0x88A1, 0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897, + 0x88A4, 0x88AC, 0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9, + 0x89D5, 0x8A30, 0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, + 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, + 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, + 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021, + 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB, + 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC, + 0x91F4, 0x91F1, 0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA, 0, +plane d8 +at 0x40 + 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, 0x9586, 0x9588, 0x967C, + 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5, + 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, 0x508B, 0x50A3, 0x5083, + 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, 0x5082, 0x5087, + 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8, + 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, 0x5588, 0x558F, + 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6, + 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, 0x5837, 0, +at 0xA0 + 0, 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, 0x5848, + 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, 0x5839, + 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, 0x5A9F, + 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, 0x5AAC, + 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, 0x5A8B, + 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, 0x5A9D, + 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, 0x5C0C, + 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, 0x5D35, + 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, 0x5D31, + 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, 0x5D36, + 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, 0x5FAB, + 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114, 0, +plane d9 +at 0x40 + 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, + 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, + 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, + 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, + 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, + 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0, + 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568, + 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, 0, +at 0xA0 + 0, 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, + 0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, + 0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, + 0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, + 0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD, + 0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD, + 0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915, + 0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97, + 0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, + 0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, + 0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, + 0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0, +plane da +at 0x40 + 0x6E68, 0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, + 0x6E39, 0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, + 0x6E77, 0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, + 0x7120, 0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, + 0x7122, 0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, + 0x7288, 0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, + 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, + 0x7335, 0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, 0, +at 0xA0 + 0, 0x741A, 0x7421, 0x742D, 0x7431, 0x7424, 0x7423, 0x741D, + 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, + 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, + 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, 0x774D, 0x7745, 0x774A, + 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, + 0x785C, 0x786D, 0x7871, 0x786A, 0x786E, 0x7870, 0x7869, 0x7868, + 0x785E, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, + 0x7A03, 0x7A0C, 0x7A04, 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B3B, + 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, + 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, + 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, + 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, 0, +plane db +at 0x40 + 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, 0x804F, 0x8050, + 0x80FE, 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, 0x8147, 0x813D, + 0x814D, 0x813A, 0x81E6, 0x81EE, 0x81F7, 0x81F8, 0x81F9, 0x8204, + 0x823C, 0x823D, 0x823F, 0x8275, 0x833B, 0x83CF, 0x83F9, 0x8423, + 0x83C0, 0x83E8, 0x8412, 0x83E7, 0x83E4, 0x83FC, 0x83F6, 0x8410, + 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, 0x8401, 0x83DD, 0x83E5, + 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, 0x83F5, 0x83C9, + 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, 0x83F3, 0, +at 0xA0 + 0, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x83C3, + 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB, + 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA, + 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1, + 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, 0x88B9, 0x88B8, 0x88C0, + 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, 0x88B2, 0x8901, 0x88C9, + 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, 0x8A4E, 0x8A4D, + 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, 0x8A52, + 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80, + 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89, + 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, + 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA, 0, +plane dc +at 0x40 + 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6, + 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, 0x9034, 0x902F, + 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, 0x90F9, 0x90FB, + 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915F, + 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226, + 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204, + 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, + 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, 0x9688, 0, +at 0xA0 + 0, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1, + 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6, + 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE, + 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA, + 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278, + 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA, + 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D, + 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9, + 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849, + 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D, + 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8, + 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, 0, +plane dd +at 0x40 + 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, + 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, + 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, + 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, + 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, + 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, + 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, + 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0, +at 0xA0 + 0, 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437, + 0x6422, 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, + 0x642F, 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, + 0x641B, 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, + 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, 0x6694, 0x6678, + 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, 0x6971, 0x693F, + 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, 0x6948, + 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, + 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941, + 0x6974, 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951, + 0x6932, 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, + 0x6B42, 0x6B48, 0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, 0x6BFC, 0, +plane de +at 0x40 + 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, 0x6EC0, + 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, 0x6ED2, + 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6, + 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92, + 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA, + 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, + 0x7141, 0x715D, 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, 0x7142, + 0x7158, 0x7143, 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, 0, +at 0xA0 + 0, 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, 0x7291, + 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, + 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, + 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, + 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, + 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, + 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD, + 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769, 0x7767, + 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F, + 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899, + 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, + 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13, 0, +plane df +at 0x40 + 0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, + 0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70, + 0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, + 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B, + 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D, + 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB, + 0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B, + 0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, 0, +at 0xA0 + 0, 0x8144, 0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242, + 0x8245, 0x84F1, 0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D, + 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D, + 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437, + 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, + 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439, + 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447, + 0x8436, 0x8433, 0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454, + 0x846E, 0x8450, 0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6, + 0x86F5, 0x874D, 0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D, + 0x8705, 0x88D6, 0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA, + 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4, 0, +plane e0 +at 0x40 + 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F, + 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81, + 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66, + 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C, + 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0, + 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2, + 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00, + 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, 0x9052, 0x903F, 0, +at 0xA0 + 0, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, 0x9111, + 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, 0x9252, + 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, 0x922E, + 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, 0x926F, + 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, + 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, 0x959E, + 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, 0x96FD, + 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, 0x980D, + 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, 0x99B5, + 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, 0x9EFD, + 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, 0x50DD, + 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0, 0, +plane e1 +at 0x40 + 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, + 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613, + 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C, + 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A, + 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894, + 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, + 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, + 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, 0, +at 0xA0 + 0, 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, + 0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D, + 0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7, + 0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43, + 0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, + 0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, + 0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, + 0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, + 0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, + 0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C, + 0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0, + 0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, 0, +plane e2 +at 0x40 + 0x69A0, 0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, + 0x698E, 0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, + 0x69BD, 0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, + 0x6993, 0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, + 0x69B5, 0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, + 0x6BA0, 0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, + 0x6F25, 0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, + 0x6F1A, 0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0, +at 0xA0 + 0, 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, + 0x6F3C, 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, + 0x6EF6, 0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, + 0x6F08, 0x6F21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, + 0x718F, 0x717B, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, + 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, 0x734C, 0x7462, 0x7473, + 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, 0x7500, 0x7502, 0x7503, + 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, 0x7615, 0x7611, 0x760A, + 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, 0x7782, 0x776E, 0x7780, + 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, + 0x787E, 0x78AB, 0x789E, 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, + 0x7998, 0x798A, 0x798B, 0x7996, 0x7995, 0x7994, 0x7993, 0, +plane e3 +at 0x40 + 0x7997, 0x7988, 0x7992, 0x7990, 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, + 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, + 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, + 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, + 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, + 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, + 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, + 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, 0x7FDE, 0, +at 0xA0 + 0, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186, 0x8183, 0x8187, + 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, 0x84A1, 0x849F, + 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, 0x84B4, + 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7, + 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF, + 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4, + 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, + 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719, 0x871B, 0x8743, + 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732, 0x872A, 0x872D, + 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, + 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, 0x88E7, 0x88F1, + 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB, 0, +plane e4 +at 0x40 + 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9, + 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96, + 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09, + 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06, + 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E, 0x8F0D, + 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A, 0x9124, + 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5, 0x92A4, + 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D, 0, +at 0xA0 + 0, 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, + 0x92EE, 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, + 0x928A, 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, + 0x929D, 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, + 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, + 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, + 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, + 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, + 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, + 0x5130, 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, + 0x50FD, 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, + 0x564C, 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658, 0, +plane e5 +at 0x40 + 0x565A, 0x5640, 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, + 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, + 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, + 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, + 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, + 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, + 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, + 0x618B, 0x6183, 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, 0, +at 0xA0 + 0, 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, 0x6192, 0x61AA, + 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, 0x6496, + 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C, + 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579, + 0x657B, 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7, + 0x66AA, 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15, + 0x69F1, 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D, + 0x69FE, 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, 0x69E7, 0x6A40, + 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, 0x6A09, 0x6A04, + 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, 0x69F4, 0x6A16, + 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, 0x6BFF, + 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92, 0, +plane e6 +at 0x40 + 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96, + 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57, + 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67, + 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, 0x6F77, + 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, 0x719A, + 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, 0x71AA, + 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, 0x735E, + 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, 0, +at 0xA0 + 0, 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, + 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, + 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628, 0x761B, + 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789, 0x7788, + 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8, + 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2, + 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, + 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, + 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, + 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, + 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, + 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F, 0, +plane e7 +at 0x40 + 0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253, + 0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500, + 0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C, + 0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2, + 0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9, + 0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E, + 0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9, + 0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, 0, +at 0xA0 + 0, 0x8756, 0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758, + 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D, + 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A, + 0x876E, 0x875C, 0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767, + 0x8769, 0x885A, 0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918, + 0x8919, 0x8906, 0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4, + 0x89A3, 0x89ED, 0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, + 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, + 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, + 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, + 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E, + 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27, 0, +plane e8 +at 0x40 + 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C, + 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073, + 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, 0x912B, 0x9129, 0x912A, + 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, 0x918A, 0x9181, 0x9182, + 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6, + 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC, + 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD, + 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, 0x92D3, 0, +at 0xA0 + 0, 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, 0x95AB, + 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, 0x9702, + 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, 0x981D, + 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, 0x9908, + 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, 0x99CD, + 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, 0x99CB, + 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1, + 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, 0x9B75, + 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF, + 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, 0x9D04, + 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, 0x511A, + 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E, 0, +plane e9 +at 0x40 + 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C, + 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC, + 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, + 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, + 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, + 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, + 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8, + 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, 0, +at 0xA0 + 0, 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF, + 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533, + 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, + 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, + 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, + 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, + 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, + 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54, + 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03, + 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8, + 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5, + 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8, 0, +plane ea +at 0x40 + 0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, + 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, + 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, + 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C, 0x7365, + 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495, + 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D, 0x7633, + 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D, + 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799, 0, +at 0xA0 + 0, 0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, + 0x78DB, 0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, + 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, + 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, + 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, + 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, + 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, + 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, + 0x7F7B, 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, + 0x81B1, 0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, + 0x81B4, 0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, + 0x8556, 0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558, 0, +plane eb +at 0x40 + 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, + 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555, + 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C, + 0x8663, 0x8665, 0x8664, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792, + 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785, + 0x8790, 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789, + 0x891E, 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922, + 0x8929, 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0, 0, +at 0xA0 + 0, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, + 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, + 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, + 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, + 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, + 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, + 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, + 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, 0x9327, 0x931E, 0x9308, + 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, 0x933C, 0x931B, 0x9323, + 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, + 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324, + 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C, 0, +plane ec +at 0x40 + 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD, + 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9, + 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97F0, + 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, 0x9927, 0x9929, + 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, 0x99E3, 0x99EA, + 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, 0x9AFA, + 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E, + 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95, 0, +at 0xA0 + 0, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14, + 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F, 0x9E88, + 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, 0x9F12, + 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52F4, + 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, 0x5682, + 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25, + 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B, + 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, 0x61C3, + 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE, + 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580, + 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89, + 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, 0, +plane ed +at 0x40 + 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, + 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, + 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, + 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, + 0x71E4, 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, + 0x74AB, 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, + 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, + 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, 0, +at 0xA0 + 0, 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, + 0x78FB, 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, + 0x79A8, 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, + 0x7AC0, 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, + 0x7C0E, 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, + 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, + 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, + 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, + 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, + 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, + 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, + 0x85A0, 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, 0, +plane ee +at 0x40 + 0x8577, 0x857C, 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, + 0x8596, 0x8586, 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, + 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, 0x8668, + 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, + 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, + 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, + 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937, + 0x8942, 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, 0, +at 0xA0 + 0, 0x8B18, 0x8B16, 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, + 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13, + 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94, + 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47, + 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, + 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, + 0x9364, 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, + 0x9350, 0x9351, 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, + 0x9357, 0x9355, 0x9352, 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, + 0x935E, 0x9363, 0x9367, 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0, + 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720, + 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C, 0, +plane ef +at 0x40 + 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A, + 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933, + 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1, + 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB, + 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, + 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1, + 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33, 0x9D41, + 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30, 0, +at 0xA0 + 0, 0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, + 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, + 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131, + 0x512D, 0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699, + 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, + 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6, + 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC, + 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, + 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, + 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005, + 0x7014, 0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, + 0x700A, 0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376, 0, +plane f0 +at 0x40 + 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2, + 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, + 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x78FF, 0x790C, + 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC, + 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D, + 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56, + 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53, + 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, 0x81D1, 0x81D2, 0, +at 0xA0 + 0, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, 0x85C3, + 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, 0x85CB, + 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, 0x85B8, + 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, 0x87EB, + 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, 0x87D3, + 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, 0x87F4, + 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, 0x8950, + 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, 0x8B35, + 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, 0x8B26, + 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, 0x8C75, + 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, 0x8E5C, + 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67, 0, +plane f1 +at 0x40 + 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, + 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5, + 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B, + 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395, + 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4, + 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3, + 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, + 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, 0, +at 0xA0 + 0, 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, + 0x9850, 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, + 0x9A0B, 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, + 0x9A06, 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, + 0x9B4A, 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, + 0x9BB5, 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, + 0x9D53, 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, + 0x9D57, 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, + 0x9EDF, 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, + 0x9F28, 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, + 0x56AB, 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, + 0x58DB, 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, 0, +plane f2 +at 0x40 + 0x5FBF, 0x61FB, 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, + 0x6584, 0x65DE, 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, + 0x6AD9, 0x6ACB, 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, + 0x6ADE, 0x6B60, 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, + 0x702B, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, + 0x702A, 0x720C, 0x720A, 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, + 0x72A4, 0x72A3, 0x72A1, 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, + 0x7660, 0x77C9, 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B, 0, +at 0xA0 + 0, 0x7921, 0x791C, 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68, + 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76, + 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74, + 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE, + 0x8078, 0x81D7, 0x81D5, 0x8264, 0x8261, 0x8263, 0x85EB, 0x85F1, + 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, 0x85D7, 0x85EC, 0x85F2, + 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, 0x85D1, 0x85F0, 0x85E6, + 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, 0x8803, 0x87F6, 0x87F7, + 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A, + 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, 0x8961, 0x895C, 0x8958, + 0x895D, 0x8959, 0x8988, 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48, + 0x8B4A, 0x8B40, 0x8B53, 0x8B56, 0x8B54, 0x8B4B, 0x8B55, 0, +plane f3 +at 0x40 + 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43, 0x8C77, 0x8C76, 0x8C9A, + 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, 0x8DAB, 0x8E6D, + 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, 0x8F52, 0x8F51, + 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, 0x91B0, 0x91AD, + 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, 0x93F9, 0x93EC, + 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, 0x93EE, 0x93E3, + 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93E7, 0x957D, 0x95DA, + 0x95DB, 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, 0x9726, 0, +at 0xA0 + 0, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE, 0x97DF, 0x985C, + 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB, 0x98BE, 0x9948, + 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, 0x9A25, 0x9A1D, + 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, 0x9A1C, + 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, + 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, + 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, + 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78, + 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70, + 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F, 0x9D79, 0x9D7F, + 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC, 0x9F2D, 0x9F40, + 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, 0x56B2, 0, +plane f4 +at 0x40 + 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF, + 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF, + 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9, + 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034, + 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x7040, 0x703B, + 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA, + 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, 0x77CF, 0x77CD, + 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0, +at 0xA0 + 0, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48, + 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80, + 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x820B, 0x8268, 0x8269, + 0x8622, 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, + 0x8609, 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, + 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, + 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, + 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, + 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, + 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, + 0x9428, 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, + 0x9416, 0x9412, 0x93FA, 0x9409, 0x93F8, 0x940A, 0x93FF, 0, +plane f5 +at 0x40 + 0x93FC, 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, + 0x972E, 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, + 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, + 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, + 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, + 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, + 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, + 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, 0, +at 0xA0 + 0, 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, + 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, + 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, + 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, + 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, + 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, + 0x6B03, 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049, + 0x7045, 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A, + 0x77D0, 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, + 0x7E87, 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, + 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, 0x861C, 0x8619, + 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, 0x8625, 0, +plane f6 +at 0x40 + 0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A, + 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45, + 0x8B7A, 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, + 0x8F5B, 0x8F5D, 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B, + 0x9436, 0x9429, 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, 0x9437, + 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, 0x973A, + 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, 0x9956, + 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, 0, +at 0xA0 + 0, 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, + 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, + 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, + 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, + 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD, + 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18, + 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6, + 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, + 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, + 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, + 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, + 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A, 0, +plane f7 +at 0x40 + 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634, + 0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826, + 0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84, + 0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A, + 0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C, + 0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449, + 0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B, + 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, 0, +at 0xA0 + 0, 0x9A49, 0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, + 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33, + 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, + 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, + 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, + 0x9EF0, 0x9F35, 0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, + 0x513D, 0x5299, 0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F, + 0x5F4F, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB, + 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382, + 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C, + 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830, + 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, 0x8973, 0x89FE, 0, +plane f8 +at 0x40 + 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64, + 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, 0x9457, 0x945E, 0x97C4, + 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52, + 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C, + 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4, + 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC, + 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3, + 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, 0x9F4F, 0, +at 0xA0 + 0, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, 0x5B4E, + 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, 0x705D, + 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, 0x79B6, + 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, 0x8835, + 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, 0x91BE, + 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, 0x9743, + 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, 0x9C67, + 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, 0x9E03, + 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, 0x9E04, + 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, 0x652E, + 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, 0x72AA, + 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, 0, +plane f9 +at 0x40 + 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648, + 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5, + 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, + 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, + 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, + 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, + 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74, + 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, 0, +at 0xA0 + 0, 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D, + 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874, + 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, + 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, + 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, + 0x8B9F, 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, + 0x7069, 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fa +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fb +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fc +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fd +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fe +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugb.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugb.map new file mode 100644 index 00000000..2f59ac1e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugb.map @@ -0,0 +1,1236 @@ +# +# GB 2312-80 +# + +plane a1 +at 0xa0 + 0, 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, + 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, + 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, + 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, + 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, + 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, + 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, + 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, + 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, + 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, + 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, + 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0, +plane a2 +at 0xa0 + 0, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, + 0x2177, 0x2178, 0x2179, 0, 0, 0, 0, 0, + 0, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, + 0x248F, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, + 0x2497, 0x2498, 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, + 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, + 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, + 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, + 0x2467, 0x2468, 0x2469, 0, 0, 0x3220, 0x3221, 0x3222, + 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0, + 0, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, + 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0, 0, 0, +plane a3 +at 0xa0 + 0, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, + 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, + 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, + 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, + 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, + 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, + 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, + 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, + 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, + 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0, +plane a4 +at 0xa0 + 0, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, + 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, + 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, + 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, + 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, + 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, + 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, + 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, + 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, + 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, + 0x3090, 0x3091, 0x3092, 0x3093, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a5 +at 0xa0 + 0, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, + 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, + 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, + 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, + 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, + 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, + 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, + 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, + 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, + 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, + 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a6 +at 0xa0 + 0, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, + 0x03A9, 0, 0, 0, 0, 0, 0, 0, + 0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x03C9, 0, 0, 0, 0, 0, 0, 0, + 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, + 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0, 0, 0xFE3B, 0xFE3C, + 0xFE37, 0xFE38, 0xFE31, 0, 0xFE33, 0xFE34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a7 +at 0xa0 + 0, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, + 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, + 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, + 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, + 0x042E, 0x042F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, + 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, + 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, + 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, + 0x044E, 0x044F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a8 +at 0xa0 + 0, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, + 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, + 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, + 0x01DC, 0x00FC, 0x00EA, 0x0251, 0xE7C7, 0x0144, 0x0148, 0xE7C8, + 0x0261, 0, 0, 0, 0, 0x3105, 0x3106, 0x3107, + 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, + 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, + 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, + 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, + 0x3128, 0x3129, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a9 +at 0xa0 + 0, 0, 0, 0, 0x2500, 0x2501, 0x2502, 0x2503, + 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, + 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, + 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, + 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, + 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, + 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, + 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, + 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, + 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane b0 +at 0xa0 + 0, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0, + 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698, + 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, + 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, + 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, + 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, + 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D, + 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591, + 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E, + 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E, + 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551, + 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, 0, +plane b1 +at 0xa0 + 0x775C, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, + 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, + 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, + 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, + 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, + 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, + 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, + 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, + 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, + 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, + 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, + 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, 0, +plane b2 +at 0xa0 + 0x77E4, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, + 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, + 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, + 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, + 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, + 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, + 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, + 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, + 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, + 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, + 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, + 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, 0, +plane b3 +at 0xa0 + 0x7883, 0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, + 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, + 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, + 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, + 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, + 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, + 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, + 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, + 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, + 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, + 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, + 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A, 0, +plane b4 +at 0xa0 + 0x790C, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3, + 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE, + 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376, + 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF, + 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E, + 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A, + 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B, + 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC, + 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8, + 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE, + 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, + 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, 0, +plane b5 +at 0xa0 + 0x7992, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, + 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, + 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, + 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, + 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, + 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, + 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, + 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, + 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, + 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, + 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, + 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, 0, +plane b6 +at 0xa0 + 0x7A1C, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, + 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, + 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, + 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, + 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, + 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, + 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, + 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, + 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, + 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, + 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, + 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0, +plane b7 +at 0xa0 + 0x7AA2, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, + 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, + 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, + 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, + 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, + 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, + 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, + 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, + 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, + 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, + 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, + 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D, 0, +plane b8 +at 0xa0 + 0x7B2D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A, + 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, + 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C, + 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A, + 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6, + 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76, + 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38, + 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, + 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5, + 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769, + 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404, + 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, 0, +plane b9 +at 0xa0 + 0x7BC4, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, + 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, + 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, + 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, + 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, + 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, + 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, + 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, + 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, + 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, + 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, + 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, 0, +plane ba +at 0xa0 + 0x7C42, 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, + 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, + 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, + 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, + 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, + 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, + 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, + 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, + 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, + 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, + 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, + 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0, +plane bb +at 0xa0 + 0x7CBB, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, + 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, + 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, + 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, + 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, + 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, + 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, + 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, + 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, + 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, + 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, + 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95, 0, +plane bc +at 0xa0 + 0x7D36, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC, + 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6, + 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324, + 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E, + 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0, + 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7, + 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532, + 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C, + 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9, + 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877, + 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB, + 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, 0, +plane bd +at 0xa0 + 0x7D98, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, + 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, + 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, + 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, + 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, + 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, + 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, + 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, + 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, + 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, + 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, + 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, 0, +plane be +at 0xa0 + 0x7DFA, 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, + 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, + 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, + 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, + 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, + 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, + 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, + 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, + 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, + 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, + 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, + 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB, 0, +plane bf +at 0xa0 + 0x7E5D, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, + 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, + 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, + 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, + 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, + 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, + 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, + 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, + 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, + 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, + 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, + 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080, 0, +plane c0 +at 0xa0 + 0x7F53, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0, + 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721, + 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A, + 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD, + 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC, + 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001, + 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7, + 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B, + 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281, + 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC, + 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389, + 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, 0, +plane c1 +at 0xa0 + 0x7FE3, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, + 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, + 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, + 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, + 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, + 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, + 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, + 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, + 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, + 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, + 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, + 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, 0, +plane c2 +at 0xa0 + 0x807D, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, + 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, + 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, + 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, + 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, + 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, + 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, + 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, + 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, + 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, + 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, + 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, 0, +plane c3 +at 0xa0 + 0x813F, 0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, + 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, + 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, + 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, + 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, + 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, + 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, + 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, + 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, + 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, + 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, + 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478, 0, +plane c4 +at 0xa0 + 0x81D3, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54, + 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, + 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6, + 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, + 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3, + 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, + 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6, + 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A, + 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA, + 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18, + 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A, + 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, 0, +plane c5 +at 0xa0 + 0x8269, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, + 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, + 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, + 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, + 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, + 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, + 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, + 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, + 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, + 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, + 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, + 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, 0, +plane c6 +at 0xa0 + 0x833D, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, + 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, + 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, + 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, + 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, + 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, + 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, + 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, + 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, + 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, + 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, + 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0, +plane c7 +at 0xa0 + 0x83ED, 0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, + 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, + 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, + 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, + 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, + 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, + 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, + 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, + 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, + 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, + 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, + 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20, 0, +plane c8 +at 0xa0 + 0x847C, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7, + 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, + 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E, + 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, + 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9, + 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4, + 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338, + 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197, + 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, + 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A, + 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12, + 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, 0, +plane c9 +at 0xa0 + 0x8502, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, + 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, + 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, + 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, + 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, + 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, + 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, + 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, + 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, + 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, + 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, + 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, 0, +plane ca +at 0xa0 + 0x8581, 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, + 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, + 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, + 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, + 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, + 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, + 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, + 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, + 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, + 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, + 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, + 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31, 0, +plane cb +at 0xa0 + 0x85F8, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, + 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, + 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, + 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, + 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, + 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, + 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, + 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, + 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, + 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, + 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, + 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854, 0, +plane cc +at 0xa0 + 0x866A, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, + 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A, + 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D, + 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD, + 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6, + 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4, + 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957, + 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22, + 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F, + 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, + 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A, + 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, 0, +plane cd +at 0xa0 + 0x8716, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, + 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, + 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, + 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, + 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, + 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, + 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, + 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, + 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, + 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, + 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, + 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, 0, +plane ce +at 0xa0 + 0x87A4, 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, + 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, + 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, + 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, + 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, + 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, + 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, + 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, + 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, + 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, + 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, + 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A, 0, +plane cf +at 0xa0 + 0x8823, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, + 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, + 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, + 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, + 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, + 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, + 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, + 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, + 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, + 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, + 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, + 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653, 0, +plane d0 +at 0xa0 + 0x88AA, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548, + 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A, + 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9, + 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C, + 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F, + 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2, + 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, + 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, + 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C, + 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157, + 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA, + 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, 0, +plane d1 +at 0xa0 + 0x8937, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, + 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, + 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, + 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, + 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, + 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, + 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, + 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, + 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, + 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, + 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, + 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, 0, +plane d2 +at 0xa0 + 0x89A1, 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, + 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, + 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, + 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, + 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, + 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, + 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, + 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, + 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, + 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, + 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, + 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, 0, +plane d3 +at 0xa0 + 0x8A1D, 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, + 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, + 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, + 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, + 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, + 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, + 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, + 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, + 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, + 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, + 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, + 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89, 0, +plane d4 +at 0xa0 + 0x8A80, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33, + 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95, + 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1, + 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5, + 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7, + 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5, + 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0, + 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43, + 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9, + 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5, + 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E, + 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, 0, +plane d5 +at 0xa0 + 0x8AE3, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, + 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, + 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, + 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, + 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, + 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, + 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, + 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, + 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, + 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, + 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, + 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, 0, +plane d6 +at 0xa0 + 0x8B45, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, + 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, + 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, + 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, + 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, + 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, + 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, + 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, + 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, + 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, + 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, + 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0, +plane d7 +at 0xa0 + 0x8C1E, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, + 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, + 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, + 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, + 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, + 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, + 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, + 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, + 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, + 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, + 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, + 0x5750, 0x5EA7, 0, 0, 0, 0, 0, 0, +plane d8 +at 0xa0 + 0x8CAD, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, + 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, + 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, + 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, + 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, + 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, + 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, + 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, + 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, + 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, + 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, + 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, 0, +plane d9 +at 0xa0 + 0x8D0D, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, + 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, + 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, + 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, + 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, + 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, + 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, + 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, + 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, + 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, + 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, + 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, 0, +plane da +at 0xa0 + 0x8DD4, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, + 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, + 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, + 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, + 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, + 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, + 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, + 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, + 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, + 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, + 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, + 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA, 0, +plane db +at 0xa0 + 0x8E71, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4, + 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, + 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, + 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD, + 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD, + 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF, + 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729, + 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B, + 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768, + 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF, + 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9, + 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD, 0, +plane dc +at 0xa0 + 0x8EE4, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, + 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, + 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, + 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, + 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, + 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, + 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, + 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, + 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, + 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, + 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, + 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, 0, +plane dd +at 0xa0 + 0x8F44, 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, + 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, + 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, + 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, + 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, + 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, + 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, + 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, + 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, + 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, + 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, + 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, 0, +plane de +at 0xa0 + 0x9018, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, + 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, + 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, + 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, + 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, + 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, + 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, + 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, + 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, + 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, + 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, + 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496, 0, +plane df +at 0xa0 + 0x90C0, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0, + 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2, + 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB, + 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456, + 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, + 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466, + 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6, + 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC, + 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF, + 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522, + 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5, + 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C, 0, +plane e0 +at 0xa0 + 0x9144, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, + 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, + 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, + 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, + 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, + 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, + 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, + 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, + 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, + 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, + 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, + 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, 0, +plane e1 +at 0xa0 + 0x91E5, 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, + 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, + 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, + 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, + 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, + 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, + 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, + 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, + 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, + 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, + 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, + 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, 0, +plane e2 +at 0xa0 + 0x9245, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, + 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, + 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, + 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, + 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, + 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, + 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, + 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, + 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, + 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, + 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, + 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042, 0, +plane e3 +at 0xa0 + 0x92A7, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083, + 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8, + 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4, + 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, + 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1, + 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606, + 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615, + 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35, + 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C, + 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4, + 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6, + 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, 0, +plane e4 +at 0xa0 + 0x9309, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, + 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, + 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, + 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, + 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, + 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, + 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, + 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, + 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, + 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, + 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, + 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, 0, +plane e5 +at 0xa0 + 0x936B, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, + 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, + 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, + 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, + 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, + 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, + 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, + 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, + 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, + 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, + 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, + 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, 0, +plane e6 +at 0xa0 + 0x93CD, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, + 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, + 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, + 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, + 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, + 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, + 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, + 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, + 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, + 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, + 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, + 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, 0, +plane e7 +at 0xa0 + 0x942E, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9, + 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1, + 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6, + 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08, + 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C, + 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, + 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31, + 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095, + 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1, + 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C, + 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A, + 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, 0, +plane e8 +at 0xa0 + 0x9520, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, + 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, + 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, + 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, + 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, + 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, + 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, + 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, + 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, + 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, + 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, + 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, 0, +plane e9 +at 0xa0 + 0x95CB, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, + 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, + 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, + 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, + 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, + 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, + 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, + 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, + 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, + 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, + 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, + 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, 0, +plane ea +at 0xa0 + 0x968A, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, + 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, + 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, + 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, + 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, + 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, + 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, + 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, + 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, + 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, + 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, + 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0, 0, +plane eb +at 0xa0 + 0x9720, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, + 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, + 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, + 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, + 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD, + 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2, + 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1, + 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112, + 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, + 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, + 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191, + 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, 0, +plane ec +at 0xa0 + 0x979D, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, + 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, + 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, + 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, + 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, + 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, + 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, + 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, + 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, + 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, + 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, + 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, 0, +plane ed +at 0xa0 + 0x980E, 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, + 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, + 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, + 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, + 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, + 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, + 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, + 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, + 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, + 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, + 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, + 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, 0, +plane ee +at 0xa0 + 0x986E, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, + 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, + 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, + 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, + 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, + 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, + 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, + 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, + 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, + 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, + 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, + 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA, 0, +plane ef +at 0xa0 + 0x9907, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5, + 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506, + 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513, + 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F, + 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534, + 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535, + 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552, + 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E, + 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, + 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572, + 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, + 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14, 0, +plane f0 +at 0xa0 + 0x9989, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, + 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, + 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, + 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, + 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, + 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, + 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, + 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, + 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, + 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, + 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, + 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, 0, +plane f1 +at 0xa0 + 0x99F9, 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, + 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, + 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, + 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, + 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, + 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, + 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, + 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, + 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, + 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, + 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, + 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, 0, +plane f2 +at 0xa0 + 0x9A59, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, + 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, + 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, + 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, + 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, + 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, + 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, + 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, + 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, + 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, + 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, + 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2, 0, +plane f3 +at 0xa0 + 0x9B06, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB, + 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1, + 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813, + 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42, + 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04, + 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, + 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E, + 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E, + 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8, + 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB, + 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6, + 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B, 0, +plane f4 +at 0xa0 + 0x9B7B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, + 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, + 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, + 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, + 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, + 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, + 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, + 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, + 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, + 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, + 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, + 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, 0, +plane f5 +at 0xa0 + 0x9BDB, 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, + 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, + 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, + 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, + 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, + 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, + 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, + 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, + 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, + 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, + 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, + 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, 0, +plane f6 +at 0xa0 + 0x9C3B, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, + 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, + 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, + 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, + 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, + 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, + 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, + 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, + 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, + 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, + 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, + 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, 0, +plane f7 +at 0xa0 + 0x9CE1, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4, + 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2, + 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3, + 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA, + 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1, + 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8, + 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, + 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F, + 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B, + 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0, + 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22, + 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, 0, +plane f8 +at 0xa0 + 0x9D42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane f9 +at 0xa0 + 0x9DA2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fa +at 0xa0 + 0x9E02, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fb +at 0xa0 + 0x9EAA, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fc +at 0xa0 + 0x9F31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fd +at 0xa0 + 0xF9F1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fe +at 0xa0 + 0xE864, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugbk.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugbk.map new file mode 100644 index 00000000..3d4370e6 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugbk.map @@ -0,0 +1,3295 @@ +# GBK --> Unicode conversion table: +# generated by Chen Xiangyang (chenxy@sun.ihep.ac.cn) +# +# it contains all 21886 characters of GBK character set, it also contains +# some unused codes in order to make the array easy to use. +# Code range: first byte: 0x81 -- 0xFE 126 +# second byte: 0x40 -- 0xFF 192 +# code points: 126 x 192 = 24192 +# +# Usage: +# +# unsigned short GBK_code, unicode; +# int pos; +# pos = ((GBK_code>>8)-0x81)*192 + ((GBK_Code&0x00FF)-0x40); +# unicode = gbk2uni[pos]; +# +# Converted to ttf2pt1 map format by Sergey Babkin +# + +plane 81 +at 0x40 + 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, + 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, + 0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, + 0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62, + 0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, + 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77, + 0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80, + 0x4E81, 0x4E82, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, 0, + 0x4E90, 0x4E96, 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4E9E, 0x4EA3, + 0x4EAA, 0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, + 0x4EB9, 0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, + 0x4ED2, 0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, + 0x4EE9, 0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, + 0x4EFA, 0x4EFC, 0x4EFE, 0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, + 0x4F06, 0x4F07, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, + 0x4F15, 0x4F16, 0x4F1C, 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, + 0x4F2C, 0x4F2D, 0x4F2E, 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, + 0x4F3B, 0x4F3E, 0x4F3F, 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, + 0x4F47, 0x4F48, 0x4F49, 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, + 0x4F56, 0x4F61, 0x4F62, 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, + 0x4F6E, 0x4F71, 0x4F72, 0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, + 0x4F7D, 0x4F80, 0x4F81, 0x4F82, 0x4F85, 0x4F86, 0x4F87, 0x4F8A, + 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F95, 0x4F96, 0x4F98, + 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, 0x4FA1, 0x4FA2, 0, +plane 82 +at 0x40 + 0x4FA4, 0x4FAB, 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, 0x4FB3, 0x4FB4, + 0x4FB6, 0x4FB7, 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB, 0x4FBC, 0x4FBD, + 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, 0x4FC8, 0x4FC9, + 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5, 0x4FD6, + 0x4FD9, 0x4FDB, 0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB, + 0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9, + 0x4FFB, 0x4FFC, 0x4FFD, 0x4FFF, 0x5000, 0x5001, 0x5002, 0x5003, + 0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500A, 0, + 0x500B, 0x500E, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, + 0x501B, 0x501D, 0x501E, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, + 0x502B, 0x502F, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, + 0x5036, 0x5037, 0x5038, 0x5039, 0x503B, 0x503D, 0x503F, 0x5040, + 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504A, 0x504B, + 0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, + 0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061, + 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A, + 0x506B, 0x506D, 0x506E, 0x506F, 0x5070, 0x5071, 0x5072, 0x5073, + 0x5074, 0x5075, 0x5078, 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, + 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, + 0x508C, 0x508E, 0x508F, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, + 0x5095, 0x5096, 0x5097, 0x5098, 0x5099, 0x509A, 0x509B, 0x509C, + 0x509D, 0x509E, 0x509F, 0x50A0, 0x50A1, 0x50A2, 0x50A4, 0x50A6, + 0x50AA, 0x50AB, 0x50AD, 0x50AE, 0x50AF, 0x50B0, 0x50B1, 0x50B3, + 0x50B4, 0x50B5, 0x50B6, 0x50B7, 0x50B8, 0x50B9, 0x50BC, 0, +plane 83 +at 0x40 + 0x50BD, 0x50BE, 0x50BF, 0x50C0, 0x50C1, 0x50C2, 0x50C3, 0x50C4, + 0x50C5, 0x50C6, 0x50C7, 0x50C8, 0x50C9, 0x50CA, 0x50CB, 0x50CC, + 0x50CD, 0x50CE, 0x50D0, 0x50D1, 0x50D2, 0x50D3, 0x50D4, 0x50D5, + 0x50D7, 0x50D8, 0x50D9, 0x50DB, 0x50DC, 0x50DD, 0x50DE, 0x50DF, + 0x50E0, 0x50E1, 0x50E2, 0x50E3, 0x50E4, 0x50E5, 0x50E8, 0x50E9, + 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1, 0x50F2, 0x50F4, 0x50F6, + 0x50F7, 0x50F8, 0x50F9, 0x50FA, 0x50FC, 0x50FD, 0x50FE, 0x50FF, + 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108, 0, + 0x5109, 0x510A, 0x510C, 0x510D, 0x510E, 0x510F, 0x5110, 0x5111, + 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511A, + 0x511B, 0x511C, 0x511D, 0x511E, 0x511F, 0x5120, 0x5122, 0x5123, + 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512A, 0x512B, + 0x512C, 0x512D, 0x512E, 0x512F, 0x5130, 0x5131, 0x5132, 0x5133, + 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513A, 0x513B, + 0x513C, 0x513D, 0x513E, 0x5142, 0x5147, 0x514A, 0x514C, 0x514E, + 0x514F, 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B, + 0x515D, 0x515E, 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, + 0x5167, 0x5169, 0x516A, 0x516F, 0x5172, 0x517A, 0x517E, 0x517F, + 0x5183, 0x5184, 0x5186, 0x5187, 0x518A, 0x518B, 0x518E, 0x518F, + 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519A, 0x519D, 0x519E, + 0x519F, 0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, 0x51AA, + 0x51AD, 0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF, + 0x51C1, 0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CD, 0x51CE, + 0x51D0, 0x51D2, 0x51D3, 0x51D4, 0x51D5, 0x51D6, 0x51D7, 0, +plane 84 +at 0x40 + 0x51D8, 0x51D9, 0x51DA, 0x51DC, 0x51DE, 0x51DF, 0x51E2, 0x51E3, + 0x51E5, 0x51E6, 0x51E7, 0x51E8, 0x51E9, 0x51EA, 0x51EC, 0x51EE, + 0x51F1, 0x51F2, 0x51F4, 0x51F7, 0x51FE, 0x5204, 0x5205, 0x5209, + 0x520B, 0x520C, 0x520F, 0x5210, 0x5213, 0x5214, 0x5215, 0x521C, + 0x521E, 0x521F, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, + 0x522A, 0x522C, 0x522F, 0x5231, 0x5232, 0x5234, 0x5235, 0x523C, + 0x523E, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524B, + 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, 0, + 0x5259, 0x525A, 0x525B, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263, + 0x5264, 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x526E, 0x5270, + 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, + 0x527A, 0x527B, 0x527C, 0x527E, 0x5280, 0x5283, 0x5284, 0x5285, + 0x5286, 0x5287, 0x5289, 0x528A, 0x528B, 0x528C, 0x528D, 0x528E, + 0x528F, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, + 0x5299, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AE, + 0x52AF, 0x52B0, 0x52B4, 0x52B5, 0x52B6, 0x52B7, 0x52B8, 0x52B9, + 0x52BA, 0x52BB, 0x52BC, 0x52BD, 0x52C0, 0x52C1, 0x52C2, 0x52C4, + 0x52C5, 0x52C6, 0x52C8, 0x52CA, 0x52CC, 0x52CD, 0x52CE, 0x52CF, + 0x52D1, 0x52D3, 0x52D4, 0x52D5, 0x52D7, 0x52D9, 0x52DA, 0x52DB, + 0x52DC, 0x52DD, 0x52DE, 0x52E0, 0x52E1, 0x52E2, 0x52E3, 0x52E5, + 0x52E6, 0x52E7, 0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, 0x52ED, + 0x52EE, 0x52EF, 0x52F1, 0x52F2, 0x52F3, 0x52F4, 0x52F5, 0x52F6, + 0x52F7, 0x52F8, 0x52FB, 0x52FC, 0x52FD, 0x5301, 0x5302, 0x5303, + 0x5304, 0x5307, 0x5309, 0x530A, 0x530B, 0x530C, 0x530E, 0, +plane 85 +at 0x40 + 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B, 0x531C, 0x531E, + 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, + 0x532C, 0x532D, 0x532F, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, + 0x5335, 0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5340, 0x5342, + 0x5344, 0x5346, 0x534B, 0x534C, 0x534D, 0x5350, 0x5354, 0x5358, + 0x5359, 0x535B, 0x535D, 0x5365, 0x5368, 0x536A, 0x536C, 0x536D, + 0x5372, 0x5376, 0x5379, 0x537B, 0x537C, 0x537D, 0x537E, 0x5380, + 0x5381, 0x5383, 0x5387, 0x5388, 0x538A, 0x538E, 0x538F, 0, + 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, + 0x539B, 0x539C, 0x539E, 0x53A0, 0x53A1, 0x53A4, 0x53A7, 0x53AA, + 0x53AB, 0x53AC, 0x53AD, 0x53AF, 0x53B0, 0x53B1, 0x53B2, 0x53B3, + 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, + 0x53BE, 0x53C0, 0x53C3, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, + 0x53CF, 0x53D0, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, + 0x53DE, 0x53E1, 0x53E2, 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, + 0x5400, 0x5402, 0x5405, 0x5407, 0x540B, 0x5414, 0x5418, 0x5419, + 0x541A, 0x541C, 0x5422, 0x5424, 0x5425, 0x542A, 0x5430, 0x5433, + 0x5436, 0x5437, 0x543A, 0x543D, 0x543F, 0x5441, 0x5442, 0x5444, + 0x5445, 0x5447, 0x5449, 0x544C, 0x544D, 0x544E, 0x544F, 0x5451, + 0x545A, 0x545D, 0x545E, 0x545F, 0x5460, 0x5461, 0x5463, 0x5465, + 0x5467, 0x5469, 0x546A, 0x546B, 0x546C, 0x546D, 0x546E, 0x546F, + 0x5470, 0x5474, 0x5479, 0x547A, 0x547E, 0x547F, 0x5481, 0x5483, + 0x5485, 0x5487, 0x5488, 0x5489, 0x548A, 0x548D, 0x5491, 0x5493, + 0x5497, 0x5498, 0x549C, 0x549E, 0x549F, 0x54A0, 0x54A1, 0, +plane 86 +at 0x40 + 0x54A2, 0x54A5, 0x54AE, 0x54B0, 0x54B2, 0x54B5, 0x54B6, 0x54B7, + 0x54B9, 0x54BA, 0x54BC, 0x54BE, 0x54C3, 0x54C5, 0x54CA, 0x54CB, + 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E1, 0x54E2, 0x54E3, 0x54E4, + 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4, 0x54F5, 0x54F6, + 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500, 0x5502, 0x5503, + 0x5504, 0x5505, 0x5508, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E, + 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551A, + 0x551C, 0x551D, 0x551E, 0x551F, 0x5521, 0x5525, 0x5526, 0, + 0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, 0x5535, 0x5536, + 0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, 0x5545, + 0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x554F, 0x5551, + 0x5552, 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, + 0x555D, 0x555E, 0x555F, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, + 0x556B, 0x556F, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, + 0x557A, 0x557D, 0x557F, 0x5585, 0x5586, 0x558C, 0x558D, 0x558E, + 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559A, 0x559B, + 0x559E, 0x55A0, 0x55A1, 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, + 0x55A8, 0x55A9, 0x55AA, 0x55AB, 0x55AC, 0x55AD, 0x55AE, 0x55AF, + 0x55B0, 0x55B2, 0x55B4, 0x55B6, 0x55B8, 0x55BA, 0x55BC, 0x55BF, + 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C6, 0x55C7, 0x55C8, 0x55CA, + 0x55CB, 0x55CE, 0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, + 0x55DA, 0x55DB, 0x55DE, 0x55E0, 0x55E2, 0x55E7, 0x55E9, 0x55ED, + 0x55EE, 0x55F0, 0x55F1, 0x55F4, 0x55F6, 0x55F8, 0x55F9, 0x55FA, + 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603, 0x5604, 0x5605, 0, +plane 87 +at 0x40 + 0x5606, 0x5607, 0x560A, 0x560B, 0x560D, 0x5610, 0x5611, 0x5612, + 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561A, 0x561C, + 0x561D, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629, + 0x562A, 0x562B, 0x562E, 0x562F, 0x5630, 0x5633, 0x5635, 0x5637, + 0x5638, 0x563A, 0x563C, 0x563D, 0x563E, 0x5640, 0x5641, 0x5642, + 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564A, + 0x564B, 0x564F, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, + 0x565A, 0x565B, 0x565D, 0x565E, 0x565F, 0x5660, 0x5661, 0, + 0x5663, 0x5665, 0x5666, 0x5667, 0x566D, 0x566E, 0x566F, 0x5670, + 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567A, + 0x567D, 0x567E, 0x567F, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, + 0x5687, 0x5688, 0x5689, 0x568A, 0x568B, 0x568C, 0x568D, 0x5690, + 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, + 0x569A, 0x569B, 0x569C, 0x569D, 0x569E, 0x569F, 0x56A0, 0x56A1, + 0x56A2, 0x56A4, 0x56A5, 0x56A6, 0x56A7, 0x56A8, 0x56A9, 0x56AA, + 0x56AB, 0x56AC, 0x56AD, 0x56AE, 0x56B0, 0x56B1, 0x56B2, 0x56B3, + 0x56B4, 0x56B5, 0x56B6, 0x56B8, 0x56B9, 0x56BA, 0x56BB, 0x56BD, + 0x56BE, 0x56BF, 0x56C0, 0x56C1, 0x56C2, 0x56C3, 0x56C4, 0x56C5, + 0x56C6, 0x56C7, 0x56C8, 0x56C9, 0x56CB, 0x56CC, 0x56CD, 0x56CE, + 0x56CF, 0x56D0, 0x56D1, 0x56D2, 0x56D3, 0x56D5, 0x56D6, 0x56D8, + 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9, + 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7, + 0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, + 0x570B, 0x570C, 0x570D, 0x570E, 0x570F, 0x5710, 0x5711, 0, +plane 88 +at 0x40 + 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719, + 0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, 0x5722, 0x5724, + 0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, 0x5734, 0x5735, + 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, 0x5741, 0x5743, + 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, 0x5752, 0x5753, + 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765, + 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, + 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780, 0, + 0x5781, 0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F, + 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, + 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, 0x57AA, + 0x57AC, 0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, 0x57B7, + 0x57B9, 0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, 0x57C0, + 0x57C1, 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57CA, + 0x57CC, 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB, + 0x57DC, 0x57DE, 0x57E1, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7, + 0x57E8, 0x57E9, 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1, + 0x57F2, 0x57F3, 0x57F5, 0x57F6, 0x57F7, 0x57FB, 0x57FC, 0x57FE, + 0x57FF, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580A, + 0x580C, 0x580E, 0x580F, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, + 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581D, 0x581F, 0x5822, + 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B, 0x582C, + 0x582D, 0x582E, 0x582F, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836, + 0x5837, 0x5838, 0x5839, 0x583A, 0x583B, 0x583C, 0x583D, 0, +plane 89 +at 0x40 + 0x583E, 0x583F, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, + 0x5847, 0x5848, 0x5849, 0x584A, 0x584B, 0x584E, 0x584F, 0x5850, + 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585A, 0x585B, + 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, + 0x5866, 0x5867, 0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, + 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, + 0x5878, 0x5879, 0x587A, 0x587B, 0x587C, 0x587D, 0x587F, 0x5882, + 0x5884, 0x5886, 0x5887, 0x5888, 0x588A, 0x588B, 0x588C, 0, + 0x588D, 0x588E, 0x588F, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, + 0x5897, 0x5898, 0x589B, 0x589C, 0x589D, 0x58A0, 0x58A1, 0x58A2, + 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB, 0x58AC, + 0x58AD, 0x58AE, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B3, 0x58B4, + 0x58B5, 0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BB, 0x58BD, + 0x58BE, 0x58BF, 0x58C0, 0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C7, + 0x58C8, 0x58C9, 0x58CA, 0x58CB, 0x58CC, 0x58CD, 0x58CE, 0x58CF, + 0x58D0, 0x58D2, 0x58D3, 0x58D4, 0x58D6, 0x58D7, 0x58D8, 0x58D9, + 0x58DA, 0x58DB, 0x58DC, 0x58DD, 0x58DE, 0x58DF, 0x58E0, 0x58E1, + 0x58E2, 0x58E3, 0x58E5, 0x58E6, 0x58E7, 0x58E8, 0x58E9, 0x58EA, + 0x58ED, 0x58EF, 0x58F1, 0x58F2, 0x58F4, 0x58F5, 0x58F7, 0x58F8, + 0x58FA, 0x58FB, 0x58FC, 0x58FD, 0x58FE, 0x58FF, 0x5900, 0x5901, + 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C, + 0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B, + 0x591D, 0x591E, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, + 0x592C, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B, 0, +plane 8a +at 0x40 + 0x593D, 0x593E, 0x593F, 0x5940, 0x5943, 0x5945, 0x5946, 0x594A, + 0x594C, 0x594D, 0x5950, 0x5952, 0x5953, 0x5959, 0x595B, 0x595C, + 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, + 0x5968, 0x5969, 0x596A, 0x596B, 0x596C, 0x596D, 0x596E, 0x596F, + 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597A, 0x597B, 0x597C, + 0x597E, 0x597F, 0x5980, 0x5985, 0x5989, 0x598B, 0x598C, 0x598E, + 0x598F, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599A, 0x599B, + 0x599C, 0x599D, 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, 0, + 0x59A7, 0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, + 0x59B6, 0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, + 0x59C1, 0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, + 0x59CC, 0x59CD, 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, + 0x59DE, 0x59DF, 0x59E0, 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, + 0x59E9, 0x59EA, 0x59EB, 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1, + 0x59F2, 0x59F3, 0x59F4, 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA, + 0x59FC, 0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, + 0x5A0E, 0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, + 0x5A19, 0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, + 0x5A26, 0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, + 0x5A2F, 0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, + 0x5A3B, 0x5A3D, 0x5A3E, 0x5A3F, 0x5A41, 0x5A42, 0x5A43, 0x5A44, + 0x5A45, 0x5A47, 0x5A48, 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, + 0x5A50, 0x5A51, 0x5A52, 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58, + 0x5A59, 0x5A5B, 0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, 0, +plane 8b +at 0x40 + 0x5A61, 0x5A63, 0x5A64, 0x5A65, 0x5A66, 0x5A68, 0x5A69, 0x5A6B, + 0x5A6C, 0x5A6D, 0x5A6E, 0x5A6F, 0x5A70, 0x5A71, 0x5A72, 0x5A73, + 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, 0x5A7D, 0x5A7E, 0x5A80, 0x5A81, + 0x5A82, 0x5A83, 0x5A84, 0x5A85, 0x5A86, 0x5A87, 0x5A88, 0x5A89, + 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, 0x5A8E, 0x5A8F, 0x5A90, 0x5A91, + 0x5A93, 0x5A94, 0x5A95, 0x5A96, 0x5A97, 0x5A98, 0x5A99, 0x5A9C, + 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA1, 0x5AA2, 0x5AA3, 0x5AA4, + 0x5AA5, 0x5AA6, 0x5AA7, 0x5AA8, 0x5AA9, 0x5AAB, 0x5AAC, 0, + 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6, 0x5AB7, + 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, 0x5ABF, 0x5AC0, 0x5AC3, + 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, 0x5ACA, 0x5ACB, 0x5ACD, + 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, 0x5AD7, 0x5AD9, + 0x5ADA, 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5, + 0x5AE7, 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0, + 0x5AF2, 0x5AF3, 0x5AF4, 0x5AF5, 0x5AF6, 0x5AF7, 0x5AF8, 0x5AF9, + 0x5AFA, 0x5AFB, 0x5AFC, 0x5AFD, 0x5AFE, 0x5AFF, 0x5B00, 0x5B01, + 0x5B02, 0x5B03, 0x5B04, 0x5B05, 0x5B06, 0x5B07, 0x5B08, 0x5B0A, + 0x5B0B, 0x5B0C, 0x5B0D, 0x5B0E, 0x5B0F, 0x5B10, 0x5B11, 0x5B12, + 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B19, 0x5B1A, 0x5B1B, 0x5B1C, + 0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B21, 0x5B22, 0x5B23, 0x5B24, + 0x5B25, 0x5B26, 0x5B27, 0x5B28, 0x5B29, 0x5B2A, 0x5B2B, 0x5B2C, + 0x5B2D, 0x5B2E, 0x5B2F, 0x5B30, 0x5B31, 0x5B33, 0x5B35, 0x5B36, + 0x5B38, 0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F, + 0x5B41, 0x5B42, 0x5B43, 0x5B44, 0x5B45, 0x5B46, 0x5B47, 0, +plane 8c +at 0x40 + 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4C, 0x5B4D, 0x5B4E, 0x5B4F, + 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67, 0x5B68, 0x5B6B, + 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77, 0x5B78, + 0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, 0x5B86, 0x5B8A, + 0x5B8D, 0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, 0x5B96, 0x5B9F, + 0x5BA7, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, 0x5BAF, 0x5BB1, + 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BC3, + 0x5BC8, 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF, 0, + 0x5BD1, 0x5BD4, 0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, + 0x5BDB, 0x5BDC, 0x5BE0, 0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, 0x5BE9, + 0x5BEA, 0x5BEB, 0x5BEC, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3, + 0x5BF4, 0x5BF5, 0x5BF6, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02, + 0x5C03, 0x5C05, 0x5C07, 0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, 0x5C0E, + 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E, 0x5C1F, + 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A, 0x5C2B, + 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35, 0x5C36, + 0x5C37, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, 0x5C52, + 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, 0x5C5C, + 0x5C5D, 0x5C5F, 0x5C62, 0x5C64, 0x5C67, 0x5C68, 0x5C69, 0x5C6A, + 0x5C6B, 0x5C6C, 0x5C6D, 0x5C70, 0x5C72, 0x5C73, 0x5C74, 0x5C75, + 0x5C76, 0x5C77, 0x5C78, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, 0x5C80, + 0x5C83, 0x5C84, 0x5C85, 0x5C86, 0x5C87, 0x5C89, 0x5C8A, 0x5C8B, + 0x5C8E, 0x5C8F, 0x5C92, 0x5C93, 0x5C95, 0x5C9D, 0x5C9E, 0x5C9F, + 0x5CA0, 0x5CA1, 0x5CA4, 0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8, 0, +plane 8d +at 0x40 + 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, + 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, + 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, + 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, + 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, + 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF, + 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF4, 0x5CF5, 0x5CF6, 0x5CF7, 0x5CF8, + 0x5CF9, 0x5CFA, 0x5CFC, 0x5CFD, 0x5CFE, 0x5CFF, 0x5D00, 0, + 0x5D01, 0x5D04, 0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, + 0x5D0D, 0x5D0F, 0x5D10, 0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D17, + 0x5D18, 0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, 0x5D1F, 0x5D20, 0x5D21, + 0x5D22, 0x5D23, 0x5D25, 0x5D28, 0x5D2A, 0x5D2B, 0x5D2C, 0x5D2F, + 0x5D30, 0x5D31, 0x5D32, 0x5D33, 0x5D35, 0x5D36, 0x5D37, 0x5D38, + 0x5D39, 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, 0x5D40, 0x5D41, 0x5D42, + 0x5D43, 0x5D44, 0x5D45, 0x5D46, 0x5D48, 0x5D49, 0x5D4D, 0x5D4E, + 0x5D4F, 0x5D50, 0x5D51, 0x5D52, 0x5D53, 0x5D54, 0x5D55, 0x5D56, + 0x5D57, 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F, 0x5D60, 0x5D61, + 0x5D62, 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67, 0x5D68, 0x5D6A, + 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73, 0x5D75, 0x5D76, + 0x5D77, 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C, 0x5D7D, 0x5D7E, + 0x5D7F, 0x5D80, 0x5D81, 0x5D83, 0x5D84, 0x5D85, 0x5D86, 0x5D87, + 0x5D88, 0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F, + 0x5D90, 0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D97, + 0x5D98, 0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA0, 0, +plane 8e +at 0x40 + 0x5DA1, 0x5DA2, 0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, 0x5DA7, 0x5DA8, + 0x5DA9, 0x5DAA, 0x5DAB, 0x5DAC, 0x5DAD, 0x5DAE, 0x5DAF, 0x5DB0, + 0x5DB1, 0x5DB2, 0x5DB3, 0x5DB4, 0x5DB5, 0x5DB6, 0x5DB8, 0x5DB9, + 0x5DBA, 0x5DBB, 0x5DBC, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1, + 0x5DC2, 0x5DC3, 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA, + 0x5DCB, 0x5DCC, 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD2, 0x5DD3, + 0x5DD4, 0x5DD5, 0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC, + 0x5DDF, 0x5DE0, 0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, 0, + 0x5DF0, 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, 0x5DFC, + 0x5DFF, 0x5E00, 0x5E04, 0x5E07, 0x5E09, 0x5E0A, 0x5E0B, 0x5E0D, + 0x5E0E, 0x5E12, 0x5E13, 0x5E17, 0x5E1E, 0x5E1F, 0x5E20, 0x5E21, + 0x5E22, 0x5E23, 0x5E24, 0x5E25, 0x5E28, 0x5E29, 0x5E2A, 0x5E2B, + 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E33, 0x5E34, 0x5E35, 0x5E36, + 0x5E39, 0x5E3A, 0x5E3E, 0x5E3F, 0x5E40, 0x5E41, 0x5E43, 0x5E46, + 0x5E47, 0x5E48, 0x5E49, 0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, + 0x5E50, 0x5E51, 0x5E52, 0x5E53, 0x5E56, 0x5E57, 0x5E58, 0x5E59, + 0x5E5A, 0x5E5C, 0x5E5D, 0x5E5F, 0x5E60, 0x5E63, 0x5E64, 0x5E65, + 0x5E66, 0x5E67, 0x5E68, 0x5E69, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D, + 0x5E6E, 0x5E6F, 0x5E70, 0x5E71, 0x5E75, 0x5E77, 0x5E79, 0x5E7E, + 0x5E81, 0x5E82, 0x5E83, 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, + 0x5E8E, 0x5E92, 0x5E98, 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, + 0x5EA4, 0x5EA8, 0x5EA9, 0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, 0x5EAF, + 0x5EB0, 0x5EB1, 0x5EB2, 0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, + 0x5EBF, 0x5EC0, 0x5EC1, 0x5EC2, 0x5EC3, 0x5EC4, 0x5EC5, 0, +plane 8f +at 0x40 + 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, 0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF, + 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8, 0x5ED9, 0x5EDA, 0x5EDC, + 0x5EDD, 0x5EDE, 0x5EDF, 0x5EE0, 0x5EE1, 0x5EE2, 0x5EE3, 0x5EE4, + 0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, 0x5EEB, 0x5EEC, 0x5EED, 0x5EEE, + 0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, 0x5EF3, 0x5EF5, 0x5EF8, 0x5EF9, + 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, 0x5F06, 0x5F07, 0x5F09, 0x5F0C, + 0x5F0D, 0x5F0E, 0x5F10, 0x5F12, 0x5F14, 0x5F16, 0x5F19, 0x5F1A, + 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, 0x5F22, 0x5F23, 0x5F24, 0, + 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F32, 0x5F33, 0x5F34, + 0x5F35, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E, 0x5F3F, + 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, 0x5F46, 0x5F47, 0x5F48, + 0x5F49, 0x5F4A, 0x5F4B, 0x5F4C, 0x5F4D, 0x5F4E, 0x5F4F, 0x5F51, + 0x5F54, 0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, 0x5F5E, 0x5F5F, 0x5F60, + 0x5F63, 0x5F65, 0x5F67, 0x5F68, 0x5F6B, 0x5F6E, 0x5F6F, 0x5F72, + 0x5F74, 0x5F75, 0x5F76, 0x5F78, 0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F, + 0x5F83, 0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, 0x5F91, 0x5F93, 0x5F94, + 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, 0x5F9F, 0x5FA0, 0x5FA2, + 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, 0x5FA9, 0x5FAB, 0x5FAC, + 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, 0x5FB8, + 0x5FB9, 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2, + 0x5FC7, 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5, + 0x5FDA, 0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5, + 0x5FE6, 0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3, + 0x5FF4, 0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, 0x5FFC, 0x6007, 0, +plane 90 +at 0x40 + 0x6008, 0x6009, 0x600B, 0x600C, 0x6010, 0x6011, 0x6013, 0x6017, + 0x6018, 0x601A, 0x601E, 0x601F, 0x6022, 0x6023, 0x6024, 0x602C, + 0x602D, 0x602E, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, + 0x6037, 0x6038, 0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044, + 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E, + 0x604F, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B, + 0x605C, 0x605E, 0x605F, 0x6060, 0x6061, 0x6065, 0x6066, 0x606E, + 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607E, 0x6080, 0, + 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608A, 0x608B, + 0x608E, 0x608F, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, + 0x6099, 0x609C, 0x609E, 0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7, + 0x60A9, 0x60AA, 0x60AE, 0x60B0, 0x60B3, 0x60B5, 0x60B6, 0x60B7, + 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF, 0x60C0, 0x60C1, 0x60C2, + 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9, 0x60CC, 0x60CD, 0x60CE, + 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4, 0x60D6, 0x60D7, 0x60D9, + 0x60DB, 0x60DE, 0x60E1, 0x60E2, 0x60E3, 0x60E4, 0x60E5, 0x60EA, + 0x60F1, 0x60F2, 0x60F5, 0x60F7, 0x60F8, 0x60FB, 0x60FC, 0x60FD, + 0x60FE, 0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610A, + 0x610B, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, + 0x6117, 0x6118, 0x6119, 0x611B, 0x611C, 0x611D, 0x611E, 0x6121, + 0x6122, 0x6125, 0x6128, 0x6129, 0x612A, 0x612C, 0x612D, 0x612E, + 0x612F, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, + 0x6137, 0x6138, 0x6139, 0x613A, 0x613B, 0x613C, 0x613D, 0x613E, + 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, 0, +plane 91 +at 0x40 + 0x6147, 0x6149, 0x614B, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153, + 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615A, 0x615B, 0x615C, + 0x615E, 0x615F, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, + 0x6169, 0x616A, 0x616B, 0x616C, 0x616D, 0x616E, 0x616F, 0x6171, + 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617A, 0x617B, + 0x617C, 0x617D, 0x617E, 0x617F, 0x6180, 0x6181, 0x6182, 0x6183, + 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618A, 0x618C, + 0x618D, 0x618F, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0, + 0x6196, 0x6197, 0x6198, 0x6199, 0x619A, 0x619B, 0x619C, 0x619E, + 0x619F, 0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A4, 0x61A5, 0x61A6, + 0x61AA, 0x61AB, 0x61AD, 0x61AE, 0x61AF, 0x61B0, 0x61B1, 0x61B2, + 0x61B3, 0x61B4, 0x61B5, 0x61B6, 0x61B8, 0x61B9, 0x61BA, 0x61BB, + 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3, 0x61C4, 0x61C5, + 0x61C6, 0x61C7, 0x61C9, 0x61CC, 0x61CD, 0x61CE, 0x61CF, 0x61D0, + 0x61D3, 0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, + 0x61DC, 0x61DD, 0x61DE, 0x61DF, 0x61E0, 0x61E1, 0x61E2, 0x61E3, + 0x61E4, 0x61E5, 0x61E7, 0x61E8, 0x61E9, 0x61EA, 0x61EB, 0x61EC, + 0x61ED, 0x61EE, 0x61EF, 0x61F0, 0x61F1, 0x61F2, 0x61F3, 0x61F4, + 0x61F6, 0x61F7, 0x61F8, 0x61F9, 0x61FA, 0x61FB, 0x61FC, 0x61FD, + 0x61FE, 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, + 0x6209, 0x6213, 0x6214, 0x6219, 0x621C, 0x621D, 0x621E, 0x6220, + 0x6223, 0x6226, 0x6227, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F, + 0x6230, 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, + 0x623B, 0x623C, 0x6242, 0x6244, 0x6245, 0x6246, 0x624A, 0, +plane 92 +at 0x40 + 0x624F, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625A, 0x625C, + 0x625D, 0x625E, 0x625F, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, + 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627A, + 0x627B, 0x627D, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, + 0x6288, 0x628B, 0x628C, 0x628D, 0x628E, 0x628F, 0x6290, 0x6294, + 0x6299, 0x629C, 0x629D, 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, + 0x62AA, 0x62AD, 0x62AE, 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, + 0x62B6, 0x62B7, 0x62B8, 0x62BA, 0x62BE, 0x62C0, 0x62C1, 0, + 0x62C3, 0x62CB, 0x62CF, 0x62D1, 0x62D5, 0x62DD, 0x62DE, 0x62E0, + 0x62E1, 0x62E4, 0x62EA, 0x62EB, 0x62F0, 0x62F2, 0x62F5, 0x62F8, + 0x62F9, 0x62FA, 0x62FB, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, + 0x630A, 0x630B, 0x630C, 0x630D, 0x630F, 0x6310, 0x6312, 0x6313, + 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631C, 0x6326, 0x6327, + 0x6329, 0x632C, 0x632D, 0x632E, 0x6330, 0x6331, 0x6333, 0x6334, + 0x6335, 0x6336, 0x6337, 0x6338, 0x633B, 0x633C, 0x633E, 0x633F, + 0x6340, 0x6341, 0x6344, 0x6347, 0x6348, 0x634A, 0x6351, 0x6352, + 0x6353, 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635A, 0x635B, + 0x635C, 0x635D, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636A, + 0x636B, 0x636C, 0x636F, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, + 0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6383, + 0x6384, 0x6385, 0x6386, 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, + 0x6395, 0x6397, 0x6399, 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, + 0x639F, 0x63A1, 0x63A4, 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, + 0x63B5, 0x63B6, 0x63B9, 0x63BB, 0x63BD, 0x63BF, 0x63C0, 0, +plane 93 +at 0x40 + 0x63C1, 0x63C2, 0x63C3, 0x63C5, 0x63C7, 0x63C8, 0x63CA, 0x63CB, + 0x63CC, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63D7, 0x63D8, 0x63D9, + 0x63DA, 0x63DB, 0x63DC, 0x63DD, 0x63DF, 0x63E2, 0x63E4, 0x63E5, + 0x63E6, 0x63E7, 0x63E8, 0x63EB, 0x63EC, 0x63EE, 0x63EF, 0x63F0, + 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA, 0x63FB, 0x63FC, + 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640A, + 0x640D, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418, + 0x6419, 0x641A, 0x641D, 0x641F, 0x6422, 0x6423, 0x6424, 0, + 0x6425, 0x6427, 0x6428, 0x6429, 0x642B, 0x642E, 0x642F, 0x6430, + 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, + 0x643B, 0x643C, 0x643E, 0x6440, 0x6442, 0x6443, 0x6449, 0x644B, + 0x644C, 0x644D, 0x644E, 0x644F, 0x6450, 0x6451, 0x6453, 0x6455, + 0x6456, 0x6457, 0x6459, 0x645A, 0x645B, 0x645C, 0x645D, 0x645F, + 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, + 0x646A, 0x646B, 0x646C, 0x646E, 0x646F, 0x6470, 0x6471, 0x6472, + 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x647B, 0x647C, 0x647D, + 0x647E, 0x647F, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489, + 0x648A, 0x648B, 0x648C, 0x648D, 0x648E, 0x648F, 0x6490, 0x6493, + 0x6494, 0x6497, 0x6498, 0x649A, 0x649B, 0x649C, 0x649D, 0x649F, + 0x64A0, 0x64A1, 0x64A2, 0x64A3, 0x64A5, 0x64A6, 0x64A7, 0x64A8, + 0x64AA, 0x64AB, 0x64AF, 0x64B1, 0x64B2, 0x64B3, 0x64B4, 0x64B6, + 0x64B9, 0x64BB, 0x64BD, 0x64BE, 0x64BF, 0x64C1, 0x64C3, 0x64C4, + 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CF, + 0x64D1, 0x64D3, 0x64D4, 0x64D5, 0x64D6, 0x64D9, 0x64DA, 0, +plane 94 +at 0x40 + 0x64DB, 0x64DC, 0x64DD, 0x64DF, 0x64E0, 0x64E1, 0x64E3, 0x64E5, + 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB, 0x64EC, 0x64ED, 0x64EE, + 0x64EF, 0x64F0, 0x64F1, 0x64F2, 0x64F3, 0x64F4, 0x64F5, 0x64F6, + 0x64F7, 0x64F8, 0x64F9, 0x64FA, 0x64FB, 0x64FC, 0x64FD, 0x64FE, + 0x64FF, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, + 0x6508, 0x650A, 0x650B, 0x650C, 0x650D, 0x650E, 0x650F, 0x6510, + 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651A, + 0x651B, 0x651C, 0x651D, 0x651E, 0x651F, 0x6520, 0x6521, 0, + 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652A, + 0x652C, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653A, + 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, + 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550, 0x6552, 0x6553, + 0x6554, 0x6557, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560, 0x6561, + 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D, 0x656E, + 0x656F, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657A, + 0x657B, 0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, 0x6582, + 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658A, 0x658D, + 0x658E, 0x658F, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659A, + 0x659D, 0x659E, 0x65A0, 0x65A2, 0x65A3, 0x65A6, 0x65A8, 0x65AA, + 0x65AC, 0x65AE, 0x65B1, 0x65B2, 0x65B3, 0x65B4, 0x65B5, 0x65B6, + 0x65B7, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF, 0x65C0, 0x65C2, + 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0, 0x65D1, 0x65D3, + 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB, 0x65DC, 0x65DD, + 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA, 0x65EB, 0, +plane 95 +at 0x40 + 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB, 0x65FC, + 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, + 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, + 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622, 0x6623, + 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, + 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B, 0x663D, + 0x663F, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, + 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, 0, + 0x6659, 0x665B, 0x665C, 0x665D, 0x665E, 0x6660, 0x6662, 0x6663, + 0x6665, 0x6667, 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, + 0x6672, 0x6673, 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, + 0x667F, 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, + 0x668A, 0x668B, 0x668D, 0x668E, 0x668F, 0x6690, 0x6692, 0x6693, + 0x6694, 0x6695, 0x6698, 0x6699, 0x669A, 0x669B, 0x669C, 0x669E, + 0x669F, 0x66A0, 0x66A1, 0x66A2, 0x66A3, 0x66A4, 0x66A5, 0x66A6, + 0x66A9, 0x66AA, 0x66AB, 0x66AC, 0x66AD, 0x66AF, 0x66B0, 0x66B1, + 0x66B2, 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8, 0x66BA, 0x66BB, + 0x66BC, 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2, 0x66C3, 0x66C4, + 0x66C5, 0x66C6, 0x66C7, 0x66C8, 0x66C9, 0x66CA, 0x66CB, 0x66CC, + 0x66CD, 0x66CE, 0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, + 0x66D5, 0x66D6, 0x66D7, 0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E0, + 0x66E1, 0x66E2, 0x66E3, 0x66E4, 0x66E5, 0x66E7, 0x66E8, 0x66EA, + 0x66EB, 0x66EC, 0x66ED, 0x66EE, 0x66EF, 0x66F1, 0x66F5, 0x66F6, + 0x66F8, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702, 0x6703, 0, +plane 96 +at 0x40 + 0x6704, 0x6705, 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711, + 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E, + 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, + 0x672E, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, + 0x673B, 0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, + 0x674A, 0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, + 0x6759, 0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, + 0x6767, 0x676B, 0x676C, 0x676E, 0x6771, 0x6774, 0x6776, 0, + 0x6778, 0x6779, 0x677A, 0x677B, 0x677D, 0x6780, 0x6782, 0x6783, + 0x6785, 0x6786, 0x6788, 0x678A, 0x678C, 0x678D, 0x678E, 0x678F, + 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679B, 0x679F, + 0x67A0, 0x67A1, 0x67A4, 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, + 0x67B2, 0x67B4, 0x67B9, 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, + 0x67BF, 0x67C0, 0x67C2, 0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, + 0x67CA, 0x67CB, 0x67CC, 0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, + 0x67DB, 0x67DF, 0x67E1, 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, + 0x67EA, 0x67EB, 0x67ED, 0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, + 0x67F8, 0x67F9, 0x67FA, 0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, + 0x6803, 0x6804, 0x6806, 0x680D, 0x6810, 0x6812, 0x6814, 0x6815, + 0x6818, 0x6819, 0x681A, 0x681B, 0x681C, 0x681E, 0x681F, 0x6820, + 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682B, + 0x682C, 0x682D, 0x682E, 0x682F, 0x6830, 0x6831, 0x6834, 0x6835, + 0x6836, 0x683A, 0x683B, 0x683F, 0x6847, 0x684B, 0x684D, 0x684F, + 0x6852, 0x6856, 0x6857, 0x6858, 0x6859, 0x685A, 0x685B, 0, +plane 97 +at 0x40 + 0x685C, 0x685D, 0x685E, 0x685F, 0x686A, 0x686C, 0x686D, 0x686E, + 0x686F, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879, + 0x687A, 0x687B, 0x687C, 0x687D, 0x687E, 0x687F, 0x6880, 0x6882, + 0x6884, 0x6887, 0x6888, 0x6889, 0x688A, 0x688B, 0x688C, 0x688D, + 0x688E, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898, + 0x6899, 0x689A, 0x689B, 0x689C, 0x689D, 0x689E, 0x689F, 0x68A0, + 0x68A1, 0x68A3, 0x68A4, 0x68A5, 0x68A9, 0x68AA, 0x68AB, 0x68AC, + 0x68AE, 0x68B1, 0x68B2, 0x68B4, 0x68B6, 0x68B7, 0x68B8, 0, + 0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, 0x68BE, 0x68BF, 0x68C1, + 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC, + 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D6, 0x68D7, + 0x68D9, 0x68DB, 0x68DC, 0x68DD, 0x68DE, 0x68DF, 0x68E1, 0x68E2, + 0x68E4, 0x68E5, 0x68E6, 0x68E7, 0x68E8, 0x68E9, 0x68EA, 0x68EB, + 0x68EC, 0x68ED, 0x68EF, 0x68F2, 0x68F3, 0x68F4, 0x68F6, 0x68F7, + 0x68F8, 0x68FB, 0x68FD, 0x68FE, 0x68FF, 0x6900, 0x6902, 0x6903, + 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690A, 0x690C, 0x690F, + 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, + 0x691A, 0x691B, 0x691C, 0x691D, 0x691E, 0x6921, 0x6922, 0x6923, + 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692A, 0x692B, 0x692C, + 0x692E, 0x692F, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, + 0x6938, 0x693A, 0x693B, 0x693C, 0x693E, 0x6940, 0x6941, 0x6943, + 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694A, 0x694B, + 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, 0x6951, 0x6952, 0x6953, + 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, 0x695C, 0x695F, 0, +plane 98 +at 0x40 + 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696A, + 0x696C, 0x696D, 0x696F, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975, + 0x6976, 0x697A, 0x697B, 0x697D, 0x697E, 0x697F, 0x6981, 0x6983, + 0x6985, 0x698A, 0x698B, 0x698C, 0x698E, 0x698F, 0x6990, 0x6991, + 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699A, 0x699D, 0x699E, + 0x699F, 0x69A0, 0x69A1, 0x69A2, 0x69A3, 0x69A4, 0x69A5, 0x69A6, + 0x69A9, 0x69AA, 0x69AC, 0x69AE, 0x69AF, 0x69B0, 0x69B2, 0x69B3, + 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA, 0x69BC, 0x69BD, 0, + 0x69BE, 0x69BF, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5, 0x69C6, + 0x69C7, 0x69C8, 0x69C9, 0x69CB, 0x69CD, 0x69CF, 0x69D1, 0x69D2, + 0x69D3, 0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, 0x69DC, + 0x69DD, 0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, 0x69E6, + 0x69E7, 0x69E8, 0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, 0x69EF, + 0x69F0, 0x69F1, 0x69F3, 0x69F4, 0x69F5, 0x69F6, 0x69F7, 0x69F8, + 0x69F9, 0x69FA, 0x69FB, 0x69FC, 0x69FE, 0x6A00, 0x6A01, 0x6A02, + 0x6A03, 0x6A04, 0x6A05, 0x6A06, 0x6A07, 0x6A08, 0x6A09, 0x6A0B, + 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11, 0x6A12, 0x6A13, + 0x6A14, 0x6A15, 0x6A16, 0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D, + 0x6A1E, 0x6A20, 0x6A22, 0x6A23, 0x6A24, 0x6A25, 0x6A26, 0x6A27, + 0x6A29, 0x6A2B, 0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, 0x6A33, + 0x6A34, 0x6A36, 0x6A37, 0x6A38, 0x6A39, 0x6A3A, 0x6A3B, 0x6A3C, + 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43, 0x6A45, 0x6A46, 0x6A48, + 0x6A49, 0x6A4A, 0x6A4B, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, 0x6A51, + 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A, 0, +plane 99 +at 0x40 + 0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, 0x6A60, 0x6A62, 0x6A63, 0x6A64, + 0x6A66, 0x6A67, 0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, + 0x6A6E, 0x6A6F, 0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, + 0x6A77, 0x6A78, 0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, + 0x6A82, 0x6A83, 0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A89, 0x6A8A, + 0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, 0x6A92, 0x6A93, 0x6A94, 0x6A95, + 0x6A96, 0x6A98, 0x6A99, 0x6A9A, 0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E, + 0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, 0x6AA4, 0x6AA5, 0x6AA6, 0, + 0x6AA7, 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AAF, 0x6AB0, 0x6AB1, + 0x6AB2, 0x6AB3, 0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB8, 0x6AB9, + 0x6ABA, 0x6ABB, 0x6ABC, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, + 0x6AC2, 0x6AC3, 0x6AC4, 0x6AC5, 0x6AC6, 0x6AC7, 0x6AC8, 0x6AC9, + 0x6ACA, 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, 0x6ACF, 0x6AD0, 0x6AD1, + 0x6AD2, 0x6AD3, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7, 0x6AD8, 0x6AD9, + 0x6ADA, 0x6ADB, 0x6ADC, 0x6ADD, 0x6ADE, 0x6ADF, 0x6AE0, 0x6AE1, + 0x6AE2, 0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, 0x6AE7, 0x6AE8, 0x6AE9, + 0x6AEA, 0x6AEB, 0x6AEC, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0, 0x6AF1, + 0x6AF2, 0x6AF3, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF8, 0x6AF9, + 0x6AFA, 0x6AFB, 0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01, + 0x6B02, 0x6B03, 0x6B04, 0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, + 0x6B0A, 0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, 0x6B0F, 0x6B10, 0x6B11, + 0x6B12, 0x6B13, 0x6B14, 0x6B15, 0x6B16, 0x6B17, 0x6B18, 0x6B19, + 0x6B1A, 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1E, 0x6B1F, 0x6B25, 0x6B26, + 0x6B28, 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E, 0, +plane 9a +at 0x40 + 0x6B2F, 0x6B30, 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, + 0x6B3B, 0x6B3C, 0x6B3D, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, + 0x6B45, 0x6B48, 0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B50, + 0x6B51, 0x6B52, 0x6B53, 0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58, + 0x6B5A, 0x6B5B, 0x6B5C, 0x6B5D, 0x6B5E, 0x6B5F, 0x6B60, 0x6B61, + 0x6B68, 0x6B69, 0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, 0x6B6F, 0x6B70, + 0x6B71, 0x6B72, 0x6B73, 0x6B74, 0x6B75, 0x6B76, 0x6B77, 0x6B78, + 0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, 0, + 0x6B8C, 0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, + 0x6B98, 0x6B99, 0x6B9C, 0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BA2, + 0x6BA3, 0x6BA4, 0x6BA5, 0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAB, + 0x6BAC, 0x6BAD, 0x6BAE, 0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, 0x6BB6, + 0x6BB8, 0x6BB9, 0x6BBA, 0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, + 0x6BC3, 0x6BC4, 0x6BC6, 0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, + 0x6BCE, 0x6BD0, 0x6BD1, 0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, + 0x6BDF, 0x6BE0, 0x6BE2, 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, + 0x6BE8, 0x6BE9, 0x6BEC, 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, + 0x6BF4, 0x6BF6, 0x6BF7, 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, + 0x6BFF, 0x6C00, 0x6C01, 0x6C02, 0x6C03, 0x6C04, 0x6C08, 0x6C09, + 0x6C0A, 0x6C0B, 0x6C0C, 0x6C0E, 0x6C12, 0x6C17, 0x6C1C, 0x6C1D, + 0x6C1E, 0x6C20, 0x6C23, 0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, 0x6C31, + 0x6C33, 0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, + 0x6C3F, 0x6C43, 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, + 0x6C4E, 0x6C4F, 0x6C51, 0x6C52, 0x6C53, 0x6C56, 0x6C58, 0, +plane 9b +at 0x40 + 0x6C59, 0x6C5A, 0x6C62, 0x6C63, 0x6C65, 0x6C66, 0x6C67, 0x6C6B, + 0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, 0x6C71, 0x6C73, 0x6C75, 0x6C77, + 0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, 0x6C87, + 0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96, + 0x6C97, 0x6C98, 0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, + 0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, + 0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, + 0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8, 0, + 0x6CD9, 0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, 0x6CE4, 0x6CE6, 0x6CE7, + 0x6CE9, 0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, 0x6CF9, 0x6CFF, 0x6D00, + 0x6D02, 0x6D03, 0x6D05, 0x6D06, 0x6D08, 0x6D09, 0x6D0A, 0x6D0D, + 0x6D0F, 0x6D10, 0x6D11, 0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18, + 0x6D1C, 0x6D1D, 0x6D1F, 0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24, + 0x6D26, 0x6D28, 0x6D29, 0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34, + 0x6D36, 0x6D37, 0x6D38, 0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44, + 0x6D49, 0x6D4C, 0x6D50, 0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B, + 0x6D5D, 0x6D5F, 0x6D61, 0x6D62, 0x6D64, 0x6D65, 0x6D67, 0x6D68, + 0x6D6B, 0x6D6C, 0x6D6D, 0x6D70, 0x6D71, 0x6D72, 0x6D73, 0x6D75, + 0x6D76, 0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, 0x6D7E, 0x6D7F, 0x6D80, + 0x6D81, 0x6D83, 0x6D84, 0x6D86, 0x6D87, 0x6D8A, 0x6D8B, 0x6D8D, + 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97, 0x6D98, 0x6D99, 0x6D9A, + 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, 0x6DB0, 0x6DB1, 0x6DB3, + 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, 0x6DBB, 0x6DBC, 0x6DBD, + 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, 0x6DC9, 0x6DCA, 0, +plane 9c +at 0x40 + 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, 0x6DD4, 0x6DD5, + 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, 0x6DE3, 0x6DE5, + 0x6DE7, 0x6DE8, 0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, 0x6DF0, 0x6DF2, + 0x6DF4, 0x6DF5, 0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, 0x6DFE, 0x6DFF, + 0x6E00, 0x6E01, 0x6E02, 0x6E03, 0x6E04, 0x6E06, 0x6E07, 0x6E08, + 0x6E09, 0x6E0B, 0x6E0F, 0x6E12, 0x6E13, 0x6E15, 0x6E18, 0x6E19, + 0x6E1B, 0x6E1C, 0x6E1E, 0x6E1F, 0x6E22, 0x6E26, 0x6E27, 0x6E28, + 0x6E2A, 0x6E2C, 0x6E2E, 0x6E30, 0x6E31, 0x6E33, 0x6E35, 0, + 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, 0x6E3F, + 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47, 0x6E48, 0x6E49, + 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51, 0x6E52, 0x6E55, + 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E5E, 0x6E60, 0x6E61, + 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68, 0x6E69, + 0x6E6A, 0x6E6C, 0x6E6D, 0x6E6F, 0x6E70, 0x6E71, 0x6E72, 0x6E73, + 0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, 0x6E7B, + 0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, 0x6E88, + 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, 0x6E93, + 0x6E94, 0x6E95, 0x6E96, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, 0x6E9D, + 0x6E9E, 0x6EA0, 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9, + 0x6EAB, 0x6EAC, 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8, + 0x6EB9, 0x6EBC, 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, 0x6EC5, + 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, 0x6ED0, + 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, 0x6EE3, + 0x6EE7, 0x6EEA, 0x6EEB, 0x6EEC, 0x6EED, 0x6EEE, 0x6EEF, 0, +plane 9d +at 0x40 + 0x6EF0, 0x6EF1, 0x6EF2, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8, + 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, 0x6EFE, 0x6EFF, 0x6F00, 0x6F01, + 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, + 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16, 0x6F17, 0x6F18, + 0x6F19, 0x6F1A, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F, 0x6F21, + 0x6F22, 0x6F23, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2C, 0x6F2E, + 0x6F30, 0x6F32, 0x6F34, 0x6F35, 0x6F37, 0x6F38, 0x6F39, 0x6F3A, + 0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, 0x6F40, 0x6F41, 0x6F42, 0, + 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C, 0x6F4E, + 0x6F4F, 0x6F50, 0x6F51, 0x6F52, 0x6F53, 0x6F54, 0x6F55, 0x6F56, + 0x6F57, 0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, + 0x6F63, 0x6F64, 0x6F65, 0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, + 0x6F6C, 0x6F6F, 0x6F70, 0x6F71, 0x6F73, 0x6F75, 0x6F76, 0x6F77, + 0x6F79, 0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, 0x6F80, 0x6F81, 0x6F82, + 0x6F83, 0x6F85, 0x6F86, 0x6F87, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90, + 0x6F91, 0x6F92, 0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F97, 0x6F98, + 0x6F99, 0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA0, 0x6FA2, + 0x6FA3, 0x6FA4, 0x6FA5, 0x6FA6, 0x6FA8, 0x6FA9, 0x6FAA, 0x6FAB, + 0x6FAC, 0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB1, 0x6FB2, 0x6FB4, + 0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE, + 0x6FBF, 0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, + 0x6FCA, 0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, + 0x6FD4, 0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, 0x6FD9, 0x6FDA, 0x6FDB, + 0x6FDC, 0x6FDD, 0x6FDF, 0x6FE2, 0x6FE3, 0x6FE4, 0x6FE5, 0, +plane 9e +at 0x40 + 0x6FE6, 0x6FE7, 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEB, 0x6FEC, 0x6FED, + 0x6FF0, 0x6FF1, 0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, + 0x6FF8, 0x6FF9, 0x6FFA, 0x6FFB, 0x6FFC, 0x6FFD, 0x6FFE, 0x6FFF, + 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, + 0x7008, 0x7009, 0x700A, 0x700B, 0x700C, 0x700D, 0x700E, 0x700F, + 0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, + 0x7019, 0x701C, 0x701D, 0x701E, 0x701F, 0x7020, 0x7021, 0x7022, + 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702A, 0, + 0x702B, 0x702C, 0x702D, 0x702E, 0x702F, 0x7030, 0x7031, 0x7032, + 0x7033, 0x7034, 0x7036, 0x7037, 0x7038, 0x703A, 0x703B, 0x703C, + 0x703D, 0x703E, 0x703F, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, + 0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704A, 0x704B, 0x704D, + 0x704E, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, + 0x7057, 0x7058, 0x7059, 0x705A, 0x705B, 0x705C, 0x705D, 0x705F, + 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, + 0x7068, 0x7069, 0x706A, 0x706E, 0x7071, 0x7072, 0x7073, 0x7074, + 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, 0x7082, 0x7083, + 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D, 0x708F, + 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B, 0x709E, + 0x709F, 0x70A0, 0x70A1, 0x70A2, 0x70A3, 0x70A4, 0x70A5, 0x70A6, + 0x70A7, 0x70A8, 0x70A9, 0x70AA, 0x70B0, 0x70B2, 0x70B4, 0x70B5, + 0x70B6, 0x70BA, 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6, 0x70C7, + 0x70C9, 0x70CB, 0x70CC, 0x70CD, 0x70CE, 0x70CF, 0x70D0, 0x70D1, + 0x70D2, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D7, 0x70DA, 0, +plane 9f +at 0x40 + 0x70DC, 0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, 0x70E5, + 0x70EA, 0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F4, 0x70F5, + 0x70F6, 0x70F8, 0x70FA, 0x70FB, 0x70FC, 0x70FE, 0x70FF, 0x7100, + 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, + 0x710B, 0x710C, 0x710D, 0x710E, 0x710F, 0x7111, 0x7112, 0x7114, + 0x7117, 0x711B, 0x711C, 0x711D, 0x711E, 0x711F, 0x7120, 0x7121, + 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712A, + 0x712B, 0x712C, 0x712D, 0x712E, 0x7132, 0x7133, 0x7134, 0, + 0x7135, 0x7137, 0x7138, 0x7139, 0x713A, 0x713B, 0x713C, 0x713D, + 0x713E, 0x713F, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, + 0x7147, 0x7148, 0x7149, 0x714B, 0x714D, 0x714F, 0x7150, 0x7151, + 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, + 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, 0x7161, 0x7162, 0x7163, + 0x7165, 0x7169, 0x716A, 0x716B, 0x716C, 0x716D, 0x716F, 0x7170, + 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C, + 0x717E, 0x717F, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, + 0x7187, 0x7188, 0x7189, 0x718B, 0x718C, 0x718D, 0x718E, 0x7190, + 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719A, 0x719B, + 0x719C, 0x719D, 0x719E, 0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5, + 0x71A6, 0x71A7, 0x71A9, 0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF, + 0x71B0, 0x71B1, 0x71B2, 0x71B4, 0x71B6, 0x71B7, 0x71B8, 0x71BA, + 0x71BB, 0x71BC, 0x71BD, 0x71BE, 0x71BF, 0x71C0, 0x71C1, 0x71C2, + 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C8, 0x71C9, 0x71CA, 0x71CB, + 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, 0x71D2, 0x71D3, 0, +plane a0 +at 0x40 + 0x71D6, 0x71D7, 0x71D8, 0x71D9, 0x71DA, 0x71DB, 0x71DC, 0x71DD, + 0x71DE, 0x71DF, 0x71E1, 0x71E2, 0x71E3, 0x71E4, 0x71E6, 0x71E8, + 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71ED, 0x71EF, 0x71F0, 0x71F1, + 0x71F2, 0x71F3, 0x71F4, 0x71F5, 0x71F6, 0x71F7, 0x71F8, 0x71FA, + 0x71FB, 0x71FC, 0x71FD, 0x71FE, 0x71FF, 0x7200, 0x7201, 0x7202, + 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720A, 0x720B, + 0x720C, 0x720D, 0x720E, 0x720F, 0x7210, 0x7211, 0x7212, 0x7213, + 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721A, 0, + 0x721B, 0x721C, 0x721E, 0x721F, 0x7220, 0x7221, 0x7222, 0x7223, + 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722B, 0x722D, 0x722E, + 0x722F, 0x7232, 0x7233, 0x7234, 0x723A, 0x723C, 0x723E, 0x7240, + 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A, + 0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, + 0x7257, 0x7258, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7264, + 0x7265, 0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, 0x7271, + 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, 0x727D, + 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C, + 0x728E, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, + 0x7298, 0x7299, 0x729A, 0x729B, 0x729C, 0x729D, 0x729E, 0x72A0, + 0x72A1, 0x72A2, 0x72A3, 0x72A4, 0x72A5, 0x72A6, 0x72A7, 0x72A8, + 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1, 0x72B2, 0x72B3, 0x72B5, + 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE, 0x72BF, 0x72C0, 0x72C5, + 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC, 0x72CF, 0x72D1, + 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA, 0x72DB, 0, +plane a1 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, + 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, + 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, + 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, + 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, + 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, + 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, + 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, + 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, + 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, + 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, + 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0, +plane a2 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, + 0x2177, 0x2178, 0x2179, 0, 0, 0, 0, 0, + 0, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, + 0x248F, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, + 0x2497, 0x2498, 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, + 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, + 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, + 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, + 0x2467, 0x2468, 0x2469, 0, 0, 0x3220, 0x3221, 0x3222, + 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0, + 0, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, + 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0, 0, 0, +plane a3 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, + 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, + 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, + 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, + 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, + 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, + 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, + 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, + 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, + 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0, +plane a4 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, + 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, + 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, + 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, + 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, + 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, + 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, + 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, + 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, + 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, + 0x3090, 0x3091, 0x3092, 0x3093, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a5 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, + 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, + 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, + 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, + 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, + 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, + 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, + 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, + 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, + 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, + 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a6 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, + 0x03A9, 0, 0, 0, 0, 0, 0, 0, + 0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x03C9, 0, 0, 0, 0, 0, 0, 0, + 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, + 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0, 0, 0xFE3B, 0xFE3C, + 0xFE37, 0xFE38, 0xFE31, 0, 0xFE33, 0xFE34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a7 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, + 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, + 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, + 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, + 0x042E, 0x042F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, + 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, + 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, + 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, + 0x044E, 0x044F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a8 +at 0x40 + 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2014, 0x2025, 0x2035, 0x2105, + 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221F, 0x2223, + 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550, 0x2551, 0x2552, 0x2553, + 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, + 0x255C, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, 0x2562, 0x2563, + 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, + 0x256C, 0x256D, 0x256E, 0x256F, 0x2570, 0x2571, 0x2572, 0x2573, + 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0, + 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D, 0x258E, 0x258F, + 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2, 0x25E3, 0x25E4, + 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, + 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, + 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, + 0x01DC, 0x00FC, 0x00EA, 0x0251, 0xE7C7, 0x0144, 0x0148, 0xE7C8, + 0x0261, 0, 0, 0, 0, 0x3105, 0x3106, 0x3107, + 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, + 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, + 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, + 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, + 0x3128, 0x3129, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a9 +at 0x40 + 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, + 0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1, + 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4, + 0, 0x2121, 0x3231, 0, 0x2010, 0, 0, 0, + 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE, 0x3006, 0x309D, 0x309E, + 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, + 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE59, 0xFE5A, + 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, 0xFE60, 0xFE61, 0, + 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68, 0xFE69, 0xFE6A, + 0xFE6B, 0xE7E7, 0xE7E8, 0xE7E9, 0xE7EA, 0xE7EB, 0xE7EC, 0xE7ED, + 0xE7EE, 0xE7EF, 0xE7F0, 0xE7F1, 0xE7F2, 0xE7F3, 0x3007, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x2500, 0x2501, 0x2502, 0x2503, + 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, + 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, + 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, + 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, + 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, + 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, + 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, + 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, + 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane aa +at 0x40 + 0x72DC, 0x72DD, 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5, 0x72E6, + 0x72E7, 0x72EA, 0x72EB, 0x72F5, 0x72F6, 0x72F9, 0x72FD, 0x72FE, + 0x72FF, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, + 0x7309, 0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, + 0x7314, 0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, + 0x7326, 0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, + 0x7335, 0x7336, 0x733A, 0x733B, 0x733C, 0x733D, 0x7340, 0x7341, + 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0, + 0x7349, 0x734A, 0x734B, 0x734C, 0x734E, 0x734F, 0x7351, 0x7353, + 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735A, 0x735B, 0x735C, + 0x735D, 0x735E, 0x735F, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, + 0x7366, 0x7367, 0x7368, 0x7369, 0x736A, 0x736B, 0x736E, 0x7370, + 0x7371, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane ab +at 0x40 + 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, + 0x737A, 0x737B, 0x737C, 0x737D, 0x737F, 0x7380, 0x7381, 0x7382, + 0x7383, 0x7385, 0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F, + 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, + 0x739A, 0x739C, 0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4, + 0x73A5, 0x73A6, 0x73A7, 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1, + 0x73B4, 0x73B5, 0x73B6, 0x73B8, 0x73B9, 0x73BC, 0x73BD, 0x73BE, + 0x73BF, 0x73C1, 0x73C3, 0x73C4, 0x73C5, 0x73C6, 0x73C7, 0, + 0x73CB, 0x73CC, 0x73CE, 0x73D2, 0x73D3, 0x73D4, 0x73D5, 0x73D6, + 0x73D7, 0x73D8, 0x73DA, 0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1, + 0x73E2, 0x73E3, 0x73E4, 0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC, + 0x73EE, 0x73EF, 0x73F0, 0x73F1, 0x73F3, 0x73F4, 0x73F5, 0x73F6, + 0x73F7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane ac +at 0x40 + 0x73F8, 0x73F9, 0x73FA, 0x73FB, 0x73FC, 0x73FD, 0x73FE, 0x73FF, + 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740B, 0x740C, + 0x740D, 0x740E, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, + 0x7417, 0x7418, 0x7419, 0x741C, 0x741D, 0x741E, 0x741F, 0x7420, + 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742B, 0x742D, 0x742F, + 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743A, 0x743B, 0x743D, + 0x743E, 0x743F, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, + 0x7447, 0x7448, 0x7449, 0x744A, 0x744B, 0x744C, 0x744D, 0, + 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456, + 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, + 0x7466, 0x7467, 0x7468, 0x7469, 0x746A, 0x746B, 0x746C, 0x746E, + 0x746F, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, + 0x747A, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane ad +at 0x40 + 0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486, + 0x7488, 0x7489, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, + 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A, + 0x749B, 0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A3, 0x74A4, + 0x74A5, 0x74A6, 0x74AA, 0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, + 0x74B0, 0x74B1, 0x74B2, 0x74B3, 0x74B4, 0x74B5, 0x74B6, 0x74B7, + 0x74B8, 0x74B9, 0x74BB, 0x74BC, 0x74BD, 0x74BE, 0x74BF, 0x74C0, + 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5, 0x74C6, 0x74C7, 0, + 0x74C8, 0x74C9, 0x74CA, 0x74CB, 0x74CC, 0x74CD, 0x74CE, 0x74CF, + 0x74D0, 0x74D1, 0x74D3, 0x74D4, 0x74D5, 0x74D6, 0x74D7, 0x74D8, + 0x74D9, 0x74DA, 0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, + 0x74E8, 0x74E9, 0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, + 0x74F2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane ae +at 0x40 + 0x74F3, 0x74F5, 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, + 0x74FE, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, + 0x7508, 0x7509, 0x750A, 0x750B, 0x750C, 0x750E, 0x7510, 0x7512, + 0x7514, 0x7515, 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, + 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752A, 0x752E, + 0x7534, 0x7536, 0x7539, 0x753C, 0x753D, 0x753F, 0x7541, 0x7542, + 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754A, 0x754D, 0x7550, + 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0, + 0x755D, 0x755E, 0x755F, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, + 0x7567, 0x7568, 0x7569, 0x756B, 0x756C, 0x756D, 0x756E, 0x756F, + 0x7570, 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757A, 0x757B, + 0x757C, 0x757D, 0x757E, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, + 0x7587, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane af +at 0x40 + 0x7588, 0x7589, 0x758A, 0x758C, 0x758D, 0x758E, 0x7590, 0x7593, + 0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, 0x75A6, 0x75A7, + 0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, 0x75BB, + 0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF, + 0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75D9, 0x75DA, 0x75DC, 0x75DD, + 0x75DF, 0x75E0, 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE, + 0x75EF, 0x75F2, 0x75F3, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA, + 0x75FB, 0x75FD, 0x75FE, 0x7602, 0x7604, 0x7606, 0x7607, 0, + 0x7608, 0x7609, 0x760B, 0x760D, 0x760E, 0x760F, 0x7611, 0x7612, + 0x7613, 0x7614, 0x7616, 0x761A, 0x761C, 0x761D, 0x761E, 0x7621, + 0x7623, 0x7627, 0x7628, 0x762C, 0x762E, 0x762F, 0x7631, 0x7632, + 0x7636, 0x7637, 0x7639, 0x763A, 0x763B, 0x763D, 0x7641, 0x7642, + 0x7644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane b0 +at 0x40 + 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764A, 0x764B, 0x764E, + 0x764F, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658, + 0x7659, 0x765A, 0x765B, 0x765D, 0x765F, 0x7660, 0x7661, 0x7662, + 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766A, 0x766C, + 0x766D, 0x766E, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, + 0x7676, 0x7677, 0x7679, 0x767A, 0x767C, 0x767F, 0x7680, 0x7681, + 0x7683, 0x7685, 0x7689, 0x768A, 0x768C, 0x768D, 0x768F, 0x7690, + 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769A, 0x769B, 0, + 0x769C, 0x769D, 0x769E, 0x769F, 0x76A0, 0x76A1, 0x76A2, 0x76A3, + 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76A9, 0x76AA, 0x76AB, 0x76AC, + 0x76AD, 0x76AF, 0x76B0, 0x76B3, 0x76B5, 0x76B6, 0x76B7, 0x76B8, + 0x76B9, 0x76BA, 0x76BB, 0x76BC, 0x76BD, 0x76BE, 0x76C0, 0x76C1, + 0x76C3, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0, + 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698, + 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, + 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, + 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, + 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, + 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D, + 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591, + 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E, + 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E, + 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551, + 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, 0, +plane b1 +at 0x40 + 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC, 0x76D3, 0x76D5, 0x76D9, + 0x76DA, 0x76DC, 0x76DD, 0x76DE, 0x76E0, 0x76E1, 0x76E2, 0x76E3, + 0x76E4, 0x76E6, 0x76E7, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, + 0x76ED, 0x76F0, 0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, + 0x76FD, 0x76FF, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, + 0x770C, 0x770E, 0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, + 0x7715, 0x7716, 0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E, + 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772A, 0x772B, 0, + 0x772C, 0x772E, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, + 0x773B, 0x773D, 0x773E, 0x773F, 0x7742, 0x7744, 0x7745, 0x7746, + 0x7748, 0x7749, 0x774A, 0x774B, 0x774C, 0x774D, 0x774E, 0x774F, + 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, + 0x775C, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, + 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, + 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, + 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, + 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, + 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, + 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, + 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, + 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, + 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, + 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, + 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, 0, +plane b2 +at 0x40 + 0x775D, 0x775E, 0x775F, 0x7760, 0x7764, 0x7767, 0x7769, 0x776A, + 0x776D, 0x776E, 0x776F, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, + 0x7775, 0x7776, 0x7777, 0x7778, 0x777A, 0x777B, 0x777C, 0x7781, + 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778A, 0x778B, + 0x778F, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, + 0x7799, 0x779A, 0x779B, 0x779C, 0x779D, 0x779E, 0x77A1, 0x77A3, + 0x77A4, 0x77A6, 0x77A8, 0x77AB, 0x77AD, 0x77AE, 0x77AF, 0x77B1, + 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA, 0, + 0x77BC, 0x77BE, 0x77C0, 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, + 0x77C6, 0x77C7, 0x77C8, 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, + 0x77CF, 0x77D0, 0x77D1, 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, + 0x77D8, 0x77D9, 0x77DA, 0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, + 0x77E4, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, + 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, + 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, + 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, + 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, + 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, + 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, + 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, + 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, + 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, + 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, + 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, 0, +plane b3 +at 0x40 + 0x77E6, 0x77E8, 0x77EA, 0x77EF, 0x77F0, 0x77F1, 0x77F2, 0x77F4, + 0x77F5, 0x77F7, 0x77F9, 0x77FA, 0x77FB, 0x77FC, 0x7803, 0x7804, + 0x7805, 0x7806, 0x7807, 0x7808, 0x780A, 0x780B, 0x780E, 0x780F, + 0x7810, 0x7813, 0x7815, 0x7819, 0x781B, 0x781E, 0x7820, 0x7821, + 0x7822, 0x7824, 0x7828, 0x782A, 0x782B, 0x782E, 0x782F, 0x7831, + 0x7832, 0x7833, 0x7835, 0x7836, 0x783D, 0x783F, 0x7841, 0x7842, + 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784A, 0x784B, 0x784D, + 0x784F, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785A, 0, + 0x785B, 0x785C, 0x785E, 0x785F, 0x7860, 0x7861, 0x7862, 0x7863, + 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786F, 0x7870, + 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, + 0x787A, 0x787B, 0x787D, 0x787E, 0x787F, 0x7880, 0x7881, 0x7882, + 0x7883, 0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, + 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, + 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, + 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, + 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, + 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, + 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, + 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, + 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, + 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, + 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, + 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A, 0, +plane b4 +at 0x40 + 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, 0x788F, 0x7890, + 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, 0x789E, 0x78A0, + 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78A9, 0x78AA, 0x78AB, 0x78AC, + 0x78AD, 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78B8, 0x78BA, + 0x78BB, 0x78BC, 0x78BD, 0x78BF, 0x78C0, 0x78C2, 0x78C3, 0x78C4, + 0x78C6, 0x78C7, 0x78C8, 0x78CC, 0x78CD, 0x78CE, 0x78CF, 0x78D1, + 0x78D2, 0x78D3, 0x78D6, 0x78D7, 0x78D8, 0x78DA, 0x78DB, 0x78DC, + 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1, 0x78E2, 0x78E3, 0, + 0x78E4, 0x78E5, 0x78E6, 0x78E7, 0x78E9, 0x78EA, 0x78EB, 0x78ED, + 0x78EE, 0x78EF, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, 0x78F8, + 0x78F9, 0x78FB, 0x78FC, 0x78FD, 0x78FE, 0x78FF, 0x7900, 0x7902, + 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790A, 0x790B, + 0x790C, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3, + 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE, + 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376, + 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF, + 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E, + 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A, + 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B, + 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC, + 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8, + 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE, + 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, + 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, 0, +plane b5 +at 0x40 + 0x790D, 0x790E, 0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, + 0x7916, 0x7917, 0x7918, 0x7919, 0x791A, 0x791B, 0x791C, 0x791D, + 0x791F, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, + 0x7928, 0x7929, 0x792A, 0x792B, 0x792C, 0x792D, 0x792E, 0x792F, + 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, + 0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, + 0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951, + 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0, + 0x7964, 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, + 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, + 0x797C, 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, + 0x7988, 0x7989, 0x798B, 0x798C, 0x798D, 0x798E, 0x7990, 0x7991, + 0x7992, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, + 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, + 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, + 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, + 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, + 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, + 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, + 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, + 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, + 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, + 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, + 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, 0, +plane b6 +at 0x40 + 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, + 0x799C, 0x799D, 0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, + 0x79A4, 0x79A5, 0x79A6, 0x79A8, 0x79A9, 0x79AA, 0x79AB, 0x79AC, + 0x79AD, 0x79AE, 0x79AF, 0x79B0, 0x79B1, 0x79B2, 0x79B4, 0x79B5, + 0x79B6, 0x79B7, 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4, 0x79C5, + 0x79C7, 0x79C8, 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0, 0x79D3, + 0x79D4, 0x79D6, 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC, 0x79DD, + 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA, 0, + 0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6, + 0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04, + 0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10, + 0x7A11, 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B, + 0x7A1C, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, + 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, + 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, + 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, + 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, + 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, + 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, + 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, + 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, + 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, + 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, + 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0, +plane b7 +at 0x40 + 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, 0x7A24, 0x7A25, 0x7A26, 0x7A27, + 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, 0x7A2C, 0x7A2D, 0x7A2E, 0x7A2F, + 0x7A30, 0x7A31, 0x7A32, 0x7A34, 0x7A35, 0x7A36, 0x7A38, 0x7A3A, + 0x7A3E, 0x7A40, 0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, 0x7A47, + 0x7A48, 0x7A49, 0x7A4A, 0x7A4B, 0x7A4C, 0x7A4D, 0x7A4E, 0x7A4F, + 0x7A50, 0x7A52, 0x7A53, 0x7A54, 0x7A55, 0x7A56, 0x7A58, 0x7A59, + 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, 0x7A5E, 0x7A5F, 0x7A60, 0x7A61, + 0x7A62, 0x7A63, 0x7A64, 0x7A65, 0x7A66, 0x7A67, 0x7A68, 0, + 0x7A69, 0x7A6A, 0x7A6B, 0x7A6C, 0x7A6D, 0x7A6E, 0x7A6F, 0x7A71, + 0x7A72, 0x7A73, 0x7A75, 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82, + 0x7A85, 0x7A87, 0x7A89, 0x7A8A, 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F, + 0x7A90, 0x7A93, 0x7A94, 0x7A99, 0x7A9A, 0x7A9B, 0x7A9E, 0x7AA1, + 0x7AA2, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, + 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, + 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, + 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, + 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, + 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, + 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, + 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, + 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, + 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, + 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, + 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D, 0, +plane b8 +at 0x40 + 0x7AA3, 0x7AA4, 0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, 0x7AAE, 0x7AAF, + 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4, 0x7AB5, 0x7AB6, 0x7AB7, 0x7AB8, + 0x7AB9, 0x7ABA, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE, 0x7AC0, 0x7AC1, + 0x7AC2, 0x7AC3, 0x7AC4, 0x7AC5, 0x7AC6, 0x7AC7, 0x7AC8, 0x7AC9, + 0x7ACA, 0x7ACC, 0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, 0x7AD1, 0x7AD2, + 0x7AD3, 0x7AD4, 0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC, + 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEA, + 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0, 0x7AF1, 0x7AF2, 0x7AF3, 0, + 0x7AF4, 0x7AF5, 0x7AF6, 0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, 0x7AFE, + 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09, 0x7B0C, 0x7B0D, + 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17, 0x7B18, 0x7B1A, + 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23, 0x7B27, 0x7B29, + 0x7B2D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A, + 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, + 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C, + 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A, + 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6, + 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76, + 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38, + 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, + 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5, + 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769, + 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404, + 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, 0, +plane b9 +at 0x40 + 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35, 0x7B36, 0x7B37, 0x7B39, + 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B42, 0x7B43, 0x7B44, + 0x7B46, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53, 0x7B55, 0x7B57, + 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63, 0x7B64, 0x7B65, + 0x7B66, 0x7B67, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D, + 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A, 0x7B7C, + 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86, 0x7B87, + 0x7B88, 0x7B89, 0x7B8A, 0x7B8B, 0x7B8C, 0x7B8E, 0x7B8F, 0, + 0x7B91, 0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, + 0x7B9E, 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, + 0x7BB0, 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, + 0x7BBB, 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC0, 0x7BC2, 0x7BC3, + 0x7BC4, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, + 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, + 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, + 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, + 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, + 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, + 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, + 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, + 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, + 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, + 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, + 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, 0, +plane ba +at 0x40 + 0x7BC5, 0x7BC8, 0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, 0x7BCE, 0x7BCF, + 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, + 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, 0x7BE4, 0x7BE7, + 0x7BE8, 0x7BE9, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, 0x7BF0, 0x7BF2, + 0x7BF3, 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFB, + 0x7BFD, 0x7BFF, 0x7C00, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05, + 0x7C06, 0x7C08, 0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, 0x7C10, 0x7C11, + 0x7C12, 0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, 0, + 0x7C1A, 0x7C1B, 0x7C1C, 0x7C1D, 0x7C1E, 0x7C20, 0x7C21, 0x7C22, + 0x7C23, 0x7C24, 0x7C25, 0x7C28, 0x7C29, 0x7C2B, 0x7C2C, 0x7C2D, + 0x7C2E, 0x7C2F, 0x7C30, 0x7C31, 0x7C32, 0x7C33, 0x7C34, 0x7C35, + 0x7C36, 0x7C37, 0x7C39, 0x7C3A, 0x7C3B, 0x7C3C, 0x7C3D, 0x7C3E, + 0x7C42, 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, + 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, + 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, + 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, + 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, + 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, + 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, + 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, + 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, + 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, + 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, + 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0, +plane bb +at 0x40 + 0x7C43, 0x7C44, 0x7C45, 0x7C46, 0x7C47, 0x7C48, 0x7C49, 0x7C4A, + 0x7C4B, 0x7C4C, 0x7C4E, 0x7C4F, 0x7C50, 0x7C51, 0x7C52, 0x7C53, + 0x7C54, 0x7C55, 0x7C56, 0x7C57, 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, + 0x7C5C, 0x7C5D, 0x7C5E, 0x7C5F, 0x7C60, 0x7C61, 0x7C62, 0x7C63, + 0x7C64, 0x7C65, 0x7C66, 0x7C67, 0x7C68, 0x7C69, 0x7C6A, 0x7C6B, + 0x7C6C, 0x7C6D, 0x7C6E, 0x7C6F, 0x7C70, 0x7C71, 0x7C72, 0x7C75, + 0x7C76, 0x7C77, 0x7C78, 0x7C79, 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, + 0x7C81, 0x7C82, 0x7C83, 0x7C84, 0x7C85, 0x7C86, 0x7C87, 0, + 0x7C88, 0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90, + 0x7C93, 0x7C94, 0x7C96, 0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1, + 0x7CA3, 0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD, + 0x7CAF, 0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA, + 0x7CBB, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, + 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, + 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, + 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, + 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, + 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, + 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, + 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, + 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, + 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, + 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, + 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95, 0, +plane bc +at 0x40 + 0x7CBF, 0x7CC0, 0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB, + 0x7CCE, 0x7CCF, 0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, 0x7CD4, 0x7CD8, + 0x7CDA, 0x7CDB, 0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4, + 0x7CE5, 0x7CE6, 0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, 0x7CEC, 0x7CED, + 0x7CEE, 0x7CF0, 0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, 0x7CF5, 0x7CF6, + 0x7CF7, 0x7CF9, 0x7CFA, 0x7CFC, 0x7CFD, 0x7CFE, 0x7CFF, 0x7D00, + 0x7D01, 0x7D02, 0x7D03, 0x7D04, 0x7D05, 0x7D06, 0x7D07, 0x7D08, + 0x7D09, 0x7D0B, 0x7D0C, 0x7D0D, 0x7D0E, 0x7D0F, 0x7D10, 0, + 0x7D11, 0x7D12, 0x7D13, 0x7D14, 0x7D15, 0x7D16, 0x7D17, 0x7D18, + 0x7D19, 0x7D1A, 0x7D1B, 0x7D1C, 0x7D1D, 0x7D1E, 0x7D1F, 0x7D21, + 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C, + 0x7D2D, 0x7D2E, 0x7D30, 0x7D31, 0x7D32, 0x7D33, 0x7D34, 0x7D35, + 0x7D36, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC, + 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6, + 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324, + 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E, + 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0, + 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7, + 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532, + 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C, + 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9, + 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877, + 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB, + 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, 0, +plane bd +at 0x40 + 0x7D37, 0x7D38, 0x7D39, 0x7D3A, 0x7D3B, 0x7D3C, 0x7D3D, 0x7D3E, + 0x7D3F, 0x7D40, 0x7D41, 0x7D42, 0x7D43, 0x7D44, 0x7D45, 0x7D46, + 0x7D47, 0x7D48, 0x7D49, 0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4E, + 0x7D4F, 0x7D50, 0x7D51, 0x7D52, 0x7D53, 0x7D54, 0x7D55, 0x7D56, + 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B, 0x7D5C, 0x7D5D, 0x7D5E, + 0x7D5F, 0x7D60, 0x7D61, 0x7D62, 0x7D63, 0x7D64, 0x7D65, 0x7D66, + 0x7D67, 0x7D68, 0x7D69, 0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, + 0x7D70, 0x7D71, 0x7D72, 0x7D73, 0x7D74, 0x7D75, 0x7D76, 0, + 0x7D78, 0x7D79, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F, + 0x7D80, 0x7D81, 0x7D82, 0x7D83, 0x7D84, 0x7D85, 0x7D86, 0x7D87, + 0x7D88, 0x7D89, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D, 0x7D8E, 0x7D8F, + 0x7D90, 0x7D91, 0x7D92, 0x7D93, 0x7D94, 0x7D95, 0x7D96, 0x7D97, + 0x7D98, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, + 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, + 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, + 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, + 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, + 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, + 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, + 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, + 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, + 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, + 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, + 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, 0, +plane be +at 0x40 + 0x7D99, 0x7D9A, 0x7D9B, 0x7D9C, 0x7D9D, 0x7D9E, 0x7D9F, 0x7DA0, + 0x7DA1, 0x7DA2, 0x7DA3, 0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, + 0x7DAA, 0x7DAB, 0x7DAC, 0x7DAD, 0x7DAF, 0x7DB0, 0x7DB1, 0x7DB2, + 0x7DB3, 0x7DB4, 0x7DB5, 0x7DB6, 0x7DB7, 0x7DB8, 0x7DB9, 0x7DBA, + 0x7DBB, 0x7DBC, 0x7DBD, 0x7DBE, 0x7DBF, 0x7DC0, 0x7DC1, 0x7DC2, + 0x7DC3, 0x7DC4, 0x7DC5, 0x7DC6, 0x7DC7, 0x7DC8, 0x7DC9, 0x7DCA, + 0x7DCB, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, 0x7DD1, 0x7DD2, + 0x7DD3, 0x7DD4, 0x7DD5, 0x7DD6, 0x7DD7, 0x7DD8, 0x7DD9, 0, + 0x7DDA, 0x7DDB, 0x7DDC, 0x7DDD, 0x7DDE, 0x7DDF, 0x7DE0, 0x7DE1, + 0x7DE2, 0x7DE3, 0x7DE4, 0x7DE5, 0x7DE6, 0x7DE7, 0x7DE8, 0x7DE9, + 0x7DEA, 0x7DEB, 0x7DEC, 0x7DED, 0x7DEE, 0x7DEF, 0x7DF0, 0x7DF1, + 0x7DF2, 0x7DF3, 0x7DF4, 0x7DF5, 0x7DF6, 0x7DF7, 0x7DF8, 0x7DF9, + 0x7DFA, 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, + 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, + 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, + 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, + 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, + 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, + 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, + 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, + 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, + 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, + 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, + 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB, 0, +plane bf +at 0x40 + 0x7DFB, 0x7DFC, 0x7DFD, 0x7DFE, 0x7DFF, 0x7E00, 0x7E01, 0x7E02, + 0x7E03, 0x7E04, 0x7E05, 0x7E06, 0x7E07, 0x7E08, 0x7E09, 0x7E0A, + 0x7E0B, 0x7E0C, 0x7E0D, 0x7E0E, 0x7E0F, 0x7E10, 0x7E11, 0x7E12, + 0x7E13, 0x7E14, 0x7E15, 0x7E16, 0x7E17, 0x7E18, 0x7E19, 0x7E1A, + 0x7E1B, 0x7E1C, 0x7E1D, 0x7E1E, 0x7E1F, 0x7E20, 0x7E21, 0x7E22, + 0x7E23, 0x7E24, 0x7E25, 0x7E26, 0x7E27, 0x7E28, 0x7E29, 0x7E2A, + 0x7E2B, 0x7E2C, 0x7E2D, 0x7E2E, 0x7E2F, 0x7E30, 0x7E31, 0x7E32, + 0x7E33, 0x7E34, 0x7E35, 0x7E36, 0x7E37, 0x7E38, 0x7E39, 0, + 0x7E3A, 0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, 0x7E40, 0x7E42, 0x7E43, + 0x7E44, 0x7E45, 0x7E46, 0x7E48, 0x7E49, 0x7E4A, 0x7E4B, 0x7E4C, + 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, 0x7E52, 0x7E53, 0x7E54, + 0x7E55, 0x7E56, 0x7E57, 0x7E58, 0x7E59, 0x7E5A, 0x7E5B, 0x7E5C, + 0x7E5D, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, + 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, + 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, + 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, + 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, + 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, + 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, + 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, + 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, + 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, + 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, + 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080, 0, +plane c0 +at 0x40 + 0x7E5E, 0x7E5F, 0x7E60, 0x7E61, 0x7E62, 0x7E63, 0x7E64, 0x7E65, + 0x7E66, 0x7E67, 0x7E68, 0x7E69, 0x7E6A, 0x7E6B, 0x7E6C, 0x7E6D, + 0x7E6E, 0x7E6F, 0x7E70, 0x7E71, 0x7E72, 0x7E73, 0x7E74, 0x7E75, + 0x7E76, 0x7E77, 0x7E78, 0x7E79, 0x7E7A, 0x7E7B, 0x7E7C, 0x7E7D, + 0x7E7E, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, 0x7E85, 0x7E86, + 0x7E87, 0x7E88, 0x7E89, 0x7E8A, 0x7E8B, 0x7E8C, 0x7E8D, 0x7E8E, + 0x7E8F, 0x7E90, 0x7E91, 0x7E92, 0x7E93, 0x7E94, 0x7E95, 0x7E96, + 0x7E97, 0x7E98, 0x7E99, 0x7E9A, 0x7E9C, 0x7E9D, 0x7E9E, 0, + 0x7EAE, 0x7EB4, 0x7EBB, 0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, 0x7EF9, + 0x7F0A, 0x7F10, 0x7F1E, 0x7F37, 0x7F39, 0x7F3B, 0x7F3C, 0x7F3D, + 0x7F3E, 0x7F3F, 0x7F40, 0x7F41, 0x7F43, 0x7F46, 0x7F47, 0x7F48, + 0x7F49, 0x7F4A, 0x7F4B, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F4F, 0x7F52, + 0x7F53, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0, + 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721, + 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A, + 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD, + 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC, + 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001, + 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7, + 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B, + 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281, + 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC, + 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389, + 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, 0, +plane c1 +at 0x40 + 0x7F56, 0x7F59, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F5E, 0x7F60, 0x7F63, + 0x7F64, 0x7F65, 0x7F66, 0x7F67, 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, + 0x7F70, 0x7F73, 0x7F75, 0x7F76, 0x7F77, 0x7F78, 0x7F7A, 0x7F7B, + 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83, 0x7F84, 0x7F85, + 0x7F86, 0x7F87, 0x7F88, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, + 0x7F91, 0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, + 0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8, + 0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, 0, + 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, + 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, + 0x7FCB, 0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, 0x7FD2, 0x7FD3, 0x7FD6, + 0x7FD7, 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, 0x7FDD, 0x7FDE, 0x7FE2, + 0x7FE3, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, + 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, + 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, + 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, + 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, + 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, + 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, + 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, + 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, + 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, + 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, + 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, 0, +plane c2 +at 0x40 + 0x7FE4, 0x7FE7, 0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, + 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, 0x7FF9, 0x7FFA, + 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007, 0x8008, 0x8009, 0x800A, + 0x800E, 0x800F, 0x8011, 0x8013, 0x801A, 0x801B, 0x801D, 0x801E, + 0x801F, 0x8021, 0x8023, 0x8024, 0x802B, 0x802C, 0x802D, 0x802E, + 0x802F, 0x8030, 0x8032, 0x8034, 0x8039, 0x803A, 0x803C, 0x803E, + 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804E, + 0x804F, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0, + 0x8059, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, + 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, + 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8072, 0x8073, 0x8074, + 0x8075, 0x8076, 0x8077, 0x8078, 0x8079, 0x807A, 0x807B, 0x807C, + 0x807D, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, + 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, + 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, + 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, + 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, + 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, + 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, + 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, + 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, + 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, + 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, + 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, 0, +plane c3 +at 0x40 + 0x807E, 0x8081, 0x8082, 0x8085, 0x8088, 0x808A, 0x808D, 0x808E, + 0x808F, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099, + 0x809E, 0x80A3, 0x80A6, 0x80A7, 0x80A8, 0x80AC, 0x80B0, 0x80B3, + 0x80B5, 0x80B6, 0x80B8, 0x80B9, 0x80BB, 0x80C5, 0x80C7, 0x80C8, + 0x80C9, 0x80CA, 0x80CB, 0x80CF, 0x80D0, 0x80D1, 0x80D2, 0x80D3, + 0x80D4, 0x80D5, 0x80D8, 0x80DF, 0x80E0, 0x80E2, 0x80E3, 0x80E6, + 0x80EE, 0x80F5, 0x80F7, 0x80F9, 0x80FB, 0x80FE, 0x80FF, 0x8100, + 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810B, 0, + 0x810C, 0x8115, 0x8117, 0x8119, 0x811B, 0x811C, 0x811D, 0x811F, + 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, + 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, 0x812E, 0x8130, 0x8133, + 0x8134, 0x8135, 0x8137, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, + 0x813F, 0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, + 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, + 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, + 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, + 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, + 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, + 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, + 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, + 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, + 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, + 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, + 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478, 0, +plane c4 +at 0x40 + 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, + 0x814D, 0x814E, 0x814F, 0x8152, 0x8156, 0x8157, 0x8158, 0x815B, + 0x815C, 0x815D, 0x815E, 0x815F, 0x8161, 0x8162, 0x8163, 0x8164, + 0x8166, 0x8168, 0x816A, 0x816B, 0x816C, 0x816F, 0x8172, 0x8173, + 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185, + 0x8186, 0x8187, 0x8189, 0x818B, 0x818C, 0x818D, 0x818E, 0x8190, + 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819A, + 0x819E, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x81A4, 0x81A5, 0, + 0x81A7, 0x81A9, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, + 0x81B1, 0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, + 0x81BC, 0x81BD, 0x81BE, 0x81BF, 0x81C4, 0x81C5, 0x81C7, 0x81C8, + 0x81C9, 0x81CB, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2, + 0x81D3, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54, + 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, + 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6, + 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, + 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3, + 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, + 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6, + 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A, + 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA, + 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18, + 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A, + 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, 0, +plane c5 +at 0x40 + 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x81D9, 0x81DA, 0x81DB, + 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x81E0, 0x81E1, 0x81E2, 0x81E4, + 0x81E5, 0x81E6, 0x81E8, 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, + 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FA, + 0x81FD, 0x81FF, 0x8203, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, + 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, + 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, + 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0, + 0x8240, 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, + 0x824C, 0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, + 0x8255, 0x8256, 0x8257, 0x8259, 0x825B, 0x825C, 0x825D, 0x825E, + 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, + 0x8269, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, + 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, + 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, + 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, + 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, + 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, + 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, + 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, + 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, + 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, + 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, + 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, 0, +plane c6 +at 0x40 + 0x826A, 0x826B, 0x826C, 0x826D, 0x8271, 0x8275, 0x8276, 0x8277, + 0x8278, 0x827B, 0x827C, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, + 0x8287, 0x8289, 0x828C, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, + 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, 0x82A3, 0x82A7, 0x82B2, + 0x82B5, 0x82B6, 0x82BA, 0x82BB, 0x82BC, 0x82BF, 0x82C0, 0x82C2, + 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9, 0x82DA, + 0x82DD, 0x82E2, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED, + 0x82EE, 0x82F0, 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0, + 0x82FA, 0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, + 0x830D, 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831D, + 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, + 0x8326, 0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, + 0x833D, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, + 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, + 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, + 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, + 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, + 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, + 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, + 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, + 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, + 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, + 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, + 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0, +plane c7 +at 0x40 + 0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834A, + 0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357, + 0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, + 0x8374, 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380, + 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838A, 0x838B, + 0x838C, 0x838D, 0x838F, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396, + 0x8397, 0x8399, 0x839A, 0x839D, 0x839F, 0x83A1, 0x83A2, 0x83A3, + 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83AC, 0x83AD, 0x83AE, 0, + 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF, 0x83C2, 0x83C3, 0x83C4, + 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD, 0x83CE, 0x83D0, 0x83D1, + 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9, 0x83DA, 0x83DB, 0x83DE, + 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7, 0x83E8, 0x83EB, 0x83EC, + 0x83ED, 0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, + 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, + 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, + 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, + 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, + 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, + 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, + 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, + 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, + 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, + 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, + 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20, 0, +plane c8 +at 0x40 + 0x83EE, 0x83EF, 0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83FA, + 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400, 0x8402, 0x8405, 0x8407, + 0x8408, 0x8409, 0x840A, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, + 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, 0x841F, 0x8420, + 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, 0x842C, 0x842D, + 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, + 0x8437, 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, 0x8441, + 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449, 0, + 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8452, + 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845D, 0x845E, 0x845F, + 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846A, + 0x846E, 0x846F, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847B, + 0x847C, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7, + 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, + 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E, + 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, + 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9, + 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4, + 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338, + 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197, + 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, + 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A, + 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12, + 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, 0, +plane c9 +at 0x40 + 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, + 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492, 0x8493, + 0x8494, 0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, + 0x849F, 0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, + 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0, + 0x84B1, 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BC, 0x84BE, + 0x84C0, 0x84C2, 0x84C3, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CB, + 0x84CC, 0x84CE, 0x84CF, 0x84D2, 0x84D4, 0x84D5, 0x84D7, 0, + 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DE, 0x84E1, 0x84E2, + 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x84EB, 0x84ED, 0x84EE, + 0x84EF, 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7, + 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x84FD, 0x84FE, 0x8500, 0x8501, + 0x8502, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, + 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, + 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, + 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, + 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, + 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, + 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, + 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, + 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, + 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, + 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, + 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, 0, +plane ca +at 0x40 + 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850A, + 0x850B, 0x850D, 0x850E, 0x850F, 0x8510, 0x8512, 0x8514, 0x8515, + 0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, 0x851E, 0x8520, + 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, + 0x852A, 0x852D, 0x852E, 0x852F, 0x8530, 0x8531, 0x8532, 0x8533, + 0x8534, 0x8535, 0x8536, 0x853E, 0x853F, 0x8540, 0x8541, 0x8542, + 0x8544, 0x8545, 0x8546, 0x8547, 0x854B, 0x854C, 0x854D, 0x854E, + 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0, + 0x8557, 0x8558, 0x855A, 0x855B, 0x855C, 0x855D, 0x855F, 0x8560, + 0x8561, 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856A, + 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8573, + 0x8575, 0x8576, 0x8577, 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, + 0x8581, 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, + 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, + 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, + 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, + 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, + 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, + 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, + 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, + 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, + 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, + 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, + 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31, 0, +plane cb +at 0x40 + 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, + 0x858D, 0x858E, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, + 0x8596, 0x8597, 0x8598, 0x8599, 0x859A, 0x859D, 0x859E, 0x859F, + 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, 0x85A6, 0x85A7, 0x85A9, + 0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5, + 0x85B6, 0x85B8, 0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, + 0x85C0, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, + 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85D1, 0x85D2, 0, + 0x85D4, 0x85D6, 0x85D7, 0x85D8, 0x85D9, 0x85DA, 0x85DB, 0x85DD, + 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E5, 0x85E6, + 0x85E7, 0x85E8, 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, + 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, + 0x85F8, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, + 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, + 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, + 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, + 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, + 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, + 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, + 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, + 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, + 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, + 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, + 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854, 0, +plane cc +at 0x40 + 0x85F9, 0x85FA, 0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602, + 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860A, 0x860B, + 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612, 0x8613, 0x8614, + 0x8615, 0x8617, 0x8618, 0x8619, 0x861A, 0x861B, 0x861C, 0x861D, + 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, + 0x8626, 0x8628, 0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, + 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, + 0x8639, 0x863A, 0x863B, 0x863D, 0x863E, 0x863F, 0x8640, 0, + 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, + 0x8649, 0x864A, 0x864B, 0x864C, 0x8652, 0x8653, 0x8655, 0x8656, + 0x8657, 0x8658, 0x8659, 0x865B, 0x865C, 0x865D, 0x865F, 0x8660, + 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, + 0x866A, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, + 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A, + 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D, + 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD, + 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6, + 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4, + 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957, + 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22, + 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F, + 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, + 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A, + 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, 0, +plane cd +at 0x40 + 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, + 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, + 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, + 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0, + 0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2, + 0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE, + 0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD, + 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, 0, + 0x86DD, 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, + 0x86E8, 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, + 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, + 0x8706, 0x870B, 0x870C, 0x870E, 0x870F, 0x8710, 0x8711, 0x8714, + 0x8716, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, + 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, + 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, + 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, + 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, + 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, + 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, + 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, + 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, + 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, + 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, + 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, 0, +plane ce +at 0x40 + 0x8719, 0x871B, 0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, + 0x8728, 0x872A, 0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, + 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, + 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, + 0x874B, 0x874D, 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, + 0x8756, 0x8758, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, + 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, + 0x876C, 0x876D, 0x876F, 0x8771, 0x8772, 0x8773, 0x8775, 0, + 0x8777, 0x8778, 0x8779, 0x877A, 0x877F, 0x8780, 0x8781, 0x8784, + 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F, 0x8790, + 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879A, + 0x879B, 0x879C, 0x879D, 0x879E, 0x87A0, 0x87A1, 0x87A2, 0x87A3, + 0x87A4, 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, + 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, + 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, + 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, + 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, + 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, + 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, + 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, + 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, + 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, + 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, + 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A, 0, +plane cf +at 0x40 + 0x87A5, 0x87A6, 0x87A7, 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1, + 0x87B2, 0x87B4, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BB, 0x87BC, + 0x87BE, 0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C4, 0x87C5, 0x87C7, + 0x87C8, 0x87C9, 0x87CC, 0x87CD, 0x87CE, 0x87CF, 0x87D0, 0x87D4, + 0x87D5, 0x87D6, 0x87D7, 0x87D8, 0x87D9, 0x87DA, 0x87DC, 0x87DD, + 0x87DE, 0x87DF, 0x87E1, 0x87E2, 0x87E3, 0x87E4, 0x87E6, 0x87E7, + 0x87E8, 0x87E9, 0x87EB, 0x87EC, 0x87ED, 0x87EF, 0x87F0, 0x87F1, + 0x87F2, 0x87F3, 0x87F4, 0x87F5, 0x87F6, 0x87F7, 0x87F8, 0, + 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FF, 0x8800, 0x8801, 0x8802, + 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880B, 0x880C, + 0x880D, 0x880E, 0x880F, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, + 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, 0x881E, 0x881F, 0x8820, + 0x8823, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, + 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, + 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, + 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, + 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, + 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, + 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, + 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, + 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, + 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, + 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, + 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653, 0, +plane d0 +at 0x40 + 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882A, 0x882B, + 0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8831, 0x8833, 0x8834, + 0x8835, 0x8836, 0x8837, 0x8838, 0x883A, 0x883B, 0x883D, 0x883E, + 0x883F, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849, + 0x884A, 0x884B, 0x884E, 0x884F, 0x8850, 0x8851, 0x8852, 0x8853, + 0x8855, 0x8856, 0x8858, 0x885A, 0x885B, 0x885C, 0x885D, 0x885E, + 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871, + 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887A, 0, + 0x887B, 0x887C, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888A, + 0x888C, 0x888E, 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, + 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889D, 0x889E, 0x889F, + 0x88A0, 0x88A1, 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, 0x88A9, + 0x88AA, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548, + 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A, + 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9, + 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C, + 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F, + 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2, + 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, + 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, + 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C, + 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157, + 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA, + 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, 0, +plane d1 +at 0x40 + 0x88AC, 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, + 0x88B6, 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, + 0x88C0, 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CA, 0x88CB, 0x88CC, + 0x88CD, 0x88CF, 0x88D0, 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, + 0x88DB, 0x88DC, 0x88DD, 0x88DE, 0x88E0, 0x88E1, 0x88E6, 0x88E7, + 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F2, + 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB, 0x88FD, 0x88FF, 0x8900, + 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0, + 0x8909, 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914, + 0x8915, 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F, + 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, + 0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8932, 0x8933, 0x8935, + 0x8937, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, + 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, + 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, + 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, + 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, + 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, + 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, + 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, + 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, + 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, + 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, + 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, 0, +plane d2 +at 0x40 + 0x8938, 0x8939, 0x893A, 0x893B, 0x893C, 0x893D, 0x893E, 0x893F, + 0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, + 0x894A, 0x894B, 0x894C, 0x894D, 0x894E, 0x894F, 0x8950, 0x8951, + 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, + 0x895A, 0x895B, 0x895C, 0x895D, 0x8960, 0x8961, 0x8962, 0x8963, + 0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896A, 0x896B, 0x896C, + 0x896D, 0x896E, 0x896F, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, + 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897A, 0x897C, 0, + 0x897D, 0x897E, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, + 0x8989, 0x898A, 0x898B, 0x898C, 0x898D, 0x898E, 0x898F, 0x8990, + 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, + 0x8999, 0x899A, 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, + 0x89A1, 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, + 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, + 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, + 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, + 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, + 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, + 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, + 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, + 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, + 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, + 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, + 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, 0, +plane d3 +at 0x40 + 0x89A2, 0x89A3, 0x89A4, 0x89A5, 0x89A6, 0x89A7, 0x89A8, 0x89A9, + 0x89AA, 0x89AB, 0x89AC, 0x89AD, 0x89AE, 0x89AF, 0x89B0, 0x89B1, + 0x89B2, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7, 0x89B8, 0x89B9, + 0x89BA, 0x89BB, 0x89BC, 0x89BD, 0x89BE, 0x89BF, 0x89C0, 0x89C3, + 0x89CD, 0x89D3, 0x89D4, 0x89D5, 0x89D7, 0x89D8, 0x89D9, 0x89DB, + 0x89DD, 0x89DF, 0x89E0, 0x89E1, 0x89E2, 0x89E4, 0x89E7, 0x89E8, + 0x89E9, 0x89EA, 0x89EC, 0x89ED, 0x89EE, 0x89F0, 0x89F1, 0x89F2, + 0x89F4, 0x89F5, 0x89F6, 0x89F7, 0x89F8, 0x89F9, 0x89FA, 0, + 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, 0x8A01, 0x8A02, 0x8A03, + 0x8A04, 0x8A05, 0x8A06, 0x8A08, 0x8A09, 0x8A0A, 0x8A0B, 0x8A0C, + 0x8A0D, 0x8A0E, 0x8A0F, 0x8A10, 0x8A11, 0x8A12, 0x8A13, 0x8A14, + 0x8A15, 0x8A16, 0x8A17, 0x8A18, 0x8A19, 0x8A1A, 0x8A1B, 0x8A1C, + 0x8A1D, 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, + 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, + 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, + 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, + 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, + 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, + 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, + 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, + 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, + 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, + 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, + 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89, 0, +plane d4 +at 0x40 + 0x8A1E, 0x8A1F, 0x8A20, 0x8A21, 0x8A22, 0x8A23, 0x8A24, 0x8A25, + 0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2A, 0x8A2B, 0x8A2C, 0x8A2D, + 0x8A2E, 0x8A2F, 0x8A30, 0x8A31, 0x8A32, 0x8A33, 0x8A34, 0x8A35, + 0x8A36, 0x8A37, 0x8A38, 0x8A39, 0x8A3A, 0x8A3B, 0x8A3C, 0x8A3D, + 0x8A3F, 0x8A40, 0x8A41, 0x8A42, 0x8A43, 0x8A44, 0x8A45, 0x8A46, + 0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, 0x8A4E, 0x8A4F, + 0x8A50, 0x8A51, 0x8A52, 0x8A53, 0x8A54, 0x8A55, 0x8A56, 0x8A57, + 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, 0x8A5E, 0, + 0x8A5F, 0x8A60, 0x8A61, 0x8A62, 0x8A63, 0x8A64, 0x8A65, 0x8A66, + 0x8A67, 0x8A68, 0x8A69, 0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, 0x8A6E, + 0x8A6F, 0x8A70, 0x8A71, 0x8A72, 0x8A73, 0x8A74, 0x8A75, 0x8A76, + 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7C, 0x8A7D, 0x8A7E, 0x8A7F, + 0x8A80, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33, + 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95, + 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1, + 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5, + 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7, + 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5, + 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0, + 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43, + 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9, + 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5, + 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E, + 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, 0, +plane d5 +at 0x40 + 0x8A81, 0x8A82, 0x8A83, 0x8A84, 0x8A85, 0x8A86, 0x8A87, 0x8A88, + 0x8A8B, 0x8A8C, 0x8A8D, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A92, + 0x8A94, 0x8A95, 0x8A96, 0x8A97, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B, + 0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, 0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3, + 0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, 0x8AA8, 0x8AA9, 0x8AAA, 0x8AAB, + 0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, + 0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, 0x8AB8, 0x8AB9, 0x8ABA, 0x8ABB, + 0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, 0x8AC0, 0x8AC1, 0x8AC2, 0, + 0x8AC3, 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, 0x8AC8, 0x8AC9, 0x8ACA, + 0x8ACB, 0x8ACC, 0x8ACD, 0x8ACE, 0x8ACF, 0x8AD0, 0x8AD1, 0x8AD2, + 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8, 0x8AD9, 0x8ADA, + 0x8ADB, 0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE2, + 0x8AE3, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, + 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, + 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, + 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, + 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, + 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, + 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, + 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, + 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, + 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, + 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, + 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, 0, +plane d6 +at 0x40 + 0x8AE4, 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEB, + 0x8AEC, 0x8AED, 0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, + 0x8AF4, 0x8AF5, 0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, 0x8AFA, 0x8AFB, + 0x8AFC, 0x8AFD, 0x8AFE, 0x8AFF, 0x8B00, 0x8B01, 0x8B02, 0x8B03, + 0x8B04, 0x8B05, 0x8B06, 0x8B08, 0x8B09, 0x8B0A, 0x8B0B, 0x8B0C, + 0x8B0D, 0x8B0E, 0x8B0F, 0x8B10, 0x8B11, 0x8B12, 0x8B13, 0x8B14, + 0x8B15, 0x8B16, 0x8B17, 0x8B18, 0x8B19, 0x8B1A, 0x8B1B, 0x8B1C, + 0x8B1D, 0x8B1E, 0x8B1F, 0x8B20, 0x8B21, 0x8B22, 0x8B23, 0, + 0x8B24, 0x8B25, 0x8B27, 0x8B28, 0x8B29, 0x8B2A, 0x8B2B, 0x8B2C, + 0x8B2D, 0x8B2E, 0x8B2F, 0x8B30, 0x8B31, 0x8B32, 0x8B33, 0x8B34, + 0x8B35, 0x8B36, 0x8B37, 0x8B38, 0x8B39, 0x8B3A, 0x8B3B, 0x8B3C, + 0x8B3D, 0x8B3E, 0x8B3F, 0x8B40, 0x8B41, 0x8B42, 0x8B43, 0x8B44, + 0x8B45, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, + 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, + 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, + 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, + 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, + 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, + 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, + 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, + 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, + 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, + 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, + 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0, +plane d7 +at 0x40 + 0x8B46, 0x8B47, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D, + 0x8B4E, 0x8B4F, 0x8B50, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, + 0x8B56, 0x8B57, 0x8B58, 0x8B59, 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, + 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65, + 0x8B67, 0x8B68, 0x8B69, 0x8B6A, 0x8B6B, 0x8B6D, 0x8B6E, 0x8B6F, + 0x8B70, 0x8B71, 0x8B72, 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77, + 0x8B78, 0x8B79, 0x8B7A, 0x8B7B, 0x8B7C, 0x8B7D, 0x8B7E, 0x8B7F, + 0x8B80, 0x8B81, 0x8B82, 0x8B83, 0x8B84, 0x8B85, 0x8B86, 0, + 0x8B87, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0x8B8D, 0x8B8E, + 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, 0x8B94, 0x8B95, 0x8B96, + 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, 0x8B9C, 0x8B9D, 0x8B9E, + 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, 0x8BD0, 0x8BEA, 0x8C09, + 0x8C1E, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, + 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, + 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, + 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, + 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, + 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, + 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, + 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, + 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, + 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, + 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, + 0x5750, 0x5EA7, 0, 0, 0, 0, 0, 0, +plane d8 +at 0x40 + 0x8C38, 0x8C39, 0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, 0x8C3E, 0x8C3F, + 0x8C40, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C48, 0x8C4A, 0x8C4B, + 0x8C4D, 0x8C4E, 0x8C4F, 0x8C50, 0x8C51, 0x8C52, 0x8C53, 0x8C54, + 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C, 0x8C5D, 0x8C5E, + 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66, 0x8C67, 0x8C68, + 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, 0x8C71, 0x8C72, + 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C, 0x8C7D, 0x8C7E, + 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86, 0x8C87, 0, + 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, + 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B, 0x8C9C, + 0x8C9D, 0x8C9E, 0x8C9F, 0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, 0x8CA4, + 0x8CA5, 0x8CA6, 0x8CA7, 0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, 0x8CAC, + 0x8CAD, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, + 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, + 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, + 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, + 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, + 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, + 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, + 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, + 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, + 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, + 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, + 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, 0, +plane d9 +at 0x40 + 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, 0x8CB2, 0x8CB3, 0x8CB4, 0x8CB5, + 0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, 0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD, + 0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, 0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5, + 0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, 0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD, + 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, 0x8CD2, 0x8CD3, 0x8CD4, 0x8CD5, + 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD, + 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, 0x8CE2, 0x8CE3, 0x8CE4, 0x8CE5, + 0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC, 0, + 0x8CED, 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF4, + 0x8CF5, 0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x8CFB, 0x8CFC, + 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D04, + 0x8D05, 0x8D06, 0x8D07, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x8D0C, + 0x8D0D, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, + 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, + 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, + 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, + 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, + 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, + 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, + 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, + 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, + 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, + 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, + 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, 0, +plane da +at 0x40 + 0x8D0E, 0x8D0F, 0x8D10, 0x8D11, 0x8D12, 0x8D13, 0x8D14, 0x8D15, + 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x8D1A, 0x8D1B, 0x8D1C, 0x8D20, + 0x8D51, 0x8D52, 0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, + 0x8D6C, 0x8D6E, 0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A, + 0x8D7B, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83, + 0x8D86, 0x8D87, 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, + 0x8D90, 0x8D92, 0x8D93, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99, + 0x8D9A, 0x8D9B, 0x8D9C, 0x8D9D, 0x8D9E, 0x8DA0, 0x8DA1, 0, + 0x8DA2, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, + 0x8DAB, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB2, 0x8DB6, + 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, 0x8DC5, + 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, 0x8DD3, + 0x8DD4, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, + 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, + 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, + 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, + 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, + 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, + 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, + 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, + 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, + 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, + 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, + 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA, 0, +plane db +at 0x40 + 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, + 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, + 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, 0x8DFF, 0x8E00, 0x8E01, 0x8E02, + 0x8E03, 0x8E04, 0x8E06, 0x8E07, 0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, + 0x8E10, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, 0x8E17, 0x8E18, + 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24, 0x8E25, + 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32, 0x8E33, + 0x8E34, 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E, 0, + 0x8E3F, 0x8E43, 0x8E45, 0x8E46, 0x8E4C, 0x8E4D, 0x8E4E, 0x8E4F, + 0x8E50, 0x8E53, 0x8E54, 0x8E55, 0x8E56, 0x8E57, 0x8E58, 0x8E5A, + 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, + 0x8E63, 0x8E64, 0x8E65, 0x8E67, 0x8E68, 0x8E6A, 0x8E6B, 0x8E6E, + 0x8E71, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4, + 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, + 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, + 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD, + 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD, + 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF, + 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729, + 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B, + 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768, + 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF, + 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9, + 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD, 0, +plane dc +at 0x40 + 0x8E73, 0x8E75, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, 0x8E7B, 0x8E7D, + 0x8E7E, 0x8E80, 0x8E82, 0x8E83, 0x8E84, 0x8E86, 0x8E88, 0x8E89, + 0x8E8A, 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, 0x8E92, 0x8E93, + 0x8E95, 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B, 0x8E9D, + 0x8E9F, 0x8EA0, 0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, 0x8EA5, 0x8EA6, + 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAA, 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1, + 0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBB, + 0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC0, 0x8EC1, 0x8EC2, 0, + 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, 0x8ECA, + 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, 0x8ED3, + 0x8ED4, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDB, + 0x8EDC, 0x8EDD, 0x8EDE, 0x8EDF, 0x8EE0, 0x8EE1, 0x8EE2, 0x8EE3, + 0x8EE4, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, + 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, + 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, + 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, + 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, + 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, + 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, + 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, + 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, + 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, + 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, + 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, 0, +plane dd +at 0x40 + 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, + 0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF2, 0x8EF3, 0x8EF4, + 0x8EF5, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, + 0x8EFD, 0x8EFE, 0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F03, 0x8F04, + 0x8F05, 0x8F06, 0x8F07, 0x8F08, 0x8F09, 0x8F0A, 0x8F0B, 0x8F0C, + 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F12, 0x8F13, 0x8F14, + 0x8F15, 0x8F16, 0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F1B, 0x8F1C, + 0x8F1D, 0x8F1E, 0x8F1F, 0x8F20, 0x8F21, 0x8F22, 0x8F23, 0, + 0x8F24, 0x8F25, 0x8F26, 0x8F27, 0x8F28, 0x8F29, 0x8F2A, 0x8F2B, + 0x8F2C, 0x8F2D, 0x8F2E, 0x8F2F, 0x8F30, 0x8F31, 0x8F32, 0x8F33, + 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F38, 0x8F39, 0x8F3A, 0x8F3B, + 0x8F3C, 0x8F3D, 0x8F3E, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43, + 0x8F44, 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, + 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, + 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, + 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, + 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, + 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, + 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, + 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, + 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, + 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, + 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, + 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, 0, +plane de +at 0x40 + 0x8F45, 0x8F46, 0x8F47, 0x8F48, 0x8F49, 0x8F4A, 0x8F4B, 0x8F4C, + 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F54, + 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C, + 0x8F5D, 0x8F5E, 0x8F5F, 0x8F60, 0x8F61, 0x8F62, 0x8F63, 0x8F64, + 0x8F65, 0x8F6A, 0x8F80, 0x8F8C, 0x8F92, 0x8F9D, 0x8FA0, 0x8FA1, + 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, 0x8FAC, 0x8FAD, + 0x8FAE, 0x8FAF, 0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, + 0x8FBA, 0x8FBB, 0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0, + 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, + 0x8FD7, 0x8FDA, 0x8FE0, 0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, + 0x8FF1, 0x8FF2, 0x8FF4, 0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, + 0x8FFE, 0x8FFF, 0x9007, 0x9008, 0x900C, 0x900E, 0x9013, 0x9015, + 0x9018, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, + 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, + 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, + 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, + 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, + 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, + 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, + 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, + 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, + 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, + 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, + 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496, 0, +plane df +at 0x40 + 0x9019, 0x901C, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, + 0x902A, 0x902B, 0x902C, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, + 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, 0x9043, 0x9045, + 0x9046, 0x9048, 0x9049, 0x904A, 0x904B, 0x904C, 0x904E, 0x9054, + 0x9055, 0x9056, 0x9059, 0x905A, 0x905C, 0x905D, 0x905E, 0x905F, + 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906A, 0x906B, + 0x906C, 0x906F, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077, + 0x9078, 0x9079, 0x907A, 0x907B, 0x907C, 0x907E, 0x9081, 0, + 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, 0x908A, 0x908C, 0x908D, + 0x908E, 0x908F, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909A, + 0x909C, 0x909E, 0x909F, 0x90A0, 0x90A4, 0x90A5, 0x90A7, 0x90A8, + 0x90A9, 0x90AB, 0x90AD, 0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF, + 0x90C0, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0, + 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2, + 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB, + 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456, + 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, + 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466, + 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6, + 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC, + 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF, + 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522, + 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5, + 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C, 0, +plane e0 +at 0x40 + 0x90C2, 0x90C3, 0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD, + 0x90D2, 0x90D4, 0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE, + 0x90DF, 0x90E0, 0x90E3, 0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC, + 0x90EE, 0x90F0, 0x90F1, 0x90F2, 0x90F3, 0x90F5, 0x90F6, 0x90F7, + 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FF, 0x9100, 0x9101, 0x9103, + 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910A, 0x910B, 0x910C, + 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, + 0x9115, 0x9116, 0x9117, 0x9118, 0x911A, 0x911B, 0x911C, 0, + 0x911D, 0x911F, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127, + 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x9130, + 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913A, + 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, + 0x9144, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, + 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, + 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, + 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, + 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, + 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, + 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, + 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, + 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, + 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, + 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, + 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, 0, +plane e1 +at 0x40 + 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, + 0x9158, 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, + 0x9168, 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, + 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, + 0x918F, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, + 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, + 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AB, 0x91AC, 0x91B0, 0x91B1, + 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BB, 0, + 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, + 0x91C4, 0x91C5, 0x91C6, 0x91C8, 0x91CB, 0x91D0, 0x91D2, 0x91D3, + 0x91D4, 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, + 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, + 0x91E5, 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, + 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, + 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, + 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, + 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, + 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, + 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, + 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, + 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, + 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, + 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, + 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, 0, +plane e2 +at 0x40 + 0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, + 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5, + 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, + 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, + 0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, + 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, + 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, + 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0, + 0x9225, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, + 0x922D, 0x922E, 0x922F, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, + 0x9235, 0x9236, 0x9237, 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, + 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, + 0x9245, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, + 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, + 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, + 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, + 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, + 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, + 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, + 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, + 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, + 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, + 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, + 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042, 0, +plane e3 +at 0x40 + 0x9246, 0x9247, 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, + 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, + 0x9256, 0x9257, 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, + 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, + 0x9266, 0x9267, 0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, + 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276, + 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, + 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0, + 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, + 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, + 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E, + 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4, 0x92A5, 0x92A6, + 0x92A7, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083, + 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8, + 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4, + 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, + 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1, + 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606, + 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615, + 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35, + 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C, + 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4, + 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6, + 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, 0, +plane e4 +at 0x40 + 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AF, 0x92B0, + 0x92B1, 0x92B2, 0x92B3, 0x92B4, 0x92B5, 0x92B6, 0x92B7, 0x92B8, + 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, + 0x92C1, 0x92C2, 0x92C3, 0x92C4, 0x92C5, 0x92C6, 0x92C7, 0x92C9, + 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, + 0x92D2, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0x92D8, 0x92D9, + 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, + 0x92E2, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, 0, + 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, + 0x92F1, 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, + 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, + 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, + 0x9309, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, + 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, + 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, + 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, + 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, + 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, + 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, + 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, + 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, + 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, + 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, + 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, 0, +plane e5 +at 0x40 + 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, + 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, + 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, + 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, + 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, + 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, + 0x933A, 0x933B, 0x933C, 0x933D, 0x933F, 0x9340, 0x9341, 0x9342, + 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0, + 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351, + 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, + 0x935A, 0x935B, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361, + 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, + 0x936B, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, + 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, + 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, + 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, + 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, + 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, + 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, + 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, + 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, + 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, + 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, + 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, 0, +plane e6 +at 0x40 + 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, + 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937A, 0x937B, + 0x937C, 0x937D, 0x937E, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, + 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938A, 0x938B, + 0x938C, 0x938D, 0x938E, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, + 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, + 0x939D, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x93A2, 0x93A3, 0x93A4, + 0x93A5, 0x93A6, 0x93A7, 0x93A8, 0x93A9, 0x93AA, 0x93AB, 0, + 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, + 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB, + 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, + 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9, 0x93CB, 0x93CC, + 0x93CD, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, + 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, + 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, + 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, + 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, + 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, + 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, + 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, + 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, + 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, + 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, + 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, 0, +plane e7 +at 0x40 + 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, + 0x93D7, 0x93D8, 0x93D9, 0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, + 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, + 0x93E7, 0x93E8, 0x93E9, 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, + 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, + 0x93F7, 0x93F8, 0x93F9, 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, + 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, + 0x9407, 0x9408, 0x9409, 0x940A, 0x940B, 0x940C, 0x940D, 0, + 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, + 0x9416, 0x9417, 0x9418, 0x9419, 0x941A, 0x941B, 0x941C, 0x941D, + 0x941E, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, + 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D, + 0x942E, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9, + 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1, + 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6, + 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08, + 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C, + 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, + 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31, + 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095, + 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1, + 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C, + 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A, + 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, 0, +plane e8 +at 0x40 + 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, + 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D, 0x943F, + 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, + 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, 0x944F, + 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, + 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E, 0x945F, + 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, + 0x9468, 0x9469, 0x946A, 0x946C, 0x946D, 0x946E, 0x946F, 0, + 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, + 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D, 0x947E, 0x947F, + 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498, + 0x94C7, 0x94CF, 0x94D3, 0x94D4, 0x94DA, 0x94E6, 0x94FB, 0x951C, + 0x9520, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, + 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, + 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, + 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, + 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, + 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, + 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, + 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, + 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, + 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, + 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, + 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, 0, +plane e9 +at 0x40 + 0x9527, 0x9533, 0x953D, 0x9543, 0x9548, 0x954B, 0x9555, 0x955A, + 0x9560, 0x956E, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957A, + 0x957B, 0x957C, 0x957D, 0x957E, 0x9580, 0x9581, 0x9582, 0x9583, + 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958A, 0x958B, + 0x958C, 0x958D, 0x958E, 0x958F, 0x9590, 0x9591, 0x9592, 0x9593, + 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959A, 0x959B, + 0x959C, 0x959D, 0x959E, 0x959F, 0x95A0, 0x95A1, 0x95A2, 0x95A3, + 0x95A4, 0x95A5, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0x95AA, 0, + 0x95AB, 0x95AC, 0x95AD, 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B2, + 0x95B3, 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0x95B8, 0x95B9, 0x95BA, + 0x95BB, 0x95BC, 0x95BD, 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0x95C2, + 0x95C3, 0x95C4, 0x95C5, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0x95CA, + 0x95CB, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, + 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, + 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, + 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, + 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, + 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, + 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, + 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, + 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, + 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, + 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, + 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, 0, +plane ea +at 0x40 + 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2, 0x95D3, + 0x95D4, 0x95D5, 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA, 0x95DB, + 0x95DC, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2, 0x95E3, + 0x95E4, 0x95E5, 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, + 0x9618, 0x961B, 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, + 0x9627, 0x9628, 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, + 0x9637, 0x9638, 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, + 0x964E, 0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0, + 0x9658, 0x9659, 0x965A, 0x965C, 0x965D, 0x965E, 0x9660, 0x9663, + 0x9665, 0x9666, 0x966B, 0x966D, 0x966E, 0x966F, 0x9670, 0x9671, + 0x9673, 0x9678, 0x9679, 0x967A, 0x967B, 0x967C, 0x967D, 0x967E, + 0x967F, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, + 0x968A, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, + 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, + 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, + 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, + 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, + 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, + 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, + 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, + 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, + 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, + 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, + 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0, 0, +plane eb +at 0x40 + 0x968C, 0x968E, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969A, + 0x969B, 0x969D, 0x969E, 0x969F, 0x96A0, 0x96A1, 0x96A2, 0x96A3, + 0x96A4, 0x96A5, 0x96A6, 0x96A8, 0x96A9, 0x96AA, 0x96AB, 0x96AC, + 0x96AD, 0x96AE, 0x96AF, 0x96B1, 0x96B2, 0x96B4, 0x96B5, 0x96B7, + 0x96B8, 0x96BA, 0x96BB, 0x96BF, 0x96C2, 0x96C3, 0x96C8, 0x96CA, + 0x96CB, 0x96D0, 0x96D1, 0x96D3, 0x96D4, 0x96D6, 0x96D7, 0x96D8, + 0x96D9, 0x96DA, 0x96DB, 0x96DC, 0x96DD, 0x96DE, 0x96DF, 0x96E1, + 0x96E2, 0x96E3, 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96EB, 0, + 0x96EC, 0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F2, 0x96F4, 0x96F5, + 0x96F8, 0x96FA, 0x96FB, 0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703, + 0x9705, 0x970A, 0x970B, 0x970C, 0x9710, 0x9711, 0x9712, 0x9714, + 0x9715, 0x9717, 0x9718, 0x9719, 0x971A, 0x971B, 0x971D, 0x971F, + 0x9720, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, + 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, + 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, + 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, + 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD, + 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2, + 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1, + 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112, + 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, + 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, + 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191, + 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, 0, +plane ec +at 0x40 + 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728, + 0x9729, 0x972B, 0x972C, 0x972E, 0x972F, 0x9731, 0x9733, 0x9734, + 0x9735, 0x9736, 0x9737, 0x973A, 0x973B, 0x973C, 0x973D, 0x973F, + 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, + 0x9748, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, 0x974E, 0x974F, + 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975A, 0x975C, + 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976A, + 0x976B, 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, 0, + 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D, + 0x977E, 0x977F, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, + 0x9787, 0x9788, 0x9789, 0x978A, 0x978C, 0x978E, 0x978F, 0x9790, + 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979B, 0x979C, + 0x979D, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, + 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, + 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, + 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, + 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, + 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, + 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, + 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, + 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, + 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, + 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, + 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, 0, +plane ed +at 0x40 + 0x979E, 0x979F, 0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A6, 0x97A7, + 0x97A8, 0x97A9, 0x97AA, 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, + 0x97B5, 0x97B6, 0x97B7, 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, + 0x97BD, 0x97BE, 0x97BF, 0x97C0, 0x97C1, 0x97C2, 0x97C3, 0x97C4, + 0x97C5, 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, + 0x97CD, 0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D3, 0x97D4, + 0x97D5, 0x97D6, 0x97D7, 0x97D8, 0x97D9, 0x97DA, 0x97DB, 0x97DC, + 0x97DD, 0x97DE, 0x97DF, 0x97E0, 0x97E1, 0x97E2, 0x97E3, 0, + 0x97E4, 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, + 0x97F4, 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB, 0x97FC, 0x97FD, + 0x97FE, 0x97FF, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, + 0x9806, 0x9807, 0x9808, 0x9809, 0x980A, 0x980B, 0x980C, 0x980D, + 0x980E, 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, + 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, + 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, + 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, + 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, + 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, + 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, + 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, + 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, + 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, + 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, + 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, 0, +plane ee +at 0x40 + 0x980F, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, + 0x9817, 0x9818, 0x9819, 0x981A, 0x981B, 0x981C, 0x981D, 0x981E, + 0x981F, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, + 0x9827, 0x9828, 0x9829, 0x982A, 0x982B, 0x982C, 0x982D, 0x982E, + 0x982F, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, + 0x9837, 0x9838, 0x9839, 0x983A, 0x983B, 0x983C, 0x983D, 0x983E, + 0x983F, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, + 0x9847, 0x9848, 0x9849, 0x984A, 0x984B, 0x984C, 0x984D, 0, + 0x984E, 0x984F, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, + 0x9856, 0x9857, 0x9858, 0x9859, 0x985A, 0x985B, 0x985C, 0x985D, + 0x985E, 0x985F, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, + 0x9866, 0x9867, 0x9868, 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, + 0x986E, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, + 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, + 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, + 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, + 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, + 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, + 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, + 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, + 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, + 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, + 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, + 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA, 0, +plane ef +at 0x40 + 0x986F, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988B, 0x988E, + 0x9892, 0x9895, 0x9899, 0x98A3, 0x98A8, 0x98A9, 0x98AA, 0x98AB, + 0x98AC, 0x98AD, 0x98AE, 0x98AF, 0x98B0, 0x98B1, 0x98B2, 0x98B3, + 0x98B4, 0x98B5, 0x98B6, 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, + 0x98BC, 0x98BD, 0x98BE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3, + 0x98C4, 0x98C5, 0x98C6, 0x98C7, 0x98C8, 0x98C9, 0x98CA, 0x98CB, + 0x98CC, 0x98CD, 0x98CF, 0x98D0, 0x98D4, 0x98D6, 0x98D7, 0x98DB, + 0x98DC, 0x98DD, 0x98E0, 0x98E1, 0x98E2, 0x98E3, 0x98E4, 0, + 0x98E5, 0x98E6, 0x98E9, 0x98EA, 0x98EB, 0x98EC, 0x98ED, 0x98EE, + 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, 0x98F4, 0x98F5, 0x98F6, + 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, 0x98FC, 0x98FD, 0x98FE, + 0x98FF, 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, + 0x9907, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5, + 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506, + 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513, + 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F, + 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534, + 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535, + 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552, + 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E, + 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, + 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572, + 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, + 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14, 0, +plane f0 +at 0x40 + 0x9908, 0x9909, 0x990A, 0x990B, 0x990C, 0x990E, 0x990F, 0x9911, + 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919, + 0x991A, 0x991B, 0x991C, 0x991D, 0x991E, 0x991F, 0x9920, 0x9921, + 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929, + 0x992A, 0x992B, 0x992C, 0x992D, 0x992F, 0x9930, 0x9931, 0x9932, + 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993A, + 0x993B, 0x993C, 0x993D, 0x993E, 0x993F, 0x9940, 0x9941, 0x9942, + 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0, + 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, 0x9951, + 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995A, 0x995B, + 0x995C, 0x995D, 0x995E, 0x995F, 0x9960, 0x9961, 0x9962, 0x9964, + 0x9966, 0x9973, 0x9978, 0x9979, 0x997B, 0x997E, 0x9982, 0x9983, + 0x9989, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, + 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, + 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, + 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, + 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, + 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, + 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, + 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, + 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, + 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, + 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, + 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, 0, +plane f1 +at 0x40 + 0x998C, 0x998E, 0x999A, 0x999B, 0x999C, 0x999D, 0x999E, 0x999F, + 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9, + 0x99AA, 0x99AB, 0x99AC, 0x99AD, 0x99AE, 0x99AF, 0x99B0, 0x99B1, + 0x99B2, 0x99B3, 0x99B4, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, + 0x99BA, 0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C1, + 0x99C2, 0x99C3, 0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, + 0x99CA, 0x99CB, 0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D0, 0x99D1, + 0x99D2, 0x99D3, 0x99D4, 0x99D5, 0x99D6, 0x99D7, 0x99D8, 0, + 0x99D9, 0x99DA, 0x99DB, 0x99DC, 0x99DD, 0x99DE, 0x99DF, 0x99E0, + 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7, 0x99E8, + 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0x99F0, + 0x99F1, 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, + 0x99F9, 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, + 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, + 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, + 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, + 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, + 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, + 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, + 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, + 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, + 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, + 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, + 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, 0, +plane f2 +at 0x40 + 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x99FF, 0x9A00, 0x9A01, + 0x9A02, 0x9A03, 0x9A04, 0x9A05, 0x9A06, 0x9A07, 0x9A08, 0x9A09, + 0x9A0A, 0x9A0B, 0x9A0C, 0x9A0D, 0x9A0E, 0x9A0F, 0x9A10, 0x9A11, + 0x9A12, 0x9A13, 0x9A14, 0x9A15, 0x9A16, 0x9A17, 0x9A18, 0x9A19, + 0x9A1A, 0x9A1B, 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21, + 0x9A22, 0x9A23, 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29, + 0x9A2A, 0x9A2B, 0x9A2C, 0x9A2D, 0x9A2E, 0x9A2F, 0x9A30, 0x9A31, + 0x9A32, 0x9A33, 0x9A34, 0x9A35, 0x9A36, 0x9A37, 0x9A38, 0, + 0x9A39, 0x9A3A, 0x9A3B, 0x9A3C, 0x9A3D, 0x9A3E, 0x9A3F, 0x9A40, + 0x9A41, 0x9A42, 0x9A43, 0x9A44, 0x9A45, 0x9A46, 0x9A47, 0x9A48, + 0x9A49, 0x9A4A, 0x9A4B, 0x9A4C, 0x9A4D, 0x9A4E, 0x9A4F, 0x9A50, + 0x9A51, 0x9A52, 0x9A53, 0x9A54, 0x9A55, 0x9A56, 0x9A57, 0x9A58, + 0x9A59, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, + 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, + 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, + 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, + 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, + 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, + 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, + 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, + 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, + 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, + 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, + 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2, 0, +plane f3 +at 0x40 + 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, 0x9A5E, 0x9A5F, 0x9A60, 0x9A61, + 0x9A62, 0x9A63, 0x9A64, 0x9A65, 0x9A66, 0x9A67, 0x9A68, 0x9A69, + 0x9A6A, 0x9A6B, 0x9A72, 0x9A83, 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, + 0x9A95, 0x9A99, 0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, + 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, + 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, + 0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, 0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4, + 0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, 0, + 0x9ADD, 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7, + 0x9AE8, 0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, 0x9AF0, 0x9AF1, 0x9AF2, + 0x9AF3, 0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AFA, 0x9AFC, + 0x9AFD, 0x9AFE, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B04, 0x9B05, + 0x9B06, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB, + 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1, + 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813, + 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42, + 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04, + 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, + 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E, + 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E, + 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8, + 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB, + 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6, + 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B, 0, +plane f4 +at 0x40 + 0x9B07, 0x9B09, 0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, 0x9B0E, 0x9B10, + 0x9B11, 0x9B12, 0x9B14, 0x9B15, 0x9B16, 0x9B17, 0x9B18, 0x9B19, + 0x9B1A, 0x9B1B, 0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, 0x9B21, 0x9B22, + 0x9B24, 0x9B25, 0x9B26, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2B, + 0x9B2C, 0x9B2D, 0x9B2E, 0x9B30, 0x9B31, 0x9B33, 0x9B34, 0x9B35, + 0x9B36, 0x9B37, 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F, + 0x9B40, 0x9B46, 0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, 0x9B50, 0x9B52, + 0x9B53, 0x9B55, 0x9B56, 0x9B57, 0x9B58, 0x9B59, 0x9B5A, 0, + 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60, 0x9B61, 0x9B62, + 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68, 0x9B69, 0x9B6A, + 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, 0x9B70, 0x9B71, 0x9B72, + 0x9B73, 0x9B74, 0x9B75, 0x9B76, 0x9B77, 0x9B78, 0x9B79, 0x9B7A, + 0x9B7B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, + 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, + 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, + 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, + 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, + 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, + 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, + 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, + 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, + 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, + 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, + 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, 0, +plane f5 +at 0x40 + 0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B81, 0x9B82, 0x9B83, + 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, + 0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, 0x9B90, 0x9B91, 0x9B92, 0x9B93, + 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99, 0x9B9A, 0x9B9B, + 0x9B9C, 0x9B9D, 0x9B9E, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, + 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAA, 0x9BAB, + 0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, 0x9BB0, 0x9BB1, 0x9BB2, 0x9BB3, + 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8, 0x9BB9, 0x9BBA, 0, + 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC0, 0x9BC1, 0x9BC2, + 0x9BC3, 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC7, 0x9BC8, 0x9BC9, 0x9BCA, + 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, + 0x9BD3, 0x9BD4, 0x9BD5, 0x9BD6, 0x9BD7, 0x9BD8, 0x9BD9, 0x9BDA, + 0x9BDB, 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, + 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, + 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, + 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, + 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, + 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, + 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, + 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, + 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, + 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, + 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, + 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, 0, +plane f6 +at 0x40 + 0x9BDC, 0x9BDD, 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE1, 0x9BE2, 0x9BE3, + 0x9BE4, 0x9BE5, 0x9BE6, 0x9BE7, 0x9BE8, 0x9BE9, 0x9BEA, 0x9BEB, + 0x9BEC, 0x9BED, 0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, 0x9BF2, 0x9BF3, + 0x9BF4, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA, 0x9BFB, + 0x9BFC, 0x9BFD, 0x9BFE, 0x9BFF, 0x9C00, 0x9C01, 0x9C02, 0x9C03, + 0x9C04, 0x9C05, 0x9C06, 0x9C07, 0x9C08, 0x9C09, 0x9C0A, 0x9C0B, + 0x9C0C, 0x9C0D, 0x9C0E, 0x9C0F, 0x9C10, 0x9C11, 0x9C12, 0x9C13, + 0x9C14, 0x9C15, 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A, 0, + 0x9C1B, 0x9C1C, 0x9C1D, 0x9C1E, 0x9C1F, 0x9C20, 0x9C21, 0x9C22, + 0x9C23, 0x9C24, 0x9C25, 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, + 0x9C2B, 0x9C2C, 0x9C2D, 0x9C2E, 0x9C2F, 0x9C30, 0x9C31, 0x9C32, + 0x9C33, 0x9C34, 0x9C35, 0x9C36, 0x9C37, 0x9C38, 0x9C39, 0x9C3A, + 0x9C3B, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, + 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, + 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, + 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, + 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, + 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, + 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, + 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, + 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, + 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, + 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, + 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, 0, +plane f7 +at 0x40 + 0x9C3C, 0x9C3D, 0x9C3E, 0x9C3F, 0x9C40, 0x9C41, 0x9C42, 0x9C43, + 0x9C44, 0x9C45, 0x9C46, 0x9C47, 0x9C48, 0x9C49, 0x9C4A, 0x9C4B, + 0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, 0x9C50, 0x9C51, 0x9C52, 0x9C53, + 0x9C54, 0x9C55, 0x9C56, 0x9C57, 0x9C58, 0x9C59, 0x9C5A, 0x9C5B, + 0x9C5C, 0x9C5D, 0x9C5E, 0x9C5F, 0x9C60, 0x9C61, 0x9C62, 0x9C63, + 0x9C64, 0x9C65, 0x9C66, 0x9C67, 0x9C68, 0x9C69, 0x9C6A, 0x9C6B, + 0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C72, 0x9C73, + 0x9C74, 0x9C75, 0x9C76, 0x9C77, 0x9C78, 0x9C79, 0x9C7A, 0, + 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80, 0x9C83, 0x9C84, 0x9C89, 0x9C8A, + 0x9C8C, 0x9C8F, 0x9C93, 0x9C96, 0x9C97, 0x9C98, 0x9C99, 0x9C9D, + 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, + 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0, + 0x9CE1, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4, + 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2, + 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3, + 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA, + 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1, + 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8, + 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, + 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F, + 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B, + 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0, + 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22, + 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, 0, +plane f8 +at 0x40 + 0x9CE3, 0x9CE4, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, 0x9CE9, 0x9CEA, + 0x9CEB, 0x9CEC, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, 0x9CF1, 0x9CF2, + 0x9CF3, 0x9CF4, 0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA, + 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, 0x9D01, 0x9D02, + 0x9D03, 0x9D04, 0x9D05, 0x9D06, 0x9D07, 0x9D08, 0x9D09, 0x9D0A, + 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E, 0x9D0F, 0x9D10, 0x9D11, 0x9D12, + 0x9D13, 0x9D14, 0x9D15, 0x9D16, 0x9D17, 0x9D18, 0x9D19, 0x9D1A, + 0x9D1B, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D1F, 0x9D20, 0x9D21, 0, + 0x9D22, 0x9D23, 0x9D24, 0x9D25, 0x9D26, 0x9D27, 0x9D28, 0x9D29, + 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D, 0x9D2E, 0x9D2F, 0x9D30, 0x9D31, + 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37, 0x9D38, 0x9D39, + 0x9D3A, 0x9D3B, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D3F, 0x9D40, 0x9D41, + 0x9D42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane f9 +at 0x40 + 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A, + 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D51, 0x9D52, + 0x9D53, 0x9D54, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, + 0x9D5B, 0x9D5C, 0x9D5D, 0x9D5E, 0x9D5F, 0x9D60, 0x9D61, 0x9D62, + 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, 0x9D6A, + 0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, 0x9D6F, 0x9D70, 0x9D71, 0x9D72, + 0x9D73, 0x9D74, 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, + 0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, 0x9D7F, 0x9D80, 0x9D81, 0, + 0x9D82, 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D87, 0x9D88, 0x9D89, + 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, 0x9D91, + 0x9D92, 0x9D93, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9D99, + 0x9D9A, 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1, + 0x9DA2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fa +at 0x40 + 0x9DA3, 0x9DA4, 0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DA9, 0x9DAA, + 0x9DAB, 0x9DAC, 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0x9DB1, 0x9DB2, + 0x9DB3, 0x9DB4, 0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, + 0x9DBB, 0x9DBC, 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2, + 0x9DC3, 0x9DC4, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, + 0x9DCB, 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, + 0x9DD3, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, 0x9DD9, 0x9DDA, + 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE1, 0, + 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, 0x9DE9, + 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, 0x9DF1, + 0x9DF2, 0x9DF3, 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, + 0x9DFA, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, 0x9E01, + 0x9E02, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fb +at 0x40 + 0x9E03, 0x9E04, 0x9E05, 0x9E06, 0x9E07, 0x9E08, 0x9E09, 0x9E0A, + 0x9E0B, 0x9E0C, 0x9E0D, 0x9E0E, 0x9E0F, 0x9E10, 0x9E11, 0x9E12, + 0x9E13, 0x9E14, 0x9E15, 0x9E16, 0x9E17, 0x9E18, 0x9E19, 0x9E1A, + 0x9E1B, 0x9E1C, 0x9E1D, 0x9E1E, 0x9E24, 0x9E27, 0x9E2E, 0x9E30, + 0x9E34, 0x9E3B, 0x9E3C, 0x9E40, 0x9E4D, 0x9E50, 0x9E52, 0x9E53, + 0x9E54, 0x9E56, 0x9E59, 0x9E5D, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, + 0x9E65, 0x9E6E, 0x9E6F, 0x9E72, 0x9E74, 0x9E75, 0x9E76, 0x9E77, + 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E7D, 0x9E80, 0, + 0x9E81, 0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E89, 0x9E8A, 0x9E8C, + 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E94, 0x9E95, 0x9E96, + 0x9E97, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9E, 0x9EA0, + 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0x9EA7, 0x9EA8, 0x9EA9, + 0x9EAA, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fc +at 0x40 + 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB1, 0x9EB2, + 0x9EB3, 0x9EB5, 0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, 0x9EBC, 0x9EBF, + 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, + 0x9ECA, 0x9ECB, 0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, 0x9ED5, 0x9ED6, + 0x9ED7, 0x9ED9, 0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, 0x9EE4, 0x9EE6, + 0x9EE8, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF2, + 0x9EF3, 0x9EF4, 0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, 0x9EFA, 0x9EFD, + 0x9EFF, 0x9F00, 0x9F01, 0x9F02, 0x9F03, 0x9F04, 0x9F05, 0, + 0x9F06, 0x9F07, 0x9F08, 0x9F09, 0x9F0A, 0x9F0C, 0x9F0F, 0x9F11, + 0x9F12, 0x9F14, 0x9F15, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, 0x9F1C, + 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, 0x9F26, + 0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, 0x9F30, + 0x9F31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fd +at 0x40 + 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A, 0x9F3C, + 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46, 0x9F47, + 0x9F48, 0x9F49, 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, + 0x9F52, 0x9F53, 0x9F54, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F59, + 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, 0x9F5F, 0x9F60, 0x9F61, + 0x9F62, 0x9F63, 0x9F64, 0x9F65, 0x9F66, 0x9F67, 0x9F68, 0x9F69, + 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, + 0x9F72, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F77, 0x9F78, 0, + 0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82, + 0x9F8D, 0x9F8E, 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F93, 0x9F94, + 0x9F95, 0x9F96, 0x9F97, 0x9F98, 0x9F9C, 0x9F9D, 0x9F9E, 0x9FA1, + 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, 0xF979, 0xF995, 0xF9E7, + 0xF9F1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fe +at 0x40 + 0xFA0C, 0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, + 0xFA1F, 0xFA20, 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, + 0xE815, 0xE816, 0xE817, 0xE818, 0xE819, 0xE81A, 0xE81B, 0xE81C, + 0xE81D, 0xE81E, 0xE81F, 0xE820, 0xE821, 0xE822, 0xE823, 0xE824, + 0xE825, 0xE826, 0xE827, 0xE828, 0xE829, 0xE82A, 0xE82B, 0xE82C, + 0xE82D, 0xE82E, 0xE82F, 0xE830, 0xE831, 0xE832, 0xE833, 0xE834, + 0xE835, 0xE836, 0xE837, 0xE838, 0xE839, 0xE83A, 0xE83B, 0xE83C, + 0xE83D, 0xE83E, 0xE83F, 0xE840, 0xE841, 0xE842, 0xE843, 0, + 0xE844, 0xE845, 0xE846, 0xE847, 0xE848, 0xE849, 0xE84A, 0xE84B, + 0xE84C, 0xE84D, 0xE84E, 0xE84F, 0xE850, 0xE851, 0xE852, 0xE853, + 0xE854, 0xE855, 0xE856, 0xE857, 0xE858, 0xE859, 0xE85A, 0xE85B, + 0xE85C, 0xE85D, 0xE85E, 0xE85F, 0xE860, 0xE861, 0xE862, 0xE863, + 0xE864, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/unicode-sample.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/unicode-sample.map new file mode 100644 index 00000000..0e57967c --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/unicode-sample.map @@ -0,0 +1,158 @@ +# this file is a sample Unicode map description. +# It describes which glyphs are to be included in the font +# and at which character position they are to be put. + +# If the character position is greater than 255, the glyph is included, but +# does not appear in the encoding table (you must then use font reencoding +# to use this glyph). +# That makes it possible to have more than 256 glyphs in a font. +# Currently the maximum supported number of glyphs is 1024. + +# Use this file as the argument to ttf2pt1's -L option. + +# 1999-11-24 Thomas.Henlich@mailbox.tu-dresden.de +# 2000-03-01 Sergey Babkin: added 3rd format + +# comment lines start with '#' or '%' or '//' + +# The default source encoding table in the TTF file is Unicode (pid=3,eid=1). +# However a map may specify another source encoding with the "id " +# directive. If this directive is used at the beginning of the map file, +# it applies to the whole file. If it is used after a "plane" directive, +# then it sets the source encoding for this particular destination plane +# (possibly overriding the file-wide id directive). The user can also +# specify the source encoding explicitly at the comman line in the +# argument to the option -L. This used-specified source encoding overrides +# any id directives in the map file. + +# examples: + +# same as Unicode (default) +id 3 1 + +# One file may contain multiple actual translation tables. Each particular +# table within a file is named a plane. The primary use of planes is +# for multi-plane Eastern fonts with over 256 glyphs: for them one TTF +# file gets converted into multiple Type1 files, with each resulting file +# containing one plane of the original font. But they may also be used +# in other creative ways. Each plane may be specified in different format +# although this is not recommended for aesthetical reasons. If a map file +# contains any specifications of planes then the plane argument MUST +# be specified to the converter with that map file. If a map file +# contains no specifications of planes then the plane argument MUST NOT +# be specified to the converter with that map file. +# +# The plane maps start from the plane directive and continue to the next +# plane directive or end of file. The plane directive must be located +# at the very beginning of a separate string and contain the word "plane" +# followed by whitespace and the plane name. The whitespace characters +# are not allowed in the plane names. Non-alphanumeric characters are +# discouraged in the plane names as well. + +# examples: + +plane 81 +=27 U+0027 APOSTROPHE + +plane otherplane + 0, 1, 2 + + +% There is one code assignment per line. +// Three formats are recognized: +# 1. optional whitespace, followed by '=', followed by a hex number +# (character position), followed by optional whitespace, followed by +# 'U+', followed by a four-digit hex number (the Unicode of the glyph we want +# here), followed by any number of characters. + +// example: + +=20 U+0020 SPACE +=48 U+0021 EXCLAMATION MARK +=22 U+0022 QUOTATION MARK +=23 U+0023 NUMBER SIGN +=24 U+0024 DOLLAR SIGN +=25 U+0025 PERCENT SIGN +=26 U+0026 AMPERSAND +=27 U+0027 APOSTROPHE + +=E0 U+042E CYRILLIC CAPITAL LETTER YU +=E1 U+0410 CYRILLIC CAPITAL LETTER A +=E2 U+0411 CYRILLIC CAPITAL LETTER BE +=E3 U+0426 CYRILLIC CAPITAL LETTER TSE +=E4 U+0414 CYRILLIC CAPITAL LETTER DE +=E5 U+0415 CYRILLIC CAPITAL LETTER IE +=E6 U+0424 CYRILLIC CAPITAL LETTER EF +=E7 U+0413 CYRILLIC CAPITAL LETTER GHE + +% 2. optional whitespace, followed by '<', followed by one or more +% non-whitespace characters, +% followed by optional whitespace, followed by '/x', followed by +% a hex number (character position), followed by optional +% whitespace, followed by '' and any number +% of characters. + +# example: + + /x40 LATIN CAPITAL LETTER I + /x41 LATIN SMALL LETTER T + /x43 LATIN SMALL LETTER R + /x44 LATIN SMALL LETTER O + /x45 LATIN SMALL LETTER C + /x46 LATIN SMALL LETTER K + /x47 LATIN SMALL LETTER S + + /xA4 EURO SIGN + +# 3. optional whitespace, followed by '!', followed by a hex number +# (character position), followed by optional whitespace, followed by +# 'U+', followed by a four-digit hex number (the Unicode of the glyph we want +# here), followed by the name of the glyph that will be used in the +# output file. + +# example: + +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent + +# 4. compact format: just list of unicodes separated by commas or ranges +# denoted by a dash between unicodes. These unicodes are mapped to +# the output codes starting from 0 and continuously increasing. +# It is possible to reset the current code by using the "at" directive +# which must start at beginning of the line and give the new current +# output code (which will be assigned to the next occuring unicode) +# as decimal, hexadecimal or octal in C notation. The "at directive must +# take a separate line. The spaces around unicodes don't matter. + +# example: +# map unicodes 0x40, 0x400, 0x4000 to the output codes 0, 1, 2 and unicodes +# 0xf010 - 0xf020, 0xf030 to the output codes 0x11-0x22 + + 0, 1, 2 +at 0x11 + 0xf010- 0xf020, 0xf030 + + +# the first format is used by Roman Czyborra on his fine WWW pages: +# http://czyborra.com/charsets/iso8859.html + +# the second format is used in the Linux locale charmaps files: +# /usr/share/i18n/charmaps/* + +# we don't need those glyphs in the encoding table +=100 U+0030 DIGIT ZERO +=101 U+0031 DIGIT ONE +=102 U+0032 DIGIT TWO +=103 U+0033 DIGIT THREE +=104 U+0034 DIGIT FOUR +=105 U+0035 DIGIT FIVE +=106 U+0036 DIGIT SIX +=107 U+0037 DIGIT SEVEN +=108 U+0039 DIGIT NINE +=109 U+0038 DIGIT EIGHT + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/Makefile b/application/third_party/dompdf/lib/ttf2ufm/src/other/Makefile new file mode 100644 index 00000000..87d17a90 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/Makefile @@ -0,0 +1,20 @@ + +PROGS= bz cmpf dmpf + +BZOBJS= bz.o bzscreen.o + +CFLAGS= -g + +all: $(PROGS) + +clean: + rm -f $(PROGS) *.o *.core core.* core + +bz: $(BZOBJS) + $(CC) $(CFLAGS) -o bz $(BZOBJS) + +cmpf: cmpf.c bmpfont.h + $(CC) $(CFLAGS) -o cmpf -I/usr/local/include -L/usr/local/lib cmpf.c -lt1 -lm + +dmpf: dmpf.c bmpfont.h + $(CC) $(CFLAGS) -o dmpf -I/usr/local/include -L/usr/local/lib dmpf.c -lt1 -lm diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/README b/application/third_party/dompdf/lib/ttf2ufm/src/other/README new file mode 100644 index 00000000..5e5ee756 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/README @@ -0,0 +1,127 @@ +Supplements for True Type to PostScript Type 1 Converter + +(Do not edit this file, it is generated from README.html!!!) + +bz +-- + +A small program to draw the Bezier curves on an alphanumeric display. +The recommended way of uing it is to run it from xterm with "Tiny" +(if you want higher magnification) or "Unreadable" (if you want +higher resolution) font and as big window size as possible. The size +of the window can be obtained by running "stty -a". For everything else +just "Use the source, Luke!" + +cmpf +---- + +A small program to compare the rendering of two supposedly +nearly-identical fonts at low resolutions. It requires the +T1LIB library. This program may be used to compare the +effect of various options of the converter on the resulting +fonts. Create two .pfa files, one with one set of options, +another with another set of options, then use this program +to compare them. + +dmpf +---- + +A small program to dump the bitmaps of all glyphs of the font +at low pixel sizes, up to 20 pixels. It requires the +T1LIB library. This program may be used to compare the +effect of changes in the T1LIB rasterizer and just for visual +search for rendering anomalies. + +lst.pl +------ + +A simple PERL script that generates an HTML file +with the full list of all characters in all +possible styles of the Variable-width and Fixed-width +fonts. This file is quite convenient to look +at the converted fonts in Netscape (or other +graphical browser). + +cntstems.pl +------ + +A simple PERL script that counts the required hint stack in the +interpreter to rasterize the glyphs of the font. May be quite +useful in search for missing glyphs which may be aborted due to +insufficient stack depth. + +showg +----- + +A PERL script that draws the glyphs and their interesting +metrics (such as coordinates of the dots, hints and blue zones) +in PostScript. It works only with un-encoded font files generated +by ttf2pt1. The intended use is like: + + showg [-c ]... ... >file.ps + gv file.ps # start the Ghostscript viewer + +As you can see, multiple glyphs may be specified. The glyphs may be +specified in one of three ways: + - as a decimal code (for example, 43 ) + - as a glyph name preceded by a slash (for example, /plus ) + - as a literal character preceded by a dot (for example, .+ ) + +So for example the following command would draw the same glyph "left +parenthesis" three times: + + showg file.t1a 40 /parenleft .\( >/file.ps + +Don't forget that some characters have to be protected from the shell +by backslash as shown above, or else the shell would try to interpret +them before passing to the program. + +One file (given as the first argument) is considered the main file +but multiple files can be specified with option -c for visual comparison +of the outlines. The glyphs from the main file are drawn in black +and supplemented with coordinate grid and sidebars for hints. The +glyphs from the comparison files are drawn in slightly lighter colors +(red, cyan, brown) and no supplemental information is provided for them. +Each use of option -c adds one comparison file, this option may be used +multiple times. If there are more than 3 comparison files the colors +repeat cyclically. + +So for example the following command would draw the same glyph "left +parenthesis" from three files on the same page: + + showg -c fileA.t1a -c fileB.t1a file.t1a .\( >/file.ps + +This program is quite valuable it you want to take a close-up view at +the font. + +The outlines are drawn in black, the ends of the curves and +lines are marked as dots, the first dots of the outlines +are fatter. The Blue Zones are drawn in light blue. The +substituted hints are marked in red, the global hints are +marked in blue. The coordinate grid is drawn in green. +The stems and the values of coordinates are for convenience +marked twice, on each size of the picture. + +showdf +------ + +A Perl script to find a list of differing glyphs in two versions of a font +file (for example, converted with different versions of ttf2pt1 or +with different options given to ttf2pt1) and feed this list into the showg +program for display. The intended use is like: + + showdf >file.ps + gv file.ps # start the Ghostscript viewer + +If both showdf and showg scripts are located in the +same directory, the command would look like: + + ./showdf ./showg font1.t1a font2.t1a >file.ps + +For decent results both font files should be converted from the same original +font and contain the same glyphs with the same names in the same order. +Otherwise most probably all the glyphs will be included, or a failure may +happen if some glyph is not found in one of the files. It is also a good +idea to convert the fonts for comparison with hinting disabled, otherwise +the differences in hinting may trigger the otherwise equal glyphs to be shown. + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/README.html b/application/third_party/dompdf/lib/ttf2ufm/src/other/README.html new file mode 100644 index 00000000..794a947d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/README.html @@ -0,0 +1,176 @@ + + + +Supplements for True Type to PostScript Type 1 Converter + + + +

+Supplements for True Type to PostScript Type 1 Converter +

+ + + +

bz

+ + +A small program to draw the Bezier curves on an alphanumeric display. +The recommended way of uing it is to run it from xterm with "Tiny" +(if you want higher magnification) or "Unreadable" (if you want +higher resolution) font and as big window size as possible. The size +of the window can be obtained by running "stty -a". For everything else +just "Use the source, Luke!" +

+ +

cmpf

+ + +A small program to compare the rendering of two supposedly +nearly-identical fonts at low resolutions. It requires the +T1LIB library. This program may be used to compare the +effect of various options of the converter on the resulting +fonts. Create two .pfa files, one with one set of options, +another with another set of options, then use this program +to compare them. +

+ +

dmpf

+ + +A small program to dump the bitmaps of all glyphs of the font +at low pixel sizes, up to 20 pixels. It requires the +T1LIB library. This program may be used to compare the +effect of changes in the T1LIB rasterizer and just for visual +search for rendering anomalies. +

+ +

lst.pl

+ + +A simple PERL script that generates an HTML file +with the full list of all characters in all +possible styles of the Variable-width and Fixed-width +fonts. This file is quite convenient to look +at the converted fonts in Netscape (or other +graphical browser). + +

cntstems.pl

+ + +A simple PERL script that counts the required hint stack in the +interpreter to rasterize the glyphs of the font. May be quite +useful in search for missing glyphs which may be aborted due to +insufficient stack depth. + +

showg

+ + +A PERL script that draws the glyphs and their interesting +metrics (such as coordinates of the dots, hints and blue zones) +in PostScript. It works only with un-encoded font files generated +by ttf2pt1. The intended use is like: +

+ +  showg [-c <fontfile.t1a>]... <fontfile.t1a> <glyph-to-draw>... >file.ps
+  gv file.ps # start the Ghostscript viewer +

+ +As you can see, multiple glyphs may be specified. The glyphs may be +specified in one of three ways: +
+  - as a decimal code (for example, 43 ) +
+  - as a glyph name preceded by a slash (for example, /plus ) +
+  - as a literal character preceded by a dot (for example, .+ ) +

+ +So for example the following command would draw the same glyph "left +parenthesis" three times: +

+ +  showg file.t1a 40 /parenleft .\( >/file.ps +

+ +Don't forget that some characters have to be protected from the shell +by backslash as shown above, or else the shell would try to interpret +them before passing to the program. +

+ +One file (given as the first argument) is considered the main file +but multiple files can be specified with option -c for visual comparison +of the outlines. The glyphs from the main file are drawn in black +and supplemented with coordinate grid and sidebars for hints. The +glyphs from the comparison files are drawn in slightly lighter colors +(red, cyan, brown) and no supplemental information is provided for them. +Each use of option -c adds one comparison file, this option may be used +multiple times. If there are more than 3 comparison files the colors +repeat cyclically. +

+ +So for example the following command would draw the same glyph "left +parenthesis" from three files on the same page: +

+ +  showg -c fileA.t1a -c fileB.t1a file.t1a .\( >/file.ps +

+ +This program is quite valuable it you want to take a close-up view at +the font. +

+ +The outlines are drawn in black, the ends of the curves and +lines are marked as dots, the first dots of the outlines +are fatter. The Blue Zones are drawn in light blue. The +substituted hints are marked in red, the global hints are +marked in blue. The coordinate grid is drawn in green. +The stems and the values of coordinates are for convenience +marked twice, on each size of the picture. +

+ +

showdf

+ + +A Perl script to find a list of differing glyphs in two versions of a font +file (for example, converted with different versions of ttf2pt1 or +with different options given to ttf2pt1) and feed this list into the showg +program for display. The intended use is like: +

+ +  showdf <showg-location> <fontfile1.t1a> <fontfile2.t1a> >file.ps
+  gv file.ps # start the Ghostscript viewer +

+ +If both showdf and showg scripts are located in the +same directory, the command would look like: +

+ +  ./showdf ./showg font1.t1a font2.t1a >file.ps
+

+ +For decent results both font files should be converted from the same original +font and contain the same glyphs with the same names in the same order. +Otherwise most probably all the glyphs will be included, or a failure may +happen if some glyph is not found in one of the files. It is also a good +idea to convert the fonts for comparison with hinting disabled, otherwise +the differences in hinting may trigger the otherwise equal glyphs to be shown. +

+ + + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/bmpfont.h b/application/third_party/dompdf/lib/ttf2ufm/src/other/bmpfont.h new file mode 100644 index 00000000..59c27372 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/bmpfont.h @@ -0,0 +1,338 @@ +/* + * see COPYRIGHT + */ + + +fchkneg(file, line, rc, cmd) + char *file; + int line; + int rc; + char *cmd; +{ + if(rc<0) { + fprintf(stderr,"%s: fatal error on line %d of %s: %d\n", + PROGNAME, line, file, rc); + fprintf(stderr,"%s\n", cmd); + exit(1); + } +} + +fchknull(file, line, rc, cmd) + char *file; + int line; + void *rc; + char *cmd; +{ + if(rc==NULL) { + fprintf(stderr,"%s: fatal error on line %d of %s: NULL\n", + PROGNAME, line, file); + fprintf(stderr,"%s\n", cmd); + exit(1); + } +} + +#define chkneg(f) fchkneg(__FILE__,__LINE__,(f),#f) +#define chknull(f) fchknull(__FILE__,__LINE__,(f),#f) + +#define MYPAD 8 + +#define CHRNONE ' ' +#define CHRBOTH '.' +#define CHRONE '1' +#define CHRTWO '2' + +#define MINSIZE 8 +#define MAXSIZE 20 + +#define LINEWIDTH 80 /* screen line width in chars */ +#define MAXLINES (MAXSIZE*(MAXSIZE-MINSIZE+1)) + +static char map[MAXLINES][LINEWIDTH+1]; +static char mbase, mx, mend; + +/* returns 0 if the same, -1 if different */ + +int +cmpglyphs(g1, g2) + GLYPH *g1, *g2; +{ + int wd1, wd2; + int ht1, ht2; + int i, j; + char *p1, *p2; + + wd1=g1->metrics.rightSideBearing - g1->metrics.leftSideBearing; + ht1=g1->metrics.ascent - g1->metrics.descent; + wd2=g2->metrics.rightSideBearing - g2->metrics.leftSideBearing; + ht2=g2->metrics.ascent - g2->metrics.descent; + + if(g1->bits==NULL && g2->bits!=NULL + || g1->bits!=NULL && g2->bits==NULL) + return -1; + + if(g1->metrics.ascent != g2->metrics.ascent) + return -1; + + if(g1->metrics.descent != g2->metrics.descent) + return -1; + + if( wd1 != wd2 ) + return -1; + + if( (p1=g1->bits) !=NULL && (p2=g2->bits) !=NULL ) + for(i=0; i mend) + mend=row; + } +} + +void +drawdotg1(row, col, val) + unsigned row, col, val; +{ + if(row < MAXLINES && col < LINEWIDTH-1) { + if(val) + map[row][col]=CHRONE; + else + map[row][col]=CHRNONE; + if(row > mend) + mend=row; + } +} + +void +drawdotg2(row, col, val) + unsigned row, col, val; +{ + if(row < MAXLINES && col < LINEWIDTH-1) { + if(val) + if(map[row][col]==CHRONE) + map[row][col]=CHRBOTH; + else + map[row][col]=CHRTWO; + else if(map[row][col]!=CHRONE) + map[row][col]=CHRNONE; + if(row > mend) + mend=row; + } +} + +void +drawglyf(size, g1) + int size; + GLYPH *g1; +{ + int wd1, wd2, wdm; + int ht1, ht2, ascm, desm; + int i, j, k, val; + char *p; + int off1, off2; + + wd1=g1->metrics.rightSideBearing - g1->metrics.leftSideBearing; + ht1=g1->metrics.ascent - g1->metrics.descent; + + wdm=wd1; + + ascm=g1->metrics.ascent; + desm= -g1->metrics.descent; + + if(mbase==0) + mbase=ascm+1; + else if(LINEWIDTH-mx <= wdm+1) { + mx=0; mbase=mend+ascm+2; + } + + drawdot(mbase-ascm-1, mx, (size/10)%10+'0'); + drawdot(mbase-ascm-1, mx+1, size%10+'0'); + + if( (p=g1->bits) !=NULL) + for(i=0; i>=1) + drawdot(i+mbase-g1->metrics.ascent, mx+j+k, (val&1)?CHRBOTH:CHRNONE); + } + } + + wdm++; + if(wdm<3) + wdm=3; + mx+=wdm; + drawdot(mbase, mx-1, '-'); +} + +void +drawdiff(size, g1, g2) + int size; + GLYPH *g1, *g2; +{ + int wd1, wd2, wdm; + int ht1, ht2, ascm, desm; + int i, j, k, val; + char *p; + int off1, off2; + + wd1=g1->metrics.rightSideBearing - g1->metrics.leftSideBearing; + ht1=g1->metrics.ascent - g1->metrics.descent; + wd2=g2->metrics.rightSideBearing - g2->metrics.leftSideBearing; + ht2=g2->metrics.ascent - g2->metrics.descent; + + if(wd1>wd2) { + wdm=wd1; + off1=0; off2=wd1-wd2; + } else { + wdm=wd2; + off2=0; off1=wd2-wd1; + } + + if(g1->metrics.ascent > g2->metrics.ascent) + ascm=g1->metrics.ascent; + else + ascm=g2->metrics.ascent; + + if(g1->metrics.descent < g2->metrics.descent) + desm= -g1->metrics.descent; + else + desm= -g2->metrics.descent; + + if(mbase==0) + mbase=ascm+1; + else if(LINEWIDTH-mx <= wdm+1) { + mx=0; mbase=mend+ascm+2; + } + + drawdot(mbase-ascm-1, mx, (size/10)%10+'0'); + drawdot(mbase-ascm-1, mx+1, size%10+'0'); + + /* check which alignment is better */ + if(off1!=0 || off2!=0) { + int cntl,cntr; + int a1, a2, d1, d2; + int val1, val2; + int rstep1, rstep2; + + cntl=cntr=0; + rstep1=(wd1+7)/8; + rstep2=(wd2+7)/8; + a1=g1->metrics.ascent; + d1=g1->metrics.descent; + a2=g2->metrics.ascent; + d2=g2->metrics.descent; + +#ifdef dbgoff + printf("size: %d\n", size); +#endif + for(i=ascm; i>= -desm; i--) { + for(j=0; ja1 || i=wd1) + val1=0; + else + val1=( g1->bits[ (a1-i)*rstep1+j/8 ] >> (j%8) ) & 1; + if(i>a2 || i=wd2) + val2=0; + else + val2=( g2->bits[ (a2-i)*rstep2+j/8 ] >> (j%8) ) & 1; + + cntl += (val1 ^ val2); + +#ifdef dbgoff + putchar(val1?'1':' '); + putchar(val2?'2':' '); + putchar('.'); +#endif + + /* now the right alignment */ + if(i>a1 || i=wd1 || jbits[ (a1-i)*rstep1+(j-off1)/8 ] >> ((j-off1)%8) ) & 1; + if(i>a2 || i=wd2) + val2=0; + else + val2=( g2->bits[ (a2-i)*rstep2+(j-off2)/8 ] >> ((j-off2)%8) ) & 1; + + cntr += (val1 ^ val2); + +#ifdef dbgoff + putchar(val1?'1':' '); + putchar(val2?'2':' '); + putchar('|'); +#endif + } +#ifdef dbgoff + putchar('\n'); +#endif + } + +#ifdef dbgoff + printf("size %d: left %d right %d\n",size, cntl, cntr); +#endif + if(cntl <= cntr) /* left is better or the same */ + off1=off2=0; + } + + if( (p=g1->bits) !=NULL) + for(i=0; i>=1) + drawdotg1(i+mbase-g1->metrics.ascent, mx+j+k+off1, val&1); + } + } + if( (p=g2->bits) !=NULL) + for(i=0; i>=1) + drawdotg2(i+mbase-g2->metrics.ascent, mx+j+k+off2, val&1); + } + } + + wdm++; + if(wdm<3) + wdm=3; + mx+=wdm; + drawdot(mbase, mx-1, '-'); +} + +void +printmap(f) + FILE *f; +{ + int i, j; + + for(i=0; i<=mend; i++) { + for(j=LINEWIDTH-1; j>=0 && map[i][j]==' '; j--) + {} + map[i][j+1]='\n'; + map[i][j+2]=0; + fputs(map[i], f); + } +} + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/bz.c b/application/third_party/dompdf/lib/ttf2ufm/src/other/bz.c new file mode 100644 index 00000000..475d13fa --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/bz.c @@ -0,0 +1,78 @@ +/* + * see COPYRIGHT + */ + +#include +#include +#include "bzscreen.h" + +/* size of the screen in "physical pixels" */ +#define PHYSX 980 +#define PHYSY 310 + +/* the bounding box of the drawing in "logical pixels" */ +/* the base point - set to 0, 0 for absolute coordinates */ +#define BASEX 19 +#define BASEY 122 +/* the maximal point */ +#define MAXX 450 +#define MAXY 481 + +main(argc,argv) + int argc; + char **argv; +{ + initscreen(PHYSX, PHYSY, PHYSX, PHYSY, 0, 0, BASEX, BASEY, MAXX, MAXY); + + /* + drawcurve('#', 0,0, 51,0, 1,49, 45,98); + drawcurve('1', 5,28, 8,37, 16,65, 45,98); + + drawcurve('3', 0,0, 0,24, 30,68, 80,72); + + drawcurve('1', 0,0, 0,5, 1,10, 2,15); + drawcurve('2', 2,15, 8,42, 30,68, 80,72); + + drawcurve('4', 0,0, 0,37, 22,67, 80,72); + */ + + /* final */ + /* + drawcurve('#', 324, 481, 390, 481, 448, 475, 448, 404 ); + drawcurve('#', 448, 404, 448, 404, 448, 324, 448, 324 ); + drawcurve('#', 448, 324, 402, 245, 19, 338, 19, 122 ); + */ + + /* 3 */ + /* + */ + drawcurve('*', 450, 404, 450, 397, 450, 390, 448, 384 ); + + drawcurve('*', 448, 384, 446, 378, 444, 370, 443, 360 ); + drawcurve('.', 443, 360, 309, 356, 206, 341, 132, 304 ); + drawcurve('.', 132, 304, 57, 266, 19, 208, 19, 122 ); + + /* 4 */ + drawcurve('#', 324, 481, 390, 481, 450, 475, 450, 404 ); + drawcurve('#', 450, 404, 450, 397, 450, 390, 448, 384 ); + + drawcurve('#', 448, 384, 402, 245, 19, 338, 19, 122 ); + + /* + drawcurve('.', 324, 481, 361, 481, 391, 478, 414, 466 ); + drawcurve('.', 414, 466, 436, 454, 450, 436, 450, 404 ); + + drawcurve('.', 450, 404, 450, 390, 447, 378, 443, 360 ); + drawcurve('.', 443, 360, 309, 356, 206, 341, 132, 304 ); + + drawcurve('.', 132, 304, 57, 266, 19, 208, 19, 122 ); + */ + + printscreen(stdout); +} + +sumcurves(dx11, dy11, dx12, dy12, dx13, dy13, + dx21, dy21, dx22, dy22, dx23, dy23) +{ +} + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.c b/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.c new file mode 100644 index 00000000..0bb5ab6a --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.c @@ -0,0 +1,220 @@ +/* + * see COPYRIGHT + */ + +#include +#include +#include "bzscreen.h" + +/* + * functions to draw the bezier curves in text mode + */ + +double +fmin(a,b) + double a, b; +{ + if(a cols || physy+yoff > rows) { + fprintf(stderr, "*** drawable area out of screen\n"); + exit(1); + } + + if(minx>maxx || miny>maxy) { + fprintf(stderr, "*** empty drawable area\n"); + exit(1); + } + + screen.physx = physx; + screen.physy = physy; + screen.rows = rows; + screen.cols = cols+2; /* for '\n\0' */ + screen.xoff = xoff; + screen.yoff = yoff; + screen.minx = minx; + screen.miny = miny; + + if(( screen.dots=malloc(screen.rows*screen.cols) )==NULL) { + perror("*** no memory for screen: "); + exit(1); + } + + j=screen.rows*screen.cols; + for(i=0; i abs(bx-ax) ) { + if(by>ay) + markb='^'; + else + markb='v'; + } else { + if(bx>ax) + markb='>'; + else + markb='<'; + } + + if(dx==cx && dy==cy) { + marke=mark; + } else if( abs(dy-cy) > abs(dx-cx) ) { + if(dy>cy) + marke='^'; + else + marke='v'; + } else { + if(dx>cx) + marke='>'; + else + marke='<'; + } + + for(i=1; i=screen.physy || x<0 || x>=screen.physx) + return; + screendot(x,y)=mark; +} + +void +setabsdot(mark, x, y) + int x, y, mark; +{ + if(y<0 || y>=screen.rows || x<0 || x>=screen.cols-2) + return; + screenabsdot(x,y)=mark; +} + +void +setfdot(mark, fx, fy) + int mark; + double fx, fy; +{ + int x, y; + + x=(int)(fx*screen.xscale+0.5); + y=(int)(fy*screen.yscale+0.5); + + if(y<0 || y>=screen.physy || x<0 || x>=screen.physx) + return; + screendot(x,y)=mark; +} + +/* destructive */ +void +printscreen(f) + FILE *f; +{ + int r; + char *pi, *pc; + + for(r=screen.rows-1; r>=0; r--) { + pc=&screenabsdot(0,r); + for(pi=&screenabsdot(-2,r+1); pi>=pc && *pi == ' '; pi--) + {} + pi[1]='\n'; + pi[2]=0; + fputs(pc, f); + } +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.h b/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.h new file mode 100644 index 00000000..290d5195 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.h @@ -0,0 +1,40 @@ +/* + * see COPYRIGHT + */ + + +/* + * Screen for drawing the Bezier curves in text mode + */ + +struct screen { + unsigned physx; + unsigned physy; + unsigned cols; + unsigned rows; + unsigned xoff; + unsigned yoff; + unsigned minx; + unsigned miny; + char *dots; + double xscale; + double yscale; +} screen; + +#define screenabsdot(x,y) (screen.dots[(y)*screen.cols+(x)]) +#define screendot(x,y) screenabsdot((x)+screen.xoff, (y)+screen.yoff) + +/* prototypes */ +double fmin(double a, double b); +int abs(int x); +void initscreen(unsigned physx, unsigned physy, + unsigned cols, unsigned rows, unsigned xoff, unsigned yoff, + unsigned minx, unsigned miny, unsigned maxx, unsigned maxy); +void drawcurve(int mark, int ax,int ay, + int bx,int by, int cx,int cy, int dx,int dy); +void drawcurvedir(int mark, int ax,int ay, + int bx,int by, int cx,int cy, int dx,int dy); +void drawdot(int mark, int x, int y); +void setabsdot(int mark, int x, int y); +void setfdot(int mark, double x, double y); +void printscreen(FILE *f); diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/cmpf.c b/application/third_party/dompdf/lib/ttf2ufm/src/other/cmpf.c new file mode 100644 index 00000000..37e6e98f --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/cmpf.c @@ -0,0 +1,67 @@ +/* + * see COPYRIGHT + */ + +#include +#include +#include "t1lib.h" + +/* + * compare two [ almost the same ] fonts + */ + +#define PROGNAME "cmpf" + +#include "bmpfont.h" + + +main(ac, av) + int ac; + char **av; +{ + int fontid1, fontid2; + GLYPH *g1, *g2; + int chr, size, diff, offset; + + if(ac!=3) { + fprintf(stderr,"Use: %s font1 font2\n", PROGNAME); + exit(1); + } + + chkneg(T1_SetBitmapPad(MYPAD)); + chkneg(T1_InitLib(NO_LOGFILE|IGNORE_CONFIGFILE|IGNORE_FONTDATABASE)); + chkneg(fontid1=T1_AddFont(av[1])); + chkneg(fontid2=T1_AddFont(av[2])); + + + resetmap(); + for(chr=0; chr<256; chr++) { + diff=0; + for(size=MAXSIZE; size>=MINSIZE; size--) { + chknull( g1=T1_CopyGlyph(T1_SetChar( fontid1, chr, (float)size, NULL)) ); + chknull( g2=T1_CopyGlyph(T1_SetChar( fontid2, chr, (float)size, NULL)) ); + + if( cmpglyphs(g1, g2) ) { + /* printf("%d %d - diff\n", chr, size); */ + diff=1; + drawdiff(size, g1, g2); + } + /* + else + fprintf(stderr, "%d %d - same\n", chr, size); + */ + + chkneg(T1_FreeGlyph(g1)); + chkneg(T1_FreeGlyph(g2)); + } + if(diff) { + printf("*** Difference for %d==0x%x %c\n", chr, chr, + isprint(chr) ? chr : ' '); + printmap(stdout); + diff=0; + resetmap(); + } + } + + printf("All done!\n"); +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/cntstems.pl b/application/third_party/dompdf/lib/ttf2ufm/src/other/cntstems.pl new file mode 100644 index 00000000..185c06c4 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/cntstems.pl @@ -0,0 +1,50 @@ +#!/usr/bin/perl +# +# Copyright (c) 2000 by Sergey Babkin +# (see COPYRIGHT for full copyright notice) +# +# script to calculate the total number of stems used by the +# glyphs in case if stems are always pushed to the stack and +# never popped (as X11 does) + +$insubrs = 0; +$inchars = 0; + +while(<>) +{ + if(/\/Subrs/) { + $insubrs = 1; + } elsif(/\/CharStrings/) { + $insubrs = 0; + $inchars = 1; + } + if($insubrs && /^dup (\d+)/) { + $cursubr = $1; + $substems[$cursubr] = 0; + } elsif (/^dup (\d+) \/(\S+) put/) { + $codeof{$2} = $1; + } + if($inchars) { + if(/^\/(\S+)\s+\{/) { + $curchar = $1; + $charstems = 0; + } elsif( /endchar/ ) { + printf("%d:%s\t%d\n", $codeof{$curchar}, $curchar, $charstems); + } elsif( /(\d+)\s+4\s+callsubr/) { + $charstems += $substems[$1+0]; + } + } + if(/[hv]stem3/) { + if($insubrs) { + $substems[$cursubr] += 3; + } elsif($inchars) { + $charstems += 3; + } + } elsif( /[hv]stem/ ) { + if($insubrs) { + $substems[$cursubr]++; + } elsif($inchars) { + $charstems++; + } + } +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/dmpf.c b/application/third_party/dompdf/lib/ttf2ufm/src/other/dmpf.c new file mode 100644 index 00000000..1052a448 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/dmpf.c @@ -0,0 +1,53 @@ +/* + * see COPYRIGHT + */ + +#include +#include +#include "t1lib.h" + +/* + * Dump a rasterizarion of the font at small size + */ + +#define PROGNAME "dmpf" + +#include "bmpfont.h" + + +main(ac, av) + int ac; + char **av; +{ + int fontid1, fontid2; + GLYPH *g1, *g2; + int chr, size, diff, offset; + + if(ac!=2) { + fprintf(stderr,"Use: %s font\n", PROGNAME); + exit(1); + } + + chkneg(T1_SetBitmapPad(MYPAD)); + chkneg(T1_InitLib(NO_LOGFILE|IGNORE_CONFIGFILE|IGNORE_FONTDATABASE)); + chkneg(fontid1=T1_AddFont(av[1])); + + + resetmap(); + for(chr=0; chr<256; chr++) { + for(size=MAXSIZE; size>=MINSIZE; size--) { + chknull( g1=T1_CopyGlyph(T1_SetChar( fontid1, chr, (float)size, NULL)) ); + + drawglyf(size, g1); + + chkneg(T1_FreeGlyph(g1)); + } + + printf("*** Glyph %d==0x%x %c\n", chr, chr, + isprint(chr) ? chr : ' '); + printmap(stdout); + resetmap(); + } + + printf("All done!\n"); +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/lst.pl b/application/third_party/dompdf/lib/ttf2ufm/src/other/lst.pl new file mode 100644 index 00000000..b5840b27 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/lst.pl @@ -0,0 +1,65 @@ +#!/usr/bin/perl +# +# script to create HTML file with character table +# in plain, italic, bold, bold-italic +# +# see COPYRIGHT +# + +# width of tables +$step=16; + +# commands to enable and disable the font modes +# (the fastest changing is first) +@matrix = ( + [ "Roman", "Italic", "", "" ], + [ "Medium", "Bold", "", "" ], + [ "Variable", "Fixed", "", "" ], +); + +sub printall +{ + local $i, $j; + + printf("\n"); + for($j=32; $j<256; $j+=$step) { + printf("\n"); + for $i ($j..$j+$step-1) { + $c=chr($i); + if($c eq "<") { + $c="<"; + } elsif($c eq ">") { + $c=">"; + } + printf("\n"); + } + printf("\n"); + } + printf("
%03d\n", $i); + printf("%s%s%s\n", $enmode, $c, $dismode); + printf("

\n"); +} + +printf("\n

\n"); + +for $mask (0.. (1<<@matrix)-1) { + #printf(""); + $mode = $enmode = $dismode = ""; + for $bit (0.. $#matrix) { + $val = ($mask >> $bit) & 1; + $mode = $matrix[$bit]->[$val] . "
" . $mode; + if( $val ) { + $enmode = $matrix[$bit]->[3] . $enmode; + $dismode = $dismode . $matrix[$bit]->[2]; + } + #printf("=== %d %s %s %s\n", $val, $mode, $enmode, $dismode); + } + #printf("%x %s %s %s\n", $mask, $mode, $enmode, $dismode); + printf("
\n"); + &printall(); + printf("\n"); + printf("%s\n", $mode); + printf("
\n"); +} + +printf("
\n"); diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/showdf b/application/third_party/dompdf/lib/ttf2ufm/src/other/showdf new file mode 100644 index 00000000..1706a814 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/showdf @@ -0,0 +1,58 @@ +#!/usr/bin/perl + +if (@ARGV != 3) { + print STDERR "Use:\n"; + print STDERR " showdf \n"; + print STDERR "to create a showg diagram of glyphs differing in two files\n"; + exit 1; +} + +$cmd = shift @ARGV; +$oldf = shift @ARGV; +$newf = shift @ARGV; + +open(O, "<$oldf") or die "Unable to open '$oldf'\n"; +open(N, "<$newf") or die "Unable to open '$newf'\n"; + +while() { + last if(/CharStrings/); +} +while() { + last if(/CharStrings/); +} + +undef @symlist; +$sym = ''; +$inlist = 0; +$nstop = 0; + +while($so = ) { + if($so =~ m|^(/\S+)\s+\{|) { + $sym = $1; + $inlist = 0; + #printf STDERR "found sym $sym\n"; + if (!$nstop || $sn !~ m|^$sym\s+\{|) { + while($sn = ) { + #print STDERR "+$sn"; + last if($sn =~ m|^${sym}\s+\{|); + } + } + $nstop = 0; + } elsif(!$nstop) { + $sn = ; + #print STDERR "<$so>$sn\n"; + if($so ne $sn) { + if(!$inlist) { + $inlist = 1; + push(@symlist, $sym); + } + if($sn =~ m|^(/\S+)\s+\{|) { + $nstop = 1; + #printf STDERR "stop at $1\n"; + } + } + } +} +unshift(@symlist, $cmd, '-c', $oldf, $newf); +#printf("%s\n", join(' ', @symlist)); +exec @symlist; diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/showg b/application/third_party/dompdf/lib/ttf2ufm/src/other/showg new file mode 100644 index 00000000..437860d4 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/showg @@ -0,0 +1,633 @@ +#!/usr/bin/perl + +my @cmpfiles; + +while($ARGV[0] eq "-c") { + shift(@ARGV); + push(@cmpfiles, shift(@ARGV)); +} + +if( $#ARGV < 1) { + die("Usage: $0 [-c file]... file glyph-code...\n"); +} + +$fname=shift @ARGV; + +# storage for files +my %fontname; +my %fbbox; +my %fblues; +my %fenc; +my %frevenc; +my %fsubrs; +my %fchars; +my @cmnbbox; # common bounding box covering all files + +@cmnbbox = (100, 100, 100, 100); + +# read all files into memory +for $f (@cmpfiles, $fname) { + open(FILE, "<$f") or die("no such file $f"); + while() { + if(/FontBBox\s+\{\s*(.*)\s*}/) { + @bbox=split(/\s+/, $1); + push(@{$fbbox{$f}}, @bbox); + if($bbox[0] < $cmnbbox[0]) { + $cmnbbox[0] = $bbox[0]; + } + if($bbox[1] < $cmnbbox[1]) { + $cmnbbox[1] = $bbox[1]; + } + if($bbox[2] > $cmnbbox[2]) { + $cmnbbox[2] = $bbox[2]; + } + if($bbox[3] > $cmnbbox[3]) { + $cmnbbox[3] = $bbox[3]; + } + } elsif( /BlueValues\s+\[\s*(.*)\s*\]/ || /OtherBlues\s+\[\s*(.*)\s*\]/ ) { + @blues=split(/\s+/, $1); + push(@{$fblues{$f}}, @blues); + } elsif( /^dup\s+(\d+)\s+\/(\S+)\s+put/ ) { + $fenc{$f}{$1} = $2; + if( ! defined $frevenc{$f}{$2} ) { + $frevenc{$f}{$2} = $1; + } + } elsif( /^dup\s+(\d+)\s+\{\s*$/ ) { + $key = $1; + $bf = $_; + while() { + $bf .= $_; + if( /\}\s+NP/ ) { + last; + } + } + $fsubrs{$f}{$key} = $bf; + } elsif( /^\/(\S+)\s+\{\s*$/ ) { + $key = $1; + $bf = $_; + while() { + $bf .= $_; + if( /endchar/ ) { + last; + } + } + $fchars{$f}{$key} = $bf; + } elsif( /^\/FontName\s+(\S+)/ ) { + $fontname{$f} = $1; + } + } + close(FILE); +} + +######################## Prolog ################################### + +print("%%!PS-Adobe-1.0 +%%DocumentNeededResources: font Courier +%%Pages: (atend) +%%EndComments +%%BeginProlog +/cmpfcolorarray [ + [ 1 0.2 0.2 ] % slightly lighter red + [ 0 0.7 0.7 ] % cyan + [ 0.7 0.7 0 ] % brown-yellow +] def +/cmpfcolor { % number -> . + cmpfcolorarray length mod % get the subarray number + cmpfcolorarray exch get aload pop setrgbcolor +} bind def +/contourcolor { 0 0 0 setrgbcolor } bind def % black +/bluezonecolor { 0.95 0.95 1 setrgbcolor } bind def % very light blue +/coordcolor { 0 1 0 setrgbcolor } bind def % green +/textcolor { 0 0 0 setrgbcolor } bind def % black +/stemcolor { 1 0 0 setrgbcolor } bind def % red +/mainstemcolor { 0 0 1 setrgbcolor } bind def % blue + +% /fnt2pt { 72 5 mul 1000 div } bind def + +/linehor { % . font_y -> . + gsave + 0 72 translate + 72 fnt2pt scale + newpath + 0 exch moveto + 7 0 rlineto + stroke + grestore +} bind def + +/linevert { % . font_x -> . + gsave + 72 0 translate + fnt2pt 72 scale + newpath + 0 moveto + 0 7 rlineto + stroke + grestore +} bind def + +/bluezone { % . font_y_1 font_y_2 -> . + gsave + bluezonecolor + 0 72 translate + 72 fnt2pt scale + newpath + 0 exch moveto + 7 0 rlineto + 7 exch lineto + -7 0 rlineto + closepath + fill + grestore +} bind def + +/drawstem { % . xwidth ywidth x0 y0 -> . + gsave + 72 72 translate fnt2pt fnt2pt scale xorg yorg translate + newpath + moveto + dup 0 exch rlineto + exch 0 rlineto + neg 0 exch rlineto + closepath fill + grestore +} bind def + +/getlen { + dup stringwidth pop +} bind def + +/compressfont 0.8 def + +/label { % . string stringwd y -> . + dup lasty lt { + dup lasty fontsz sub le + } { + dup lasty fontsz add ge + } ifelse { + /curx 0 store + } if + dup /lasty exch store + 0 exch moveto + compressfont mul dup curx add maxx gt { + /curx 0 store + } if + curx 0 rmoveto + dup 0 rlineto + stroke + gsave + curx lasty moveto + curx add /curx exch store + compressfont 1 scale + show + grestore +} bind def +"); + +@bbox=@cmnbbox; + +$nx=$bbox[2]-$bbox[0]; +$ny=$bbox[3]-$bbox[1]; +$maxsz= ($nx>$ny) ? $nx : $ny; +$fnt2pt= 72*5/$maxsz; +printf("/fnt2pt 72 5 mul %d div def\n", $maxsz); +$xorg= -($bbox[0]-($maxsz-$nx)/2); +$yorg= -($bbox[1]-($maxsz-$ny)/2); +printf("/xorg %d def /yorg %d def\n", $xorg, $yorg); + +print(" +%%EndProlog +"); + +######################## Subroutines ############################## + +sub bluezone # from to +{ + my ($a, $b)=@_; + printf("%d %d bluezone\n",$a+$yorg, $b+$yorg); + $ycoord{$a+0}=1; + $ycoord{$b+0}=1; +} + +sub linehor # x +{ + my $a=$_[0]; + printf("%d linehor\n",$a+$yorg); + $ycoord{$a+0}=1; +} + +sub linevert # x +{ + my $a=$_[0]; + printf("%d linevert\n",$a+$xorg); + $xcoord{$a+0}=1; +} + +sub hstem # from width +{ + my ($from, $width)=@_; + $stemhused=1; + printf("%d %d %d %d drawstem %% %d %d h \n", -$stemwd, $width, + $bbox[0]-2-$stemhgrp*$stemwd, $from, + $from, $width); + printf("%d %d %d %d drawstem %% %d %d h \n", $stemwd, $width, + $bbox[2]+2+$stemhgrp*$stemwd, $from, + $from, $width); +} + +sub vstem # from width +{ + my ($from, $width)=@_; + $stemvused=1; + printf("%d %d %d %d drawstem %% %d %d v \n", $width, -$stemwd, + $from, $bbox[1]-2-$stemhgrp*$stemwd, + $from, $width); + printf("%d %d %d %d drawstem %% %d %d v \n", $width, $stemwd, + $from, $bbox[3]+2+$stemhgrp*$stemwd, + $from, $width); +} + +sub nextstemgrp +{ + if($stemhused || $stemvused) { + $stemhgrp++; + $stemhused=0; + $stemvgrp++; + $stemvused=0; + } +} + +sub substems # fname subrlist +{ + my $fname = shift; + my $i, $cmd, @vals; + + print("\nstemcolor\n"); + + for $i (@_) { + &nextstemgrp(); + for $_ (split(/\n/, $fsubrs{$fname}{$i})) { + s/^\s+//; + @vals=split(/\s+/, $_); + $cmd=$vals[$#vals]; + if($cmd eq "hstem") { + &hstem($vals[0], $vals[1]); + } elsif($cmd eq "vstem") { + &vstem($vals[0], $vals[1]); + } + } + } + print("\n"); +} + +sub drawcharwstems # charstring +{ + my($x,$y)=(0,0); + my @vals, $cmd, $i; + + print("\nmainstemcolor\n"); + &nextstemgrp(); + for $_ (split(/\n/, $_[0])) { + s/^\s+//; + @vals=split(/\s+/, $_); + $cmd=$vals[$#vals]; + + if($cmd eq "hsbw") { + $x=$vals[0]+0; + } elsif($cmd eq "hstem") { + &hstem($vals[0], $vals[1]); + } elsif($cmd eq "hstem3") { + &hstem($vals[0], $vals[1]); + &hstem($vals[2], $vals[3]); + &hstem($vals[4], $vals[5]); + } elsif($cmd eq "vstem") { + &vstem($vals[0], $vals[1]); + } elsif($cmd eq "vstem3") { + &vstem($vals[0], $vals[1]); + &vstem($vals[2], $vals[3]); + &vstem($vals[4], $vals[5]); + } elsif($cmd eq "rmoveto") { + # a shortcut + last; + } + } + &drawchar("drawchar", 1, "contourcolor", $_[0]); +} + +sub drawchar #procname wantgrid color charstring +{ + my($procname, $wantgrid, $color, $charstring) = @_; + my($x,$y)=(0,0); + my @vals, $cmd, $i; + my %xv=(); + my %yv=(); + + printf("\n/%s {\n",$procname); + printf("\ngsave 72 72 translate fnt2pt fnt2pt scale %d %d translate\n", $xorg, $yorg); + printf("%s 1 setlinewidth newpath\n", $color); + for $_ (split(/\n/, $charstring)) { + s/^\s+//; + @vals=split(/\s+/, $_); + $cmd=$vals[$#vals]; + + if($cmd eq "callsubr" && $vals[1] == 4) { + push(@subrlist, $vals[0]); + } elsif($cmd eq "amoveto") { + $x=$vals[0]+0; + $y=$vals[1]+0; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d moveto\n", $x, $y); + printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "rmoveto") { + $x+=$vals[0]; + $y+=$vals[1]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d moveto\n", $x, $y); + printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "hmoveto") { + $x+=$vals[0]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d moveto\n", $x, $y); + printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "vmoveto") { + $y+=$vals[0]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d moveto\n", $x, $y); + printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "alineto") { + $x=$vals[0]+0; + $y=$vals[1]+0; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d lineto\n", $x, $y); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "rlineto") { + $x+=$vals[0]; + $y+=$vals[1]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d lineto\n", $x, $y); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "hlineto") { + $x+=$vals[0]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d lineto\n", $x, $y); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "vlineto") { + $y+=$vals[0]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d lineto\n", $x, $y); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "arcurveto") { + for $i (0,2,4) { + $x=$vals[$i]+0; + $y=$vals[$i+1]+0; + printf("%d %d ", $x, $y); + } + $xv{$x+0}=1; $yv{$y+0}=1; + printf("curveto\n"); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "rrcurveto") { + for $i (0,2,4) { + $x+=$vals[$i]; + $y+=$vals[$i+1]; + printf("%d %d \n", $x, $y); + } + $xv{$x+0}=1; $yv{$y+0}=1; + printf("curveto\n"); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "hvcurveto") { + $x+=$vals[0]; + printf("%d %d \n", $x, $y); + $x+=$vals[1]; + $y+=$vals[2]; + printf("%d %d \n", $x, $y); + $y+=$vals[3]; + printf("%d %d \n", $x, $y); + $xv{$x+0}=1; $yv{$y+0}=1; + printf("curveto\n"); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "vhcurveto") { + $y+=$vals[0]; + printf("%d %d \n", $x, $y); + $x+=$vals[1]; + $y+=$vals[2]; + printf("%d %d \n", $x, $y); + $x+=$vals[3]; + printf("%d %d \n", $x, $y); + $xv{$x+0}=1; $yv{$y+0}=1; + printf("curveto\n"); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "closepath") { + printf("closepath stroke newpath\n"); + } + } + + printf("grestore } bind def\n"); + if($wantgrid) { + printf("coordcolor\n"); + for $x (keys %xv) { + &linevert($x); + } + for $y (keys %yv) { + &linehor($y); + } + } +} + +$pages=0; + +for $arg (@ARGV) { + undef $name, $code; + + if( $arg =~ /^\/(.*)/ ) { + $name=$1; + } elsif( $arg =~ /^\.(.)/ ) { + $code=ord($1); + } else { + $code=$arg; + } + + $pages++; + + $stemhgrp=0; + $stemhused=0; + $stemvgrp=0; + $stemvused=0; + $stemwd=10; + undef %xcoord; + undef %ycoord; + + if( defined $name ) { + $xname = $name; + $xcode = $frevenc{$fname}{$name}; + if( $xcode eq "" ) { + $xcode = "**UNKNOWN**"; + } + } else { + $xname = $fenc{$fname}{$code}; + if( $xname eq "" ) { + $xname = "**UNKNOWN**"; + } + $xcode = $code; + } + + printf("%%%%Page: %d %d\n", $pages, $pages); + printf("gsave + +0 setlinewidth +36 72 translate + +gsave +contourcolor +72 72 scale +newpath +0 0 moveto +7 0 rlineto +0 7 rlineto +-7 0 rlineto +closepath +stroke +1 1 translate +newpath +0 0 moveto +5 0 rlineto +0 5 rlineto +-5 0 rlineto +closepath +stroke +grestore + +"); + + undef @subrlist; + + + @bbox=@{$fbbox{$fname}}; + + print("coordcolor\n"); + printf("0 linehor %d linehor %d linehor\n", $bbox[1]+$yorg, $bbox[3]+$yorg); + printf("%d linevert %d linevert\n", $bbox[0]+$xorg, $bbox[2]+$xorg); + + %vals=@{$fblues{$fname}}; + for $i (keys %vals) { + &bluezone($i, $vals{$i}); + } + + $havechar = 1; + if( defined $fchars{$fname}{$xname} ) { + &drawcharwstems($fchars{$fname}{$xname}); + } else { + $havechar = 0; + if(defined $name) { + printf(STDERR "WARNING: %s nas no character with name \"%s\"\n", $fname, $name); + } else { + printf(STDERR "WARNING: %s nas no character with code \"%s\"\n", $fname, $code); + } + } + + &substems($fname, @subrlist); + + printf(STDERR "glyph name:%s code:%s (%d substituted stem groups)\n", $xname, $xcode, scalar @subrlist); + + $cmpfidx = 0; + for $cmpf(@cmpfiles) { + undef $cname, $ccode; + + if( defined $name ) { + if ( ! defined $fchars{$cmpf}{$name} && defined $fenc{$cmpf}{$xcode}) { + printf(STDERR " NOTE: %s nas no glyph with name \"%s\", guessed by code\n", $cmpf, $name); + $cname = $fenc{$cmpf}{$xcode}; + if( $cname eq "" ) { + $cname = "**UNKNOWN**"; + } + $ccode = $xcode; + } else { + $cname = $name; + $ccode = $frevenc{$cmpf}{$name}; + if( $ccode eq "" ) { + $ccode = "**UNKNOWN**"; + } + } + } else { + $cname = $fenc{$cmpf}{$code}; + if( $cname eq "" ) { + $cname = "**UNKNOWN**"; + } + $ccode = $code; + } + + if( defined $fchars{$cmpf}{$cname} ) { + &drawchar("drawcmpchar", 0, sprintf("%d cmpfcolor", $cmpfidx), + $fchars{$cmpf}{$cname}); + printf("drawcmpchar\n\n"); + printf(STDERR " in %s glyph name:%s code:%s\n", $cmpf, $cname, $ccode); + } else { + if(defined $name) { + printf(STDERR " WARNING: %s nas no character with name \"%s\"\n", $cmpf, $name); + } else { + printf(STDERR " WARNING: %s nas no character with code \"%s\"\n", $cmpf, $code); + } + } + $cmpfidx++; + } + + if($havechar) { + printf("drawchar\n\n"); + } + + # flush the last group + &nextstemgrp(); + + # the values of coordinates + printf("/fontsz 8 fnt2pt div def\n"); + printf("/Myfont /Courier findfont fontsz scalefont def\n\n"); + printf("contourcolor Myfont setfont\n"); + + for $org (0, $xorg+$bbox[2]+$stemwd*$stemhgrp+72/$fnt2pt) { + printf("gsave\n"); + printf("/maxx 72 fnt2pt div %d sub def /curx 0 def /lasty -10000 def\n", + 2+$stemhgrp*$stemwd-$xorg-$bbox[0]); + printf("0 72 translate fnt2pt fnt2pt scale %f yorg translate 1 setlinewidth\n", $org); + for $y (sort {$a <=> $b} keys %ycoord) { + printf("(%d) getlen %d label\n", $y, $y); + } + printf("grestore\n"); + } + + for $org (0, $yorg+$bbox[3]+$stemwd*$stemvgrp+72/$fnt2pt) { + printf("gsave\n"); + printf("/maxx 72 fnt2pt div %d sub def /curx 0 def /lasty -10000 def\n", + 2+$stemvgrp*$stemwd-$yorg-$bbox[1]); + printf("72 0 translate fnt2pt fnt2pt scale xorg %f translate 90 rotate 1 setlinewidth\n", $org); + for $x (sort {$a <=> $b} keys %xcoord) { + printf("(%d) getlen %d label\n", $x, -$x); + } + printf("grestore\n"); + } + + printf("gsave 0 %d translate\n", 7.5*72 ); + printf("contourcolor /Courier findfont 12 scalefont setfont\n"); + $line = 0; + + $cmpfidx = $#cmpfiles; + if( $cmpfidx > (2.5*72/15)-4 ) { + $cmpfidx = (2.5*72/15)-4; + } + for(; $cmpfidx>=0; $cmpfidx--) { + $cmpf = $cmpfiles[$cmpfidx]; + printf("%d cmpfcolor\n", $cmpfidx); + printf("newpath 20 %d moveto 0 10 rlineto 10 0 rlineto 0 -10 rlineto closepath fill\n", + 15*$line, $cmpf); + printf("contourcolor 40 %d moveto (%s %s) show\n", 15*$line, $cmpf, $fontname{$cmpf}); + $line++; + } + if( $#cmpfiles >=0 ) { + printf("0 %d moveto (Comparison files:) show\n", 15*$line++); + } + printf("0 %d moveto (code: %d name: %s) show\n", 15*$line++, $xcode, $xname); + printf("0 %d moveto (%s) show\n", 15*$line++, $fname); + printf("0 %d moveto (%s) show\n", 15*$line++, $fontname{$fname}); + printf("grestore\n\n"); + + printf("showpage grestore\n\n"); +} +printf("%%%%Pages: %d\n", $pages); diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/pt1.c b/application/third_party/dompdf/lib/ttf2ufm/src/pt1.c new file mode 100644 index 00000000..875608b5 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/pt1.c @@ -0,0 +1,7390 @@ +/* + * see COPYRIGHT + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef WINDOWS +# include +# include +#else +# include "windows.h" +#endif + +#include "ttf.h" +#include "pt1.h" +#include "global.h" + +/* big and small values for comparisons */ +#define FBIGVAL (1e20) +#define FEPS (100000./FBIGVAL) + +/* names of the axes */ +#define X 0 +#define Y 1 + +/* the GENTRY extension structure used in fforceconcise() */ + +struct gex_con { + double d[2 /*X, Y*/]; /* sizes of curve */ + double sin2; /* squared sinus of the angle to the next gentry */ + double len2; /* squared distance between the endpoints */ + +/* number of reference dots taken from each curve */ +#define NREFDOTS 3 + + double dots[NREFDOTS][2]; /* reference dots */ + + int flags; /* flags for gentry and tits joint to the next gentry */ +/* a vertical or horizontal line may be in 2 quadrants at once */ +#define GEXF_QUL 0x00000001 /* in up-left quadrant */ +#define GEXF_QUR 0x00000002 /* in up-right quadrant */ +#define GEXF_QDR 0x00000004 /* in down-right quadrant */ +#define GEXF_QDL 0x00000008 /* in down-left quadrant */ +#define GEXF_QMASK 0x0000000F /* quadrant mask */ + +/* if a line is nearly vertical or horizontal, we remember that idealized quartant too */ +#define GEXF_QTO_IDEAL(f) (((f)&0xF)<<4) +#define GEXF_QFROM_IDEAL(f) (((f)&0xF0)>>4) +#define GEXF_IDQ_L 0x00000090 /* left */ +#define GEXF_IDQ_R 0x00000060 /* right */ +#define GEXF_IDQ_U 0x00000030 /* up */ +#define GEXF_IDQ_D 0x000000C0 /* down */ + +/* possibly can be joined with conditions: + * (in order of increasing preference, the numeric order is important) + */ +#define GEXF_JLINE 0x00000100 /* into one line */ +#define GEXF_JIGN 0x00000200 /* if one entry's tangent angle is ignored */ +#define GEXF_JID 0x00000400 /* if one entry is idealized to hor/vert */ +#define GEXF_JFLAT 0x00000800 /* if one entry is flattened */ +#define GEXF_JGOOD 0x00001000 /* perfectly, no additional maodifications */ + +#define GEXF_JMASK 0x00001F00 /* the mask of all above */ +#define GEXF_JCVMASK 0x00001E00 /* the mask of all above except JLINE */ + +/* which entry needs to be modified for conditional joining */ +#define GEXF_JIGN1 0x00002000 +#define GEXF_JIGN2 0x00004000 +#define GEXF_JIGNDIR(dir) (GEXF_JIGN1<<(dir)) +#define GEXF_JID1 0x00008000 +#define GEXF_JID2 0x00010000 +#define GEXF_JIDDIR(dir) (GEXF_JID1<<(dir)) +#define GEXF_JFLAT1 0x00020000 +#define GEXF_JFLAT2 0x00040000 +#define GEXF_JFLATDIR(dir) (GEXF_JFLAT1<<(dir)) + +#define GEXF_VERT 0x00100000 /* is nearly vertical */ +#define GEXF_HOR 0x00200000 /* is nearly horizontal */ +#define GEXF_FLAT 0x00400000 /* is nearly flat */ + +#define GEXF_VDOTS 0x01000000 /* the dots are valid */ + + signed char isd[2 /*X,Y*/]; /* signs of the sizes */ +}; +typedef struct gex_con GEX_CON; + +/* convenience macros */ +#define X_CON(ge) ((GEX_CON *)((ge)->ext)) +#define X_CON_D(ge) (X_CON(ge)->d) +#define X_CON_DX(ge) (X_CON(ge)->d[0]) +#define X_CON_DY(ge) (X_CON(ge)->d[1]) +#define X_CON_ISD(ge) (X_CON(ge)->isd) +#define X_CON_ISDX(ge) (X_CON(ge)->isd[0]) +#define X_CON_ISDY(ge) (X_CON(ge)->isd[1]) +#define X_CON_SIN2(ge) (X_CON(ge)->sin2) +#define X_CON_LEN2(ge) (X_CON(ge)->len2) +#define X_CON_F(ge) (X_CON(ge)->flags) + +/* performance statistics about guessing the concise curves */ +static int ggoodcv=0, ggoodcvdots=0, gbadcv=0, gbadcvdots=0; + +int stdhw, stdvw; /* dominant stems widths */ +int stemsnaph[12], stemsnapv[12]; /* most typical stem width */ + +int bluevalues[14]; +int nblues; +int otherblues[10]; +int notherb; +int bbox[4]; /* the FontBBox array */ +double italic_angle; + +GLYPH *glyph_list; +int encoding[ENCTABSZ]; /* inverse of glyph[].char_no */ +int kerning_pairs = 0; + +/* prototypes */ +static void fixcvdir( GENTRY * ge, int dir); +static void fixcvends( GENTRY * ge); +static int fgetcvdir( GENTRY * ge); +static int igetcvdir( GENTRY * ge); +static int fiszigzag( GENTRY *ge); +static int iiszigzag( GENTRY *ge); +static GENTRY * freethisge( GENTRY *ge); +static void addgeafter( GENTRY *oge, GENTRY *nge ); +static GENTRY * newgentry( int flags); +static void debugstems( char *name, STEM * hstems, int nhs, STEM * vstems, int nvs); +static int addbluestems( STEM *s, int n); +static void sortstems( STEM * s, int n); +static int stemoverlap( STEM * s1, STEM * s2); +static int steminblue( STEM *s); +static void markbluestems( STEM *s, int nold); +static int joinmainstems( STEM * s, int nold, int useblues); +static void joinsubstems( STEM * s, short *pairs, int nold, int useblues); +static void fixendpath( GENTRY *ge); +static void fdelsmall( GLYPH *g, double minlen); +static void alloc_gex_con( GENTRY *ge); +static double fjointsin2( GENTRY *ge1, GENTRY *ge2); +static double fcvarea( GENTRY *ge); +static double fcvval( GENTRY *ge, int axis, double t); +static void fsampledots( GENTRY *ge, double dots[][2], int ndots); +static void fnormalizege( GENTRY *ge); +static void fanalyzege( GENTRY *ge); +static void fanalyzejoint( GENTRY *ge); +static void fconcisecontour( GLYPH *g, GENTRY *ge); +static double fclosegap( GENTRY *from, GENTRY *to, int axis, + double gap, double *ret); + +int +isign( + int x +) +{ + if (x > 0) + return 1; + else if (x < 0) + return -1; + else + return 0; +} + +int +fsign( + double x +) +{ + if (x > 0.0) + return 1; + else if (x < 0.0) + return -1; + else + return 0; +} + +static GENTRY * +newgentry( + int flags +) +{ + GENTRY *ge; + + ge = calloc(1, sizeof(GENTRY)); + + if (ge == 0) { + fprintf(stderr, "***** Memory allocation error *****\n"); + exit(255); + } + ge->stemid = -1; + ge->flags = flags; + /* the rest is set to 0 by calloc() */ + return ge; +} + +/* + * Routines to print out Postscript functions with optimization + */ + +void +rmoveto( + int dx, + int dy +) +{ + if (optimize && dx == 0) + fprintf(pfa_file, "%d vmoveto\n", dy); + else if (optimize && dy == 0) + fprintf(pfa_file, "%d hmoveto\n", dx); + else + fprintf(pfa_file, "%d %d rmoveto\n", dx, dy); +} + +void +rlineto( + int dx, + int dy +) +{ + if (optimize && dx == 0 && dy == 0) /* for special pathologic + * case */ + return; + else if (optimize && dx == 0) + fprintf(pfa_file, "%d vlineto\n", dy); + else if (optimize && dy == 0) + fprintf(pfa_file, "%d hlineto\n", dx); + else + fprintf(pfa_file, "%d %d rlineto\n", dx, dy); +} + +void +rrcurveto( + int dx1, + int dy1, + int dx2, + int dy2, + int dx3, + int dy3 +) +{ + /* first two ifs are for crazy cases that occur surprisingly often */ + if (optimize && dx1 == 0 && dx2 == 0 && dx3 == 0) + rlineto(0, dy1 + dy2 + dy3); + else if (optimize && dy1 == 0 && dy2 == 0 && dy3 == 0) + rlineto(dx1 + dx2 + dx3, 0); + else if (optimize && dy1 == 0 && dx3 == 0) + fprintf(pfa_file, "%d %d %d %d hvcurveto\n", + dx1, dx2, dy2, dy3); + else if (optimize && dx1 == 0 && dy3 == 0) + fprintf(pfa_file, "%d %d %d %d vhcurveto\n", + dy1, dx2, dy2, dx3); + else + fprintf(pfa_file, "%d %d %d %d %d %d rrcurveto\n", + dx1, dy1, dx2, dy2, dx3, dy3); +} + +void +closepath(void) +{ + fprintf(pfa_file, "closepath\n"); +} + +/* + * Many of the path processing routines exist (or will exist) in + * both floating-point and integer version. Fimally most of the + * processing will go in floating point and the integer processing + * will become legacy. + * The names of floating routines start with f, names of integer + * routines start with i, and those old routines existing in one + * version only have no such prefix at all. + */ + +/* +** Routine that checks integrity of the path, for debugging +*/ + +void +assertpath( + GENTRY * from, + char *file, + int line, + char *name +) +{ + GENTRY *first, *pe, *ge; + int isfloat; + + if(from==0) + return; + isfloat = (from->flags & GEF_FLOAT); + pe = from->prev; + for (ge = from; ge != 0; pe = ge, ge = ge->next) { + if( (ge->flags & GEF_FLOAT) ^ isfloat ) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "float flag changes from %s to %s at 0x%p (type %c, prev type %c)\n", + (isfloat ? "TRUE" : "FALSE"), (isfloat ? "FALSE" : "TRUE"), ge, ge->type, pe->type); + abort(); + } + if (pe != ge->prev) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "unidirectional chain 0x%x -next-> 0x%x -prev-> 0x%x \n", + pe, ge, ge->prev); + abort(); + } + + switch(ge->type) { + case GE_MOVE: + break; + case GE_PATH: + if (ge->prev == 0) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "empty path at 0x%x \n", ge); + abort(); + } + break; + case GE_LINE: + case GE_CURVE: + if(ge->frwd->bkwd != ge) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "unidirectional chain 0x%x -frwd-> 0x%x -bkwd-> 0x%x \n", + ge, ge->frwd, ge->frwd->bkwd); + abort(); + } + if(ge->prev->type == GE_MOVE) { + first = ge; + if(ge->bkwd->next->type != GE_PATH) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "broken first backlink 0x%x -bkwd-> 0x%x -next-> 0x%x \n", + ge, ge->bkwd, ge->bkwd->next); + abort(); + } + } + if(ge->next->type == GE_PATH) { + if(ge->frwd != first) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "broken loop 0x%x -...-> 0x%x -frwd-> 0x%x \n", + first, ge, ge->frwd); + abort(); + } + } + break; + } + + } +} + +void +assertisfloat( + GLYPH *g, + char *msg +) +{ + if( !(g->flags & GF_FLOAT) ) { + fprintf(stderr, "**! Glyph %s is not float: %s\n", g->name, msg); + abort(); + } + if(g->lastentry) { + if( !(g->lastentry->flags & GEF_FLOAT) ) { + fprintf(stderr, "**! Glyphs %s last entry is int: %s\n", g->name, msg); + abort(); + } + } +} + +void +assertisint( + GLYPH *g, + char *msg +) +{ + if( (g->flags & GF_FLOAT) ) { + fprintf(stderr, "**! Glyph %s is not int: %s\n", g->name, msg); + abort(); + } + if(g->lastentry) { + if( (g->lastentry->flags & GEF_FLOAT) ) { + fprintf(stderr, "**! Glyphs %s last entry is float: %s\n", g->name, msg); + abort(); + } + } +} + + +/* + * Routines to save the generated data about glyph + */ + +void +fg_rmoveto( + GLYPH * g, + double x, + double y) +{ + GENTRY *oge; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: f rmoveto(%g, %g)\n", g->name, x, y); + + assertisfloat(g, "adding float MOVE"); + + if ((oge = g->lastentry) != 0) { + if (oge->type == GE_MOVE) { /* just eat up the first move */ + oge->fx3 = x; + oge->fy3 = y; + } else if (oge->type == GE_LINE || oge->type == GE_CURVE) { + fprintf(stderr, "Glyph %s: MOVE in middle of path\n", g->name); + } else { + GENTRY *nge; + + nge = newgentry(GEF_FLOAT); + nge->type = GE_MOVE; + nge->fx3 = x; + nge->fy3 = y; + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } + } else { + GENTRY *nge; + + nge = newgentry(GEF_FLOAT); + nge->type = GE_MOVE; + nge->fx3 = x; + nge->fy3 = y; + nge->bkwd = (GENTRY*)&g->entries; + g->entries = g->lastentry = nge; + } + + if (0 && ISDBG(BUILDG)) + dumppaths(g, NULL, NULL); +} + +void +ig_rmoveto( + GLYPH * g, + int x, + int y) +{ + GENTRY *oge; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: i rmoveto(%d, %d)\n", g->name, x, y); + + assertisint(g, "adding int MOVE"); + + if ((oge = g->lastentry) != 0) { + if (oge->type == GE_MOVE) { /* just eat up the first move */ + oge->ix3 = x; + oge->iy3 = y; + } else if (oge->type == GE_LINE || oge->type == GE_CURVE) { + fprintf(stderr, "Glyph %s: MOVE in middle of path, ignored\n", g->name); + } else { + GENTRY *nge; + + nge = newgentry(0); + nge->type = GE_MOVE; + nge->ix3 = x; + nge->iy3 = y; + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } + } else { + GENTRY *nge; + + nge = newgentry(0); + nge->type = GE_MOVE; + nge->ix3 = x; + nge->iy3 = y; + nge->bkwd = (GENTRY*)&g->entries; + g->entries = g->lastentry = nge; + } + +} + +void +fg_rlineto( + GLYPH * g, + double x, + double y) +{ + GENTRY *oge, *nge; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: f rlineto(%g, %g)\n", g->name, x, y); + + assertisfloat(g, "adding float LINE"); + + nge = newgentry(GEF_FLOAT); + nge->type = GE_LINE; + nge->fx3 = x; + nge->fy3 = y; + + if ((oge = g->lastentry) != 0) { + if (x == oge->fx3 && y == oge->fy3) { /* empty line */ + /* ignore it or we will get in troubles later */ + free(nge); + return; + } + if (g->path == 0) { + g->path = nge; + nge->bkwd = nge->frwd = nge; + } else { + oge->frwd = nge; + nge->bkwd = oge; + g->path->bkwd = nge; + nge->frwd = g->path; + } + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } else { + WARNING_1 fprintf(stderr, "Glyph %s: LINE outside of path\n", g->name); + free(nge); + } + + if (0 && ISDBG(BUILDG)) + dumppaths(g, NULL, NULL); +} + +void +ig_rlineto( + GLYPH * g, + int x, + int y) +{ + GENTRY *oge, *nge; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: i rlineto(%d, %d)\n", g->name, x, y); + + assertisint(g, "adding int LINE"); + + nge = newgentry(0); + nge->type = GE_LINE; + nge->ix3 = x; + nge->iy3 = y; + + if ((oge = g->lastentry) != 0) { + if (x == oge->ix3 && y == oge->iy3) { /* empty line */ + /* ignore it or we will get in troubles later */ + free(nge); + return; + } + if (g->path == 0) { + g->path = nge; + nge->bkwd = nge->frwd = nge; + } else { + oge->frwd = nge; + nge->bkwd = oge; + g->path->bkwd = nge; + nge->frwd = g->path; + } + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } else { + WARNING_1 fprintf(stderr, "Glyph %s: LINE outside of path\n", g->name); + free(nge); + } + +} + +void +fg_rrcurveto( + GLYPH * g, + double x1, + double y1, + double x2, + double y2, + double x3, + double y3) +{ + GENTRY *oge, *nge; + + oge = g->lastentry; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: f rrcurveto(%g, %g, %g, %g, %g, %g)\n" + ,g->name, x1, y1, x2, y2, x3, y3); + + assertisfloat(g, "adding float CURVE"); + + if (oge && oge->fx3 == x1 && x1 == x2 && x2 == x3) /* check if it's + * actually a line */ + fg_rlineto(g, x1, y3); + else if (oge && oge->fy3 == y1 && y1 == y2 && y2 == y3) + fg_rlineto(g, x3, y1); + else { + nge = newgentry(GEF_FLOAT); + nge->type = GE_CURVE; + nge->fx1 = x1; + nge->fy1 = y1; + nge->fx2 = x2; + nge->fy2 = y2; + nge->fx3 = x3; + nge->fy3 = y3; + + if (oge != 0) { + if (x3 == oge->fx3 && y3 == oge->fy3) { + free(nge); /* consider this curve empty */ + /* ignore it or we will get in troubles later */ + return; + } + if (g->path == 0) { + g->path = nge; + nge->bkwd = nge->frwd = nge; + } else { + oge->frwd = nge; + nge->bkwd = oge; + g->path->bkwd = nge; + nge->frwd = g->path; + } + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } else { + WARNING_1 fprintf(stderr, "Glyph %s: CURVE outside of path\n", g->name); + free(nge); + } + } + + if (0 && ISDBG(BUILDG)) + dumppaths(g, NULL, NULL); +} + +void +ig_rrcurveto( + GLYPH * g, + int x1, + int y1, + int x2, + int y2, + int x3, + int y3) +{ + GENTRY *oge, *nge; + + oge = g->lastentry; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: i rrcurveto(%d, %d, %d, %d, %d, %d)\n" + ,g->name, x1, y1, x2, y2, x3, y3); + + assertisint(g, "adding int CURVE"); + + if (oge && oge->ix3 == x1 && x1 == x2 && x2 == x3) /* check if it's + * actually a line */ + ig_rlineto(g, x1, y3); + else if (oge && oge->iy3 == y1 && y1 == y2 && y2 == y3) + ig_rlineto(g, x3, y1); + else { + nge = newgentry(0); + nge->type = GE_CURVE; + nge->ix1 = x1; + nge->iy1 = y1; + nge->ix2 = x2; + nge->iy2 = y2; + nge->ix3 = x3; + nge->iy3 = y3; + + if (oge != 0) { + if (x3 == oge->ix3 && y3 == oge->iy3) { + free(nge); /* consider this curve empty */ + /* ignore it or we will get in troubles later */ + return; + } + if (g->path == 0) { + g->path = nge; + nge->bkwd = nge->frwd = nge; + } else { + oge->frwd = nge; + nge->bkwd = oge; + g->path->bkwd = nge; + nge->frwd = g->path; + } + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } else { + WARNING_1 fprintf(stderr, "Glyph %s: CURVE outside of path\n", g->name); + free(nge); + } + } +} + +void +g_closepath( + GLYPH * g +) +{ + GENTRY *oge, *nge; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: closepath\n", g->name); + + oge = g->lastentry; + + if (g->path == 0) { + WARNING_1 fprintf(stderr, "Warning: **** closepath on empty path in glyph \"%s\" ****\n", + g->name); + if (oge == 0) { + WARNING_1 fprintf(stderr, "No previois entry\n"); + } else { + WARNING_1 fprintf(stderr, "Previous entry type: %c\n", oge->type); + if (oge->type == GE_MOVE) { + g->lastentry = oge->prev; + if (oge->prev == 0) + g->entries = 0; + else + g->lastentry->next = 0; + free(oge); + } + } + return; + } + + nge = newgentry(oge->flags & GEF_FLOAT); /* keep the same type */ + nge->type = GE_PATH; + + g->path = 0; + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + + if (0 && ISDBG(BUILDG)) + dumppaths(g, NULL, NULL); +} + +/* + * * SB * Routines to smooth and fix the glyphs + */ + +/* +** we don't want to see the curves with coinciding middle and +** outer points +*/ + +static void +fixcvends( + GENTRY * ge +) +{ + int dx, dy; + int x0, y0, x1, y1, x2, y2, x3, y3; + + if (ge->type != GE_CURVE) + return; + + if(ge->flags & GEF_FLOAT) { + fprintf(stderr, "**! fixcvends(0x%x) on floating entry, ABORT\n", ge); + abort(); /* dump core */ + } + + x0 = ge->prev->ix3; + y0 = ge->prev->iy3; + x1 = ge->ix1; + y1 = ge->iy1; + x2 = ge->ix2; + y2 = ge->iy2; + x3 = ge->ix3; + y3 = ge->iy3; + + + /* look at the start of the curve */ + if (x1 == x0 && y1 == y0) { + dx = x2 - x1; + dy = y2 - y1; + + if (dx == 0 && dy == 0 + || x2 == x3 && y2 == y3) { + /* Oops, we actually have a straight line */ + /* + * if it's small, we hope that it will get optimized + * later + */ + if (abs(x3 - x0) <= 2 || abs(y3 - y0) <= 2) { + ge->ix1 = x3; + ge->iy1 = y3; + ge->ix2 = x0; + ge->iy2 = y0; + } else {/* just make it a line */ + ge->type = GE_LINE; + } + } else { + if (abs(dx) < 4 && abs(dy) < 4) { /* consider it very + * small */ + ge->ix1 = x2; + ge->iy1 = y2; + } else if (abs(dx) < 8 && abs(dy) < 8) { /* consider it small */ + ge->ix1 += dx / 2; + ge->iy1 += dy / 2; + } else { + ge->ix1 += dx / 4; + ge->iy1 += dy / 4; + } + /* make sure that it's still on the same side */ + if (abs(x3 - x0) * abs(dy) < abs(y3 - y0) * abs(dx)) { + if (abs(x3 - x0) * abs(ge->iy1 - y0) > abs(y3 - y0) * abs(ge->ix1 - x0)) + ge->ix1 += isign(dx); + } else { + if (abs(x3 - x0) * abs(ge->iy1 - y0) < abs(y3 - y0) * abs(ge->ix1 - x0)) + ge->iy1 += isign(dy); + } + + ge->ix2 += (x3 - x2) / 8; + ge->iy2 += (y3 - y2) / 8; + /* make sure that it's still on the same side */ + if (abs(x3 - x0) * abs(y3 - y2) < abs(y3 - y0) * abs(x3 - x2)) { + if (abs(x3 - x0) * abs(y3 - ge->iy2) > abs(y3 - y0) * abs(x3 - ge->ix2)) + ge->iy1 -= isign(y3 - y2); + } else { + if (abs(x3 - x0) * abs(y3 - ge->iy2) < abs(y3 - y0) * abs(x3 - ge->ix2)) + ge->ix1 -= isign(x3 - x2); + } + + } + } else if (x2 == x3 && y2 == y3) { + dx = x1 - x2; + dy = y1 - y2; + + if (dx == 0 && dy == 0) { + /* Oops, we actually have a straight line */ + /* + * if it's small, we hope that it will get optimized + * later + */ + if (abs(x3 - x0) <= 2 || abs(y3 - y0) <= 2) { + ge->ix1 = x3; + ge->iy1 = y3; + ge->ix2 = x0; + ge->iy2 = y0; + } else {/* just make it a line */ + ge->type = GE_LINE; + } + } else { + if (abs(dx) < 4 && abs(dy) < 4) { /* consider it very + * small */ + ge->ix2 = x1; + ge->iy2 = y1; + } else if (abs(dx) < 8 && abs(dy) < 8) { /* consider it small */ + ge->ix2 += dx / 2; + ge->iy2 += dy / 2; + } else { + ge->ix2 += dx / 4; + ge->iy2 += dy / 4; + } + /* make sure that it's still on the same side */ + if (abs(x3 - x0) * abs(dy) < abs(y3 - y0) * abs(dx)) { + if (abs(x3 - x0) * abs(ge->iy2 - y3) > abs(y3 - y0) * abs(ge->ix2 - x3)) + ge->ix2 += isign(dx); + } else { + if (abs(x3 - x0) * abs(ge->iy2 - y3) < abs(y3 - y0) * abs(ge->ix2 - x3)) + ge->iy2 += isign(dy); + } + + ge->ix1 += (x0 - x1) / 8; + ge->iy1 += (y0 - y1) / 8; + /* make sure that it's still on the same side */ + if (abs(x3 - x0) * abs(y0 - y1) < abs(y3 - y0) * abs(x0 - x1)) { + if (abs(x3 - x0) * abs(y0 - ge->iy1) > abs(y3 - y0) * abs(x0 - ge->ix1)) + ge->iy1 -= isign(y0 - y1); + } else { + if (abs(x3 - x0) * abs(y0 - ge->iy1) < abs(y3 - y0) * abs(x0 - ge->ix1)) + ge->ix1 -= isign(x0 - x1); + } + + } + } +} + +/* +** After transformations we want to make sure that the resulting +** curve is going in the same quadrant as the original one, +** because rounding errors introduced during transformations +** may make the result completeley wrong. +** +** `dir' argument describes the direction of the original curve, +** it is the superposition of two values for the front and +** rear ends of curve: +** +** >EQUAL - goes over the line connecting the ends +** =EQUAL - coincides with the line connecting the ends +** flags & GEF_FLOAT) { + fprintf(stderr, "**! fixcvdir(0x%x) on floating entry, ABORT\n", ge); + abort(); /* dump core */ + } + + fdir = (dir & CVDIR_FRONT) - CVDIR_FEQUAL; + if ((dir & CVDIR_REAR) == CVDIR_RSAME) + rdir = fdir; /* we need only isign, exact value doesn't matter */ + else + rdir = (dir & CVDIR_REAR) - CVDIR_REQUAL; + + fixcvends(ge); + + c = isign(ge->ix3 - ge->prev->ix3); /* note the direction of + * curve */ + d = isign(ge->iy3 - ge->prev->iy3); + + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy1 - ge->prev->iy3; + b = ge->ix1 - ge->prev->ix3; + kk1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy3 - ge->iy2; + b = ge->ix3 - ge->ix2; + kk2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + + changed = 1; + while (changed) { + if (ISDBG(FIXCVDIR)) { + /* for debugging */ + fprintf(stderr, "fixcvdir %d %d (%d %d %d %d %d %d) %f %f %f\n", + fdir, rdir, + ge->ix1 - ge->prev->ix3, + ge->iy1 - ge->prev->iy3, + ge->ix2 - ge->ix1, + ge->iy2 - ge->iy1, + ge->ix3 - ge->ix2, + ge->iy3 - ge->iy2, + kk1, kk, kk2); + } + changed = 0; + + if (fdir > 0) { + if (kk1 > kk) { /* the front end has problems */ + if (c * (ge->ix1 - ge->prev->ix3) > 0) { + ge->ix1 -= c; + changed = 1; + } if (d * (ge->iy2 - ge->iy1) > 0) { + ge->iy1 += d; + changed = 1; + } + /* recalculate the coefficients */ + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy1 - ge->prev->iy3; + b = ge->ix1 - ge->prev->ix3; + kk1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + } + } else if (fdir < 0) { + if (kk1 < kk) { /* the front end has problems */ + if (c * (ge->ix2 - ge->ix1) > 0) { + ge->ix1 += c; + changed = 1; + } if (d * (ge->iy1 - ge->prev->iy3) > 0) { + ge->iy1 -= d; + changed = 1; + } + /* recalculate the coefficients */ + a = ge->iy1 - ge->prev->iy3; + b = ge->ix1 - ge->prev->ix3; + kk1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + } + } + if (rdir > 0) { + if (kk2 < kk) { /* the rear end has problems */ + if (c * (ge->ix2 - ge->ix1) > 0) { + ge->ix2 -= c; + changed = 1; + } if (d * (ge->iy3 - ge->iy2) > 0) { + ge->iy2 += d; + changed = 1; + } + /* recalculate the coefficients */ + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy3 - ge->iy2; + b = ge->ix3 - ge->ix2; + kk2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + } + } else if (rdir < 0) { + if (kk2 > kk) { /* the rear end has problems */ + if (c * (ge->ix3 - ge->ix2) > 0) { + ge->ix2 += c; + changed = 1; + } if (d * (ge->iy2 - ge->iy1) > 0) { + ge->iy2 -= d; + changed = 1; + } + /* recalculate the coefficients */ + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy3 - ge->iy2; + b = ge->ix3 - ge->ix2; + kk2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + } + } + } + fixcvends(ge); +} + +/* Get the directions of ends of curve for further usage */ + +/* expects that the previous element is also float */ + +static int +fgetcvdir( + GENTRY * ge +) +{ + double a, b; + double k, k1, k2; + int dir = 0; + + if( !(ge->flags & GEF_FLOAT) ) { + fprintf(stderr, "**! fgetcvdir(0x%x) on int entry, ABORT\n", ge); + abort(); /* dump core */ + } + + a = fabs(ge->fy3 - ge->prev->fy3); + b = fabs(ge->fx3 - ge->prev->fx3); + k = a < FEPS ? (b < FEPS ? 1. : 100000.) : ( b / a); + + a = fabs(ge->fy1 - ge->prev->fy3); + b = fabs(ge->fx1 - ge->prev->fx3); + if(a < FEPS) { + if(b < FEPS) { + a = fabs(ge->fy2 - ge->prev->fy3); + b = fabs(ge->fx2 - ge->prev->fx3); + k1 = a < FEPS ? (b < FEPS ? k : 100000.) : ( b / a); + } else + k1 = FBIGVAL; + } else + k1 = b / a; + + a = fabs(ge->fy3 - ge->fy2); + b = fabs(ge->fx3 - ge->fx2); + if(a < FEPS) { + if(b < FEPS) { + a = fabs(ge->fy3 - ge->fy1); + b = fabs(ge->fx3 - ge->fx1); + k2 = a < FEPS ? (b < FEPS ? k : 100000.) : ( b / a); + } else + k2 = FBIGVAL; + } else + k2 = b / a; + + if(fabs(k1-k) < 0.0001) + dir |= CVDIR_FEQUAL; + else if (k1 < k) + dir |= CVDIR_FUP; + else + dir |= CVDIR_FDOWN; + + if(fabs(k2-k) < 0.0001) + dir |= CVDIR_REQUAL; + else if (k2 > k) + dir |= CVDIR_RUP; + else + dir |= CVDIR_RDOWN; + + return dir; +} + + +/* expects that the previous element is also int */ + +static int +igetcvdir( + GENTRY * ge +) +{ + int a, b; + double k, k1, k2; + int dir = 0; + + if(ge->flags & GEF_FLOAT) { + fprintf(stderr, "**! igetcvdir(0x%x) on floating entry, ABORT\n", ge); + abort(); /* dump core */ + } + + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + k = (a == 0) ? (b == 0 ? 1. : 100000.) : fabs((double) b / (double) a); + + a = ge->iy1 - ge->prev->iy3; + b = ge->ix1 - ge->prev->ix3; + if(a == 0) { + if(b == 0) { + a = ge->iy2 - ge->prev->iy3; + b = ge->ix2 - ge->prev->ix3; + k1 = (a == 0) ? (b == 0 ? k : 100000.) : fabs((double) b / (double) a); + } else + k1 = FBIGVAL; + } else + k1 = fabs((double) b / (double) a); + + a = ge->iy3 - ge->iy2; + b = ge->ix3 - ge->ix2; + if(a == 0) { + if(b == 0) { + a = ge->iy3 - ge->iy1; + b = ge->ix3 - ge->ix1; + k2 = (a == 0) ? (b == 0 ? k : 100000.) : fabs((double) b / (double) a); + } else + k2 = FBIGVAL; + } else + k2 = fabs((double) b / (double) a); + + if(fabs(k1-k) < 0.0001) + dir |= CVDIR_FEQUAL; + else if (k1 < k) + dir |= CVDIR_FUP; + else + dir |= CVDIR_FDOWN; + + if(fabs(k2-k) < 0.0001) + dir |= CVDIR_REQUAL; + else if (k2 > k) + dir |= CVDIR_RUP; + else + dir |= CVDIR_RDOWN; + + return dir; +} + +#if 0 +/* a function just to test the work of fixcvdir() */ +static void +testfixcvdir( + GLYPH * g +) +{ + GENTRY *ge; + int dir; + + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type == GE_CURVE) { + dir = igetcvdir(ge); + fixcvdir(ge, dir); + } + } +} +#endif + +static int +iround( + double val +) +{ + return (int) (val > 0 ? val + 0.5 : val - 0.5); +} + +/* for debugging - dump the glyph + * mark with a star the entries from start to end inclusive + * (start == NULL means don't mark any, end == NULL means to the last) + */ + +void +dumppaths( + GLYPH *g, + GENTRY *start, + GENTRY *end +) +{ + GENTRY *ge; + int i; + char mark=' '; + + fprintf(stderr, "Glyph %s:\n", g->name); + + /* now do the conversion */ + for(ge = g->entries; ge != 0; ge = ge->next) { + if(ge == start) + mark = '*'; + fprintf(stderr, " %c %8x", mark, ge); + switch(ge->type) { + case GE_MOVE: + case GE_LINE: + if(ge->flags & GEF_FLOAT) + fprintf(stderr," %c float (%g, %g)\n", ge->type, ge->fx3, ge->fy3); + else + fprintf(stderr," %c int (%d, %d)\n", ge->type, ge->ix3, ge->iy3); + break; + case GE_CURVE: + if(ge->flags & GEF_FLOAT) { + fprintf(stderr," C float "); + for(i=0; i<3; i++) + fprintf(stderr,"(%g, %g) ", ge->fxn[i], ge->fyn[i]); + fprintf(stderr,"\n"); + } else { + fprintf(stderr," C int "); + for(i=0; i<3; i++) + fprintf(stderr,"(%d, %d) ", ge->ixn[i], ge->iyn[i]); + fprintf(stderr,"\n"); + } + break; + default: + fprintf(stderr, " %c\n", ge->type); + break; + } + if(ge == end) + mark = ' '; + } +} + +/* + * Routine that converts all entries in the path from float to int + */ + +void +pathtoint( + GLYPH *g +) +{ + GENTRY *ge; + int x[3], y[3]; + int i; + + + if(ISDBG(TOINT)) + fprintf(stderr, "TOINT: glyph %s\n", g->name); + assertisfloat(g, "converting path to int\n"); + + fdelsmall(g, 1.0); /* get rid of sub-pixel contours */ + assertpath(g->entries, __FILE__, __LINE__, g->name); + + /* 1st pass, collect the directions of the curves: have + * to do that in advance, while everyting is float + */ + for(ge = g->entries; ge != 0; ge = ge->next) { + if( !(ge->flags & GEF_FLOAT) ) { + fprintf(stderr, "**! glyphs %s has int entry, found in conversion to int\n", + g->name); + exit(1); + } + if(ge->type == GE_CURVE) { + ge->dir = fgetcvdir(ge); + } + } + + /* now do the conversion */ + for(ge = g->entries; ge != 0; ge = ge->next) { + switch(ge->type) { + case GE_MOVE: + case GE_LINE: + if(ISDBG(TOINT)) + fprintf(stderr," %c float x=%g y=%g\n", ge->type, ge->fx3, ge->fy3); + x[0] = iround(ge->fx3); + y[0] = iround(ge->fy3); + for(i=0; i<3; i++) { /* put some valid values everywhere, for convenience */ + ge->ixn[i] = x[0]; + ge->iyn[i] = y[0]; + } + if(ISDBG(TOINT)) + fprintf(stderr," int x=%d y=%d\n", ge->ix3, ge->iy3); + break; + case GE_CURVE: + if(ISDBG(TOINT)) + fprintf(stderr," %c float ", ge->type); + + for(i=0; i<3; i++) { + if(ISDBG(TOINT)) + fprintf(stderr,"(%g, %g) ", ge->fxn[i], ge->fyn[i]); + x[i] = iround(ge->fxn[i]); + y[i] = iround(ge->fyn[i]); + } + + if(ISDBG(TOINT)) + fprintf(stderr,"\n int "); + + for(i=0; i<3; i++) { + ge->ixn[i] = x[i]; + ge->iyn[i] = y[i]; + if(ISDBG(TOINT)) + fprintf(stderr,"(%d, %d) ", ge->ixn[i], ge->iyn[i]); + } + ge->flags &= ~GEF_FLOAT; /* for fixcvdir */ + fixcvdir(ge, ge->dir); + + if(ISDBG(TOINT)) { + fprintf(stderr,"\n fixed "); + for(i=0; i<3; i++) + fprintf(stderr,"(%d, %d) ", ge->ixn[i], ge->iyn[i]); + fprintf(stderr,"\n"); + } + + break; + } + ge->flags &= ~GEF_FLOAT; + } + g->flags &= ~GF_FLOAT; +} + + +/* check whether we can fix up the curve to change its size by (dx,dy) */ +/* 0 means NO, 1 means YES */ + +/* for float: if scaling would be under 10% */ + +int +fcheckcv( + GENTRY * ge, + double dx, + double dy +) +{ + if( !(ge->flags & GEF_FLOAT) ) { + fprintf(stderr, "**! fcheckcv(0x%x) on int entry, ABORT\n", ge); + abort(); /* dump core */ + } + + if (ge->type != GE_CURVE) + return 0; + + if( fabs(ge->fx3 - ge->prev->fx3) < fabs(dx) * 10 ) + return 0; + + if( fabs(ge->fy3 - ge->prev->fy3) < fabs(dy) * 10 ) + return 0; + + return 1; +} + +/* for int: if won't create new zigzags at the ends */ + +int +icheckcv( + GENTRY * ge, + int dx, + int dy +) +{ + int xdep, ydep; + + if(ge->flags & GEF_FLOAT) { + fprintf(stderr, "**! icheckcv(0x%x) on floating entry, ABORT\n", ge); + abort(); /* dump core */ + } + + if (ge->type != GE_CURVE) + return 0; + + xdep = ge->ix3 - ge->prev->ix3; + ydep = ge->iy3 - ge->prev->iy3; + + if (ge->type == GE_CURVE + && (xdep * (xdep + dx)) > 0 + && (ydep * (ydep + dy)) > 0) { + return 1; + } else + return 0; +} + +/* float connect the ends of open contours */ + +void +fclosepaths( + GLYPH * g +) +{ + GENTRY *ge, *fge, *xge, *nge; + int i; + + assertisfloat(g, "fclosepaths float\n"); + + for (xge = g->entries; xge != 0; xge = xge->next) { + if( xge->type != GE_PATH ) + continue; + + ge = xge->prev; + if(ge == 0 || ge->type != GE_LINE && ge->type!= GE_CURVE) { + fprintf(stderr, "**! Glyph %s got empty path\n", + g->name); + exit(1); + } + + fge = ge->frwd; + if (fge->prev == 0 || fge->prev->type != GE_MOVE) { + fprintf(stderr, "**! Glyph %s got strange beginning of path\n", + g->name); + exit(1); + } + fge = fge->prev; + if (fge->fx3 != ge->fx3 || fge->fy3 != ge->fy3) { + /* we have to fix this open path */ + + WARNING_4 fprintf(stderr, "Glyph %s got path open by dx=%g dy=%g\n", + g->name, fge->fx3 - ge->fx3, fge->fy3 - ge->fy3); + + + /* add a new line */ + nge = newgentry(GEF_FLOAT); + (*nge) = (*ge); + nge->fx3 = fge->fx3; + nge->fy3 = fge->fy3; + nge->type = GE_LINE; + + addgeafter(ge, nge); + + if (fabs(ge->fx3 - fge->fx3) <= 2 && fabs(ge->fy3 - fge->fy3) <= 2) { + /* + * small change, try to get rid of the new entry + */ + + double df[2]; + + for(i=0; i<2; i++) { + df[i] = ge->fpoints[i][2] - fge->fpoints[i][2]; + df[i] = fclosegap(nge, nge, i, df[i], NULL); + } + + if(df[0] == 0. && df[1] == 0.) { + /* closed gap successfully, remove the added entry */ + freethisge(nge); + } + } + } + } +} + +void +smoothjoints( + GLYPH * g +) +{ + GENTRY *ge, *ne; + int dx1, dy1, dx2, dy2, k; + int dir; + + return; /* this stuff seems to create problems */ + + assertisint(g, "smoothjoints int"); + + if (g->entries == 0) /* nothing to do */ + return; + + for (ge = g->entries->next; ge != 0; ge = ge->next) { + ne = ge->frwd; + + /* + * although there should be no one-line path * and any path + * must end with CLOSEPATH, * nobody can say for sure + */ + + if (ge == ne || ne == 0) + continue; + + /* now handle various joints */ + + if (ge->type == GE_LINE && ne->type == GE_LINE) { + dx1 = ge->ix3 - ge->prev->ix3; + dy1 = ge->iy3 - ge->prev->iy3; + dx2 = ne->ix3 - ge->ix3; + dy2 = ne->iy3 - ge->iy3; + + /* check whether they have the same direction */ + /* and the same slope */ + /* then we can join them into one line */ + + if (dx1 * dx2 >= 0 && dy1 * dy2 >= 0 && dx1 * dy2 == dy1 * dx2) { + /* extend the previous line */ + ge->ix3 = ne->ix3; + ge->iy3 = ne->iy3; + + /* and get rid of the next line */ + freethisge(ne); + } + } else if (ge->type == GE_LINE && ne->type == GE_CURVE) { + fixcvends(ne); + + dx1 = ge->ix3 - ge->prev->ix3; + dy1 = ge->iy3 - ge->prev->iy3; + dx2 = ne->ix1 - ge->ix3; + dy2 = ne->iy1 - ge->iy3; + + /* if the line is nearly horizontal and we can fix it */ + if (dx1 != 0 && 5 * abs(dy1) / abs(dx1) == 0 + && icheckcv(ne, 0, -dy1) + && abs(dy1) <= 4) { + dir = igetcvdir(ne); + ge->iy3 -= dy1; + ne->iy1 -= dy1; + fixcvdir(ne, dir); + if (ge->next != ne) + ne->prev->iy3 -= dy1; + dy1 = 0; + } else if (dy1 != 0 && 5 * abs(dx1) / abs(dy1) == 0 + && icheckcv(ne, -dx1, 0) + && abs(dx1) <= 4) { + /* the same but vertical */ + dir = igetcvdir(ne); + ge->ix3 -= dx1; + ne->ix1 -= dx1; + fixcvdir(ne, dir); + if (ge->next != ne) + ne->prev->ix3 -= dx1; + dx1 = 0; + } + /* + * if line is horizontal and curve begins nearly + * horizontally + */ + if (dy1 == 0 && dx2 != 0 && 5 * abs(dy2) / abs(dx2) == 0) { + dir = igetcvdir(ne); + ne->iy1 -= dy2; + fixcvdir(ne, dir); + dy2 = 0; + } else if (dx1 == 0 && dy2 != 0 && 5 * abs(dx2) / abs(dy2) == 0) { + /* the same but vertical */ + dir = igetcvdir(ne); + ne->ix1 -= dx2; + fixcvdir(ne, dir); + dx2 = 0; + } + } else if (ge->type == GE_CURVE && ne->type == GE_LINE) { + fixcvends(ge); + + dx1 = ge->ix3 - ge->ix2; + dy1 = ge->iy3 - ge->iy2; + dx2 = ne->ix3 - ge->ix3; + dy2 = ne->iy3 - ge->iy3; + + /* if the line is nearly horizontal and we can fix it */ + if (dx2 != 0 && 5 * abs(dy2) / abs(dx2) == 0 + && icheckcv(ge, 0, dy2) + && abs(dy2) <= 4) { + dir = igetcvdir(ge); + ge->iy3 += dy2; + ge->iy2 += dy2; + fixcvdir(ge, dir); + if (ge->next != ne) + ne->prev->iy3 += dy2; + dy2 = 0; + } else if (dy2 != 0 && 5 * abs(dx2) / abs(dy2) == 0 + && icheckcv(ge, dx2, 0) + && abs(dx2) <= 4) { + /* the same but vertical */ + dir = igetcvdir(ge); + ge->ix3 += dx2; + ge->ix2 += dx2; + fixcvdir(ge, dir); + if (ge->next != ne) + ne->prev->ix3 += dx2; + dx2 = 0; + } + /* + * if line is horizontal and curve ends nearly + * horizontally + */ + if (dy2 == 0 && dx1 != 0 && 5 * abs(dy1) / abs(dx1) == 0) { + dir = igetcvdir(ge); + ge->iy2 += dy1; + fixcvdir(ge, dir); + dy1 = 0; + } else if (dx2 == 0 && dy1 != 0 && 5 * abs(dx1) / abs(dy1) == 0) { + /* the same but vertical */ + dir = igetcvdir(ge); + ge->ix2 += dx1; + fixcvdir(ge, dir); + dx1 = 0; + } + } else if (ge->type == GE_CURVE && ne->type == GE_CURVE) { + fixcvends(ge); + fixcvends(ne); + + dx1 = ge->ix3 - ge->ix2; + dy1 = ge->iy3 - ge->iy2; + dx2 = ne->ix1 - ge->ix3; + dy2 = ne->iy1 - ge->iy3; + + /* + * check if we have a rather smooth joint at extremal + * point + */ + /* left or right extremal point */ + if (abs(dx1) <= 4 && abs(dx2) <= 4 + && dy1 != 0 && 5 * abs(dx1) / abs(dy1) == 0 + && dy2 != 0 && 5 * abs(dx2) / abs(dy2) == 0 + && (ge->iy3 < ge->prev->iy3 && ne->iy3 < ge->iy3 + || ge->iy3 > ge->prev->iy3 && ne->iy3 > ge->iy3) + && (ge->ix3 - ge->prev->ix3) * (ne->ix3 - ge->ix3) < 0 + ) { + dir = igetcvdir(ge); + ge->ix2 += dx1; + dx1 = 0; + fixcvdir(ge, dir); + dir = igetcvdir(ne); + ne->ix1 -= dx2; + dx2 = 0; + fixcvdir(ne, dir); + } + /* top or down extremal point */ + else if (abs(dy1) <= 4 && abs(dy2) <= 4 + && dx1 != 0 && 5 * abs(dy1) / abs(dx1) == 0 + && dx2 != 0 && 5 * abs(dy2) / abs(dx2) == 0 + && (ge->ix3 < ge->prev->ix3 && ne->ix3 < ge->ix3 + || ge->ix3 > ge->prev->ix3 && ne->ix3 > ge->ix3) + && (ge->iy3 - ge->prev->iy3) * (ne->iy3 - ge->iy3) < 0 + ) { + dir = igetcvdir(ge); + ge->iy2 += dy1; + dy1 = 0; + fixcvdir(ge, dir); + dir = igetcvdir(ne); + ne->iy1 -= dy2; + dy2 = 0; + fixcvdir(ne, dir); + } + /* or may be we just have a smooth junction */ + else if (dx1 * dx2 >= 0 && dy1 * dy2 >= 0 + && 10 * abs(k = abs(dx1 * dy2) - abs(dy1 * dx2)) < (abs(dx1 * dy2) + abs(dy1 * dx2))) { + int tries[6][4]; + int results[6]; + int i, b; + + /* build array of changes we are going to try */ + /* uninitalized entries are 0 */ + if (k > 0) { + static int t1[6][4] = { + {0, 0, 0, 0}, + {-1, 0, 1, 0}, + {-1, 0, 0, 1}, + {0, -1, 1, 0}, + {0, -1, 0, 1}, + {-1, -1, 1, 1}}; + memcpy(tries, t1, sizeof tries); + } else { + static int t1[6][4] = { + {0, 0, 0, 0}, + {1, 0, -1, 0}, + {1, 0, 0, -1}, + {0, 1, -1, 0}, + {0, 1, 0, -1}, + {1, 1, -1, -1}}; + memcpy(tries, t1, sizeof tries); + } + + /* now try the changes */ + results[0] = abs(k); + for (i = 1; i < 6; i++) { + results[i] = abs((abs(dx1) + tries[i][0]) * (abs(dy2) + tries[i][1]) - + (abs(dy1) + tries[i][2]) * (abs(dx2) + tries[i][3])); + } + + /* and find the best try */ + k = abs(k); + b = 0; + for (i = 1; i < 6; i++) + if (results[i] < k) { + k = results[i]; + b = i; + } + /* and finally apply it */ + if (dx1 < 0) + tries[b][0] = -tries[b][0]; + if (dy2 < 0) + tries[b][1] = -tries[b][1]; + if (dy1 < 0) + tries[b][2] = -tries[b][2]; + if (dx2 < 0) + tries[b][3] = -tries[b][3]; + + dir = igetcvdir(ge); + ge->ix2 -= tries[b][0]; + ge->iy2 -= tries[b][2]; + fixcvdir(ge, dir); + dir = igetcvdir(ne); + ne->ix1 += tries[b][3]; + ne->iy1 += tries[b][1]; + fixcvdir(ne, dir); + } + } + } +} + +/* debugging: print out stems of a glyph */ +static void +debugstems( + char *name, + STEM * hstems, + int nhs, + STEM * vstems, + int nvs +) +{ + int i; + + fprintf(pfa_file, "%% %s\n", name); + fprintf(pfa_file, "%% %d horizontal stems:\n", nhs); + for (i = 0; i < nhs; i++) + fprintf(pfa_file, "%% %3d %d (%d...%d) %c %c%c%c%c\n", i, hstems[i].value, + hstems[i].from, hstems[i].to, + ((hstems[i].flags & ST_UP) ? 'U' : 'D'), + ((hstems[i].flags & ST_END) ? 'E' : '-'), + ((hstems[i].flags & ST_FLAT) ? 'F' : '-'), + ((hstems[i].flags & ST_ZONE) ? 'Z' : ' '), + ((hstems[i].flags & ST_TOPZONE) ? 'T' : ' ')); + fprintf(pfa_file, "%% %d vertical stems:\n", nvs); + for (i = 0; i < nvs; i++) + fprintf(pfa_file, "%% %3d %d (%d...%d) %c %c%c\n", i, vstems[i].value, + vstems[i].from, vstems[i].to, + ((vstems[i].flags & ST_UP) ? 'U' : 'D'), + ((vstems[i].flags & ST_END) ? 'E' : '-'), + ((vstems[i].flags & ST_FLAT) ? 'F' : '-')); +} + +/* add pseudo-stems for the limits of the Blue zones to the stem array */ +static int +addbluestems( + STEM *s, + int n +) +{ + int i; + + for(i=0; i + (s[j].flags & (ST_ZONE|ST_FLAT|ST_END) ^ ST_FLAT) + ) + continue; + } else { + if( + (s[i].flags & (ST_ZONE|ST_FLAT|ST_END) ^ ST_FLAT) + < + (s[j].flags & (ST_ZONE|ST_FLAT|ST_END) ^ ST_FLAT) + ) + continue; + } + } + } + x = s[j]; + s[j] = s[i]; + s[i] = x; + } +} + +/* check whether two stem borders overlap */ + +static int +stemoverlap( + STEM * s1, + STEM * s2 +) +{ + int result; + + if (s1->from <= s2->from && s1->to >= s2->from + || s2->from <= s1->from && s2->to >= s1->from) + result = 1; + else + result = 0; + + if (ISDBG(STEMOVERLAP)) + fprintf(pfa_file, "%% overlap %d(%d..%d)x%d(%d..%d)=%d\n", + s1->value, s1->from, s1->to, s2->value, s2->from, s2->to, result); + return result; +} + +/* + * check if the stem [border] is in an appropriate blue zone + * (currently not used) + */ + +static int +steminblue( + STEM *s +) +{ + int i, val; + + val=s->value; + if(s->flags & ST_UP) { + /* painted size up, look at lower zones */ + if(nblues>=2 && val>=bluevalues[0] && val<=bluevalues[1] ) + return 1; + for(i=0; i=otherblues[i] && val<=otherblues[i+1] ) + return 1; + } + } else { + /* painted side down, look at upper zones */ + for(i=2; i=bluevalues[i] && val<=bluevalues[i+1] ) + return 1; + } + } + + return 0; +} + +/* mark the outermost stem [borders] in the blue zones */ + +static void +markbluestems( + STEM *s, + int nold +) +{ + int i, j, a, b, c; + /* + * traverse the list of Blue Values, mark the lowest upper + * stem in each bottom zone and the topmost lower stem in + * each top zone with ST_BLUE + */ + + /* top zones */ + for(i=2; i=0; j--) { + if( s[j].flags & (ST_ZONE|ST_UP|ST_END) ) + continue; + c=s[j].value; + if(c=0 && s[j].value==c + && (s[j].flags & (ST_UP|ST_ZONE))==0 ; j--) + s[j].flags |= ST_BLUE; + break; + } + } + } + /* baseline */ + if(nblues>=2) { + a=bluevalues[0]; b=bluevalues[1]; + for(j=0; jb) /* too high */ + break; + if(c>=a) { /* found the lowest stem border */ + /* mark all the stems with the same value */ + if(ISDBG(BLUESTEMS)) + fprintf(pfa_file, "%% found U BLUE at %d\n", s[j].value); + /* include ST_END values */ + while( s[j-1].value==c && (s[j-1].flags & ST_ZONE)==0 ) + j--; + s[j].flags |= ST_BLUE; + for(j++; jb) /* too high */ + break; + if(c>=a) { /* found the lowest stem border */ + /* mark all the stems with the same value */ + if(ISDBG(BLUESTEMS)) + fprintf(pfa_file, "%% found U BLUE at %d\n", s[j].value); + /* include ST_END values */ + while( s[j-1].value==c && (s[j-1].flags & ST_ZONE)==0 ) + j--; + s[j].flags |= ST_BLUE; + for(j++; j=b) { /* have no free space */ + for(j=nold; j>=b; j--) /* make free space */ + s[j]=s[j-1]; + b++; + nold++; + } + s[nnew]=s[a]; + s[nnew].flags &= ~(ST_UP|ST_BLUE); + nnew++; + i=b-1; + } else { + s[nnew++]=s[c]; + i=c; /* skip up to this point */ + } + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d U BLUE\n", + s[nnew-2].value, s[nnew-1].value); + } else { + if (nstack >= MAX_STACK) { + WARNING_1 fprintf(stderr, "Warning: **** converter's stem stack overflow ****\n"); + nstack = 0; + } + stack[nstack++] = s[i]; + } + } else if(s[i].flags & ST_BLUE) { + /* again, we just HAVE to use this value */ + if (readystem) + nnew += 2; + readystem=0; + + /* remember the list of Blue zone stems with the same value */ + for(a=i, i++; i= 0; i--) { + if( (stack[i].flags & ST_UP)==0 ) { + if( (stack[i].flags & (ST_ZONE|ST_TOPZONE))==ST_ZONE ) + break; + else + continue; + } + for(j=a; j=0; j-=2) { + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% ?stem %d...%d -- %d\n", + s[j].value, s[j+1].value, stack[c].value); + if(s[j+1].value < stack[c].value) /* no conflict */ + break; + if(s[j].flags & ST_BLUE) { + /* oops, we don't want to spoil other blue zones */ + stack[c].value=s[j+1].value+1; + break; + } + if( (s[j].flags|s[j+1].flags) & ST_END ) { + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% -stem %d...%d p=1\n", + s[j].value, s[j+1].value); + continue; /* pri==1, silently discard it */ + } + /* we want to discard no nore than 2 stems of pri>=2 */ + if( ++readystem > 2 ) { + /* change our stem to not conflict */ + stack[c].value=s[j+1].value+1; + break; + } else { + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% -stem %d...%d p>=2\n", + s[j].value, s[j+1].value); + continue; + } + } + nnew=j+2; + /* add this stem */ + if(nnew>=b-1) { /* have no free space */ + for(j=nold; j>=b-1; j--) /* make free space */ + s[j]=s[j-1]; + b++; + nold++; + } + s[nnew++]=stack[c]; + s[nnew++]=s[b-1]; + /* clean up the stack */ + nstack=sbottom=0; + readystem=0; + /* set the next position to search */ + i=b-1; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d D BLUE\n", + s[nnew-2].value, s[nnew-1].value); + } else if (nstack > 0) { + + /* + * check whether our stem overlaps with anything in + * stack + */ + for (j = nstack - 1; j >= sbottom; j--) { + if (s[i].value <= stack[j].value) + break; + if (stack[j].flags & ST_ZONE) + continue; + + if ((s[i].flags & ST_END) + || (stack[j].flags & ST_END)) + pri = 1; + else if ((s[i].flags & ST_FLAT) + || (stack[j].flags & ST_FLAT)) + pri = 3; + else + pri = 2; + + if (pri < readystem && s[nnew + 1].value >= stack[j].value + || !stemoverlap(&stack[j], &s[i])) + continue; + + if (readystem > 1 && s[nnew + 1].value < stack[j].value) { + nnew += 2; + readystem = 0; + nlps = 0; + } + /* + * width of the previous stem (if it's + * present) + */ + w1 = s[nnew + 1].value - s[nnew].value; + + /* width of this stem */ + w2 = s[i].value - stack[j].value; + + if (readystem == 0) { + /* nothing yet, just add a new stem */ + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + readystem = pri; + if (pri == 1) + nlps = 1; + else if (pri == 2) + sbottom = j; + else { + sbottom = j + 1; + while (sbottom < nstack + && stack[sbottom].value <= stack[j].value) + sbottom++; + } + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } else if (pri == 1) { + if (stack[j].value > s[nnew + 1].value) { + /* + * doesn't overlap with the + * previous one + */ + nnew += 2; + nlps++; + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } else if (w2 < w1) { + /* is narrower */ + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d %d->%d\n", + stack[j].value, s[i].value, pri, nlps, w1, w2); + } + } else if (pri == 2) { + if (readystem == 2) { + /* choose the narrower stem */ + if (w1 > w2) { + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + sbottom = j; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } + /* else readystem==1 */ + } else if (stack[j].value > s[nnew + 1].value) { + /* + * value doesn't overlap with + * the previous one + */ + nnew += 2; + nlps = 0; + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + sbottom = j; + readystem = pri; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } else if (nlps == 1 + || stack[j].value > s[nnew - 1].value) { + /* + * we can replace the top + * stem + */ + nlps = 0; + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + readystem = pri; + sbottom = j; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } + } else if (readystem == 3) { /* that means also + * pri==3 */ + /* choose the narrower stem */ + if (w1 > w2) { + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + sbottom = j + 1; + while (sbottom < nstack + && stack[sbottom].value <= stack[j].value) + sbottom++; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } + } else if (pri == 3) { + /* + * we can replace as many stems as + * neccessary + */ + nnew += 2; + while (nnew > 0 && s[nnew - 1].value >= stack[j].value) { + nnew -= 2; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% -stem %d..%d\n", + s[nnew].value, s[nnew + 1].value); + } + nlps = 0; + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + readystem = pri; + sbottom = j + 1; + while (sbottom < nstack + && stack[sbottom].value <= stack[j].value) + sbottom++; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } + } + } + } + if (readystem) + nnew += 2; + + /* change the 1-pixel-wide stems to 20-pixel-wide stems if possible + * the constant 20 is recommended in the Type1 manual + */ + if(useblues) { + for(i=0; ii+2 && s[i+2].value0 && s[i-1].value>s[i].value-22) + s[i].value=s[i-1].value+2; /* compensate for fuzziness */ + else + s[i].value-=20; + } + } + } + /* make sure that no stem it stretched between + * a top zone and a bottom zone + */ + if(useblues) { + for(i=0; i=s[i].value && c<=s[i+1].value && c=2) { + c=bluevalues[1]; + if( c>=s[i].value && c<=s[i+1].value && c>b ) + b=c; + } + for(j=1; j=s[i].value && c<=s[i+1].value && c>b ) + b=c; + } + if( a!=10000 && b!= -10000 ) { /* it is stretched */ + /* split the stem into 2 ghost stems */ + for(j=nnew+1; j>i+1; j--) /* make free space */ + s[j]=s[j-2]; + nnew+=2; + + if(s[i].value+22 >= a) + s[i+1].value=a-2; /* leave space for fuzziness */ + else + s[i+1].value=s[i].value+20; + + if(s[i+3].value-22 <= b) + s[i+2].value=b+2; /* leave space for fuzziness */ + else + s[i+2].value=s[i+3].value-20; + + i+=2; + } + } + } + /* look for triple stems */ + for (i = 0; i < nnew; i += 2) { + if (nnew - i >= 6) { + a = s[i].value + s[i + 1].value; + b = s[i + 2].value + s[i + 3].value; + c = s[i + 4].value + s[i + 5].value; + + w1 = s[i + 1].value - s[i].value; + w2 = s[i + 3].value - s[i + 2].value; + w3 = s[i + 5].value - s[i + 4].value; + + fw = w3 - w1; /* fuzz in width */ + fd = ((c - b) - (b - a)); /* fuzz in distance + * (doubled) */ + + /* we are able to handle some fuzz */ + /* + * it doesn't hurt if the declared stem is a bit + * narrower than actual unless it's an edge in + * a blue zone + */ + if (abs(abs(fd) - abs(fw)) * 5 < w2 + && abs(fw) * 20 < (w1 + w3)) { /* width dirrerence <10% */ + + if(useblues) { /* check that we don't disturb any blue stems */ + j=c; k=a; + if (fw > 0) { + if (fd > 0) { + if( s[i+5].flags & ST_BLUE ) + continue; + j -= fw; + } else { + if( s[i+4].flags & ST_BLUE ) + continue; + j += fw; + } + } else if(fw < 0) { + if (fd > 0) { + if( s[i+1].flags & ST_BLUE ) + continue; + k -= fw; + } else { + if( s[i].flags & ST_BLUE ) + continue; + k += fw; + } + } + pri = ((j - b) - (b - k)); + + if (pri > 0) { + if( s[i+2].flags & ST_BLUE ) + continue; + } else if(pri < 0) { + if( s[i+3].flags & ST_BLUE ) + continue; + } + } + + /* + * first fix up the width of 1st and 3rd + * stems + */ + if (fw > 0) { + if (fd > 0) { + s[i + 5].value -= fw; + c -= fw; + } else { + s[i + 4].value += fw; + c += fw; + } + } else { + if (fd > 0) { + s[i + 1].value -= fw; + a -= fw; + } else { + s[i].value += fw; + a += fw; + } + } + fd = ((c - b) - (b - a)); + + if (fd > 0) { + s[i + 2].value += abs(fd) / 2; + } else { + s[i + 3].value -= abs(fd) / 2; + } + + s[i].flags |= ST_3; + i += 4; + } + } + } + + return (nnew & ~1); /* number of lines must be always even */ +} + +/* + * these macros and function allow to set the base stem, + * check that it's not empty and subtract another stem + * from the base stem (possibly dividing it into multiple parts) + */ + +/* pairs for pieces of the base stem */ +static short xbstem[MAX_STEMS*2]; +/* index of the last point */ +static int xblast= -1; + +#define setbasestem(from, to) \ + (xbstem[0]=from, xbstem[1]=to, xblast=1) +#define isbaseempty() (xblast<=0) + +/* returns 1 if was overlapping, 0 otherwise */ +static int +subfrombase( + int from, + int to +) +{ + int a, b; + int i, j; + + if(isbaseempty()) + return 0; + + /* handle the simple case simply */ + if(from > xbstem[xblast] || to < xbstem[0]) + return 0; + + /* the binary search may be more efficient */ + /* but for now the linear search is OK */ + for(b=1; from > xbstem[b]; b+=2) {} /* result: from <= xbstem[b] */ + for(a=xblast-1; to < xbstem[a]; a-=2) {} /* result: to >= xbstem[a] */ + + /* now the interesting examples are: + * (it was hard for me to understand, so I looked at the examples) + * 1 + * a|-----| |-----|b |-----| |-----| + * f|-----|t + * 2 + * a|-----|b |-----| |-----| |-----| + * f|--|t + * 3 + * a|-----|b |-----| |-----| |-----| + * f|-----|t + * 4 + * |-----|b a|-----| |-----| |-----| + * f|------------|t + * 5 + * |-----| |-----|b |-----| a|-----| + * f|-----------------------------|t + * 6 + * |-----|b |-----| |-----| a|-----| + * f|--------------------------------------------------|t + * 7 + * |-----|b |-----| a|-----| |-----| + * f|--------------------------|t + */ + + if(a < b-1) /* hits a gap - example 1 */ + return 0; + + /* now the subtraction itself */ + + if(a==b-1 && from > xbstem[a] && to < xbstem[b]) { + /* overlaps with only one subrange and splits it - example 2 */ + j=xblast; i=(xblast+=2); + while(j>=b) + xbstem[i--]=xbstem[j--]; + xbstem[b]=from-1; + xbstem[b+1]=to+1; + return 1; + /* becomes + * 2a + * a|b || |-----| |-----| |-----| + * f|--|t + */ + } + + if(xbstem[b-1] < from) { + /* cuts the back of this subrange - examples 3, 4, 7 */ + xbstem[b] = from-1; + b+=2; + /* becomes + * 3a + * a|----| |-----|b |-----| |-----| + * f|-----|t + * 4a + * |---| a|-----|b |-----| |-----| + * f|------------|t + * 7a + * |---| |-----|b a|-----| |-----| + * f|--------------------------|t + */ + } + + if(xbstem[a+1] > to) { + /* cuts the front of this subrange - examples 4a, 5, 7a */ + xbstem[a] = to+1; + a-=2; + /* becomes + * 4b + * a|---| |---|b |-----| |-----| + * f|------------|t + * 5b + * |-----| |-----|b a|-----| || + * f|-----------------------------|t + * 7b + * |---| a|-----|b || |-----| + * f|--------------------------|t + */ + } + + if(a < b-1) /* now after modification it hits a gap - examples 3a, 4b */ + return 1; /* because we have removed something */ + + /* now remove the subranges completely covered by the new stem */ + /* examples 5b, 6, 7b */ + i=b-1; j=a+2; + /* positioned as: + * 5b i j + * |-----| |-----|b a|-----| || + * f|-----------------------------|t + * 6 i xblast j + * |-----|b |-----| |-----| a|-----| + * f|--------------------------------------------------|t + * 7b i j + * |---| a|-----|b || |-----| + * f|--------------------------|t + */ + while(j <= xblast) + xbstem[i++]=xbstem[j++]; + xblast=i-1; + return 1; +} + +/* for debugging */ +static void +printbasestem(void) +{ + int i; + + printf("( "); + for(i=0; i lastpri + && ( lastpri==1 || s[j].value-v<20 || (s[x].value-v)*2 >= s[j].value-v ) ) { + lastpri=pri; + x=j; + } + } + } else { + for(j=i-1; j>=0; j--) { + if(mx[i][j]==0) + continue; + + if( (f | s[j].flags) & ST_END ) + pri=1; + else if( (f | s[j].flags) & ST_FLAT ) + pri=3; + else + pri=2; + + if(lastpri==0 + || pri > lastpri + && ( lastpri==1 || v-s[j].value<20 || (v-s[x].value)*2 >= v-s[j].value ) ) { + lastpri=pri; + x=j; + } + } + } + if(x== -1 && mx[i][i]) + pairs[i]=i; /* a special case */ + else + pairs[i]=x; + } + + if(ISDBG(SUBSTEMS)) { + for(i=0; i0) + fprintf(pfa_file, "%% %d...%d (%d x %d)\n", s[i].value, s[j].value, i, j); + } + } +} + +/* + * Make all the stems originating at the same value get the + * same width. Without this the rasterizer may move the dots + * randomly up or down by one pixel, and that looks bad. + * The prioritisation is the same as in findstemat(). + */ +static void +uniformstems( + STEM * s, + short *pairs, + int ns +) +{ + int i, j, from, to, val, dir; + int pri, prevpri[2], wd, prevwd[2], prevbest[2]; + + for(from=0; from prevpri[dir] || wd= 0) { + if(ISDBG(SUBSTEMS)) { + fprintf(stderr, "at %d (%s %d) pair %d->%d(%d)\n", i, + (dir ? "UP":"DOWN"), s[i].value, pairs[i], prevbest[dir], + s[prevbest[dir]].value); + } + pairs[i] = prevbest[dir]; + } + } + } +} + +/* + * Find the best stem in the array at the specified (value, origin), + * related to the entry ge. + * Returns its index in the array sp, -1 means "none". + * prevbest is the result for the other end of the line, we must + * find something better than it or leave it as it is. + */ +static int +findstemat( + int value, + int origin, + GENTRY *ge, + STEM *sp, + short *pairs, + int ns, + int prevbest /* -1 means "none" */ +) +{ + int i, min, max; + int v, si; + int pri, prevpri; /* priority, 0 = has ST_END, 1 = no ST_END */ + int wd, prevwd; /* stem width */ + + si= -1; /* nothing yet */ + + /* stems are ordered by value, binary search */ + min=0; max=ns; /* min <= i < max */ + while( min < max ) { + i=(min+max)/2; + v=sp[i].value; + if(vvalue) + max=i; + else { + si=i; /* temporary value */ + break; + } + } + + if( si < 0 ) /* found nothing this time */ + return prevbest; + + /* find the priority of the prevbest */ + /* we expect that prevbest has a pair */ + if(prevbest>=0) { + i=pairs[prevbest]; + prevpri=1; + if( (sp[prevbest].flags | sp[i].flags) & ST_END ) + prevpri=0; + prevwd=abs(sp[i].value-value); + } + + /* stems are not ordered by origin, so now do the linear search */ + + while( si>0 && sp[si-1].value==value ) /* find the first one */ + si--; + + for(; siprevpri + || pri==prevpri && prevwd==0 || wd!=0 && wdprev->ix3; + y=ge->prev->iy3; + + if(*nextvsi == -2) + si[SI_VP]=findstemat(x, y, ge, vs, vpairs, nvs, -1); + else { + si[SI_VP]= *nextvsi; *nextvsi= -2; + } + if(*nexthsi == -2) + si[SI_HP]=findstemat(y, x, ge, hs, hpairs, nhs, -1); + else { + si[SI_HP]= *nexthsi; *nexthsi= -2; + } + + /* + * For the horizontal lines we make sure that both + * ends of the line have the same horizontal stem, + * and the same thing for vertical lines and stems. + * In both cases we enforce the stem for the next entry. + * Otherwise unpleasant effects may arise. + */ + + if(ge->type==GE_LINE) { + if(ge->ix3==x) { /* vertical line */ + *nextvsi=si[SI_VP]=findstemat(x, ge->iy3, ge->frwd, vs, vpairs, nvs, si[SI_VP]); + } else if(ge->iy3==y) { /* horizontal line */ + *nexthsi=si[SI_HP]=findstemat(y, ge->ix3, ge->frwd, hs, hpairs, nhs, si[SI_HP]); + } + } + + if(si[SI_VP]+si[SI_HP] == -2) /* no stems, leave it alone */ + return 0; + + /* build the array of relevant bounds */ + nr=0; + for(i=0; i< sizeof(si) / sizeof(si[0]); i++) { + STEM *sp; + short *pairs; + int step; + int f; + int nzones, firstzone, binzone, einzone; + int btype, etype; + + if(si[i] < 0) + continue; + + if(i r[nr].high) { + j=r[nr].low; r[nr].low=r[nr].high; r[nr].high=j; + step= -1; + } else { + step=1; + } + + /* handle the interaction with Blue Zones */ + + if(i>=SI_HP) { /* only for horizontal stems */ + if(si[i]==pairs[si[i]]) { + /* special case, the outermost stem in the + * Blue Zone without a pair, simulate it to 20-pixel + */ + if(sp[ si[i] ].flags & ST_UP) { + r[nr].high+=20; + for(j=si[i]+1; j sp[j].value-2) + r[nr].high=sp[j].value-2; + break; + } + } else { + r[nr].low-=20; + for(j=si[i]-1; j>=0; j--) + if( (sp[j].flags & (ST_ZONE|ST_TOPZONE)) + == (ST_ZONE) ) { + if(r[nr].low < sp[j].value+2) + r[nr].low=sp[j].value+2; + break; + } + } + } + + /* check that the stem borders don't end up in + * different Blue Zones */ + f=sp[ si[i] ].flags; + nzones=0; einzone=binzone=0; + for(j=si[i]; j!=pairs[ si[i] ]; j+=step) { + if( (sp[j].flags & ST_ZONE)==0 ) + continue; + /* if see a zone border going in the same direction */ + if( ((f ^ sp[j].flags) & ST_UP)==0 ) { + if( ++nzones == 1 ) { + firstzone=sp[j].value; /* remember the first one */ + etype=sp[j].flags & ST_TOPZONE; + } + einzone=1; + + } else { /* the opposite direction */ + if(nzones==0) { /* beginning is in a blue zone */ + binzone=1; + btype=sp[j].flags & ST_TOPZONE; + } + einzone=0; + } + } + + /* beginning and end are in Blue Zones of different types */ + if( binzone && einzone && (btype ^ etype)!=0 ) { + if( sp[si[i]].flags & ST_UP ) { + if(firstzone > r[nr].low+22) + r[nr].high=r[nr].low+20; + else + r[nr].high=firstzone-2; + } else { + if(firstzone < r[nr].high-22) + r[nr].low=r[nr].high-20; + else + r[nr].low=firstzone+2; + } + } + } + + if(ISDBG(SUBSTEMS)) + fprintf(pfa_file, "%% at(%d,%d)[%d,%d] %d..%d %c (%d x %d)\n", x, y, i, nr, + r[nr].low, r[nr].high, r[nr].isvert ? 'v' : 'h', + si[i], pairs[si[i]]); + + nr++; + } + + /* now try to find a group */ + conflict=0; /* no conflicts found yet */ + for(j=0; j= lb ) { + if( r[j].low == lb && r[j].high == hb ) /* coincides */ + r[j].already=1; + else + conflict=1; + } + + if(conflict) + break; + } + + if(conflict) { /* nope, check all the groups */ + for(j=0; j= lb ) { + if( r[j].low == lb && r[j].high == hb ) /* coincides */ + r[j].already=1; + else + conflict=1; + } + + if(conflict) + i=egp[grp]-1; /* fast forward to the next group */ + } + } + + /* do we have any empty group ? */ + if(conflict && grp < NSTEMGRP-1) { + grp++; conflict=0; + for(j=0; j 0) { + for(i=egp[NSTEMGRP-1]-1; i>=egp[grp]; i--) + s[i+rexpand]=s[i]; + for(i=0; istemid = gssentry_lastgrp = grp; + return 0; +} + +/* + * Create the groups of substituted stems from the list. + * Each group will be represented by a subroutine in the Subs + * array. + */ + +static void +groupsubstems( + GLYPH *g, + STEM *hs, /* horizontal stems, sorted by value */ + short *hpairs, + int nhs, + STEM *vs, /* vertical stems, sorted by value */ + short *vpairs, + int nvs +) +{ + GENTRY *ge; + int i, j; + + /* temporary storage */ + STEMBOUNDS s[MAX_STEMS*2]; + /* indexes in there, pointing past the end each stem group */ + short egp[NSTEMGRP]; + + int nextvsi, nexthsi; /* -2 means "check by yourself" */ + + for(i=0; ientries; ge != 0; ge = ge->next) { + if(ge->type!=GE_LINE && ge->type!=GE_CURVE) { + nextvsi=nexthsi= -2; /* next path is independent */ + continue; + } + + if( gssentry(ge, hs, hpairs, nhs, vs, vpairs, nvs, s, egp, &nextvsi, &nexthsi) ) { + WARNING_2 fprintf(stderr, "*** glyph %s requires over %d hint subroutines, ignored them\n", + g->name, NSTEMGRP); + /* it's better to have no substituted hints at all than have only part */ + for (ge = g->entries; ge != 0; ge = ge->next) + ge->stemid= -1; + g->nsg=0; /* just to be safe, already is 0 by initialization */ + return; + } + + /* + * handle the last vert/horiz line of the path specially, + * correct the hint for the first entry of the path + */ + if(ge->frwd != ge->next && (nextvsi != -2 || nexthsi != -2) ) { + if( gssentry(ge->frwd, hs, hpairs, nhs, vs, vpairs, nvs, s, egp, &nextvsi, &nexthsi) ) { + WARNING_2 fprintf(stderr, "*** glyph %s requires over %d hint subroutines, ignored them\n", + g->name, NSTEMGRP); + /* it's better to have no substituted hints at all than have only part */ + for (ge = g->entries; ge != 0; ge = ge->next) + ge->stemid= -1; + g->nsg=0; /* just to be safe, already is 0 by initialization */ + return; + } + } + + } + + /* find the index of the first empty group - same as the number of groups */ + if(egp[0]>0) { + for(i=1; insg=i; + } else + g->nsg=0; + + if(ISDBG(SUBSTEMS)) { + fprintf(pfa_file, "%% %d substem groups (%d %d %d)\n", g->nsg, + g->nsg>1 ? egp[g->nsg-2] : -1, + g->nsg>0 ? egp[g->nsg-1] : -1, + g->nsgnsg] : -1 ); + j=0; + for(i=0; insg; i++) { + fprintf(pfa_file, "%% grp %3d: ", i); + for(; jnsg==1) { /* it would be the same as the main stems */ + /* so erase it */ + for (ge = g->entries; ge != 0; ge = ge->next) + ge->stemid= -1; + g->nsg=0; + } + + if(g->nsg>0) { + if( (g->nsbs=malloc(g->nsg * sizeof (egp[0]))) == 0 ) { + fprintf(stderr, "**** not enough memory for substituted hints ****\n"); + exit(255); + } + memmove(g->nsbs, egp, g->nsg * sizeof(short)); + if( (g->sbstems=malloc(egp[g->nsg-1] * sizeof (s[0]))) == 0 ) { + fprintf(stderr, "**** not enough memory for substituted hints ****\n"); + exit(255); + } + memmove(g->sbstems, s, egp[g->nsg-1] * sizeof(s[0])); + } +} + +void +buildstems( + GLYPH * g +) +{ + STEM hs[MAX_STEMS], vs[MAX_STEMS]; /* temporary working + * storage */ + short hs_pairs[MAX_STEMS], vs_pairs[MAX_STEMS]; /* best pairs for these stems */ + STEM *sp; + GENTRY *ge, *nge, *pge; + int nx, ny; + int ovalue; + int totals, grp, lastgrp; + + assertisint(g, "buildstems int"); + + g->nhs = g->nvs = 0; + memset(hs, 0, sizeof hs); + memset(vs, 0, sizeof vs); + + /* first search the whole character for possible stem points */ + + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type == GE_CURVE) { + + /* + * SURPRISE! + * We consider the stems bound by the + * H/V ends of the curves as flat ones. + * + * But we don't include the point on the + * other end into the range. + */ + + /* first check the beginning of curve */ + /* if it is horizontal, add a hstem */ + if (ge->iy1 == ge->prev->iy3) { + hs[g->nhs].value = ge->iy1; + + if (ge->ix1 < ge->prev->ix3) + hs[g->nhs].flags = ST_FLAT | ST_UP; + else + hs[g->nhs].flags = ST_FLAT; + + hs[g->nhs].origin = ge->prev->ix3; + hs[g->nhs].ge = ge; + + if (ge->ix1 < ge->prev->ix3) { + hs[g->nhs].from = ge->ix1+1; + hs[g->nhs].to = ge->prev->ix3; + if(hs[g->nhs].from > hs[g->nhs].to) + hs[g->nhs].from--; + } else { + hs[g->nhs].from = ge->prev->ix3; + hs[g->nhs].to = ge->ix1-1; + if(hs[g->nhs].from > hs[g->nhs].to) + hs[g->nhs].to++; + } + if (ge->ix1 != ge->prev->ix3) + g->nhs++; + } + /* if it is vertical, add a vstem */ + else if (ge->ix1 == ge->prev->ix3) { + vs[g->nvs].value = ge->ix1; + + if (ge->iy1 > ge->prev->iy3) + vs[g->nvs].flags = ST_FLAT | ST_UP; + else + vs[g->nvs].flags = ST_FLAT; + + vs[g->nvs].origin = ge->prev->iy3; + vs[g->nvs].ge = ge; + + if (ge->iy1 < ge->prev->iy3) { + vs[g->nvs].from = ge->iy1+1; + vs[g->nvs].to = ge->prev->iy3; + if(vs[g->nvs].from > vs[g->nvs].to) + vs[g->nvs].from--; + } else { + vs[g->nvs].from = ge->prev->iy3; + vs[g->nvs].to = ge->iy1-1; + if(vs[g->nvs].from > vs[g->nvs].to) + vs[g->nvs].to++; + } + + if (ge->iy1 != ge->prev->iy3) + g->nvs++; + } + /* then check the end of curve */ + /* if it is horizontal, add a hstem */ + if (ge->iy3 == ge->iy2) { + hs[g->nhs].value = ge->iy3; + + if (ge->ix3 < ge->ix2) + hs[g->nhs].flags = ST_FLAT | ST_UP; + else + hs[g->nhs].flags = ST_FLAT; + + hs[g->nhs].origin = ge->ix3; + hs[g->nhs].ge = ge->frwd; + + if (ge->ix3 < ge->ix2) { + hs[g->nhs].from = ge->ix3; + hs[g->nhs].to = ge->ix2-1; + if( hs[g->nhs].from > hs[g->nhs].to ) + hs[g->nhs].to++; + } else { + hs[g->nhs].from = ge->ix2+1; + hs[g->nhs].to = ge->ix3; + if( hs[g->nhs].from > hs[g->nhs].to ) + hs[g->nhs].from--; + } + + if (ge->ix3 != ge->ix2) + g->nhs++; + } + /* if it is vertical, add a vstem */ + else if (ge->ix3 == ge->ix2) { + vs[g->nvs].value = ge->ix3; + + if (ge->iy3 > ge->iy2) + vs[g->nvs].flags = ST_FLAT | ST_UP; + else + vs[g->nvs].flags = ST_FLAT; + + vs[g->nvs].origin = ge->iy3; + vs[g->nvs].ge = ge->frwd; + + if (ge->iy3 < ge->iy2) { + vs[g->nvs].from = ge->iy3; + vs[g->nvs].to = ge->iy2-1; + if( vs[g->nvs].from > vs[g->nvs].to ) + vs[g->nvs].to++; + } else { + vs[g->nvs].from = ge->iy2+1; + vs[g->nvs].to = ge->iy3; + if( vs[g->nvs].from > vs[g->nvs].to ) + vs[g->nvs].from--; + } + + if (ge->iy3 != ge->iy2) + g->nvs++; + } else { + + /* + * check the end of curve for a not smooth + * local extremum + */ + nge = ge->frwd; + + if (nge == 0) + continue; + else if (nge->type == GE_LINE) { + nx = nge->ix3; + ny = nge->iy3; + } else if (nge->type == GE_CURVE) { + nx = nge->ix1; + ny = nge->iy1; + } else + continue; + + /* check for vertical extremums */ + if (ge->iy3 > ge->iy2 && ge->iy3 > ny + || ge->iy3 < ge->iy2 && ge->iy3 < ny) { + hs[g->nhs].value = ge->iy3; + hs[g->nhs].from + = hs[g->nhs].to + = hs[g->nhs].origin = ge->ix3; + hs[g->nhs].ge = ge->frwd; + + if (ge->ix3 < ge->ix2 + || nx < ge->ix3) + hs[g->nhs].flags = ST_UP; + else + hs[g->nhs].flags = 0; + + if (ge->ix3 != ge->ix2 || nx != ge->ix3) + g->nhs++; + } + /* + * the same point may be both horizontal and + * vertical extremum + */ + /* check for horizontal extremums */ + if (ge->ix3 > ge->ix2 && ge->ix3 > nx + || ge->ix3 < ge->ix2 && ge->ix3 < nx) { + vs[g->nvs].value = ge->ix3; + vs[g->nvs].from + = vs[g->nvs].to + = vs[g->nvs].origin = ge->iy3; + vs[g->nvs].ge = ge->frwd; + + if (ge->iy3 > ge->iy2 + || ny > ge->iy3) + vs[g->nvs].flags = ST_UP; + else + vs[g->nvs].flags = 0; + + if (ge->iy3 != ge->iy2 || ny != ge->iy3) + g->nvs++; + } + } + + } else if (ge->type == GE_LINE) { + nge = ge->frwd; + + /* if it is horizontal, add a hstem */ + /* and the ends as vstems if they brace the line */ + if (ge->iy3 == ge->prev->iy3 + && ge->ix3 != ge->prev->ix3) { + hs[g->nhs].value = ge->iy3; + if (ge->ix3 < ge->prev->ix3) { + hs[g->nhs].flags = ST_FLAT | ST_UP; + hs[g->nhs].from = ge->ix3; + hs[g->nhs].to = ge->prev->ix3; + } else { + hs[g->nhs].flags = ST_FLAT; + hs[g->nhs].from = ge->prev->ix3; + hs[g->nhs].to = ge->ix3; + } + hs[g->nhs].origin = ge->ix3; + hs[g->nhs].ge = ge->frwd; + + pge = ge->bkwd; + + /* add beginning as vstem */ + vs[g->nvs].value = pge->ix3; + vs[g->nvs].origin + = vs[g->nvs].from + = vs[g->nvs].to = pge->iy3; + vs[g->nvs].ge = ge; + + if(pge->type==GE_CURVE) + ovalue=pge->iy2; + else + ovalue=pge->prev->iy3; + + if (pge->iy3 > ovalue) + vs[g->nvs].flags = ST_UP | ST_END; + else if (pge->iy3 < ovalue) + vs[g->nvs].flags = ST_END; + else + vs[g->nvs].flags = 0; + + if( vs[g->nvs].flags != 0 ) + g->nvs++; + + /* add end as vstem */ + vs[g->nvs].value = ge->ix3; + vs[g->nvs].origin + = vs[g->nvs].from + = vs[g->nvs].to = ge->iy3; + vs[g->nvs].ge = ge->frwd; + + if(nge->type==GE_CURVE) + ovalue=nge->iy1; + else + ovalue=nge->iy3; + + if (ovalue > ge->iy3) + vs[g->nvs].flags = ST_UP | ST_END; + else if (ovalue < ge->iy3) + vs[g->nvs].flags = ST_END; + else + vs[g->nvs].flags = 0; + + if( vs[g->nvs].flags != 0 ) + g->nvs++; + + g->nhs++; + } + /* if it is vertical, add a vstem */ + /* and the ends as hstems if they brace the line */ + else if (ge->ix3 == ge->prev->ix3 + && ge->iy3 != ge->prev->iy3) { + vs[g->nvs].value = ge->ix3; + if (ge->iy3 > ge->prev->iy3) { + vs[g->nvs].flags = ST_FLAT | ST_UP; + vs[g->nvs].from = ge->prev->iy3; + vs[g->nvs].to = ge->iy3; + } else { + vs[g->nvs].flags = ST_FLAT; + vs[g->nvs].from = ge->iy3; + vs[g->nvs].to = ge->prev->iy3; + } + vs[g->nvs].origin = ge->iy3; + vs[g->nvs].ge = ge->frwd; + + pge = ge->bkwd; + + /* add beginning as hstem */ + hs[g->nhs].value = pge->iy3; + hs[g->nhs].origin + = hs[g->nhs].from + = hs[g->nhs].to = pge->ix3; + hs[g->nhs].ge = ge; + + if(pge->type==GE_CURVE) + ovalue=pge->ix2; + else + ovalue=pge->prev->ix3; + + if (pge->ix3 < ovalue) + hs[g->nhs].flags = ST_UP | ST_END; + else if (pge->ix3 > ovalue) + hs[g->nhs].flags = ST_END; + else + hs[g->nhs].flags = 0; + + if( hs[g->nhs].flags != 0 ) + g->nhs++; + + /* add end as hstem */ + hs[g->nhs].value = ge->iy3; + hs[g->nhs].origin + = hs[g->nhs].from + = hs[g->nhs].to = ge->ix3; + hs[g->nhs].ge = ge->frwd; + + if(nge->type==GE_CURVE) + ovalue=nge->ix1; + else + ovalue=nge->ix3; + + if (ovalue < ge->ix3) + hs[g->nhs].flags = ST_UP | ST_END; + else if (ovalue > ge->ix3) + hs[g->nhs].flags = ST_END; + else + hs[g->nhs].flags = 0; + + if( hs[g->nhs].flags != 0 ) + g->nhs++; + + g->nvs++; + } + /* + * check the end of line for a not smooth local + * extremum + */ + nge = ge->frwd; + + if (nge == 0) + continue; + else if (nge->type == GE_LINE) { + nx = nge->ix3; + ny = nge->iy3; + } else if (nge->type == GE_CURVE) { + nx = nge->ix1; + ny = nge->iy1; + } else + continue; + + /* check for vertical extremums */ + if (ge->iy3 > ge->prev->iy3 && ge->iy3 > ny + || ge->iy3 < ge->prev->iy3 && ge->iy3 < ny) { + hs[g->nhs].value = ge->iy3; + hs[g->nhs].from + = hs[g->nhs].to + = hs[g->nhs].origin = ge->ix3; + hs[g->nhs].ge = ge->frwd; + + if (ge->ix3 < ge->prev->ix3 + || nx < ge->ix3) + hs[g->nhs].flags = ST_UP; + else + hs[g->nhs].flags = 0; + + if (ge->ix3 != ge->prev->ix3 || nx != ge->ix3) + g->nhs++; + } + /* + * the same point may be both horizontal and vertical + * extremum + */ + /* check for horizontal extremums */ + if (ge->ix3 > ge->prev->ix3 && ge->ix3 > nx + || ge->ix3 < ge->prev->ix3 && ge->ix3 < nx) { + vs[g->nvs].value = ge->ix3; + vs[g->nvs].from + = vs[g->nvs].to + = vs[g->nvs].origin = ge->iy3; + vs[g->nvs].ge = ge->frwd; + + if (ge->iy3 > ge->prev->iy3 + || ny > ge->iy3) + vs[g->nvs].flags = ST_UP; + else + vs[g->nvs].flags = 0; + + if (ge->iy3 != ge->prev->iy3 || ny != ge->iy3) + g->nvs++; + } + } + } + + g->nhs=addbluestems(hs, g->nhs); + sortstems(hs, g->nhs); + sortstems(vs, g->nvs); + + if (ISDBG(STEMS)) + debugstems(g->name, hs, g->nhs, vs, g->nvs); + + /* find the stems interacting with the Blue Zones */ + markbluestems(hs, g->nhs); + + if(subhints) { + if (ISDBG(SUBSTEMS)) + fprintf(pfa_file, "%% %s: joining subst horizontal stems\n", g->name); + joinsubstems(hs, hs_pairs, g->nhs, 1); + uniformstems(hs, hs_pairs, g->nhs); + + if (ISDBG(SUBSTEMS)) + fprintf(pfa_file, "%% %s: joining subst vertical stems\n", g->name); + joinsubstems(vs, vs_pairs, g->nvs, 0); + + groupsubstems(g, hs, hs_pairs, g->nhs, vs, vs_pairs, g->nvs); + } + + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% %s: joining main horizontal stems\n", g->name); + g->nhs = joinmainstems(hs, g->nhs, 1); + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% %s: joining main vertical stems\n", g->name); + g->nvs = joinmainstems(vs, g->nvs, 0); + + if (ISDBG(MAINSTEMS)) + debugstems(g->name, hs, g->nhs, vs, g->nvs); + + if(g->nhs > 0) { + if ((sp = malloc(sizeof(STEM) * g->nhs)) == 0) { + fprintf(stderr, "**** not enough memory for hints ****\n"); + exit(255); + } + g->hstems = sp; + memcpy(sp, hs, sizeof(STEM) * g->nhs); + } else + g->hstems = 0; + + if(g->nvs > 0) { + if ((sp = malloc(sizeof(STEM) * g->nvs)) == 0) { + fprintf(stderr, "**** not enough memory for hints ****\n"); + exit(255); + } + g->vstems = sp; + memcpy(sp, vs, sizeof(STEM) * g->nvs); + } else + g->vstems = 0; + + /* now check that the stems won't overflow the interpreter's stem stack: + * some interpreters (like X11) push the stems on each change into + * stack and pop them only after the whole glyphs is completed. + */ + + totals = (g->nhs+g->nvs) / 2; /* we count whole stems, not halves */ + lastgrp = -1; + + for (ge = g->entries; ge != 0; ge = ge->next) { + grp=ge->stemid; + if(grp >= 0 && grp != lastgrp) { + if(grp==0) + totals += g->nsbs[0]; + else + totals += g->nsbs[grp] - g->nsbs[grp-1]; + + lastgrp = grp; + } + } + + /* be on the safe side, check for >= , not > */ + if(totals >= max_stemdepth) { /* oops, too deep */ + WARNING_2 { + fprintf(stderr, "Warning: glyph %s needs hint stack depth %d\n", g->name, totals); + fprintf(stderr, " (limit %d): removed the substituted hints from it\n", max_stemdepth); + } + if(g->nsg > 0) { + for (ge = g->entries; ge != 0; ge = ge->next) + ge->stemid = -1; + free(g->sbstems); g->sbstems = 0; + free(g->nsbs); g->nsbs = 0; + g->nsg = 0; + } + } + + /* now check if there are too many main stems */ + totals = (g->nhs+g->nvs) / 2; /* we count whole stems, not halves */ + if(totals >= max_stemdepth) { + /* even worse, too much of non-substituted stems */ + WARNING_2 { + fprintf(stderr, "Warning: glyph %s has %d main hints\n", g->name, totals); + fprintf(stderr, " (limit %d): removed the hints from it\n", max_stemdepth); + } + if(g->vstems) { + free(g->vstems); g->vstems = 0; g->nvs = 0; + } + if(g->hstems) { + free(g->hstems); g->hstems = 0; g->nhs = 0; + } + } +} + +/* convert weird curves that are close to lines into lines. +*/ + +void +fstraighten( + GLYPH * g +) +{ + GENTRY *ge, *pge, *nge, *ige; + double df; + int dir; + double iln, oln; + int svdir, i, o; + + for (ige = g->entries; ige != 0; ige = ige->next) { + if (ige->type != GE_CURVE) + continue; + + ge = ige; + pge = ge->bkwd; + nge = ge->frwd; + + df = 0.; + + /* look for vertical then horizontal */ + for(i=0; i<2; i++) { + o = !i; /* other axis */ + + iln = fabs(ge->fpoints[i][2] - pge->fpoints[i][2]); + oln = fabs(ge->fpoints[o][2] - pge->fpoints[o][2]); + /* + * if current curve is almost a vertical line, and it + * doesn't begin or end horizontally (and the prev/next + * line doesn't join smoothly ?) + */ + if( oln < 1. + || ge->fpoints[o][2] == ge->fpoints[o][1] + || ge->fpoints[o][0] == pge->fpoints[o][2] + || iln > 2. + || iln > 1. && iln/oln > 0.1 ) + continue; + + + if(ISDBG(STRAIGHTEN)) + fprintf(stderr,"** straighten almost %s\n", (i? "horizontal":"vertical")); + + df = ge->fpoints[i][2] - pge->fpoints[i][2]; + dir = fsign(ge->fpoints[o][2] - pge->fpoints[o][2]); + ge->type = GE_LINE; + + /* + * suck in all the sequence of such almost lines + * going in the same direction but not deviating + * too far from vertical + */ + iln = fabs(nge->fpoints[i][2] - ge->fpoints[i][2]); + oln = nge->fpoints[o][2] - ge->fpoints[o][2]; + + while (fabs(df) <= 5 && nge->type == GE_CURVE + && dir == fsign(oln) /* that also gives oln != 0 */ + && iln <= 2. + && ( iln <= 1. || iln/fabs(oln) <= 0.1 ) ) { + ge->fx3 = nge->fx3; + ge->fy3 = nge->fy3; + + if(ISDBG(STRAIGHTEN)) + fprintf(stderr,"** straighten collapsing %s\n", (i? "horizontal":"vertical")); + freethisge(nge); + fixendpath(ge); + pge = ge->bkwd; + nge = ge->frwd; + + df = ge->fpoints[i][2] - pge->fpoints[i][2]; + + iln = fabs(nge->fpoints[i][2] - ge->fpoints[i][2]); + oln = nge->fpoints[o][2] - ge->fpoints[o][2]; + } + + /* now check what do we have as previous/next line */ + + if(ge != pge) { + if( pge->type == GE_LINE && pge->fpoints[i][2] == pge->prev->fpoints[i][2] + && fabs(pge->fpoints[o][2] != pge->prev->fpoints[o][2]) ) { + if(ISDBG(STRAIGHTEN)) fprintf(stderr,"** straighten join with previous 0x%x 0x%x\n", pge, ge); + /* join the previous line with current */ + pge->fx3 = ge->fx3; + pge->fy3 = ge->fy3; + + ige = freethisge(ge)->prev; /* keep the iterator valid */ + ge = pge; + fixendpath(ge); + pge = ge->bkwd; + } + } + + if(ge != nge) { + if (nge->type == GE_LINE && nge->fpoints[i][2] == ge->fpoints[i][2] + && fabs(nge->fpoints[o][2] != ge->fpoints[o][2]) ) { + if(ISDBG(STRAIGHTEN)) fprintf(stderr,"** straighten join with next 0x%x 0x%x\n", ge, nge); + /* join the next line with current */ + ge->fx3 = nge->fx3; + ge->fy3 = nge->fy3; + + freethisge(nge); + fixendpath(ge); + pge = ge->bkwd; + nge = ge->frwd; + + } + } + + if(ge != pge) { + /* try to align the lines if neccessary */ + if(df != 0.) + fclosegap(ge, ge, i, df, NULL); + } else { + /* contour consists of only one line, get rid of it */ + ige = freethisge(ge); /* keep the iterator valid */ + if(ige == 0) /* this was the last contour */ + return; + ige = ige->prev; + } + + break; /* don't bother looking at the other axis */ + } + } +} + +/* solve a square equation, + * returns the number of solutions found, the solutions + * are stored in res which should point to array of two doubles. + * min and max limit the area for solutions + */ + +static int +fsqequation( + double a, + double b, + double c, + double *res, + double min, + double max +) +{ + double D; + int n; + + if(ISDBG(SQEQ)) fprintf(stderr, "sqeq(%g,%g,%g) [%g;%g]\n", a, b, c, min, max); + + if(fabs(a) < 0.000001) { /* if a linear equation */ + n=0; + if(fabs(b) < 0.000001) /* not an equation at all */ + return 0; + res[0] = -c/b; + if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: linear t=%g\n", res[0]); + if(res[0] >= min && res[0] <= max) + n++; + return n; + } + + D = b*b - 4.0*a*c; + if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: D=%g\n", D); + if(D<0) + return 0; + + D = sqrt(D); + + n=0; + res[0] = (-b+D) / (2*a); + if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: t1=%g\n", res[0]); + if(res[0] >= min && res[0] <= max) + n++; + + res[n] = (-b-D) / (2*a); + if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: t2=%g\n", res[n]); + if(res[n] >= min && res[n] <= max) + n++; + + /* return 2nd solution only if it's different enough */ + if(n==2 && fabs(res[0]-res[1])<0.000001) + n=1; + + return n; +} + +/* check that the curves don't cross quadrant boundary */ +/* (float) */ + +/* + Here we make sure that the curve does not continue past + horizontal or vertical extremums. The horizontal points are + explained, vertical points are by analogy. + + The horizontal points are where the derivative + dy/dx is equal to 0. But the Bezier curves are defined by + parametric formulas + x=fx(t) + y=fy(t) + so finding this derivative is complicated. + Also even if we find some point (x,y) splitting at this point + is far not obvious. Fortunately we can use dy/dt = 0 instead, + this gets to a rather simple square equation and splitting + at a known value of t is simple. + + The formulas are: + + y = A*(1-t)^3 + 3*B*(1-t)^2*t + 3*C*(1-t)*t^2 + D*t^3 + y = (-A+3*B-3*C+D)*t^3 + (3*A-6*B+3*C)*t^2 + (-3*A+3*B)*t + A + dy/dt = 3*(-A+3*B-3*C+D)*t^2 + 2*(3*A-6*B+3*C)*t + (-3*A+3*B) + */ + +void +ffixquadrants( + GLYPH *g +) +{ + GENTRY *ge, *nge; + int i, j, np, oldnp; + double sp[5]; /* split points, last one empty */ + char dir[5]; /* for debugging, direction by which split happened */ + double a, b, *pts; /* points of a curve */ + + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type != GE_CURVE) + continue; + + doagain: + np = 0; /* no split points yet */ + if(ISDBG(QUAD)) { + fprintf(stderr, "%s: trying 0x%x (%g %g) (%g %g) (%g %g) (%g %g)\n ", g->name, + ge, ge->prev->fx3, ge->prev->fy3, ge->fx1, ge->fy1, ge->fx2, ge->fy2, + ge->fx3, ge->fy3); + } + for(i=0; i<2; i++) { /* first for x then for y */ + /* find the cooridnates of control points */ + a = ge->prev->fpoints[i][2]; + pts = &ge->fpoints[i][0]; + + oldnp = np; + np += fsqequation( + 3.0*(-a + 3.0*pts[0] - 3.0*pts[1] + pts[2]), + 6.0*(a - 2.0*pts[0] + pts[1]), + 3.0*(-a + pts[0]), + &sp[np], + 0.0, 1.0); /* XXX range is [0;1] */ + + if(np == oldnp) + continue; + + if(ISDBG(QUAD)) + fprintf(stderr, "%s: 0x%x: %d pts(%c): ", + g->name, ge, np-oldnp, i? 'y':'x'); + + /* remove points that are too close to the ends + * because hor/vert ends are permitted, also + * if the split point is VERY close to the ends + * but not exactly then just flatten it and check again. + */ + for(j = oldnp; jfpoints[i][0] != ge->prev->fpoints[i][2]) { + ge->fpoints[i][0] = ge->prev->fpoints[i][2]; + if(ISDBG(QUAD)) fprintf(stderr, "flattened at front\n"); + goto doagain; + } + if( ge->fpoints[i][1] != ge->fpoints[i][0] + && fsign(ge->fpoints[i][2] - ge->fpoints[i][1]) + != fsign(ge->fpoints[i][1] - ge->fpoints[i][0]) ) { + ge->fpoints[i][1] = ge->fpoints[i][0]; + if(ISDBG(QUAD)) fprintf(stderr, "flattened zigzag at front\n"); + goto doagain; + } + sp[j] = sp[j+1]; np--; j--; + if(ISDBG(QUAD)) fprintf(stderr, "(front flat) "); + } else if(sp[j] > 0.97) { /* rear end of curve */ + if(ge->fpoints[i][1] != ge->fpoints[i][2]) { + ge->fpoints[i][1] = ge->fpoints[i][2]; + if(ISDBG(QUAD)) fprintf(stderr, "flattened at rear\n"); + goto doagain; + } + if( ge->fpoints[i][0] != ge->fpoints[i][1] + && fsign(ge->prev->fpoints[i][2] - ge->fpoints[i][0]) + != fsign(ge->fpoints[i][0] - ge->fpoints[i][1]) ) { + ge->fpoints[i][0] = ge->fpoints[i][1]; + if(ISDBG(QUAD)) fprintf(stderr, "flattened zigzag at rear\n"); + goto doagain; + } + sp[j] = sp[j+1]; np--; j--; + if(ISDBG(QUAD)) fprintf(stderr, "(rear flat) "); + } + } + if(ISDBG(QUAD)) fprintf(stderr, "\n"); + } + + if(np==0) /* no split points, leave it alone */ + continue; + + if(ISDBG(QUAD)) { + fprintf(stderr, "%s: splitting 0x%x (%g %g) (%g %g) (%g %g) (%g %g) at %d points\n ", g->name, + ge, ge->prev->fx3, ge->prev->fy3, ge->fx1, ge->fy1, ge->fx2, ge->fy2, + ge->fx3, ge->fy3, np); + for(i=0; i sp[j]) { + a = sp[i]; sp[i] = sp[j]; sp[j] = a; + } + + /* now finally do the split on each point */ + for(j=0; jfpoints[i][0]; /* get the middle points */ + b = ge->fpoints[i][1]; + + /* calculate new internal points */ + c = SPLIT(a, b); + + ge->fpoints[i][0] = SPLIT(ge->prev->fpoints[i][2], a); + ge->fpoints[i][1] = SPLIT(ge->fpoints[i][0], c); + + nge->fpoints[i][1] = SPLIT(b, nge->fpoints[i][2]); + nge->fpoints[i][0] = SPLIT(c, nge->fpoints[i][1]); + + ge->fpoints[i][2] = SPLIT(ge->fpoints[i][1], + + nge->fpoints[i][0]); + } +#undef SPLIT + + addgeafter(ge, nge); + + /* go to the next part, adjust remaining points */ + ge = nge; + for(i=j+1; itype != GE_CURVE) + return 0; + + a = ge->iy2 - ge->iy1; + b = ge->ix2 - ge->ix1; + if(a == 0) { + if(b == 0) { + return 0; + } else + k = FBIGVAL; + } else + k = fabs((double) b / (double) a); + + a = ge->iy1 - ge->prev->iy3; + b = ge->ix1 - ge->prev->ix3; + if(a == 0) { + if(b == 0) { + return 0; + } else + k1 = FBIGVAL; + } else + k1 = fabs((double) b / (double) a); + + a = ge->iy3 - ge->iy2; + b = ge->ix3 - ge->ix2; + if(a == 0) { + if(b == 0) { + return 0; + } else + k2 = FBIGVAL; + } else + k2 = fabs((double) b / (double) a); + + /* if the curve is not a zigzag */ + if (k1+0.0001 >= k && k2 <= k+0.0001 || k1 <= k+0.0001 && k2+0.0001 >= k) + return 0; + else + return 1; +} + +/* check if a curve is a zigzag - floating */ + +static int +fiszigzag( + GENTRY *ge +) +{ + double k, k1, k2; + double a, b; + + if (ge->type != GE_CURVE) + return 0; + + a = fabs(ge->fy2 - ge->fy1); + b = fabs(ge->fx2 - ge->fx1); + if(a < FEPS) { + if(b < FEPS) { + return 0; + } else + k = FBIGVAL; + } else + k = b / a; + + a = fabs(ge->fy1 - ge->prev->fy3); + b = fabs(ge->fx1 - ge->prev->fx3); + if(a < FEPS) { + if(b < FEPS) { + return 0; + } else + k1 = FBIGVAL; + } else + k1 = b / a; + + a = fabs(ge->fy3 - ge->fy2); + b = fabs(ge->fx3 - ge->fx2); + if(a < FEPS) { + if(b < FEPS) { + return 0; + } else + k2 = FBIGVAL; + } else + k2 = b / a; + + /* if the curve is not a zigzag */ + if (k1+0.0001 >= k && k2 <= k+0.0001 || k1 <= k+0.0001 && k2+0.0001 >= k) + return 0; + else + return 1; +} + +/* split the zigzag-like curves into two parts */ + +void +fsplitzigzags( + GLYPH * g +) +{ + GENTRY *ge, *nge; + double a, b, c, d; + + assertisfloat(g, "splitting zigzags"); + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type != GE_CURVE) + continue; + + /* if the curve is not a zigzag */ + if ( !fiszigzag(ge) ) { + continue; + } + + if(ISDBG(FCONCISE)) { + double maxsc1, maxsc2; + fprintf(stderr, "split a zigzag "); + fnormalizege(ge); + if( fcrossraysge(ge, ge, &maxsc1, &maxsc2, NULL) ) { + fprintf(stderr, "sc1=%g sc2=%g\n", maxsc1, maxsc2); + } else { + fprintf(stderr, "(rays don't cross)\n"); + } + } + /* split the curve by t=0.5 */ + nge = newgentry(GEF_FLOAT); + (*nge) = (*ge); + nge->type = GE_CURVE; + + a = ge->prev->fx3; + b = ge->fx1; + c = ge->fx2; + d = ge->fx3; + nge->fx3 = d; + nge->fx2 = (c + d) / 2.; + nge->fx1 = (b + 2. * c + d) / 4.; + ge->fx3 = (a + b * 3. + c * 3. + d) / 8.; + ge->fx2 = (a + 2. * b + c) / 4.; + ge->fx1 = (a + b) / 2.; + + a = ge->prev->fy3; + b = ge->fy1; + c = ge->fy2; + d = ge->fy3; + nge->fy3 = d; + nge->fy2 = (c + d) / 2.; + nge->fy1 = (b + 2. * c + d) / 4.; + ge->fy3 = (a + b * 3. + c * 3. + d) / 8.; + ge->fy2 = (a + 2. * b + c) / 4.; + ge->fy1 = (a + b) / 2.; + + addgeafter(ge, nge); + + if(ISDBG(FCONCISE)) { + dumppaths(g, ge, nge); + } + } +} + +/* free this GENTRY, returns what was ge->next + * (ge must be of type GE_LINE or GE_CURVE) + * works on both float and int entries + */ + +static GENTRY * +freethisge( + GENTRY *ge +) +{ + GENTRY *xge; + + if (ge->bkwd != ge->prev) { + /* at beginning of the contour */ + + xge = ge->bkwd; + if(xge == ge) { /* was the only line in contour */ + /* remove the contour completely */ + /* prev is GE_MOVE, next is GE_PATH, remove them all */ + + /* may be the first contour, then ->bkwd points to ge->entries */ + if(ge->prev->prev == 0) + *(GENTRY **)(ge->prev->bkwd) = ge->next->next; + else + ge->prev->prev->next = ge->next->next; + + if(ge->next->next) { + ge->next->next->prev = ge->prev->prev; + ge->next->next->bkwd = ge->prev->bkwd; + } + + xge = ge->next->next; + free(ge->prev); free(ge->next); free(ge); + return xge; + } + + /* move the start point of the contour */ + if(ge->flags & GEF_FLOAT) { + ge->prev->fx3 = xge->fx3; + ge->prev->fy3 = xge->fy3; + } else { + ge->prev->ix3 = xge->ix3; + ge->prev->iy3 = xge->iy3; + } + } else if(ge->frwd != ge->next) { + /* at end of the contour */ + + xge = ge->frwd->prev; + /* move the start point of the contour */ + if(ge->flags & GEF_FLOAT) { + xge->fx3 = ge->bkwd->fx3; + xge->fy3 = ge->bkwd->fy3; + } else { + xge->ix3 = ge->bkwd->ix3; + xge->iy3 = ge->bkwd->iy3; + } + } + + ge->prev->next = ge->next; + ge->next->prev = ge->prev; + ge->bkwd->frwd = ge->frwd; + ge->frwd->bkwd = ge->bkwd; + + xge = ge->next; + free(ge); + return xge; +} + +/* inserts a new gentry (LINE or CURVE) after another (MOVE + * or LINE or CURVE) + * corrects the first GE_MOVE if neccessary + */ + +static void +addgeafter( + GENTRY *oge, /* after this */ + GENTRY *nge /* insert this */ +) +{ + if(oge->type == GE_MOVE) { + /* insert before next */ + if(oge->next->type == GE_PATH) { + /* first and only GENTRY in path */ + nge->frwd = nge->bkwd = nge; + } else { + nge->frwd = oge->next; + nge->bkwd = oge->next->bkwd; + oge->next->bkwd->frwd = nge; + oge->next->bkwd = nge; + } + } else { + nge->frwd = oge->frwd; + nge->bkwd = oge; + oge->frwd->bkwd = nge; + oge->frwd = nge; + } + + nge->next = oge->next; + nge->prev = oge; + oge->next->prev = nge; + oge->next = nge; + + if(nge->frwd->prev->type == GE_MOVE) { + /* fix up the GE_MOVE entry */ + if(nge->flags & GEF_FLOAT) { + nge->frwd->prev->fx3 = nge->fx3; + nge->frwd->prev->fy3 = nge->fy3; + } else { + nge->frwd->prev->ix3 = nge->ix3; + nge->frwd->prev->iy3 = nge->iy3; + } + } +} + +/* + * Check if this GENTRY happens to be at the end of path + * and fix the first MOVETO accordingly + * handles both int and float + */ + +static void +fixendpath( + GENTRY *ge +) +{ + GENTRY *mge; + + mge = ge->frwd->prev; + if(mge->type == GE_MOVE) { + if(ge->flags & GEF_FLOAT) { + mge->fx3 = ge->fx3; + mge->fy3 = ge->fy3; + } else { + mge->ix3 = ge->ix3; + mge->iy3 = ge->iy3; + } + } +} + +/* + * This function adjusts the rest of path (the part from...to is NOT changed) + * to cover the specified gap by the specified axis (0 - X, 1 - Y). + * Gap is counted in direction (end_of_to - beginning_of_from). + * Returns by how much the gap was not closed (0.0 if it was fully closed). + * Ret contains by how much the first and last points of [from...to] + * were moved to bring them in consistence to the rest of the path. + * If ret==NULL then this info is not returned. + */ + +static double +fclosegap( + GENTRY *from, + GENTRY *to, + int axis, + double gap, + double *ret +) +{ +#define TIMESLARGER 10. /* how many times larger must be a curve to not change too much */ + double rm[2]; + double oldpos[2]; + double times, limit, df, dx; + int j, k; + GENTRY *xge, *pge, *nge, *bge[2]; + + /* remember the old points to calculate ret */ + oldpos[0] = from->prev->fpoints[axis][2]; + oldpos[1] = to->fpoints[axis][2]; + + rm[0] = rm[1] = gap / 2. ; + + bge[0] = from; /* this is convenient for iterations */ + bge[1] = to; + + /* first try to modify large curves but if have none then settle for small */ + for(times = (TIMESLARGER-1); times > 0.1; times /= 2. ) { + + if(rm[0]+rm[1] == 0.) + break; + + /* iterate in both directions, backwards then forwards */ + for(j = 0; j<2; j++) { + + if(rm[j] == 0.) /* if this direction is exhausted */ + continue; + + limit = fabs(rm[j]) * (1.+times); + + for(xge = bge[j]->cntr[j]; xge != bge[!j]; xge = xge->cntr[j]) { + dx = xge->fpoints[axis][2] - xge->prev->fpoints[axis][2]; + df = fabs(dx) - limit; + if( df <= FEPS ) /* curve is too small to change */ + continue; + + if( df >= fabs(rm[j]) ) + df = rm[j]; + else + df *= fsign(rm[j]); /* we may cover this part of rm */ + + rm[j] -= df; + limit = fabs(rm[j]) * (1.+times); + + if(xge->type == GE_CURVE) { /* correct internal points */ + double scale = ((dx+df) / dx) - 1.; + double base; + + if(j) + base = xge->fpoints[axis][2]; + else + base = xge->prev->fpoints[axis][2]; + + for(k = 0; k<2; k++) + xge->fpoints[axis][k] += scale * + (xge->fpoints[axis][k] - base); + } + + /* move all the intermediate lines */ + if(j) { + df = -df; /* absolute direction */ + pge = bge[1]->bkwd; + nge = xge->bkwd; + } else { + xge->fpoints[axis][2] += df; + pge = bge[0]; + nge = xge->frwd; + } + while(nge != pge) { + if(nge->type == GE_CURVE) { + nge->fpoints[axis][0] +=df; + nge->fpoints[axis][1] +=df; + } + nge->fpoints[axis][2] += df; + if(nge->next != nge->frwd) { /* last entry of contour */ + nge->frwd->prev->fpoints[axis][2] += df; + } + nge = nge->cntr[!j]; + } + + if(rm[j] == 0.) + break; + } + } + } + + /* find the difference */ + oldpos[0] -= from->prev->fpoints[axis][2]; + oldpos[1] -= to->fpoints[axis][2]; + + if(ret) { + ret[0] = oldpos[0] - from->prev->fpoints[axis][2]; + ret[1] = oldpos[1] - to->fpoints[axis][2]; + } + +#if 0 + if( rm[0]+rm[1] != gap - oldpos[1] + oldpos[0]) { + fprintf(stderr, "** gap=%g rm[0]=%g rm[1]=%g o[0]=%g o[1]=%g rg=%g og=%g\n", + gap, rm[0], rm[1], oldpos[0], oldpos[1], rm[0]+rm[1], + gap - oldpos[1] + oldpos[0]); + } +#endif + + return rm[0]+rm[1]; +#undef TIMESLARGER +} + +/* remove the lines or curves smaller or equal to the size limit */ + +static void +fdelsmall( + GLYPH *g, + double minlen +) +{ + GENTRY *ge, *nge, *pge, *xge, *next; + int i, k; + double dx, dy, d2, d2m; + double minlen2; +#define TIMESLARGER 10. /* how much larger must be a curve to not change too much */ + + minlen2 = minlen*minlen; + + for (ge = g->entries; ge != 0; ge = next) { + next = ge->next; + + if (ge->type != GE_CURVE && ge->type != GE_LINE) + continue; + + d2m = 0; + for(i= (ge->type==GE_CURVE? 0: 2); i<3; i++) { + dx = ge->fxn[i] - ge->prev->fx3; + dy = ge->fyn[i] - ge->prev->fy3; + d2 = dx*dx + dy*dy; + if(d2m < d2) + d2m = d2; + } + + if( d2m > minlen2 ) { /* line is not too small */ + /* XXX add more normalization here */ + continue; + } + + /* if the line is too small */ + + /* check forwards if we have a whole sequence of them */ + nge = ge; + for(xge = ge->frwd; xge != ge; xge = xge->frwd) { + d2m = 0; + for(i= (xge->type==GE_CURVE? 0: 2); i<3; i++) { + dx = xge->fxn[i] - xge->prev->fx3; + dy = xge->fyn[i] - xge->prev->fy3; + d2 = dx*dx + dy*dy; + if(d2m < d2) + d2m = d2; + } + if( d2m > minlen2 ) /* line is not too small */ + break; + nge = xge; + if(next == nge) /* move the next step past this sequence */ + next = next->next; + } + + /* check backwards if we have a whole sequence of them */ + pge = ge; + for(xge = ge->bkwd; xge != ge; xge = xge->bkwd) { + d2m = 0; + for(i= (xge->type==GE_CURVE? 0: 2); i<3; i++) { + dx = xge->fxn[i] - xge->prev->fx3; + dy = xge->fyn[i] - xge->prev->fy3; + d2 = dx*dx + dy*dy; + if(d2m < d2) + d2m = d2; + } + if( d2m > minlen2 ) /* line is not too small */ + break; + pge = xge; + } + + /* now we have a sequence of small fragments in pge...nge (inclusive) */ + + if(ISDBG(FCONCISE)) { + fprintf(stderr, "glyph %s has very small fragments(%x..%x..%x)\n", + g->name, pge, ge, nge); + dumppaths(g, pge, nge); + } + + /* reduce whole sequence to one part and remember the middle point */ + if(pge != nge) { + while(1) { + xge = pge->frwd; + if(xge == nge) { + pge->fx1 = pge->fx2 = pge->fx3; + pge->fx3 = nge->fx3; + pge->fy1 = pge->fy2 = pge->fy3; + pge->fy3 = nge->fy3; + pge->type = GE_CURVE; + freethisge(nge); + break; + } + if(xge == nge->bkwd) { + pge->fx1 = pge->fx2 = (pge->fx3+xge->fx3)/2.; + pge->fx3 = nge->fx3; + pge->fy1 = pge->fy2 = (pge->fy3+xge->fy3)/2.; + pge->fy3 = nge->fy3; + pge->type = GE_CURVE; + freethisge(nge); + freethisge(xge); + break; + } + freethisge(pge); pge = xge; + xge = nge->bkwd; freethisge(nge); nge = xge; + } + } + ge = pge; + + /* check if the whole sequence is small */ + dx = ge->fx3 - ge->prev->fx3; + dy = ge->fy3 - ge->prev->fy3; + d2 = dx*dx + dy*dy; + + if( d2 > minlen2 ) { /* no, it is not */ + double b, d; + + WARNING_3 fprintf(stderr, "glyph %s had a sequence of fragments < %g points each, reduced to one curve\n", + g->name, minlen); + + /* check that we did not create a monstrosity spanning quadrants */ + if(fsign(ge->fx1 - ge->prev->fx1) * fsign(ge->fx3 - ge->fx1) < 0 + || fsign(ge->fy1 - ge->prev->fy1) * fsign(ge->fy3 - ge->fy1) < 0 ) { + /* yes, we did; are both parts of this thing big enough ? */ + dx = ge->fx1 - ge->prev->fx3; + dy = ge->fy1 - ge->prev->fy3; + d2 = dx*dx + dy*dy; + + dx = ge->fx3 - ge->fx1; + dy = ge->fy3 - ge->fy1; + d2m = dx*dx + dy*dy; + + if(d2 > minlen2 && d2m > minlen2) { /* make two straights */ + nge = newgentry(GEF_FLOAT); + *nge = *ge; + + for(i=0; i<2; i++) { + ge->fpoints[i][2] = ge->fpoints[i][0]; + b = nge->fpoints[i][0]; + d = nge->fpoints[i][2] - b; + nge->fpoints[i][0] = b + 0.1*d; + nge->fpoints[i][1] = b + 0.9*d; + } + } + for(i=0; i<2; i++) { /* make one straight or first of two straights */ + b = ge->prev->fpoints[i][2]; + d = ge->fpoints[i][2] - b; + ge->fpoints[i][0] = b + 0.1*d; + ge->fpoints[i][1] = b + 0.9*d; + } + } + continue; + } + + if(ge->frwd == ge) { /* points to itself, just remove the path completely */ + WARNING_3 fprintf(stderr, "glyph %s had a path made of fragments < %g points each, removed\n", + g->name, minlen); + + next = freethisge(ge); + continue; + } + + /* now close the gap by x and y */ + for(i=0; i<2; i++) { + double gap; + + gap = ge->fpoints[i][2] - ge->prev->fpoints[i][2]; + if( fclosegap(ge, ge, i, gap, NULL) != 0.0 ) { + double scale, base; + + /* not good, as the last resort just scale the next line */ + gap = ge->fpoints[i][2] - ge->prev->fpoints[i][2]; + + if(ISDBG(FCONCISE)) + fprintf(stderr, " last resort on %c: closing next by %g\n", + (i==0 ? 'x' : 'y'), gap); + + nge = ge->frwd; + base = nge->fpoints[i][2]; + dx = ge->fpoints[i][2] - base; + if(fabs(dx) < FEPS) + continue; + + scale = ((dx-gap) / dx); + + if(nge->type == GE_CURVE) + for(k = 0; k<2; k++) + nge->fpoints[i][k] = base + + scale * (nge->fpoints[i][k] - base); + + ge->fpoints[i][2] -= gap; + } + } + + /* OK, the gap is closed - remove this useless GENTRY */ + freethisge(ge); + } +#undef TIMESLARGER +} + +/* find the point where two rays continuing vectors cross + * returns 1 if they cross, 0 if they don't + * If they cross optionally (if the pointers are not NULL) returns + * the maximal scales for both vectors and also optionally the point + * where the rays cross (twice). + * Expects that the curves are normalized. + * + * For convenience there are 2 front-end functions taking + * arguments in different formats + */ + +struct ray { + double x1, y1, x2, y2; + int isvert; + double k, b; /* lines are represented as y = k*x + b */ + double *maxp; +}; +static struct ray ray[3]; + +/* the back-end doing the actual work + * the rays are defined in the static array ray[] + */ + +static int +fcrossraysxx( + double crossdot[2][2] +) +{ + double x, y, max; + int i; + + for(i=0; i<2; i++) { + if(ray[i].x1 == ray[i].x2) + ray[i].isvert = 1; + else { + ray[i].isvert = 0; + ray[i].k = (ray[i].y2 - ray[i].y1) / (ray[i].x2 - ray[i].x1); + ray[i].b = ray[i].y2 - ray[i].k * ray[i].x2; + } + } + + if(ray[0].isvert && ray[1].isvert) { + if(ISDBG(FCONCISE)) fprintf(stderr, "crossrays: both vertical\n"); + return 0; /* both vertical, don't cross */ + } + + if(ray[1].isvert) { + ray[2] = ray[0]; /* exchange them */ + ray[0] = ray[1]; + ray[1] = ray[2]; + } + + if(ray[0].isvert) { + x = ray[0].x1; + } else { + if( fabs(ray[0].k - ray[1].k) < FEPS) { + if(ISDBG(FCONCISE)) fprintf(stderr, "crossrays: parallel lines, k = %g, %g\n", + ray[0].k, ray[1].k); + return 0; /* parallel lines */ + } + x = (ray[1].b - ray[0].b) / (ray[0].k - ray[1].k) ; + } + y = ray[1].k * x + ray[1].b; + + for(i=0; i<2; i++) { + if(ray[i].isvert) + max = (y - ray[i].y1) / (ray[i].y2 - ray[i].y1); + else + max = (x - ray[i].x1) / (ray[i].x2 - ray[i].x1); + /* check if wrong sides of rays cross */ + if( max < 0 ) { + if(ISDBG(FCONCISE)) fprintf(stderr, "crossrays: %c scale=%g @(%g,%g) (%g,%g)<-(%g,%g)\n", + (i?'Y':'X'), max, x, y, ray[i].x2, ray[i].y2, ray[i].x1, ray[i].y1); + return 0; + } + if(ray[i].maxp) + *ray[i].maxp = max; + } + if(crossdot != 0) { + crossdot[0][0] = crossdot[1][0] = x; + crossdot[0][1] = crossdot[1][1] = y; + } + return 1; +} + +/* the front-end getting the arguments from 4 dots defining + * a curve in the same format as for fapproxcurve(): + * rays are defined as beginning and end of the curve, + * the crossdot is inserted as the two middle dots of the curve + */ + +int +fcrossrayscv( + double curve[4][2 /*X,Y*/], + double *max1, + double *max2 +) +{ + ray[0].x1 = curve[0][X]; + ray[0].y1 = curve[0][Y]; + ray[0].x2 = curve[1][X]; + ray[0].y2 = curve[1][Y]; + ray[0].maxp = max1; + + ray[1].x1 = curve[2][X]; + ray[1].y1 = curve[2][Y]; + ray[1].x2 = curve[3][X]; + ray[1].y2 = curve[3][Y]; + ray[1].maxp = max2; + + return fcrossraysxx(&curve[1]); +} + +/* the front-end getting the arguments from gentries: + * rays are defined as beginning of curve1 and end of curve 2 + */ + +int +fcrossraysge( + GENTRY *ge1, + GENTRY *ge2, + double *max1, + double *max2, + double crossdot[2][2] +) +{ + ray[0].x1 = ge1->prev->fx3; + ray[0].y1 = ge1->prev->fy3; + ray[0].x2 = ge1->fpoints[X][ge1->ftg]; + ray[0].y2 = ge1->fpoints[Y][ge1->ftg]; + ray[0].maxp = max1; + + ray[1].x1 = ge2->fx3; + ray[1].y1 = ge2->fy3; + if(ge2->rtg < 0) { + ray[1].x2 = ge2->prev->fx3; + ray[1].y2 = ge2->prev->fy3; + } else { + ray[1].x2 = ge2->fpoints[X][ge2->rtg]; + ray[1].y2 = ge2->fpoints[Y][ge2->rtg]; + } + ray[1].maxp = max2; + + return fcrossraysxx(crossdot); +} + +/* debugging printout functions */ + +#if defined(DEBUG_DOTSEG) || defined(DEBUG_DOTCURVE) || defined(DEBUG_APPROXCV) + +/* for debugging */ +static +printdot( + double dot[2] +) +{ + fprintf(stderr, "(%g,%g)", dot[0], dot[1]); +} + +static +printseg( + double seg[2][2] +) +{ + putc('[', stderr); + printdot(seg[0]); + putc(' ', stderr); + printdot(seg[1]); + putc(']', stderr); +} + +#endif /* DEBUG_* */ + +/* + * Find squared distance from a dot to a line segment + */ + +double +fdotsegdist2( + double seg[2][2 /*X,Y*/], + double dot[2 /*X,Y*/] +) +{ +#define x1 seg[0][X] +#define y1 seg[0][Y] +#define x2 seg[1][X] +#define y2 seg[1][Y] +#define xdot dot[X] +#define ydot dot[Y] + + double dx, dy; /* segment dimensions */ + double kline, bline; /* segment line formula is y=k*x+b */ + double kperp, bperp; /* perpendicular from the dot to the line */ + double xcross, ycross; /* where the perpendicular crosses the segment */ + +/* handle the situation where the nearest point of the segment is its end */ +#define HANDLE_LIMITS(less12, lesscr1, lesscr2) \ + if( less12 ) { \ + if( lesscr1 ) { \ + xcross = x1; \ + ycross = y1; \ + } else if( !(lesscr2) ) { \ + xcross = x2; \ + ycross = y2; \ + } \ + } else { \ + if( !(lesscr1) ) { \ + xcross = x1; \ + ycross = y1; \ + } else if( lesscr2 ) { \ + xcross = x2; \ + ycross = y2; \ + } \ + } \ + /* end of macro */ + + + dx = x2 - x1; + dy = y2 - y1; + + if(fabs(dx) < FEPS) { + /* special case - vertical line */ +#ifdef DEBUG_DOTSEG + printf("vertical line!\n"); +#endif + xcross = x1; + ycross = ydot; + HANDLE_LIMITS( y1 < y2, ycross < y1, ycross < y2); + } else if(fabs(dy) < FEPS) { + /* special case - horizontal line */ +#ifdef DEBUG_DOTSEG + printf("horizontal line!\n"); +#endif + xcross = xdot; + ycross = y1; + HANDLE_LIMITS( x1 < x2, xcross < x1, xcross < x2) + } else { + kline = dy/dx; + bline = y1 - x1*kline; + kperp = -1./kline; + bperp = ydot - xdot*kperp; + + xcross = (bline-bperp) / (kperp-kline); + ycross = kline*xcross + bline; + + HANDLE_LIMITS( x1 < x2, xcross < x1, xcross < x2) + } +#ifdef DEBUG_DOTSEG + printf("crossover at (%g,%g)\n", xcross, ycross); +#endif + + dx = xdot-xcross; + dy = ydot-ycross; + return dx*dx+dy*dy; +#undef x1 +#undef y1 +#undef x2 +#undef y2 +#undef xdot +#undef ydot +#undef HANDLE_LIMITS +} + +/* find the weighted quadratic average for the distance of a set + * of dots from the curve; also fills out the individual distances + * for each dot; if maxp!=NULL then returns the maximal squared + * distance in there + */ + +double +fdotcurvdist2( + double curve[4][2 /*X,Y*/ ], + struct dot_dist *dots, + int ndots, /* number of entries in dots */ + double *maxp +) +{ + /* a curve is approximated by this many straight segments */ +#define NAPSECT 16 + /* a curve is divided into this many sections with equal weight each */ +#define NWSECT 4 + /* table of coefficients for finding the dots on the curve */ + /* tt[0] is left unused */ + static double tt[NAPSECT][4]; + static int havett = 0; /* flag: tt is initialized */ + /* dots on the curve */ + double cvd[NAPSECT+1][2 /*X,Y*/]; + /* sums by sections */ + double sum[NWSECT]; + /* counts by sections */ + double count[NWSECT]; + int d, i, j; + int id1, id2; + double dist1, dist2, dist3, dx, dy, x, y; + double max = 0.; + + if(!havett) { + double t, nt, t2, nt2, step; + + havett++; + step = 1. / NAPSECT; + t = 0; + for(i=1; iid1+1; i--) { + dx = x - cvd[i][X]; + dy = y - cvd[i][Y]; + dist3 = dx*dx + dy*dy; +#ifdef DEBUG_DOTCURVE + printf(" dot %d ",i); printdot(cvd[i]); printf(" dist=%g\n", sqrt(dist3)); +#endif + if(dist3 < dist2) { + dist2 = dist3; + id2 = i; + } else + break; + } + + /* now find which of the local minimums is smaller */ + if(dist2 < dist1) { + id1 = id2; + } + } + + /* the nearest segment must include the nearest dot */ + if(id1==0) { + dots[d].seg = 0; + dots[d].dist2 = fdotsegdist2(&cvd[0], dots[d].p); + } else if(id1==NAPSECT) { + dots[d].seg = NAPSECT-1; + dots[d].dist2 = fdotsegdist2(&cvd[NAPSECT-1], dots[d].p); + } else { + dist1 = fdotsegdist2(&cvd[id1], dots[d].p); + dist2 = fdotsegdist2(&cvd[id1-1], dots[d].p); + if(dist2 < dist1) { + dots[d].seg = id1-1; + dots[d].dist2 = dist2; + } else { + dots[d].seg = id1; + dots[d].dist2 = dist1; + } + } + + i = dots[d].seg % NWSECT; + sum[i] += dots[d].dist2; + if(dots[d].dist2 > max) + max = dots[d].dist2; + count[i]++; +#ifdef DEBUG_DOTCURVE + printf(" best seg %d sect %d dist=%g\n", dots[d].seg, i, sqrt(dots[d].dist2)); +#endif + } + + /* calculate the weighted average */ + id1=0; + dist1=0.; + for(i=0; irtg < 0) { + d[1][X] = ge1->fx3 - ge1->prev->fx3; + d[1][Y] = ge1->fy3 - ge1->prev->fy3; + } else { + d[1][X] = ge1->fx3 - ge1->fpoints[X][ge1->rtg]; + d[1][Y] = ge1->fy3 - ge1->fpoints[Y][ge1->rtg]; + } + d[2][X] = ge2->fpoints[X][ge2->ftg] - ge2->prev->fx3; + d[2][Y] = ge2->fpoints[Y][ge2->ftg] - ge2->prev->fy3; + + len1 = sqrt( d[1][X]*d[1][X] + d[1][Y]*d[1][Y] ); + len2 = sqrt( d[2][X]*d[2][X] + d[2][Y]*d[2][Y] ); + /* scale the 2nd segment to the length of 1 + * and to make sure that the 1st segment is longer scale it to + * the length of 2 and extend to the same distance backwards + */ + scale1 = 2./len1; + scale2 = 1./len2; + + for(axis=0; axis <2; axis++) { + d[0][axis] = -( d[1][axis] *= scale1 ); + d[2][axis] *= scale2; + } + return fdotsegdist2(d, d[2]); +} + +#if 0 +/* find the area covered by the curve + * (limited by the projections to the X axis) + */ + +static double +fcvarea( + GENTRY *ge +) +{ + double Ly, My, Ny, Py, Qx, Rx, Sx; + double area; + + /* y = Ly*t^3 + My*t^2 + Ny*t + Py */ + Ly = -ge->prev->fy3 + 3*(ge->fy1 - ge->fy2) + ge->fy3; + My = 3*ge->prev->fy3 - 6*ge->fy1 + 3*ge->fy2; + Ny = 3*(-ge->prev->fy3 + ge->fy1); + Py = ge->prev->fy3; + + /* dx/dt = Qx*t^2 + Rx*t + Sx */ + Qx = 3*(-ge->prev->fx3 + 3*(ge->fx1 - ge->fx2) + ge->fx3); + Rx = 6*(ge->prev->fx3 - 2*ge->fx1 + ge->fx2); + Sx = 3*(-ge->prev->fx3 + ge->fx1); + + /* area is integral[from 0 to 1]( y(t) * dx(t)/dt *dt) */ + area = 1./6.*(Ly*Qx) + 1./5.*(Ly*Rx + My*Qx) + + 1./4.*(Ly*Sx + My*Rx + Ny*Qx) + 1./3.*(My*Sx + Ny*Rx + Py*Qx) + + 1./2.*(Ny*Sx + Py*Rx) + Py*Sx; + + return area; +} +#endif + +/* find the value of point on the curve at the given parameter t, + * along the given axis (0 - X, 1 - Y). + */ + +static double +fcvval( + GENTRY *ge, + int axis, + double t +) +{ + double t2, mt, mt2; + + /* val = A*(1-t)^3 + 3*B*(1-t)^2*t + 3*C*(1-t)*t^2 + D*t^3 */ + t2 = t*t; + mt = 1-t; + mt2 = mt*mt; + + return ge->prev->fpoints[axis][2]*mt2*mt + + 3*(ge->fpoints[axis][0]*mt2*t + ge->fpoints[axis][1]*mt*t2) + + ge->fpoints[axis][2]*t*t2; +} + +/* + * Find ndots equally spaced dots on a curve or line and fill + * their coordinates into the dots array + */ + +static void +fsampledots( + GENTRY *ge, + double dots[][2], /* the dots to fill */ + int ndots +) +{ + int i, axis; + double t, nf, dx, d[2]; + + nf = ndots+1; + if(ge->type == GE_CURVE) { + for(i=0; ifx3 - ge->prev->fx3; + d[1] = ge->fy3 - ge->prev->fy3; + for(i=0; iprev->fpoints[axis][2] + + t*d[axis]; + } + } +} + +/* + * Allocate a structure gex_con + */ + +static void +alloc_gex_con( + GENTRY *ge +) +{ + ge->ext = (void*)calloc(1, sizeof(GEX_CON)); + if(ge->ext == 0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } +} + +/* + * Normalize a gentry for fforceconcise() : find the points that + * can be used to calculate the tangents. + */ + +static void +fnormalizege( + GENTRY *ge +) +{ + int midsame, frontsame, rearsame; + + if(ge->type == GE_LINE) { + ge->ftg = 2; + ge->rtg = -1; + } else { /* assume it's a curve */ + midsame = (fabs(ge->fx1-ge->fx2)fy1-ge->fy2)fx1-ge->prev->fx3)fy1-ge->prev->fy3)fx3-ge->fx2)fy3-ge->fy2)ftg = 2; + ge->rtg = -1; + } else { + if(frontsame) { + ge->ftg = 1; + } else { + ge->ftg = 0; + } + if(rearsame) { + ge->rtg = 0; + } else { + ge->rtg = 1; + } + } + } +} + +/* various definition for the processing of outlines */ + +/* maximal average quadratic distance from the original curve + * (in dots) to consider the joined curve good + */ +#define CVEPS 1.5 +#define CVEPS2 (CVEPS*CVEPS) +/* squared sinus of the maximal angle that we consider a smooth joint */ +#define SMOOTHSIN2 0.25 /* 0.25==sin(30 degrees)^2 */ +/* squared line length that we consider small */ +#define SMALL_LINE2 (15.*15.) +/* how many times a curve must be bigger than a line to join, squared */ +#define TIMES_LINE2 (3.*3.) + +/* + * Normalize and analyse a gentry for fforceconcise() and fill out the gex_con + * structure + */ + +static void +fanalyzege( + GENTRY *ge +) +{ + int i, ix, iy; + double avsd2, dots[3][2 /*X,Y*/]; + GEX_CON *gex; + + gex = X_CON(ge); + memset(gex, 0, sizeof *gex); + + gex->len2 = 0; + for(i=0; i<2; i++) { + avsd2 = gex->d[i] = ge->fpoints[i][2] - ge->prev->fpoints[i][2]; + gex->len2 += avsd2*avsd2; + } + gex->sin2 = fjointsin2(ge, ge->frwd); + if(ge->type == GE_CURVE) { + ge->dir = fgetcvdir(ge); + for(i=0; i<2; i++) { + dots[0][i] = ge->prev->fpoints[i][2]; + dots[1][i] = ge->fpoints[i][2]; + dots[2][i] = fcvval(ge, i, 0.5); + } + avsd2 = fdotsegdist2(dots, dots[2]); + if(avsd2 <= CVEPS2) { + gex->flags |= GEXF_FLAT; + } + } else { + ge->dir = CVDIR_FEQUAL|CVDIR_REQUAL; + gex->flags |= GEXF_FLAT; + } + if(gex->flags & GEXF_FLAT) { + if( fabs(gex->d[X]) > FEPS && fabs(gex->d[Y]) < 5. + && fabs(gex->d[Y] / gex->d[X]) < 0.2) + gex->flags |= GEXF_HOR; + else if( fabs(gex->d[Y]) > FEPS && fabs(gex->d[X]) < 5. + && fabs(gex->d[X] / gex->d[Y]) < 0.2) + gex->flags |= GEXF_VERT; + } + ix = gex->isd[X] = fsign(gex->d[X]); + iy = gex->isd[Y] = fsign(gex->d[Y]); + if(ix <= 0) { + if(iy <= 0) + gex->flags |= GEXF_QDL; + if(iy >= 0) + gex->flags |= GEXF_QUL; + if(gex->flags & GEXF_HOR) + gex->flags |= GEXF_IDQ_L; + } + if(ix >= 0) { + if(iy <= 0) + gex->flags |= GEXF_QDR; + if(iy >= 0) + gex->flags |= GEXF_QUR; + if(gex->flags & GEXF_HOR) + gex->flags |= GEXF_IDQ_R; + } + if(gex->flags & GEXF_VERT) { + if(iy <= 0) { + gex->flags |= GEXF_IDQ_U; + } else { /* supposedly there is no 0-sized entry */ + gex->flags |= GEXF_IDQ_D; + } + } +} + +/* + * Analyse a joint between this and following gentry for fforceconcise() + * and fill out the corresponding parts of the gex_con structure + * Bothe entries must be analyzed first. + */ + +static void +fanalyzejoint( + GENTRY *ge +) +{ + GENTRY *nge = ge->frwd; + GENTRY tge; + GEX_CON *gex, *ngex; + double avsd2, dots[3][2 /*X,Y*/]; + int i; + + gex = X_CON(ge); ngex = X_CON(nge); + + /* look if they can be joined honestly */ + + /* if any is flat, they should join smoothly */ + if( (gex->flags & GEXF_FLAT || ngex->flags & GEXF_FLAT) + && gex->sin2 > SMOOTHSIN2) + goto try_flatboth; + + if(ge->type == GE_LINE) { + if(nge->type == GE_LINE) { + if(gex->len2 > SMALL_LINE2 || ngex->len2 > SMALL_LINE2) + goto try_flatboth; + } else { + if(gex->len2*TIMES_LINE2 > ngex->len2) + goto try_flatboth; + } + } else if(nge->type == GE_LINE) { + if(ngex->len2*TIMES_LINE2 > gex->len2) + goto try_flatboth; + } + + /* if curve changes direction */ + if( gex->isd[X]*ngex->isd[X]<0 || gex->isd[Y]*ngex->isd[Y]<0) + goto try_idealone; + + /* if would create a zigzag */ + if( ((ge->dir&CVDIR_FRONT)-CVDIR_FEQUAL) * ((nge->dir&CVDIR_REAR)-CVDIR_REQUAL) < 0 ) + goto try_flatone; + + if( fcrossraysge(ge, nge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JGOOD; + +try_flatone: + /* look if they can be joined by flatting out one of the entries */ + + /* at this point we know that the general direction of the + * gentries is OK + */ + + if( gex->flags & GEXF_FLAT ) { + tge = *ge; + tge.fx1 = tge.fx3; + tge.fy1 = tge.fy3; + fnormalizege(&tge); + if( fcrossraysge(&tge, nge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JFLAT|GEXF_JFLAT1; + } + if( ngex->flags & GEXF_FLAT ) { + tge = *nge; + tge.fx2 = ge->fx3; + tge.fy2 = ge->fy3; + fnormalizege(&tge); + if( fcrossraysge(ge, &tge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JFLAT|GEXF_JFLAT2; + } + +try_idealone: + /* look if one of the entries can be brought to an idealized + * horizontal or vertical position and then joined + */ + if( gex->flags & GEXF_HOR && gex->isd[X]*ngex->isd[X]>=0 ) { + tge = *ge; + tge.fx1 = tge.fx3; + tge.fy1 = ge->prev->fy3; /* force horizontal */ + fnormalizege(&tge); + if( fcrossraysge(&tge, nge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JID|GEXF_JID1; + } else if( gex->flags & GEXF_VERT && gex->isd[Y]*ngex->isd[Y]>=0 ) { + tge = *ge; + tge.fx1 = ge->prev->fx3; /* force vertical */ + tge.fy1 = tge.fy3; + fnormalizege(&tge); + if( fcrossraysge(&tge, nge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JID|GEXF_JID1; + } + if( ngex->flags & GEXF_HOR && gex->isd[X]*ngex->isd[X]>=0 ) { + tge = *nge; + tge.fx2 = ge->fx3; + tge.fy2 = nge->fy3; /* force horizontal */ + fnormalizege(&tge); + if( fcrossraysge(ge, &tge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JID|GEXF_JID2; + } else if( ngex->flags & GEXF_VERT && gex->isd[Y]*ngex->isd[Y]>=0 ) { + tge = *nge; + tge.fx2 = nge->fx3; /* force vertical */ + tge.fy2 = ge->fy3; + fnormalizege(&tge); + if( fcrossraysge(ge, &tge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JID|GEXF_JID2; + } + +try_flatboth: + /* look if we can change them to one line */ + if(gex->flags & GEXF_FLAT && ngex->flags & GEXF_FLAT) { + for(i=0; i<2; i++) { + dots[0][i] = ge->prev->fpoints[i][2]; + dots[1][i] = nge->fpoints[i][2]; + dots[2][i] = ge->fpoints[i][2]; + } + if( fdotsegdist2(dots, dots[2]) <= CVEPS2) + gex->flags |= GEXF_JLINE; + } +} + +/* + * Force conciseness of one contour in the glyph, + * the contour is indicated by one entry from it. + */ + +static void +fconcisecontour( + GLYPH *g, + GENTRY *startge +) +{ +/* initial maximal number of dots to be used as reference */ +#define MAXDOTS ((NREFDOTS+1)*12) + + GENTRY *ge, *pge, *nge, *ige; + GEX_CON *gex, *pgex, *ngex, *nngex; + GENTRY tpge, tnge; + int quad, qq, i, j, ndots, maxdots; + int found[2]; + int joinmask, pflag, nflag; + struct dot_dist *dots; + double avsd2, maxd2, eps2; + double apcv[4][2]; + + if(startge == 0) { + fprintf(stderr, "WARNING: assertion in %s line %d, please report it to the ttf2pt1 project\n", + __FILE__, __LINE__); + fprintf(stderr, "Strange contour in glyph %s\n", g->name); + dumppaths(g, NULL, NULL); + return; + } + + if(startge->type != GE_CURVE && startge->type != GE_LINE) + return; /* probably a degenerate contour */ + + if(ISDBG(FCONCISE)) + fprintf(stderr, "processing contour 0x%p of glyph %s\n", startge, g->name); + + maxdots = MAXDOTS; + dots = (struct dot_dist *)malloc(sizeof(*dots)*maxdots); + if(dots == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + + ge = startge; + joinmask = GEXF_JGOOD; + while(1) { + restart: + gex = X_CON(ge); + if((gex->flags & GEXF_JMASK) > ((joinmask<<1)-1)) { + if(ISDBG(FCONCISE)) + fprintf(stderr, "found higher flag (%x>%x) at 0x%p\n", + gex->flags & GEXF_JMASK, ((joinmask<<1)-1), ge); + joinmask <<= 1; + startge = ge; /* have to redo the pass */ + continue; + } + if(( gex->flags & joinmask )==0) + goto next; + + /* if we happen to be in the middle of a string of + * joinable entries, find its beginning + */ + if( gex->flags & (GEXF_JCVMASK^GEXF_JID) ) + quad = gex->flags & X_CON_F(ge->frwd) & GEXF_QMASK; + else if( gex->flags & GEXF_JID2 ) + quad = gex->flags & GEXF_QFROM_IDEAL(X_CON_F(ge->frwd)) & GEXF_QMASK; + else /* must be GEXF_JID1 */ + quad = GEXF_QFROM_IDEAL(gex->flags) & X_CON_F(ge->frwd) & GEXF_QMASK; + + pge = ge; + pgex = X_CON(pge->bkwd); + + if(ISDBG(FCONCISE)) + fprintf(stderr, "ge %p prev -> 0x%p ", ge, pge); + + while(pgex->flags & GEXF_JCVMASK) { + if( !(pgex->flags & ((GEXF_JCVMASK^GEXF_JID)|GEXF_JID2)) ) + qq = GEXF_QFROM_IDEAL(pgex->flags); + else + qq = pgex->flags & GEXF_QMASK; + + if(ISDBG(FCONCISE)) + fprintf(stderr, "(%x?%x)", quad, qq); + + if( !(quad & qq) ) { + if( !(X_CON_F(pge) & (GEXF_JCVMASK^GEXF_JID)) + && pgex->flags & (GEXF_JCVMASK^GEXF_JID) ) { + /* the previos entry is definitely a better match */ + if(pge == ge) { + if(ISDBG(FCONCISE)) + fprintf(stderr, "\nprev is a better match at %p\n", pge); + startge = ge; + goto next; + } else + pge = pge->frwd; + } + break; + } + + quad &= qq; + pge = pge->bkwd; + pgex = X_CON(pge->bkwd); + if(ISDBG(FCONCISE)) + fprintf(stderr, "0x%p ", pge); + } + + /* collect as many entries for joining as possible */ + nge = ge->frwd; + ngex = X_CON(nge); + nngex = X_CON(nge->frwd); + + if(ISDBG(FCONCISE)) + fprintf(stderr, ": 0x%x\nnext -> 0x%p ", pge, nge); + + while(ngex->flags & GEXF_JCVMASK) { + if( !(ngex->flags & ((GEXF_JCVMASK^GEXF_JID)|GEXF_JID1)) ) + qq = GEXF_QFROM_IDEAL(nngex->flags); + else + qq = nngex->flags & GEXF_QMASK; + + if(ISDBG(FCONCISE)) + fprintf(stderr, "(%x?%x)", quad, qq); + if( !(quad & qq) ) { + if( !(X_CON_F(nge->bkwd) & (GEXF_JCVMASK^GEXF_JID)) + && ngex->flags & (GEXF_JCVMASK^GEXF_JID) ) { + /* the next-next entry is definitely a better match */ + if(nge == ge->frwd) { + if(ISDBG(FCONCISE)) + fprintf(stderr, "\nnext %x is a better match than %x at %p (jmask %x)\n", + ngex->flags & GEXF_JCVMASK, gex->flags & GEXF_JCVMASK, nge, joinmask); + goto next; + } else + nge = nge->bkwd; + } + break; + } + + quad &= qq; + nge = nge->frwd; + ngex = nngex; + nngex = X_CON(nge->frwd); + if(ISDBG(FCONCISE)) + fprintf(stderr, "0x%p ", nge); + } + + if(ISDBG(FCONCISE)) + fprintf(stderr, ": 0x%x\n", nge); + + /* XXX add splitting of last entries if neccessary */ + + /* make sure that all the reference dots are valid */ + for(ige = pge; ige != nge->frwd; ige = ige->frwd) { + nngex = X_CON(ige); + if( !(nngex->flags & GEXF_VDOTS) ) { + fsampledots(ige, nngex->dots, NREFDOTS); + nngex->flags |= GEXF_VDOTS; + } + } + + /* do the actual joining */ + while(1) { + pgex = X_CON(pge); + ngex = X_CON(nge->bkwd); + /* now the segments to be joined are pge...nge */ + + ndots = 0; + for(ige = pge; ige != nge->frwd; ige = ige->frwd) { + if(maxdots < ndots+(NREFDOTS+1)) { + maxdots += MAXDOTS; + dots = (struct dot_dist *)realloc((void *)dots, sizeof(*dots)*maxdots); + if(dots == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + } + nngex = X_CON(ige); + for(i=0; idots[i][j]; + ndots++; + } + for(j=0; j<2; j++) + dots[ndots].p[j] = ige->fpoints[j][2]; + ndots++; + } + ndots--; /* the last point is not interesting */ + + tpge = *pge; + pflag = pgex->flags; + if(pflag & (GEXF_JGOOD|GEXF_JFLAT2|GEXF_JID2)) { + /* nothing */ + } else if(pflag & GEXF_JFLAT) { + tpge.fx1 = tpge.fx3; + tpge.fy1 = tpge.fy3; + } else if(pflag & GEXF_JID) { + if(pflag & GEXF_HOR) + tpge.fy1 = tpge.bkwd->fy3; + else + tpge.fx1 = tpge.bkwd->fx3; + } + + tnge = *nge; + nflag = ngex->flags; + if(nflag & (GEXF_JGOOD|GEXF_JFLAT1|GEXF_JID) + && !(nflag & GEXF_JID2)) { + /* nothing */ + } else if(nflag & GEXF_JFLAT) { + tnge.fx2 = tnge.bkwd->fx3; + tnge.fy2 = tnge.bkwd->fy3; + } else if(nflag & GEXF_JID) { + if(X_CON_F(nge) & GEXF_HOR) + tnge.fy2 = tnge.fy3; + else + tnge.fx2 = tnge.fx3; + } + + fnormalizege(&tpge); + fnormalizege(&tnge); + if( fcrossraysge(&tpge, &tnge, NULL, NULL, &apcv[1]) ) { + apcv[0][X] = tpge.bkwd->fx3; + apcv[0][Y] = tpge.bkwd->fy3; + /* apcv[1] and apcv[2] were filled by fcrossraysge() */ + apcv[3][X] = tnge.fx3; + apcv[3][Y] = tnge.fy3; + + /* calculate the precision depending on the smaller dimension of the curve */ + maxd2 = apcv[3][X]-apcv[0][X]; + maxd2 *= maxd2; + eps2 = apcv[3][Y]-apcv[0][Y]; + eps2 *= eps2; + if(maxd2 < eps2) + eps2 = maxd2; + eps2 *= (CVEPS2*4.) / (400.*400.); + if(eps2 < CVEPS2) + eps2 = CVEPS2; + else if(eps2 > CVEPS2*4.) + eps2 = CVEPS2*4.; + + fapproxcurve(apcv, dots, ndots); + + avsd2 = fdotcurvdist2(apcv, dots, ndots, &maxd2); + if(ISDBG(FCONCISE)) + fprintf(stderr, "avsd = %g, maxd = %g, ", sqrt(avsd2), sqrt(maxd2)); + if(avsd2 <= eps2 && maxd2 <= eps2*2.) { + /* we've guessed a curve that is close enough */ + ggoodcv++; ggoodcvdots += ndots; + + if(ISDBG(FCONCISE)) { + fprintf(stderr, "in %s joined %p-%p to ", g->name, pge, nge); + for(i=0; i<4; i++) { + fprintf(stderr, " (%g, %g)", apcv[i][X], apcv[i][Y]); + } + fprintf(stderr, " from\n"); + dumppaths(g, pge, nge); + } + for(i=0; i<3; i++) { + pge->fxn[i] = apcv[i+1][X]; + pge->fyn[i] = apcv[i+1][Y]; + } + pge->type = GE_CURVE; + ge = pge; + for(ige = pge->frwd; ; ige = pge->frwd) { + if(ige == pge) { + fprintf(stderr, "WARNING: assertion in %s line %d, please report it to the ttf2pt1 project\n", + __FILE__, __LINE__); + free(dots); + return; + } + if(startge == ige) + startge = pge; + free(ige->ext); + freethisge(ige); + if(ige == nge) + break; + } + fnormalizege(ge); + if(ISDBG(FCONCISE)) { + fprintf(stderr, "normalized "); + for(i=0; i<3; i++) { + fprintf(stderr, " (%g, %g)", ge->fpoints[X][i], ge->fpoints[Y][i]); + } + fprintf(stderr, "\n"); + } + fanalyzege(ge); + fanalyzejoint(ge); + fanalyzege(ge->bkwd); + fanalyzejoint(ge->bkwd); + + /* the results of this join will have to be reconsidered */ + startge = ge = ge->frwd; + goto restart; + } else { + gbadcv++; gbadcvdots += ndots; + } + } + + /* if we're down to 2 entries then the join has failed */ + if(pge->frwd == nge) { + pgex->flags &= ~joinmask; + if(ISDBG(FCONCISE)) + fprintf(stderr, "no match\n"); + goto next; + } + + /* reduce the number of entries by dropping one at some end, + * should never drop the original ge from the range + */ + + if(nge->bkwd == ge + || pge != ge && (pgex->flags & GEXF_JCVMASK) <= (ngex->flags & GEXF_JCVMASK) ) { + pge = pge->frwd; + } else { + nge = nge->bkwd; + } + if(ISDBG(FCONCISE)) + fprintf(stderr, "next try: %p to %p\n", pge, nge); + } + +next: + ge = ge->frwd; + if(ge == startge) { + joinmask = (joinmask >> 1) & GEXF_JCVMASK; + if(joinmask == 0) + break; + } + } + + /* join flat segments into lines */ + /* here ge==startge */ + while(1) { + gex = X_CON(ge); + if( !(gex->flags & GEXF_JLINE) ) + goto next2; + + ndots = 0; + dots[ndots].p[X] = ge->fx3; + dots[ndots].p[Y] = ge->fy3; + ndots++; + + pge = ge->bkwd; + nge = ge->frwd; + + if(ISDBG(FCONCISE)) + fprintf(stderr, "joining LINE from %p-%p\n", ge, nge); + + while(pge!=nge) { + pgex = X_CON(pge); + ngex = X_CON(nge); + if(ISDBG(FCONCISE)) + fprintf(stderr, "(p=%p/%x n=0x%x/%x) ", pge, pgex->flags & GEXF_JLINE, + nge, ngex->flags & GEXF_JLINE); + if( !((pgex->flags | ngex->flags) & GEXF_JLINE) ) { + if(ISDBG(FCONCISE)) + fprintf(stderr, "(end p=%p n=%p) ", pge, nge); + break; + } + + if(maxdots < ndots+2) { + maxdots += MAXDOTS; + dots = (struct dot_dist *)realloc((void *)dots, sizeof(*dots)*maxdots); + if(dots == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + } + if( pgex->flags & GEXF_JLINE ) { + for(i=0; i<2; i++) { + apcv[0][i] = pge->bkwd->fpoints[i][2]; + apcv[1][i] = nge->fpoints[i][2]; + dots[ndots].p[i] = pge->fpoints[i][2]; + } + ndots++; + for(i=0; i CVEPS2) + break; + } + if(iflags &= ~GEXF_JLINE; + } else { + pge = pge->bkwd; + if(pge == nge) { + if(ISDBG(FCONCISE)) + fprintf(stderr, "intersected at prev %p ", pge); + break; /* oops, tried to self-intersect */ + } + } + } else if(ISDBG(FCONCISE)) + fprintf(stderr, "(p=%p) ", pge); + + if( ngex->flags & GEXF_JLINE ) { + for(i=0; i<2; i++) { + apcv[0][i] = pge->fpoints[i][2]; /* pge points before the 1st segment */ + apcv[1][i] = nge->frwd->fpoints[i][2]; + dots[ndots].p[i] = nge->fpoints[i][2]; + } + ndots++; + for(i=0; i CVEPS2) + break; + } + if(ifrwd); + ndots--; + ngex->flags &= ~GEXF_JLINE; + } else { + nge = nge->frwd; + } + } else if(ISDBG(FCONCISE)) + fprintf(stderr, "(n=%p) ", nge); + } + + pge = pge->frwd; /* now the limits are pge...nge inclusive */ + if(pge == nge) /* a deeply perversive contour */ + break; + + if(ISDBG(FCONCISE)) { + fprintf(stderr, "\nin %s joined LINE %p-%p from\n", g->name, pge, nge); + dumppaths(g, pge, nge); + } + pge->type = GE_LINE; + for(i=0; i<2; i++) { + pge->fpoints[i][2] = nge->fpoints[i][2]; + } + fnormalizege(pge); + X_CON_F(pge) &= ~GEXF_JLINE; + + ge = pge; + for(ige = pge->frwd; ; ige = pge->frwd) { + if(ige == pge) { + fprintf(stderr, "WARNING: assertion in %s line %d, please report it to the ttf2pt1 project\n", + __FILE__, __LINE__); + free(dots); + return; + } + if(startge == ige) + startge = pge; + free(ige->ext); + freethisge(ige); + if(ige == nge) + break; + } +next2: + ge = ge->frwd; + if(ge == startge) + break; + } + + free(dots); +} + +/* force conciseness: substitute 2 or more curves going in the +** same quadrant with one curve +** in floating point +*/ + +void +fforceconcise( + GLYPH * g +) +{ + + GENTRY *ge, *nge, *endge, *xge; + + assertisfloat(g, "enforcing conciseness"); + + fdelsmall(g, 0.05); + assertpath(g->entries, __FILE__, __LINE__, g->name); + + if(ISDBG(FCONCISE)) + dumppaths(g, NULL, NULL); + + /* collect more information about each gentry and their joints */ + for (ge = g->entries; ge != 0; ge = ge->next) + if (ge->type == GE_CURVE || ge->type == GE_LINE) + fnormalizege(ge); + + for (ge = g->entries; ge != 0; ge = ge->next) + if (ge->type == GE_CURVE || ge->type == GE_LINE) { + alloc_gex_con(ge); + fanalyzege(ge); + } + + /* see what we can do about joining */ + for (ge = g->entries; ge != 0; ge = ge->next) + if (ge->type == GE_CURVE || ge->type == GE_LINE) + fanalyzejoint(ge); + + /* now do the joining */ + for (ge = g->entries; ge != 0; ge = ge->next) + if(ge->type == GE_MOVE) + fconcisecontour(g, ge->next); + + for (ge = g->entries; ge != 0; ge = ge->next) + if (ge->type == GE_CURVE || ge->type == GE_LINE) + free(ge->ext); +} + +void +print_glyph( + int glyphno +) +{ + GLYPH *g; + GENTRY *ge; + int x = 0, y = 0; + int i; + int grp, lastgrp= -1; + + if(ISDBG(FCONCISE) && glyphno == 0) { + fprintf(stderr, "Guessed curves: bad %d/%d good %d/%d\n", + gbadcv, gbadcvdots, ggoodcv, ggoodcvdots); + } + + g = &glyph_list[glyphno]; + + fprintf(pfa_file, "/%s { \n", g->name); + + /* consider widths >MAXLEGALWIDTH as bugs */ + if( g->scaledwidth <= MAXLEGALWIDTH ) { + fprintf(pfa_file, "0 %d hsbw\n", g->scaledwidth); + } else { + fprintf(pfa_file, "0 1000 hsbw\n"); + WARNING_2 fprintf(stderr, "glyph %s: width %d seems to be buggy, set to 1000\n", + g->name, g->scaledwidth); + } + +#if 0 + fprintf(pfa_file, "%% contours: "); + for (i = 0; i < g->ncontours; i++) + fprintf(pfa_file, "%s(%d,%d) ", (g->contours[i].direction == DIR_OUTER ? "out" : "in"), + g->contours[i].xofmin, g->contours[i].ymin); + fprintf(pfa_file, "\n"); + + if (g->rymin < 5000) + fprintf(pfa_file, "%d lower%s\n", g->rymin, (g->flatymin ? "flat" : "curve")); + if (g->rymax > -5000) + fprintf(pfa_file, "%d upper%s\n", g->rymax, (g->flatymax ? "flat" : "curve")); +#endif + + if (g->hstems) + for (i = 0; i < g->nhs; i += 2) { + if (g->hstems[i].flags & ST_3) { + fprintf(pfa_file, "%d %d %d %d %d %d hstem3\n", + g->hstems[i].value, + g->hstems[i + 1].value - g->hstems[i].value, + g->hstems[i + 2].value, + g->hstems[i + 3].value - g->hstems[i + 2].value, + g->hstems[i + 4].value, + g->hstems[i + 5].value - g->hstems[i + 4].value + ); + i += 4; + } else { + fprintf(pfa_file, "%d %d hstem\n", g->hstems[i].value, + g->hstems[i + 1].value - g->hstems[i].value); + } + } + + if (g->vstems) + for (i = 0; i < g->nvs; i += 2) { + if (g->vstems[i].flags & ST_3) { + fprintf(pfa_file, "%d %d %d %d %d %d vstem3\n", + g->vstems[i].value, + g->vstems[i + 1].value - g->vstems[i].value, + g->vstems[i + 2].value, + g->vstems[i + 3].value - g->vstems[i + 2].value, + g->vstems[i + 4].value, + g->vstems[i + 5].value - g->vstems[i + 4].value + ); + i += 4; + } else { + fprintf(pfa_file, "%d %d vstem\n", g->vstems[i].value, + g->vstems[i + 1].value - g->vstems[i].value); + } + } + + for (ge = g->entries; ge != 0; ge = ge->next) { + if(g->nsg>0) { + grp=ge->stemid; + if(grp >= 0 && grp != lastgrp) { + fprintf(pfa_file, "%d 4 callsubr\n", grp+g->firstsubr); + lastgrp=grp; + } + } + + switch (ge->type) { + case GE_MOVE: + if (absolute) + fprintf(pfa_file, "%d %d amoveto\n", ge->ix3, ge->iy3); + else + rmoveto(ge->ix3 - x, ge->iy3 - y); + if (0) + fprintf(stderr, "Glyph %s: print moveto(%d, %d)\n", + g->name, ge->ix3, ge->iy3); + x = ge->ix3; + y = ge->iy3; + break; + case GE_LINE: + if (absolute) + fprintf(pfa_file, "%d %d alineto\n", ge->ix3, ge->iy3); + else + rlineto(ge->ix3 - x, ge->iy3 - y); + x = ge->ix3; + y = ge->iy3; + break; + case GE_CURVE: + if (absolute) + fprintf(pfa_file, "%d %d %d %d %d %d arcurveto\n", + ge->ix1, ge->iy1, ge->ix2, ge->iy2, ge->ix3, ge->iy3); + else + rrcurveto(ge->ix1 - x, ge->iy1 - y, + ge->ix2 - ge->ix1, ge->iy2 - ge->iy1, + ge->ix3 - ge->ix2, ge->iy3 - ge->iy2); + x = ge->ix3; + y = ge->iy3; + break; + case GE_PATH: + closepath(); + break; + default: + WARNING_1 fprintf(stderr, "**** Glyph %s: unknown entry type '%c'\n", + g->name, ge->type); + break; + } + } + + fprintf(pfa_file, "endchar } ND\n"); +} + +/* print the subroutines for this glyph, returns the number of them */ +int +print_glyph_subs( + int glyphno, + int startid /* start numbering subroutines from this id */ +) +{ + GLYPH *g; + int i, grp; + + g = &glyph_list[glyphno]; + + if(!hints || !subhints || g->nsg<1) + return 0; + + g->firstsubr=startid; + +#if 0 + fprintf(pfa_file, "%% %s %d\n", g->name, g->nsg); +#endif + for(grp=0; grpnsg; grp++) { + fprintf(pfa_file, "dup %d {\n", startid++); + for(i= (grp==0)? 0 : g->nsbs[grp-1]; insbs[grp]; i++) + fprintf(pfa_file, "\t%d %d %cstem\n", g->sbstems[i].low, + g->sbstems[i].high-g->sbstems[i].low, + g->sbstems[i].isvert ? 'v' : 'h'); + fprintf(pfa_file, "\treturn\n\t} NP\n"); + } + + return g->nsg; +} + +void +print_glyph_metrics( + FILE *afm_file, + int code, + int glyphno +) +{ + GLYPH *g; + + g = &glyph_list[glyphno]; + + if(transform) + fprintf(afm_file, "C %d ; WX %d ; N %s ; B %d %d %d %d ;\n", + code, g->scaledwidth, g->name, + iscale(g->xMin), iscale(g->yMin), iscale(g->xMax), iscale(g->yMax)); + else + fprintf(afm_file, "C %d ; WX %d ; N %s ; B %d %d %d %d ;\n", + code, g->scaledwidth, g->name, + g->xMin, g->yMin, g->xMax, g->yMax); + +} + +void +print_glyph_metrics_ufm( + FILE *ufm_file, + int code, + int glyphno +) +{ + GLYPH *g; + + g = &glyph_list[glyphno]; + + // OAR - added bounding box for Unicode glyphs + fprintf(ufm_file, "U %d ; WX %d ; N %s ; G %d ; B %d %d %d %d ;\n", + code, g->scaledwidth, g->name, glyphno, g->xMin, g->yMin, g->xMax, g->yMax); +} +/* + SB: + An important note about the BlueValues. + + The Adobe documentation says that the maximal width of a Blue zone + is connected to the value of BlueScale, which is by default 0.039625. + The BlueScale value defines, at which point size the overshoot + suppression be disabled. + + The formula for it that is given in the manual is: + + BlueScale=point_size/240, for a 300dpi device + + that makes us wonder what is this 240 standing for. Incidentally + 240=72*1000/300, where 72 is the relation between inches and points, + 1000 is the size of the glyph matrix, and 300dpi is the resolution of + the output device. Knowing that we can recalculate the formula for + the font size in pixels rather than points: + + BlueScale=pixel_size/1000 + + That looks a lot simpler than the original formula, does not it ? + And the limitation about the maximal width of zone also looks + a lot simpler after the transformation: + + max_width < 1000/pixel_size + + that ensures that even at the maximal pixel size when the overshoot + suppression is disabled the zone width will be less than one pixel. + This is important, failure to comply to this limit will result in + really ugly fonts (been there, done that). But knowing the formula + for the pixel width, we see that in fact we can use the maximal width + of 24, not 23 as specified in the manual. + +*/ + +#define MAXBLUEWIDTH (24) + +/* + * Find the indexes of the most frequent values + * in the hystogram, sort them in ascending order, and save which one + * was the best one (if asked). + * Returns the number of values found (may be less than maximal because + * we ignore the zero values) + */ + +#define MAXHYST (2000) /* size of the hystogram */ +#define HYSTBASE 500 + +static int +besthyst( + int *hyst, /* the hystogram */ + int base, /* the base point of the hystogram */ + int *best, /* the array for indexes of best values */ + int nbest, /* its allocated size */ + int width, /* minimal difference between indexes */ + int *bestindp /* returned top point */ +) +{ + unsigned char hused[MAXHYST / 8 + 1]; + int i, max, j, w, last = 0; + int nf = 0; + + width--; + + memset(hused, 0 , sizeof hused); + + max = 1; + for (i = 0; i < nbest && max != 0; i++) { + best[i] = 0; + max = 0; + for (j = 1; j < MAXHYST - 1; j++) { + w = hyst[j]; + + if (w > max && (hused[j>>3] & (1 << (j & 0x07))) == 0) { + best[i] = j; + max = w; + } + } + if (max != 0) { + if (max < last/2) { + /* do not pick the too low values */ + break; + } + for (j = best[i] - width; j <= best[i] + width; j++) { + if (j >= 0 && j < MAXHYST) + hused[j >> 3] |= (1 << (j & 0x07)); + } + last = max; + best[i] -= base; + nf = i + 1; + } + } + + if (bestindp) + *bestindp = best[0]; + + /* sort the indexes in ascending order */ + for (i = 0; i < nf; i++) { + for (j = i + 1; j < nf; j++) + if (best[j] < best[i]) { + w = best[i]; + best[i] = best[j]; + best[j] = w; + } + } + + return nf; +} + +/* + * Find the next best Blue zone in the hystogram. + * Return the weight of the found zone. + */ + +static int +bestblue( + short *zhyst, /* the zones hystogram */ + short *physt, /* the points hystogram */ + short *ozhyst, /* the other zones hystogram */ + int *bluetab /* where to put the found zone */ +) +{ + int i, j, w, max, ind, first, last; + + /* find the highest point in the zones hystogram */ + /* if we have a plateau, take its center */ + /* if we have multiple peaks, take the first one */ + + max = -1; + first = last = -10; + for (i = 0; i <= MAXHYST - MAXBLUEWIDTH; i++) { + w = zhyst[i]; + if (w > max) { + first = last = i; + max = w; + } else if (w == max) { + if (last == i - 1) + last = i; + } + } + ind = (first + last) / 2; + + if (max == 0) /* no zones left */ + return 0; + + /* now we reuse `first' and `last' as inclusive borders of the zone */ + first = ind; + last = ind + (MAXBLUEWIDTH - 1); + + /* our maximal width is far too big, so we try to make it narrower */ + w = max; + j = (w & 1); /* a pseudo-random bit */ + while (1) { + while (physt[first] == 0) + first++; + while (physt[last] == 0) + last--; + if (last - first < (MAXBLUEWIDTH * 2 / 3) || (max - w) * 10 > max) + break; + + if (physt[first] < physt[last] + || physt[first] == physt[last] && j) { + if (physt[first] * 20 > w) /* if weight is >5%, + * stop */ + break; + w -= physt[first]; + first++; + j = 0; + } else { + if (physt[last] * 20 > w) /* if weight is >5%, + * stop */ + break; + w -= physt[last]; + last--; + j = 1; + } + } + + /* save our zone */ + bluetab[0] = first - HYSTBASE; + bluetab[1] = last - HYSTBASE; + + /* invalidate all the zones overlapping with this one */ + /* the constant of 2 is determined by the default value of BlueFuzz */ + for (i = first - (MAXBLUEWIDTH - 1) - 2; i <= last + 2; i++) + if (i >= 0 && i < MAXHYST) { + zhyst[i] = 0; + ozhyst[i] = 0; + } + return w; +} + +/* + * Try to find the Blue Values, bounding box and italic angle + */ + +void +findblues(void) +{ + /* hystograms for upper and lower zones */ + short hystl[MAXHYST]; + short hystu[MAXHYST]; + short zuhyst[MAXHYST]; + short zlhyst[MAXHYST]; + int nchars; + int i, j, k, w, max; + GENTRY *ge; + GLYPH *g; + double ang; + + /* find the lowest and highest points of glyphs */ + /* and by the way build the values for FontBBox */ + /* and build the hystogram for the ItalicAngle */ + + /* re-use hystl for the hystogram of italic angle */ + + bbox[0] = bbox[1] = 5000; + bbox[2] = bbox[3] = -5000; + + for (i = 0; i < MAXHYST; i++) + hystl[i] = 0; + + nchars = 0; + + for (i = 0, g = glyph_list; i < numglyphs; i++, g++) { + if (g->flags & GF_USED) { + nchars++; + + g->rymin = 5000; + g->rymax = -5000; + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type == GE_LINE) { + + j = ge->iy3 - ge->prev->iy3; + k = ge->ix3 - ge->prev->ix3; + if (j > 0) + ang = atan2(-k, j) * 180.0 / M_PI; + else + ang = atan2(k, -j) * 180.0 / M_PI; + + k /= 100; + j /= 100; + if (ang > -45.0 && ang < 45.0) { + /* + * be careful to not overflow + * the counter + */ + hystl[HYSTBASE + (int) (ang * 10.0)] += (k * k + j * j) / 4; + } + if (ge->iy3 == ge->prev->iy3) { + if (ge->iy3 <= g->rymin) { + g->rymin = ge->iy3; + g->flatymin = 1; + } + if (ge->iy3 >= g->rymax) { + g->rymax = ge->iy3; + g->flatymax = 1; + } + } else { + if (ge->iy3 < g->rymin) { + g->rymin = ge->iy3; + g->flatymin = 0; + } + if (ge->iy3 > g->rymax) { + g->rymax = ge->iy3; + g->flatymax = 0; + } + } + } else if (ge->type == GE_CURVE) { + if (ge->iy3 < g->rymin) { + g->rymin = ge->iy3; + g->flatymin = 0; + } + if (ge->iy3 > g->rymax) { + g->rymax = ge->iy3; + g->flatymax = 0; + } + } + if (ge->type == GE_LINE || ge->type == GE_CURVE) { + if (ge->ix3 < bbox[0]) + bbox[0] = ge->ix3; + if (ge->ix3 > bbox[2]) + bbox[2] = ge->ix3; + if (ge->iy3 < bbox[1]) + bbox[1] = ge->iy3; + if (ge->iy3 > bbox[3]) + bbox[3] = ge->iy3; + } + } + } + } + + /* get the most popular angle */ + max = 0; + w = 0; + for (i = 0; i < MAXHYST; i++) { + if (hystl[i] > w) { + w = hystl[i]; + max = i; + } + } + ang = (double) (max - HYSTBASE) / 10.0; + WARNING_2 fprintf(stderr, "Guessed italic angle: %f\n", ang); + if (italic_angle == 0.0) + italic_angle = ang; + + /* build the hystogram of the lower points */ + for (i = 0; i < MAXHYST; i++) + hystl[i] = 0; + + for (i = 0, g = glyph_list; i < numglyphs; i++, g++) { + if ((g->flags & GF_USED) + && g->rymin + HYSTBASE >= 0 && g->rymin < MAXHYST - HYSTBASE) { + hystl[g->rymin + HYSTBASE]++; + } + } + + /* build the hystogram of the upper points */ + for (i = 0; i < MAXHYST; i++) + hystu[i] = 0; + + for (i = 0, g = glyph_list; i < numglyphs; i++, g++) { + if ((g->flags & GF_USED) + && g->rymax + HYSTBASE >= 0 && g->rymax < MAXHYST - HYSTBASE) { + hystu[g->rymax + HYSTBASE]++; + } + } + + /* build the hystogram of all the possible lower zones with max width */ + for (i = 0; i < MAXHYST; i++) + zlhyst[i] = 0; + + for (i = 0; i <= MAXHYST - MAXBLUEWIDTH; i++) { + for (j = 0; j < MAXBLUEWIDTH; j++) + zlhyst[i] += hystl[i + j]; + } + + /* build the hystogram of all the possible upper zones with max width */ + for (i = 0; i < MAXHYST; i++) + zuhyst[i] = 0; + + for (i = 0; i <= MAXHYST - MAXBLUEWIDTH; i++) { + for (j = 0; j < MAXBLUEWIDTH; j++) + zuhyst[i] += hystu[i + j]; + } + + /* find the baseline */ + w = bestblue(zlhyst, hystl, zuhyst, &bluevalues[0]); + if (0) + fprintf(stderr, "BaselineBlue zone %d%% %d...%d\n", w * 100 / nchars, + bluevalues[0], bluevalues[1]); + + if (w == 0) /* no baseline, something weird */ + return; + + /* find the upper zones */ + for (nblues = 2; nblues < 14; nblues += 2) { + w = bestblue(zuhyst, hystu, zlhyst, &bluevalues[nblues]); + + if (0) + fprintf(stderr, "Blue zone %d%% %d...%d\n", w * 100 / nchars, + bluevalues[nblues], bluevalues[nblues+1]); + + if (w * 20 < nchars) + break; /* don't save this zone */ + } + + /* find the lower zones */ + for (notherb = 0; notherb < 10; notherb += 2) { + w = bestblue(zlhyst, hystl, zuhyst, &otherblues[notherb]); + + if (0) + fprintf(stderr, "OtherBlue zone %d%% %d...%d\n", w * 100 / nchars, + otherblues[notherb], otherblues[notherb+1]); + + + if (w * 20 < nchars) + break; /* don't save this zone */ + } + +} + +/* + * Find the actual width of the glyph and modify the + * description to reflect it. Not guaranteed to do + * any good, may make character spacing too wide. + */ + +void +docorrectwidth(void) +{ + int i; + GENTRY *ge; + GLYPH *g; + int xmin, xmax; + int maxwidth, minsp; + + /* enforce this minimal spacing, + * we limit the amount of the enforced spacing to avoid + * spacing the bold wonts too widely + */ + minsp = (stdhw>60 || stdhw<10)? 60 : stdhw; + + for (i = 0, g = glyph_list; i < numglyphs; i++, g++) { + g->oldwidth=g->scaledwidth; /* save the old width, will need for AFM */ + + if (correctwidth && g->flags & GF_USED) { + xmin = 5000; + xmax = -5000; + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type != GE_LINE && ge->type != GE_CURVE) + continue; + + if (ge->ix3 <= xmin) { + xmin = ge->ix3; + } + if (ge->ix3 >= xmax) { + xmax = ge->ix3; + } + } + + maxwidth=xmax+minsp; + if( g->scaledwidth < maxwidth ) { + g->scaledwidth = maxwidth; + WARNING_3 fprintf(stderr, "glyph %s: extended from %d to %d\n", + g->name, g->oldwidth, g->scaledwidth ); + } + } + } + +} + +/* + * Try to find the typical stem widths + */ + +void +stemstatistics(void) +{ +#define MINDIST 10 /* minimal distance between the widths */ + int hyst[MAXHYST+MINDIST*2]; + int best[12]; + int i, j, k, w; + int nchars; + int ns; + STEM *s; + GLYPH *g; + + /* start with typical stem width */ + + nchars=0; + + /* build the hystogram of horizontal stem widths */ + memset(hyst, 0, sizeof hyst); + + for (i = 0, g = glyph_list; i < numglyphs; i++, g++) { + if (g->flags & GF_USED) { + nchars++; + s = g->hstems; + for (j = 0; j < g->nhs; j += 2) { + if ((s[j].flags | s[j + 1].flags) & ST_END) + continue; + w = s[j + 1].value - s[j].value+1; + if(w==20) /* split stems should not be counted */ + continue; + if (w > 0 && w < MAXHYST - 1) { + /* + * handle some fuzz present in + * converted fonts + */ + hyst[w+MINDIST] += MINDIST-1; + for(k=1; kflags & GF_USED) { + s = g->vstems; + for (j = 0; j < g->nvs; j += 2) { + if ((s[j].flags | s[j + 1].flags) & ST_END) + continue; + w = s[j + 1].value - s[j].value+1; + if (w > 0 && w < MAXHYST - 1) { + /* + * handle some fuzz present in + * converted fonts + */ + hyst[w+MINDIST] += MINDIST-1; + for(k=1; knext) { + if(ge->type == GE_LINE || ge->type == GE_CURVE) { + if (ISDBG(REVERSAL)) + fprintf(stderr, "reverse path 0x%x <- 0x%x, 0x%x\n", ge, ge->prev, ge->bkwd); + + /* cut out the path itself */ + pge = ge->prev; /* GE_MOVE */ + if (pge == 0) { + fprintf(stderr, "**! No MOVE before line !!! Fatal. ****\n"); + exit(1); + } + nge = ge->bkwd->next; /* GE_PATH */ + pge->next = nge; + nge->prev = pge; + ge->bkwd->next = 0; /* mark end of chain */ + + /* remember the starting point */ + if(ge->flags & GEF_FLOAT) { + flast[0] = pge->fx3; + flast[1] = pge->fy3; + } else { + ilast[0] = pge->ix3; + ilast[1] = pge->iy3; + } + + /* then reinsert them in backwards order */ + for(cur = ge; cur != 0; cur = next ) { + next = cur->next; /* or addgeafter() will screw it up */ + if(cur->flags & GEF_FLOAT) { + for(i=0; i<2; i++) { + /* reverse the direction of path element */ + f = cur->fpoints[i][0]; + cur->fpoints[i][0] = cur->fpoints[i][1]; + cur->fpoints[i][1] = f; + f = flast[i]; + flast[i] = cur->fpoints[i][2]; + cur->fpoints[i][2] = f; + } + } else { + for(i=0; i<2; i++) { + /* reverse the direction of path element */ + n = cur->ipoints[i][0]; + cur->ipoints[i][0] = cur->ipoints[i][1]; + cur->ipoints[i][1] = n; + n = ilast[i]; + ilast[i] = cur->ipoints[i][2]; + cur->ipoints[i][2] = n; + } + } + addgeafter(pge, cur); + } + + /* restore the starting point */ + if(ge->flags & GEF_FLOAT) { + pge->fx3 = flast[0]; + pge->fy3 = flast[1]; + } else { + pge->ix3 = ilast[0]; + pge->iy3 = ilast[1]; + } + + ge = nge; + } + + } +} + +void +reversepaths( + GLYPH * g +) +{ + reversepathsfromto(g->entries, NULL); +} + +/* add a kerning pair information, scales the value */ + +void +addkernpair( + unsigned id1, + unsigned id2, + int unscval +) +{ + static unsigned char *bits = 0; + static int lastid; + GLYPH *g = &glyph_list[id1]; + int i, n; + struct kern *p; + + if(unscval == 0 || id1 >= numglyphs || id2 >= numglyphs) + return; + + if( (glyph_list[id1].flags & GF_USED)==0 + || (glyph_list[id2].flags & GF_USED)==0 ) + return; + + if(bits == 0) { + bits = calloc( BITMAP_BYTES(numglyphs), 1); + if (bits == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + lastid = id1; + } + + if(lastid != id1) { + /* refill the bitmap cache */ + memset(bits, 0,BITMAP_BYTES(numglyphs)); + p = g->kern; + for(i=g->kerncount; i>0; i--) { + n = (p++)->id; + SET_BITMAP(bits, n); + } + lastid = id1; + } + + if(IS_BITMAP(bits, id2)) + return; /* duplicate */ + + if(g->kerncount <= g->kernalloc) { + g->kernalloc += 8; + p = realloc(g->kern, sizeof(struct kern) * g->kernalloc); + if(p == 0) { + fprintf (stderr, "** realloc failed, kerning data will be incomplete\n"); + } + g->kern = p; + } + + SET_BITMAP(bits, id2); + p = &g->kern[g->kerncount]; + p->id = id2; + p->val = iscale(unscval) - (g->scaledwidth - g->oldwidth); + g->kerncount++; + kerning_pairs++; +} + +/* print out the kerning information */ + +void +print_kerning( + FILE *afm_file +) +{ + int i, j, n; + GLYPH *g; + struct kern *p; + + if( kerning_pairs == 0 ) + return; + + fprintf(afm_file, "StartKernData\n"); + fprintf(afm_file, "StartKernPairs %hd\n", kerning_pairs); + + for(i=0; iflags & GF_USED) ==0) + continue; + p = g->kern; + for(j=g->kerncount; j>0; j--, p++) { + fprintf(afm_file, "KPX %s %s %d\n", g->name, + glyph_list[ p->id ].name, p->val ); + } + } + + fprintf(afm_file, "EndKernPairs\n"); + fprintf(afm_file, "EndKernData\n"); +} + + +#if 0 + +/* +** This function is commented out because the information +** collected by it is not used anywhere else yet. Now +** it only collects the directions of contours. And the +** direction of contours gets fixed already in draw_glyf(). +** +*********************************************** +** +** Here we expect that the paths are already closed. +** We also expect that the contours do not intersect +** and that curves doesn't cross any border of quadrant. +** +** Find which contours go inside which and what is +** their proper direction. Then fix the direction +** to make it right. +** +*/ + +#define MAXCONT 1000 + +void +fixcontours( + GLYPH * g +) +{ + CONTOUR cont[MAXCONT]; + short ymax[MAXCONT]; /* the highest point */ + short xofmax[MAXCONT]; /* X-coordinate of any point + * at ymax */ + short ymin[MAXCONT]; /* the lowest point */ + short xofmin[MAXCONT]; /* X-coordinate of any point + * at ymin */ + short count[MAXCONT]; /* count of lines */ + char dir[MAXCONT]; /* in which direction they must go */ + GENTRY *start[MAXCONT], *minptr[MAXCONT], *maxptr[MAXCONT]; + int ncont; + int i; + int dx1, dy1, dx2, dy2; + GENTRY *ge, *nge; + + /* find the contours and their most upper/lower points */ + ncont = 0; + ymax[0] = -5000; + ymin[0] = 5000; + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type == GE_LINE || ge->type == GE_CURVE) { + if (ge->iy3 > ymax[ncont]) { + ymax[ncont] = ge->iy3; + xofmax[ncont] = ge->ix3; + maxptr[ncont] = ge; + } + if (ge->iy3 < ymin[ncont]) { + ymin[ncont] = ge->iy3; + xofmin[ncont] = ge->ix3; + minptr[ncont] = ge; + } + } + if (ge->frwd != ge->next) { + start[ncont++] = ge->frwd; + ymax[ncont] = -5000; + ymin[ncont] = 5000; + } + } + + /* determine the directions of contours */ + for (i = 0; i < ncont; i++) { + ge = minptr[i]; + nge = ge->frwd; + + if (ge->type == GE_CURVE) { + dx1 = ge->ix3 - ge->ix2; + dy1 = ge->iy3 - ge->iy2; + + if (dx1 == 0 && dy1 == 0) { /* a pathological case */ + dx1 = ge->ix3 - ge->ix1; + dy1 = ge->iy3 - ge->iy1; + } + if (dx1 == 0 && dy1 == 0) { /* a more pathological + * case */ + dx1 = ge->ix3 - ge->prev->ix3; + dy1 = ge->iy3 - ge->prev->iy3; + } + } else { + dx1 = ge->ix3 - ge->prev->ix3; + dy1 = ge->iy3 - ge->prev->iy3; + } + if (nge->type == GE_CURVE) { + dx2 = ge->ix3 - nge->ix1; + dy2 = ge->iy3 - nge->iy1; + if (dx1 == 0 && dy1 == 0) { /* a pathological case */ + dx2 = ge->ix3 - nge->ix2; + dy2 = ge->iy3 - nge->iy2; + } + if (dx1 == 0 && dy1 == 0) { /* a more pathological + * case */ + dx2 = ge->ix3 - nge->ix3; + dy2 = ge->iy3 - nge->iy3; + } + } else { + dx2 = ge->ix3 - nge->ix3; + dy2 = ge->iy3 - nge->iy3; + } + + /* compare angles */ + cont[i].direction = DIR_INNER; + if (dy1 == 0) { + if (dx1 < 0) + cont[i].direction = DIR_OUTER; + } else if (dy2 == 0) { + if (dx2 > 0) + cont[i].direction = DIR_OUTER; + } else if (dx2 * dy1 < dx1 * dy2) + cont[i].direction = DIR_OUTER; + + cont[i].ymin = ymin[i]; + cont[i].xofmin = xofmin[i]; + } + + /* save the information that may be needed further */ + g->ncontours = ncont; + if (ncont > 0) { + g->contours = malloc(sizeof(CONTOUR) * ncont); + if (g->contours == 0) { + fprintf(stderr, "***** Memory allocation error *****\n"); + exit(255); + } + memcpy(g->contours, cont, sizeof(CONTOUR) * ncont); + } +} + +#endif + +/* + * + */ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/pt1.h b/application/third_party/dompdf/lib/ttf2ufm/src/pt1.h new file mode 100644 index 00000000..a1d3af33 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/pt1.h @@ -0,0 +1,262 @@ +/* + * see COPYRIGHT + */ + + +/* glyph entry, one drawing command */ +typedef struct gentry { + /* this list links all GENTRYs of a GLYPH sequentially */ + struct gentry *next; /* double linked list */ + struct gentry *prev; + + /* this list links all GENTRYs of one contour - + * of types GE_LINE and GE_CURVE only + * bkwd is also reused: in the very first entry (normally + * of type GE_MOVE) it points to g->entries + */ + struct gentry *cntr[2]; /* double-linked circular list */ +/* convenience handles */ +#define bkwd cntr[0] +#define frwd cntr[1] + + /* various extended structures used at some stage of transformation */ + void *ext; + + union { + struct { + int val[2][3]; /* integer values */ + } i; + struct { + double val[2][3]; /* floating values */ + } f; + } points; /* absolute values, NOT deltas */ +/* convenience handles */ +#define ipoints points.i.val +#define fpoints points.f.val +#define ixn ipoints[0] +#define iyn ipoints[1] +#define fxn fpoints[0] +#define fyn fpoints[1] +#define ix1 ixn[0] +#define ix2 ixn[1] +#define ix3 ixn[2] +#define iy1 iyn[0] +#define iy2 iyn[1] +#define iy3 iyn[2] +#define fx1 fxn[0] +#define fx2 fxn[1] +#define fx3 fxn[2] +#define fy1 fyn[0] +#define fy2 fyn[1] +#define fy3 fyn[2] + + char flags; +#define GEF_FLOAT 0x02 /* entry contains floating point data */ +#define GEF_LINE 0x04 /* entry looks like a line even if it's a curve */ + + unsigned char dir; /* used to temporarily store the values for + * the directions of the ends of curves */ +/* front end */ +#define CVDIR_FUP 0x02 /* goes over the line connecting the ends */ +#define CVDIR_FEQUAL 0x01 /* coincides with the line connecting the + * ends */ +#define CVDIR_FDOWN 0x00 /* goes under the line connecting the ends */ +#define CVDIR_FRONT 0x0F /* mask of all front directions */ +/* rear end */ +#define CVDIR_RSAME 0x30 /* is the same as for the front end */ +#define CVDIR_RUP 0x20 /* goes over the line connecting the ends */ +#define CVDIR_REQUAL 0x10 /* coincides with the line connecting the + * ends */ +#define CVDIR_RDOWN 0x00 /* goes under the line connecting the ends */ +#define CVDIR_REAR 0xF0 /* mask of all rear directions */ + + signed char stemid; /* connection to the substituted stem group */ + char type; +#define GE_HSBW 'B' +#define GE_MOVE 'M' +#define GE_LINE 'L' +#define GE_CURVE 'C' +#define GE_PATH 'P' + + /* indexes of the points to be used for calculation of the tangents */ + signed char ftg; /* front tangent */ + signed char rtg; /* rear tangent, -1 means "idx 2 of the previous entry" */ +} GENTRY; + +/* stem structure, describes one [hv]stem */ +/* acually, it describes one border of a stem */ +/* the whole stem is a pair of these structures */ + +typedef struct stem { + short value; /* value of X or Y coordinate */ + short origin; /* point of origin for curve stems */ + GENTRY *ge; /* entry that has (value, origin) as its first dot */ + /* also for all the stems the couple (value, origin) + * is used to determine whether a stem is relevant for a + * line, it's considered revelant if this tuple is + * equal to any of the ends of the line. + * ge is also used to resolve ambiguity if there is more than + * one line going through certain pointi, it is used to + * distinguish these lines. + */ + + short from, to; /* values of other coordinate between + * which this stem is valid */ + + short flags; + /* ordering of ST_END, ST_FLAT, ST_ZONE is IMPORTANT for sorting */ +#define ST_END 0x01 /* end of line, lowest priority */ +#define ST_FLAT 0x02 /* stem is defined by a flat line, not a + * curve */ +#define ST_ZONE 0x04 /* pseudo-stem, the limit of a blue zone */ +#define ST_UP 0x08 /* the black area is to up or right from + * value */ +#define ST_3 0x20 /* first stem of [hv]stem3 */ +#define ST_BLUE 0x40 /* stem is in blue zone */ +#define ST_TOPZONE 0x80 /* 1 - top zone, 0 - bottom zone */ +#define ST_VERT 0x100 /* vertical stem (used in substitutions) */ +} STEM; + +#define MAX_STEMS 2000 /* we can't have more stems than path + * elements (or hope so) */ +#define NSTEMGRP 50 /* maximal number of the substituted stem groups */ + +/* structure for economical representation of the + * substituted stems + */ + +typedef struct stembounds { + short low; /* low bound */ + short high; /* high bound */ + char isvert; /* 1 - vertical, 0 - horizontal */ + char already; /* temp. flag: is aleready included */ +} STEMBOUNDS; + +struct kern { + unsigned id; /* ID of the second glyph */ + int val; /* kerning value */ +}; + +typedef struct contour { + short ymin, xofmin; + short inside; /* inside which contour */ + char direction; +#define DIR_OUTER 1 +#define DIR_INNER 0 +} CONTOUR; + +/* becnjcarson: allow glyphs to have multiple character codes. This isn't 100% + perfect, but should be enough for most normal fonts. */ +#define GLYPH_MAX_ENCODINGS (4) + +typedef struct glyph { + int char_no;/* Encoding of glyph */ + int orig_code[GLYPH_MAX_ENCODINGS]; /* code(s) of glyph in the font's original encoding */ + char *name; /* Postscript name of glyph */ + int xMin, yMin, xMax, yMax; /* values from TTF dictionary */ + int lsb; /* left sidebearing */ + int ttf_pathlen; /* total length of TTF paths */ + short width; + short flags; +#define GF_USED 0x0001 /* whether is this glyph used in T1 font */ +#define GF_FLOAT 0x0002 /* thys glyph contains floating point entries */ + + GENTRY *entries;/* doube linked list of entries */ + GENTRY *lastentry; /* the last inserted entry */ + GENTRY *path; /* beggining of the last path */ + int oldwidth; /* actually also scaled */ + int scaledwidth; +#define MAXLEGALWIDTH 10000 + + struct kern *kern; /* kerning data */ + int kerncount; /* number of kerning pairs */ + int kernalloc; /* for how many pairs we have space */ + + STEM *hstems; /* global horiz. and vert. stems */ + STEM *vstems; + int nhs, nvs; /* numbers of stems */ + + STEMBOUNDS *sbstems; /* substituted stems for all the groups */ + short *nsbs; /* indexes of the group ends in the common array */ + int nsg; /* actual number of the stem groups */ + int firstsubr; /* first substistuted stems subroutine number */ + + CONTOUR *contours; /* it is not used now */ + int ncontours; + + int rymin, rymax; /* real values */ + /* do we have flat surfaces on top/bottom */ + char flatymin, flatymax; + +} GLYPH; + +/* description of a dot for calculation of its distance to a curve */ + +struct dot_dist { + double p[2 /*X,Y*/]; /* coordinates of a dot */ + double dist2; /* squared distance from the dot to the curve */ + short seg; /* the closest segment of the curve */ +}; + +extern int stdhw, stdvw; /* dominant stems widths */ +extern int stemsnaph[12], stemsnapv[12]; /* most typical stem width */ + +extern int bluevalues[14]; +extern int nblues; +extern int otherblues[10]; +extern int notherb; +extern int bbox[4]; /* the FontBBox array */ +extern double italic_angle; + +extern GLYPH *glyph_list; +extern int encoding[]; /* inverse of glyph[].char_no */ + +/* prototypes of functions */ +void rmoveto( int dx, int dy); +void rlineto( int dx, int dy); +void rrcurveto( int dx1, int dy1, int dx2, int dy2, int dx3, int dy3); +void assertpath( GENTRY * from, char *file, int line, char *name); + +void fg_rmoveto( GLYPH * g, double x, double y); +void ig_rmoveto( GLYPH * g, int x, int y); +void fg_rlineto( GLYPH * g, double x, double y); +void ig_rlineto( GLYPH * g, int x, int y); +void fg_rrcurveto( GLYPH * g, double x1, double y1, + double x2, double y2, double x3, double y3); +void ig_rrcurveto( GLYPH * g, int x1, int y1, + int x2, int y2, int x3, int y3); +void g_closepath( GLYPH * g); + +void pathtoint( GLYPH *g); +void ffixquadrants( GLYPH *g); +void flattencurves( GLYPH * g); +int checkcv( GENTRY * ge, int dx, int dy); +void iclosepaths( GLYPH * g); +void fclosepaths( GLYPH * g); +void smoothjoints( GLYPH * g); +void buildstems( GLYPH * g); +void fstraighten( GLYPH * g); +void istraighten( GLYPH * g, int zigonly); +void isplitzigzags( GLYPH * g); +void fsplitzigzags( GLYPH * g); +void fforceconcise( GLYPH * g); +void iforceconcise( GLYPH * g); +void reversepathsfromto( GENTRY * from, GENTRY * to); +void reversepaths( GLYPH * g); +void dumppaths( GLYPH * g, GENTRY *start, GENTRY *end); +void print_glyph( int glyphno); +int print_glyph_subs( int glyphno, int startid); +void print_glyph_metrics( FILE *afm_file, int code, int glyphno); +void print_glyph_metrics_ufm( FILE *ufm_file, int code, int glyphno); +void findblues(void); +void stemstatistics(void); +void docorrectwidth(void); +void addkernpair( unsigned id1, unsigned id2, int unscval); +void print_kerning( FILE *afm_file); + +int fcrossrayscv( double curve[4][2], double *max1, double *max2); +int fcrossraysge( GENTRY *ge1, GENTRY *ge2, double *max1, double *max2, + double crossdot[2][2]); +double fdotsegdist2( double seg[2][2], double dot[2]); +double fdotcurvdist2( double curve[4][2], struct dot_dist *dots, int ndots, double *maxp); +void fapproxcurve( double cv[4][2], struct dot_dist *dots, int ndots); diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/runt1asm.c b/application/third_party/dompdf/lib/ttf2ufm/src/runt1asm.c new file mode 100644 index 00000000..58c4cad8 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/runt1asm.c @@ -0,0 +1,61 @@ +/* + * Wrap-around code to either compile in t1asm or call it externally + * + * Copyright (C) 2000 by Sergey Babkin + * Copyright (C) 2000 by The TTF2PT1 Project + * + * See COPYRIGHT for full license + */ + +#ifdef EXTERNAL_T1ASM + +#include +#include + +FILE *ifp; +FILE *ofp; + +int +runt1asm( + int pfbflag +) +{ + char *cmd; + int id, od; + int error; + + /* first make a copy in case some of then is already stdin/stdout */ + if(( id = dup(fileno(ifp)) )<0) { + perror("** Re-opening input file for t1asm"); + exit(1); + } + if(( od = dup(fileno(ofp)) )<0) { + perror("** Re-opening output file for t1asm"); + exit(1); + } + fclose(ifp); fclose(ofp); + close(0); + if(( dup(id) )!=0) { + perror("** Re-directing input file for t1asm"); + exit(1); + } + close(1); + if(( dup(od) )!=1) { + perror("** Re-directing output file for t1asm"); + exit(1); + } + close(id); close(od); + + if(pfbflag) + error = execlp("t1asm", "t1asm", "-b", NULL); + else + error = execlp("t1asm", "t1asm", NULL); + + perror("** Calling t1asm"); + + exit(1); +} + +#else +# include "t1asm.c" +#endif diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert new file mode 100644 index 00000000..35b00cfb --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert @@ -0,0 +1,367 @@ +#!/bin/sh +# +# Copyright (c) 1998-2000 +# Sergey A. Babkin. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net) +# + +# Use : convert [cfgfile] + +# Convert TTF fonts from source directory to Type1 fonts in the destination +# directory, converted to the specified encodings. Also generate the +# fonts.scale, fonts.dir and fonts.alias files in the destination directory. + +# clean some variables so that they won't be inherited from environment + +ENCDIR= +MAPDIR= + +# path to the configuration file + +if [ $# -eq 1 ] +then + CFGFILE=$1 +else + CFGFILE=`pwd`/convert.cfg +fi + +# these setting would be edited during installation + +TTF2PT1_BINDIR= +TTF2PT1_LIBXDIR= +TTF2PT1_SHAREDIR= + +[ -z "$TTF2PT1_BINDIR" ] && { + TTF2PT1_BINDIR=`pwd`/.. +} +[ -z "$TTF2PT1_LIBXDIR" ] && { + TTF2PT1_LIBXDIR=`pwd`/.. +} +[ -z "$TTF2PT1_SHAREDIR" ] && { + TTF2PT1_SHAREDIR=`pwd`/.. +} + +# directory from where we are started + +RUNDIR=`pwd` + +# paths to various utilities + +T1ASM=$TTF2PT1_LIBXDIR/t1asm +[ -f $T1ASM -a -x $T1ASM ] || { + # if it's not in libxdir, use whatever t1asm the system provides + T1ASM=t1asm +} +TTF2PT1=$TTF2PT1_BINDIR/ttf2pt1 +TRANS=$TTF2PT1_SHAREDIR/scripts/trans +T1FDIR=$TTF2PT1_SHAREDIR/scripts/t1fdir +FORCEISO=$TTF2PT1_SHAREDIR/scripts/forceiso +X2GS=$TTF2PT1_SHAREDIR/scripts/x2gs +SUFFIX="pfa" + +MYSELF=convert + +# include the configuration + +if [ -r $CFGFILE ] +then { + . $CFGFILE +} else { + echo " +Can't find the configuration file + $CFGFILE +Please look at the sample file convert.cfg.sample, +copy it to convert.cfg and modify for +you actual configuration." >&2 + exit 1 +} fi + +# path to the directory with descriptions of encodings +[ -z "$ENCDIR" ] && { + ENCDIR=$TTF2PT1_SHAREDIR/encodings +} + +# directory with the external Unicode maps +[ -z "$MAPDIR" ] && { + MAPDIR=$TTF2PT1_SHAREDIR/maps +} + +LOG=$DSTDIR/convert.log + +# configure the ttf2pt1 options from our options + +# artefact of backwards-compatibility with .cfg +[ -z "$CORRECTWIDTH" -a YES != "$DONTCORRECTWIDTH" ] && { + TTF2PT1="$TTF2PT1 -OW" +} +[ YES = "$CORRECTWIDTH" ] && { + TTF2PT1="$TTF2PT1 -OW" +} + +[ YES != "$HINTSUBST" ] && { + TTF2PT1="$TTF2PT1 -Ou" # meaning changed past 3.22 +} + +[ YES = "$ALLGLYPHS" -a YES = "$ENFORCEISO" ] && { + echo "$MYSELF: options ALLGLYPHS and ENFORCEISO are mutually exclusive" >&2 + exit 1 +} + +[ YES = "$ALLGLYPHS" ] && { + TTF2PT1="$TTF2PT1 -a" +} + +[ YES = "$GENUID" ] && { + TTF2PT1="$TTF2PT1 -uA" +} + +[ YES != "$ENFORCEISO" ] && { + FORCEISO=cat +} + +[ YES = "$CREATEPFB" ] && { + T1ASM="$T1ASM -b" + SUFFIX="pfb" +} + +# parse the information about the source files + +eval "`echo \"$SRCDIRS\" | awk ' + BEGIN { n=0; } + /^ *$/ { next; } + { + if(n>9) { + printf(\"echo \\\"Only 9 encodings are supported at once!\\\" >&2\n\"); + printf(\"exit 1\\n\"); + } else { + printf(\"SRCDIR%d=%s\n\",n,$1); + printf(\"SRCLANG%d=%s\n\",n,$2); + printf(\"SRCENC%d=%s\n\",n,$3); + printf(\"SRCMAP%d=%s\n\",n,$4); + n++; + } + }'`" + +# check whether we have the directories + +mkdir $DSTDIR 2>/dev/null >/dev/null +[ -d $DSTDIR -a -r $DSTDIR -a -w $DSTDIR -a -x $DSTDIR ] || { + echo "$MYSELF: can't access the directory $DSTDIR" >&2 + exit 1 +} + +# go to our destination directory + +cd $DSTDIR || { + echo "$MYSELF: can't chdir to $DSTDIR" >&2 + exit 1 +} + +rm -f ./* 2>/dev/null +>$LOG + +for dirno in 0 1 2 3 4 5 6 7 8 9 +do { + + SRCDIR=`eval "echo \\\$SRCDIR$dirno"` + SRCLANG=`eval "echo \\\$SRCLANG$dirno"` + SRCENC=`eval "echo \\\$SRCENC$dirno"` + SRCMAP=`eval "echo \\\$SRCMAP$dirno"` + DSTENC=`eval "echo \\\$DSTENC$SRCLANG"` + + echo $SRCDIR + echo $SRCENC + + [ -z "$SRCDIR" ] && break; + + [ "`ls $SRCDIR/*.[tT][tT][fF] 2>/dev/null |wc -l`" -gt 0 ] || { + echo "$MYSELF: no TTF files in $SRCDIR" >&2 + exit 1 + } + + # check whether we have the encoding tables + + [ -n "$SRCENC" ] || { + echo "$MYSELF: you must specify some source encoding" >&2 + exit 1 + } + + [ unknown = "$SRCLANG" -o -n "$DSTENC" ] || { + echo "$MYSELF: you must specify some destination encodings" >&2 + exit 1 + } + + # handle aliases of the destination encodings + + XDSTENC= + DSTALIAS= + + [ -r $ENCDIR/$SRCLANG/encodings.alias ] && { + for i in $DSTENC + do { + TO=`awk '$1=="'$i'" { print $2; }' <$ENCDIR/$SRCLANG/encodings.alias` + if [ -n "$TO" ] + then { + [ -f $ENCDIR/$SRCLANG/$i.tbl -a -r $ENCDIR/$SRCLANG/$i.tbl ] && { + echo "WARNING: $SRCLANG encoding $i found as both table and alias" >&2 + echo "WARNING: The alias takes precedence" >&2 + } + DSTALIAS="$TO $i +$DSTALIAS" + XDSTENC="$TO +$XDSTENC" + } else { + XDSTENC="$i +$XDSTENC" + } fi + } done + DSTENC=`echo "$XDSTENC" | sort -u | tr ' +' ' '` + } + + [ unknown != "$SRCLANG" ] && { + for i in $SRCENC $DSTENC + do { + [ -f $ENCDIR/$SRCLANG/$i.tbl -a -r $ENCDIR/$SRCLANG/$i.tbl ] || { + echo "$MYSELF: can't read $ENCDIR/$SRCLANG/$i.tbl" >&2 + exit 1 + } + } done + } + + # OK convert the files + + for file in $SRCDIR/*.[tT][tT][fF] + do { + name=`echo $file | tr A-Z a-z` + name=`basename $name .ttf` + + echo "Converting $name" + + # generate the assembler code + + echo "******* $name -> t1a ************" >>$LOG + + if [ -n "$SRCMAP" ] + then { + $TTF2PT1 -L $MAPDIR/$SRCMAP $file ./$name.$SRCENC 2>>$LOG + } else { + $TTF2PT1 -l $SRCLANG $file ./$name.$SRCENC 2>>$LOG + } fi + + [ -s ./$name.$SRCENC.t1a ] || { + echo "$MYSELF: can't generate Type1 assembler code for $name" >&2 + continue; + } + + [ -s ./$name.$SRCENC.afm ] || { + echo "$MYSELF: can't generate AFM metrics file for $name" >&2 + continue; + } + + mv ./$name.$SRCENC.afm ./$name.$SRCENC.xafm + + psname=`$T1FDIR -g $FOUNDRY " " -f ./$name.$SRCENC.t1a \ + | awk '{print substr($1,2);}'` + + # now for each destination encoding generate a .pfa/b file + # and record for fonts.scale + + if [ unknown != "$SRCLANG" ] + then { + for enc in $DSTENC + do { + echo "******* $name -> $enc ************" >>$LOG + + sed 's|^\/FontName.*$|/FontName /'$psname$enc' def|' <./$name.$SRCENC.t1a \ + | $TRANS $ENCDIR/$SRCLANG/$SRCENC.tbl $ENCDIR/$SRCLANG/$enc.tbl \ + | $FORCEISO | $T1ASM >./$name.$enc.$SUFFIX + [ -s ./$name.$enc.$SUFFIX ] || { + echo "$MYSELF: can't convert/assemble Type1 file for $name.$enc" >&2 + continue; + } + + sed 's|^FontName.*$|FontName '$psname$enc'|' <./$name.$SRCENC.xafm \ + | $TRANS $ENCDIR/$SRCLANG/$SRCENC.tbl $ENCDIR/$SRCLANG/$enc.tbl \ + | uniq | $FORCEISO >./$name.$enc.afm + [ -s ./$name.$enc.afm ] || { + echo "$MYSELF: can't convert AFM file for $name.$enc" >&2 + } + + aliases=`echo "$DSTALIAS" | grep "^$enc" | cut -d\ -f2` + echo "******* aliases: $aliases" >>$LOG + + $T1FDIR -d fonts.ttf fonts.alias $FOUNDRY $enc $aliases -f ./$name.$enc.$SUFFIX + echo "/$psname$enc ($name.$enc.$SUFFIX) ;" >>Fontmap.ttf + } done + } else { + enc="$SRCENC" + echo "******* $name -> $enc ************" >>$LOG + + sed 's|^\/FontName.*$|/FontName /'$psname$enc' def|' <./$name.$SRCENC.t1a \ + | $FORCEISO | $T1ASM >./$name.$enc.$SUFFIX + [ -s ./$name.$enc.$SUFFIX ] || { + echo "$MYSELF: can't convert/assemble Type1 file for $name.$enc" >&2 + continue; + } + + sed 's|^FontName.*$|FontName '$psname$enc'|' <./$name.$SRCENC.xafm \ + | uniq | $FORCEISO >./$name.$enc.afm + [ -s ./$name.$enc.afm ] || { + echo "$MYSELF: can't convert AFM file for $name.$enc" >&2 + } + + $T1FDIR -d fonts.ttf fonts.alias $FOUNDRY $enc -f ./$name.$enc.$SUFFIX + echo "/$psname$enc ($name.$enc.$SUFFIX) ;" >>Fontmap.ttf + } fi + + [ YES = "$REMOVET1A" ] && { + rm -f ./$name.$SRCENC.t1a + rm -f ./$name.$SRCENC.xafm + } + + } done +} done + +wc -l fonts.scale +cat fonts.ttf >>fonts.scale +mkfontdir + +[ YES = "$GENUID" ] && { + echo "Checking for duplicate UniqueIDs..." + for id in `find . -name "*.$SUFFIX" -exec grep UniqueID {} \; \ + | cut -d" " -f2 | sort | uniq -d` + do { + echo "Warning: duplicate UniqueID $id in files:" | tee -a $LOG + find . -name "*.$SUFFIX" -exec grep -l "UniqueID $id " {} \; 2>&1 | tee -a $LOG + } done +} + +[ -n "$GSDIR" ] || { + echo "$MYSELF: The Ghostscript base directory is not specified.\n" >&2 + echo "$MYSELF: Installation of the Ghostscript fonts is deferred.\n" >&2 + echo "$MYSELF: You can do it later by running x2gs\n" >&2 + exit 0 +} + +echo "Installing the Ghostscript fonts" +cd $RUNDIR +$X2GS $CFGFILE || { + echo "$MYSELF: Installation of the Ghostscript fonts has failed.\n" >&2 + echo "$MYSELF: You can correct the problem and run x2gs to repeat\n" >&2 + exit 0 +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert.cfg.sample b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert.cfg.sample new file mode 100644 index 00000000..4adf8e0d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert.cfg.sample @@ -0,0 +1,192 @@ +#!/bin/sh +# +# Copyright (c) 1998, 1999 +# Sergey A. Babkin. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net) +# + +# Configuration file for the conversion script. +# Convert TTF fonts from source directory to Type1 fonts in the destination +# directory, converted to the specified encodings. Also generate the +# fonts.scale, fonts.dir and fonts.alias files in the destination +# directory. + +# This file is an example of configuration. It contains +# the examples of settings for all the supported languages. +# Please check the settings and change them for +# your needs. + +# The directories with source TTF files. +# The lines are formatted in 3 columns: +# - directory path +# - language name +# - encoding of the fonts in this directory +# - optional Unicode map file name +# There should be a separate directory for each input encoding. +# No more than 10 encodings are supported now for +# one conversion. +# +# If the Unicode map file name is specified then this +# external map file will be used to encode the resulting +# font. Otherwise the built-in table for this language +# will be used. If you have some special encoding map that +# does not conform to any of the defined languages, set the +# language name to 'unknown' and encoding name to whatever +# you want to see in the X11 logical font description. +# +# NOTES: +# For Russian, Bulgarian and English (as a subset of +# Western) languages you may pile together the Unicode +# fonts and the fonts in the Windows encoding into the same +# directory, they will be sorted out automatically. For +# the Russian and Bulgarian Unicode fonts set the +# source encoding to ibm-1251. +# +# For Turkish, Baltic, Central European and other Western +# European languages the resulting fonts will be in +# a proper iso8859 encoding only if the source fonts +# are in Unicode. +# +# AdobeStd encoding will work only +# for the source font in Unicode encoding which +# either have proper character names or map the +# Adobe character extensions to the expected codes +# (or both). +# +# The external maps work only if the source fonts +# are in Unicode, otherwise the original font's +# encoding will be preserved. +# +# Better don't use the map adobe-standard-encoding.map, +# unless you really need it, it's very incomplete. +# +# The map planes are not supported in the scripts yet. + +SRCDIRS=" +/SOME_DIR_WITH_cyrillic_windows_TTF_FONTS cyrillic ibm-1251 +/SOME_DIR_WITH_cyrillic_koi_TTF_FONTS cyrillic koi8-r +/SOME_DIR_WITH_unicode_TTF_FONTS latin4 iso8859-4 +/SOME_DIR_WITH_unicode_TTF_FONTS latin5 iso8859-9 +/SOME_DIR_WITH_unicode_TTF_FONTS latin2 iso8859-2 +/SOME_DIR_WITH_western_TTF_FONTS latin1 iso8859-1 +/SOME_DIR_WITH_unicode_TTF_FONTS adobestd adobe-std +/SOME_DIR_WITH_weird_unicode_TTF_FONTS adobestd adobe-std adobe-standard-encoding.map +/SOME_DIR_WITH_unicode_TTF_FONTS unknown my-special some-very-special.map +" + +# the directory for converted X11 fonts +DSTDIR=/usr/X11R6/lib/X11/fonts/fromttf + +# The base directory of Ghostscript; +# set it to empty space if you don't want the Ghostscript fonts installed. +# For some systems the directory is /usr/share/ghostscript. +GSDIR=/usr/local/share/ghostscript + +# The font directory of Ghostscript; +# should work for all the versions of Ghostscript. Except (as always) the one +# packaged with Red Hat Linux 6.0. For RH6.0 it should be set to either +# /usr/share/fonts/default/ghostscript or /usr/share/fonts/default/Type1. +GSFONTDIR=$GSDIR/fonts + +# The configuration directory of Ghostscript where the Fontmap file is stored; +# the example is for Ghostscript 6.0, change for the version you actually +# have. This directory is used only to reach the Fontmap file, so if your +# installation stores the Fontmap files in the same directory as fonts +# (like Debian Linux does - isn't Linux wonderful in its differences?) +# then set it to the same value as GSFONTDIR. +GSCONFDIR=$GSDIR/6.0 + +# The encodings of generated files by languages +# (see the whole list of possible encodings for each +# language in the directories encoding/ ) +# +# Here prefer windows-1251 over ibm-1251: it aliases +# to the same thing but is the name expected by +# Netscape Navigator. For the same reason prefer +# cp-866 over ibm-866. + +DSTENCcyrillic="koi8-r windows-1251 iso8859-1" +DSTENClatin1="iso8859-1" +DSTENClatin2="iso8859-2" +DSTENClatin4="iso8859-4" +DSTENClatin5="iso8859-9" +DSTENCadobestd="adobe-std" + +# name of foundry for generated fonts +# (for HP-UX or if you just want to use an +# honest name change to "misc") +FOUNDRY=fromttf + +# If you want to use non-standard directories with encoding +# maps and tables then set these values + +MAPDIR= +ENCDIR= + +# Options: +# set the value to YES to enable, NO (or anything else) to disable + +# CORRECTWIDTH - use the option "-w" of converter. Set this +# option to NO if your fonts are well-designed. At least some +# freeware fonts have the width metrics broken and the letters +# look smashed into each other. If this option is set to "YES" +# the converter tries to correct this defect but this may have slight +# side effects on the well-designed fonts: the characters that +# are designed to be close to each other will get wider spacing. +# REMOVET1A - remove the un-encoded .t1a files after they are converted +# and assembled if this option set to YES +# INSTALLFONTMAP - if set to YES install the entries for the converted +# fonts right into the Ghostscript Fontmap file. Otherwise just +# symlink the font files and copy Fontmap.ttf to the Ghostscript +# directories. +# HINTSUBST - enable the hint substitution (option "-H" of +# converter). You may want to compare the looks of the fonts with and +# without this option and decide what is better (see the discussion in +# the README file). If the fonts with this option set to YES look +# completely empty in X11 then set this option to NO or install +# the supplied patches. +# ENFORCEISO - try to disguise the character names according to +# the ISOLatin1 encoding table. Set it to YES if some program +# expects strictly the ISO names but the fonts have different +# character names (this is not the case for X11 any more). +# Options ENFORCEISO and ALLGLYPHS can't be both set to YES. +# ALLGLYPHS - include all the glyphs (characters) from the source +# fonts into the resulting fonts, even if those are not +# included into the encoding tables. If the supplied X11 +# patches are not installed this may cause font size overflow +# in X11. So if you are not sure better leave it as NO. +# For more details see the discussion of the option "-a". +# GENUID - automatically generate UniqueID for all the fonts. +# Setting it to YES may be useful only for the fonts to +# be loaded the fonts into a printer with hard disk. Be +# advised that although unlikely the generated UniqueIDs +# for two fonts may coincide, then the consequences will +# be unpredictable. +# CREATEPFB - if set to YES create .pfb font files, otherwise +# .pfa font files. The .pfb files take somewhat less disk +# space but contain 8-bit binary data. + +CORRECTWIDTH=YES +REMOVET1A=YES +INSTALLFONTMAP=YES +HINTSUBST=NO +ENFORCEISO=NO +ALLGLYPHS=NO +GENUID=NO +CREATEPFB=YES + +# End of the configuration file diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/forceiso b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/forceiso new file mode 100644 index 00000000..34f925e8 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/forceiso @@ -0,0 +1,450 @@ +#!/usr/bin/perl +# +# Copyright (c) 1998 +# Sergey A. Babkin. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net) +# + +# +# Force the font to use the encoding as close to ISO Latin-1 as possible +# +# Use: +# forceiso [format] file2.t1a +# where format is a printf-type format used to select names for the +# glyphs without standard Latin-1 names. It must expect one argument, +# the character code. The default format is "_%d". + +%latin1=( + 0, "", + 1, "", + 2, "", + 3, "", + 4, "", + 5, "", + 6, "", + 7, "", + 8, "", + 9, "", + 10, "", + 11, "", + 12, "", + 13, "", + 14, "", + 15, "", + 16, "", + 17, "", + 18, "", + 19, "", + 20, "", + 21, "", + 22, "", + 23, "", + 24, "", + 25, "", + 26, "", + 27, "", + 28, "", + 29, "", + 30, "", + 31, "", + 32, "space", + 33, "exclam", + 34, "quotedbl", + 35, "numbersign", + 36, "dollar", + 37, "percent", + 38, "ampersand", + 39, "quoteright", + 40, "parenleft", + 41, "parenright", + 42, "asterisk", + 43, "plus", + 44, "comma", + 45, "hyphen", + 46, "period", + 47, "slash", + 48, "zero", + 49, "one", + 50, "two", + 51, "three", + 52, "four", + 53, "five", + 54, "six", + 55, "seven", + 56, "eight", + 57, "nine", + 58, "colon", + 59, "semicolon", + 60, "less", + 61, "equal", + 62, "greater", + 63, "question", + 64, "at", + 65, "A", + 66, "B", + 67, "C", + 68, "D", + 69, "E", + 70, "F", + 71, "G", + 72, "H", + 73, "I", + 74, "J", + 75, "K", + 76, "L", + 77, "M", + 78, "N", + 79, "O", + 80, "P", + 81, "Q", + 82, "R", + 83, "S", + 84, "T", + 85, "U", + 86, "V", + 87, "W", + 88, "X", + 89, "Y", + 90, "Z", + 91, "bracketleft", + 92, "backslash", + 93, "bracketright", + 94, "asciicircum", + 95, "underscore", + 96, "grave", + 97, "a", + 98, "b", + 99, "c", + 100, "d", + 101, "e", + 102, "f", + 103, "g", + 104, "h", + 105, "i", + 106, "j", + 107, "k", + 108, "l", + 109, "m", + 110, "n", + 111, "o", + 112, "p", + 113, "q", + 114, "r", + 115, "s", + 116, "t", + 117, "u", + 118, "v", + 119, "w", + 120, "x", + 121, "y", + 122, "z", + 123, "braceleft", + 124, "bar", + 125, "braceright", + 126, "asciitilde", + 127, "", + 128, "", + 129, "", + 130, "", + 131, "", + 132, "", + 133, "", + 134, "", + 135, "", + 136, "", + 137, "", + 138, "", + 139, "", + 140, "", + 141, "", + 142, "", + 143, "", + 144, "", + 145, "", + 146, "", + 147, "", + 148, "", + 149, "", + 150, "", + 151, "", + 152, "", + 153, "", + 154, "", + 155, "", + 156, "", + 157, "", + 158, "", + 159, "", + 160, "", + 161, "exclamdown", + 162, "cent", + 163, "sterling", + 164, "currency", + 165, "yen", + 166, "brokenbar", + 167, "section", + 168, "dieresis", + 169, "copyright", + 170, "ordfeminine", + 171, "guillemotleft", + 172, "logicalnot", + 173, "minus", + 174, "registered", + 175, "macron", + 176, "degree", + 177, "plusminus", + 178, "twosuperior", + 179, "threesuperior", + 180, "acute", + 181, "mu", + 182, "paragraph", + 183, "periodcentered", + 184, "cedilla", + 185, "onesuperior", + 186, "ordmasculine", + 187, "guillemotright", + 188, "onequarter", + 189, "onehalf", + 190, "threequarters", + 191, "questiondown", + 192, "Agrave", + 193, "Aacute", + 194, "Acircumflex", + 195, "Atilde", + 196, "Adieresis", + 197, "Aring", + 198, "AE", + 199, "Ccedilla", + 200, "Egrave", + 201, "Eacute", + 202, "Ecircumflex", + 203, "Edieresis", + 204, "Igrave", + 205, "Iacute", + 206, "Icircumflex", + 207, "Idieresis", + 208, "Eth", + 209, "Ntilde", + 210, "Ograve", + 211, "Oacute", + 212, "Ocircumflex", + 213, "Otilde", + 214, "Odieresis", + 215, "multiply", + 216, "Oslash", + 217, "Ugrave", + 218, "Uacute", + 219, "Ucircumflex", + 220, "Udieresis", + 221, "Yacute", + 222, "Thorn", + 223, "germandbls", + 224, "agrave", + 225, "aacute", + 226, "acircumflex", + 227, "atilde", + 228, "adieresis", + 229, "aring", + 230, "ae", + 231, "ccedilla", + 232, "egrave", + 233, "eacute", + 234, "ecircumflex", + 235, "edieresis", + 236, "igrave", + 237, "iacute", + 238, "icircumflex", + 239, "idieresis", + 240, "eth", + 241, "ntilde", + 242, "ograve", + 243, "oacute", + 244, "ocircumflex", + 245, "otilde", + 246, "odieresis", + 247, "divide", + 248, "oslash", + 249, "ugrave", + 250, "uacute", + 251, "ucircumflex", + 252, "udieresis", + 253, "yacute", + 254, "thorn", + 255, "ydieresis" +); + +# how to treat the unknown characters +$unk = "_%d"; + +if($#ARGV >= 0) { + $unk = $ARGV[0]; +} + +# fill in the unnamed characters +if( sprintf($unk, 0) eq sprintf($unk, 1) ) { + die "The format for unnamed characters must not be a constant" +} +for($i=0; $i < 256; $i++) { + if($latin1{$i} eq "") { + $latin1{$i} = sprintf($unk, $i); + } +} + +while() { + print $_; + if(/^\/Encoding\s+.*\s+array/) { + $fontfile=1; + last; + } + if(/^StartCharMetrics\s+/) { + $fontfile=0; + last; + } +} + +$ndups=0; + +if($fontfile) { # .t1a file + while() { + if($_ !~ /^dup\s+(\d+)\s+\/(\S+)\s+put/) { + print $_; + last; + } + $code=$1+0; + $name=$2; + if($name eq ".notdef") { + print $_; + } else { + printf("dup %d /%s put\n",$code,$latin1{$code}); + if($trans{$name}) { # two or more references to the same glyph + $ndups++; + #printf(STDERR "forceiso: %d dups\n", $ndups); + if($copies{$name} eq "") { + $copies{$name} = $latin1{$code}; + } else { + $copies{$name} .= "|" . $latin1{$code}; + } + } else { + $trans{$name}=$latin1{$code}; + } + } + + } + + while() { + if( /\/CharStrings\s+(\d+)\s/) { + $nchars=$1+$ndups; + #printf(STDERR "forceiso: %d dups %d chars\n", $ndups, $nchars); + $_ =~ s|/CharStrings\s+\d+\s|/CharStrings $nchars |; + print $_; + last; + } + print $_; + } + + while() { + if(/^\/(\S+)/) { + $name=$1; + $to=$trans{$name}; + + $header=$_; + $body=""; + + if($to ne "") { + $_ =~ s/^\/\S+/\/$to/; + } + print $_; + } elsif(/endchar/) { + print $_; + if($copies{$name}) { + for $to (split(/\|/,$copies{$name})) { + $header =~ s/^\/\S+/\/$to/; + print($header, $body, $_); + } + } + } else { + print $_; + $body .= $_; + } + } +} else { # .afm file + while() { + if($_ !~ /^C\s+(\d+)(\s*;.*N\s+)(\S+)(\s*;.*)\n/) { + print $_; + last; + } + $code=$1+0; + $name=$3; + $part2=$2; + $part4=$4; + if($name eq ".notdef") { + print $_; + } else { + printf("C %d%s%s%s\n",$code,$part2,$latin1{$code},$part4); + if($copies{$name} eq "") { + $copies{$name} = $latin1{$code}; + } else { + $copies{$name} .= "|" . $latin1{$code}; + $ndups++; + #printf(STDERR "forceiso: %d dups\n", $ndups); + } + } + + } + + while() { + if(/^StartKernPairs\s+(\d+)/) { + last; + } + print $_; + } + + $npairs=0; + $kps=""; + while() { + if(/^KPX\s+(\S+)\s+(\S+)\s+(.*)\n/) { + $name1=$1; + $name2=$2; + $metric=$3; + + $cp1=$copies{$name1}; + if($cp1 eq "") { + $cp1=$name1; + } + + $cp2=$copies{$name2}; + if($cp2 eq "") { + $cp2=$name2; + } + + for $to1 (split(/\|/,$cp1)) { + for $to2 (split(/\|/,$cp2)) { + $kps .= sprintf("KPX %s %s %s\n", $to1, $to2, $metric); + $npairs++; + } + } + } else { + if($npairs!=0) { + printf("StartKernPairs %d\n", $npairs); + printf("%s", $kps); + $npairs=0; + $kps=""; + } + print $_; + } + } +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/frommap b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/frommap new file mode 100644 index 00000000..f32280c2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/frommap @@ -0,0 +1,24 @@ +#!/usr/bin/perl +# +# A script to convert a Unicode character map to +# the C code +# + +sub fromhex +{ + return eval "0x".$_[0]; +} + +$inmap=0; + +while(<>) +{ + if(/^CHARMAP/) { + $inmap=1; + } elsif(/^END CHARMAP/) { + $inmap=0; + } elsif($inmap + && /^\s*\S+\s+\/x([0-9a-fA-F][0-9a-fA-F])\s+\ [] ] is the directory where the man pages will be created +# (current directory by default). If a file name is given instead of +# directory then the directory of that file is used. +# is the directory containing the ttf2pt1 files version.h +# and CHANGES.html which are used to generate the release name and date +# for the man page (by default looks in current directory and then in up to +# 5 ancestor directories). +# If the version files can not be found then the release defaults to +# "current" and the date defaults to today. +# +# Special formatting in the html file is: +# All controls are hidden within HTML comments that must occupy a whole separate line +# Such a line looks like: +# +# +# Any sort of directive must be followed by a space. The pod directives are +# automatically surrounded by empty lines in the output file. +# The html2man directives are: +# +# +# Define a man page. Multiple man pages can be defined in the same HTML +# file. is a short name by which this man page will be referred in the +# other directives. is the name of the man page, and

is the +# section of the manual (do not confuse with sections within a man page). +# +# +# All the text following this directive is copied (with translation) +# into the specified section of the specified man page. The sections +# may appear in arbitrary order, they will be rearranged to the standard +# order before output. Only standard section names are permitted (see @stdsect +# below). The pod directives which occur outside of man sections are ignored, +# just like the common text. The translation of HTML tags is: +# +#
- to paragraph break +# - to B<> +# - to I<> +# - to C<> +#
- to F<> +#
    ,
  • ,
- to =over 2, =item *, =back +#  , &, <, > - to their symbols, appropriately encoded +# +# The rest of HTML tags is removed +# +# If the same section is started more than once, the text from the +# second appearance will be added to the first, etc. +# +# +# Stop copying text to the man page. +# +# +# Continue copying text to the man page, same section as before. +# +# +# Insert this into the man page (works only when copying is enabled). +# Characters <, >, & are converted as usual. + +@mons = qw(January February March April May June July August September October November December); + +$dir = $ARGV[0]; +$maindir = $ARGV[1]; + +if($dir eq "") { + $dir = "."; +} elsif( ! -d $dir ) { + if( ! ($dir =~ s|\/[^/]*$||) ) { + $dir = "."; + } +} +if($maindir eq "") { + $maindir = "."; + for($i=0; $i<5; $i++) { + if(-f "$maindir/version.h") { + last; + } + $maindir = "../$maindir"; + } +} + +if( open(VERFILE, "<$maindir/version.h") ) { + while() { + if( /^\s*\#define\s+TTF2PT1_VERSION\s+\"(.*)\"/ ) { + $release = "version $1"; + } + } + close(VERFILE); + if( $release =~ /SNAP-([0-9][0-9])([0-9][0-9])([0-9][0-9])/ ) { + $date = sprintf("%s %d, 20%02d", $mons[$2-1], $3, $1); + } elsif( open(CFILE, "<$maindir/CHANGES.html") ) { + while() { + if( /\/) { + last; + } + } + $_ = ; + chomp; + if( $_ =~ s/^.*?-- // ) { + $date = $_; + } + close(CFILE); + } +} + +if($release eq "") { + $release = "current"; +} +if($date eq "") { + @lt = localtime(time); + $date = sprintf("%s %d, %d", $mons[$lt[4]], $lt[3], 1900+$lt[5]); +} + +#printf(STDERR "date=%s release=%s\n", $date, $release); + +$writemode = 0; + +while() { + if( s/^\<\!\-\- \=(\S+)\s+//) { + $cmd = $1; + s/\s*--\>\s*$//; + #printf(STDERR "cmd=%s args=%s\n", $cmd, $_); + if($cmd =~ /^=/) { + if($writemode) { + $text{$tosect} .= "\n\n$cmd $_\n\n"; + } + } elsif($cmd eq "defdoc") { + @sl = split; + push(@allids, $sl[0]); + $file{$sl[0]} = $sl[1]; + $mansect{$sl[0]} = $sl[2]; + } elsif($cmd eq "section") { + # tosect includes the file id + $tosect = $_; + $text{$tosect} .= "\n\n"; + $writemode = 1; + } elsif($cmd eq "stop") { + $writemode = 0; + $text{$tosect} .= "\n"; + } elsif($cmd eq "cont") { + $writemode = 1; + } elsif($cmd eq "text") { + if($writemode) { + s/\<\;//gi; + s/\&\;/\&/gi; + $text{$tosect} .= "$_\n"; + } + } + } elsif($writemode) { + s/^\s+//; + + s/\{/\&lbr;/g; + s/\}/\&rbr;/g; + + s/\/\n\n/gi; + #s/\/\n\n=over 4\n\n/gi; + #s/\<\/blockquote\>/\n\n=back\n\n/gi; + s/\/\n\n=over 4\n\n/gi; + s/\<\/ul\>/\n\n=back\n\n/gi; + s/\\s*/\n\n=item \*\n\n/gi; + s/\(.*?)\<\/i\>/I\{\1\}/gi; + s/\(.*?)\<\/b\>/B\{\1\}/gi; + s/\(.*?)\<\/tt\>/C\{\1\}/gi; + s/\
(.*?)\<\/a\>/F\{\1\}/gi; + s/\<.*?\>//g; + s/\{/\/g; + + s/\ \;/S< >/gi; + s/\&\;/\&/gi; + s/\<\;/E/gi; + s/\>\;/E/gi; + #s/\|/E/g; + #s/\//E/g; + s/\&lbr\;/\{/g; + s/\&rbr\;/\}/g; + + #printf(STDERR "section=%s add=%s", $tosect, $_); + $text{$tosect} .= $_; + } +} + +@stdsect = ( + "NAME", + "SYNOPSIS", + "DESCRIPTION", + "OPTIONS", + "RETURN VALUE", + "ERRORS", + "EXAMPLES", + "ENVIRONMENT", + "FILES", + "SEE ALSO", + "NOTES", + "CAVEATS", + "DIAGNOSTICS", + "BUGS", + "RESTRICTIONS", + "AUTHOR", + "HISTORY" ); + +#printf(STDERR "allids= @allids\n"); +for $id (@allids) { + #print(STDERR "creating man page $id $file{$id} $mansect{$id}\n\n"); + die "Unable to create pod file $dir/$file{$id}.pod" + unless open(PODF, ">$dir/$file{$id}.pod"); + print(PODF "=pod\n\n"); + for $sect (@stdsect) { + $sid = "$id $sect"; + #printf(STDERR "trying %s\n", $sid); + if(defined $text{$sid}) { + print(PODF "=head1 $sect\n\n$text{$sid}\n\n"); + } + } + print(PODF "=cut\n"); + close(PODF); + die "Unable to generate the man page $dir/$file{$id}.1" + if system("pod2man --section=\"$mansect{$id}\" --release=\"$release\" " + . "--center=\"TTF2PT1 Font Converter\" --date=\"$date\" " + . "$dir/$file{$id}.pod >$dir/$file{$id}.1"); + + unlink("$dir/$file{$id}.pod"); +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_dir b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_dir new file mode 100644 index 00000000..7bc10f4c --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_dir @@ -0,0 +1,43 @@ +#!/usr/bin/perl +# +# Script to create a directory for installation +# +# (c) 2000 by The TTF2PT1 Project +# See COPYRIGHT for full license +# + +if( $#ARGV!=0 && $#ARGV !=3) { + die "Use: $0 dir-name [owner group mode]\n" +} + +if( $#ARGV==3 ) { + $owner = $ARGV[1]; + $group = $ARGV[2]; + eval "\$mode = 0$ARGV[3];"; +} else { + $owner = "root"; + $group = "bin"; + $mode = 0755; +} + +@sl = split(/\//, $ARGV[0]); +$prefix = shift(@sl); +if($prefix eq "") { + $prefix = "/" . shift(@sl); +} + +while(1) { + if( ! -d "$prefix" ) { + die "Unable to create directory $prefix:\n$!\n" + unless mkdir($prefix, $mode); + die "Unable to change owner of $prefix to $owner\n" + if system("chown $owner $prefix"); + die "Unable to change group of $prefix to $group\n" + if system("chgrp $group $prefix"); + } + if($#sl < 0) { + last; + } + $prefix .= "/" . shift(@sl); +} +exit(0); diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_file b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_file new file mode 100644 index 00000000..d3758671 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_file @@ -0,0 +1,17 @@ +#!/bin/sh +# +# Script to install a file (for portability reasons) +# +# (c) 2000 by The TTF2PT1 Project +# See COPYRIGHT for full license +# + +[ $# != 5 ] && { + echo "Use: $0 file-from file-to owner group mode" >&2 + exit 1 +} + +cp -f $1 $2 \ +&& chown $3 $2 \ +&& chgrp $4 $2 \ +&& chmod 0$5 $2 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/mkrel b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/mkrel new file mode 100644 index 00000000..e4ac93de --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/mkrel @@ -0,0 +1,104 @@ +#!/bin/sh +# +# See COPYRIGHT +# +# Script to create a release or shapshot archive. +# Also checks for very basic inconsistences. +# Expects that it would be run from the current directory of ttf2pt1, +# and that the parent directory is the place to create archives. +# Expects that the CVS environment variables are set properly. + +VER=`grep TTF2PT1_VERSION version.h | cut -d\" -f2` + +case "$1" in +snapshot) + echo "$VER" | egrep '^[0-9][0-9]*\.[0-9].*-CURRENT$' || { + echo "mkrel: version.h must contain *-CURRENT to create a snapshot" >&2 + exit 1 + } + grep "^current$" CHANGES.html >/dev/null || { + echo "mkrel: CHANGES.html must list 'current' to create a snapshot" >&2 + exit 1 + } + snapdate=`date "+ %y %m %d " | sed 's/ \([0-9]\) / 0& /g;s/ //g'` + NEWVER=`echo "$VER" | sed "s/-CURRENT/-SNAP-$snapdate/"` + TAG="-D tomorrow" + ;; +release) + echo "$VER" | egrep '^[0-9][0-9]*\.[0-9][.0-9]*$' || { + echo "mkrel: version.h must not be -CURRENT to create a release" >&2 + exit 1 + } + grep "^$VER -- " CHANGES.html >/dev/null || { + echo "mkrel: CHANGES.html must list the same version as version.h" >&2 + exit 1 + } + NEWVER="$VER" + TAG=`echo "-r ttf2pt1-$VER" | sed \ + 's/\(-[0-9][0-9]*\.[0-9]\)$/&.0/;s/\./-/g'` + ;; +*) + echo "use: mkrel [snapshot|release]" >&2 + exit 1 + ;; +esac + +cd .. || { + echo "mkrel: can't cd to .." >&2 + exit 1 +} + +rm -f ttf2pt1-$NEWVER.tgz ttf2pt1-$NEWVER.zip +rm -rf ttf2pt1-$NEWVER + +echo "cvs -z9 export $TAG -d ttf2pt1-$NEWVER ttf2pt1" +cvs -z9 export $TAG -d ttf2pt1-$NEWVER ttf2pt1 || { + echo "mkrel: unable to export from CVS" >&2 + echo "mkrel: check that the CVS tree is properly tagged" >&2 + exit 1 +} + + +# a little bit more for snapshot: correct the version +( +case "$1" in +snapshot) + cd ttf2pt1-$NEWVER || { + echo "mkrel: can't cd to ../ttf2pt1-$NEWVER" >&2 + exit 1 + } + + sed "s/^current\$/$NEWVER/" CHANGES.html.new \ + && mv CHANGES.html.new CHANGES.html || { + echo "mkrel: can't update CHANGES.html" >&2 + exit 1 + } + + sed "s/\".*-CURRENT\"/\"$NEWVER\"/" version.h.new \ + && mv version.h.new version.h || { + echo "mkrel: can't update version.h" >&2 + exit 1 + } + ;; +esac +) + +# generate the man pages - in case if the users would have no pod2man +( + cd ttf2pt1-$NEWVER || { + echo "mkrel: can't cd to ../ttf2pt1-$NEWVER" >&2 + exit 1 + } + + make mans +) + +tar czvf ttf2pt1-$NEWVER.tgz ttf2pt1-$NEWVER || { + echo "mkrel: can't create .tgz archive" >&2 + exit 1 +} + +zip -u -r ttf2pt1-$NEWVER.zip ttf2pt1-$NEWVER || { + echo "mkrel: can't create .zip archive" >&2 + exit 1 +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/t1fdir b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/t1fdir new file mode 100644 index 00000000..16c86530 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/t1fdir @@ -0,0 +1,227 @@ +#!/usr/bin/perl +# +# Copyright (c) 1998 +# Sergey A. Babkin. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net) +# + +# +# Script that reads the Type1 font files and prints out the fonts.scale +# lines for them +# + +# other substrings (regexps) that are considered irrelevant +# and sould be removed from the font names: +@wrongstr= ( + "koi8r", + "koi8", + "cp1251", + "ibm1251", + "win1251", + "cp866", + "ibm866", + "iso8859[1-9]", + "iso8859", + "isolatin[0-9]", + "isolatin", + "latin[0-9]", + "^ER ", + "^K8 ", +); + +sub usage +{ + print STDERR "Use: \n"; + print STDERR " t1fdir [-g] ... [ -f ...]\n"; + print STDERR "or\n"; + print STDERR " t1fdir -d fonts.scale fonts.alias ... [ -f ...]\n"; +} + +$ghost=0; +if( $ARGV[0] eq "-g" ) { + shift @ARGV; + $ghost=1; +} elsif( $ARGV[0] eq "-d" ) { + shift @ARGV; + $files=1; + $scalef=shift @ARGV; + $aliasf=shift @ARGV; +} + +if($#ARGV<2) { + &usage(); + exit 1; +} + +$foundry=$ARGV[0]; +shift @ARGV; + +while($#ARGV>=0) { + if($ARGV[0] eq "-f") { + shift @ARGV; + last; + } + push(@encodings,$ARGV[0]); + shift @ARGV; +} + +if($files) { + open(SCALEF, ">>$scalef") || die "Can't write to $scalef"; + open(ALIASF, ">>$aliasf") || die "Can't write to $aliasf"; +} +for $name (@ARGV) { + + $familyname=""; + $fullname=""; + $fontname=""; + $weight=""; + $angle=0; + + open(FILE,"<$name") || die "Unable to open file $name\n"; + + $type="p"; # by default + + while() { + if(/eexec/) { last; } + if(/^\/FamilyName.*\((.+)\)/ ) { $familyname= $1; } + if(/^\/FullName.*\((.+)\)/ ) { $fullname= $1; } + if(/^\/FontName.*\((.+)\)/ ) { $fontname= $1; } + if(/^\/Weight.*\((.+)\)/ ) { $weight= $1; } + if(/^\/ItalicAngle.*(\d+)/ ) { $angle= $1+0; } + if(/^\/isFixedPitch/) { + if(/true/) { + $type="m"; + } else { + $type="p"; + } + } + } + + # now try to interpret this information + + $allinfo= $familyname ." ". $fullname ." ". $fontname ." ". $weight; + $lcallinfo=$allinfo; + $lcallinfo=~tr[A-Z][a-z]; + + $familyname.="_"; # just a delimiter for substitutions + $familyname=~s/Bold([^a-z])/$1/g; + $familyname=~s/Italic([^a-z])/$1/g; + $familyname=~s/Oblique([^a-z])/$1/g; + $familyname=~s/Roman([^a-z])/$1/g; + + for $i (@wrongstr) { # for uppercase- and space- sensitive strings + $familyname =~ s/$i//g; + } + + $familyname=~tr[A-Z][a-z]; + $familyname=~tr[A-Za-z0-9][]cd; + + for $i (@wrongstr) { # for case-insensitive strings + $familyname =~ s/$i//g; + } + + if( $familyname eq "") { + $familyname="unknown"; + } + + $fn=$name; + $fn=~ s/.*\///g; + + $n=0; + for $encoding (@encodings) { + $n++; + if($ghost) { + printf("/%s-", uc(substr($familyname,0,1)).substr($familyname,1)); + + $r=1; + + if( $allinfo =~ /Bold[^a-z]/ + || $lcallinfo =~ /\bbold\b/ ) { + printf("Bold"); + $r=0; + } + if( $allinfo =~ /Italic[^a-z]/ + || $lcallinfo =~ /\bitalic\b/ + || $angle>0 ) { + printf("Italic"); + $r=0; + } elsif( $allinfo =~ /Oblique[^a-z]/ + || $lcallinfo =~ /\boblique\b/ + || $angle<0 ) { + printf("Oblique"); + $r=0; + } + + if($r) { + printf("Roman"); + } + + printf("-%s\t (%s) ;\n",$encoding,$fn); + } else { + $xenc=$encoding; + $xenc =~ s/\-/_/g; + + $srec = sprintf("-%s-%s_%s-",$foundry,$familyname,$xenc); + $arec = sprintf("-%s-%s-",$foundry,$familyname); + + if( $allinfo =~ /Bold[^a-z]/ + || $lcallinfo =~ /\bbold\b/ ) { + $srec .= "bold-"; + $arec .= "bold-"; + } else { + $srec .= "medium-"; + $arec .= "medium-"; + } + + if( $allinfo =~ /Italic[^a-z]/ + || $lcallinfo =~ /\bitalic\b/ + || $angle>0 ) { + $srec .= "i-"; + $arec .= "i-"; + } elsif( $allinfo =~ /Oblique[^a-z]/ + || $lcallinfo =~ /\boblique\b/ + || $angle<0 ) { + $srec .= "o-"; + $arec .= "o-"; + } else { + $srec .= "r-"; + $arec .= "r-"; + } + + $srec .= sprintf("normal--0-0-0-0-%s-0-adobe-fontspecific",$type,$encoding); + $arec .= sprintf("normal--0-0-0-0-%s-0-%s",$type,$encoding); + + if($files) { + if($n==1) { + printf(SCALEF "%s %s\n",$fn,$srec); + printf(ALIASF "%s %s\n",$arec,$srec); + $srec1=$srec; + } else { + printf(ALIASF "%s %s\n",$arec,$srec1); + } + } else { + printf("%s %s\n",$fn,$arec); + } + } + } + + close(FILE); +} +if($files) { + close(SCALEF); + close(ALIASF); +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/trans b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/trans new file mode 100644 index 00000000..d52760e6 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/trans @@ -0,0 +1,164 @@ +#!/usr/bin/perl +# +# Copyright (c) 1998-2000 +# Sergey A. Babkin. All rights reserved. +# +# See the full text of the license in the COPYRIGHT file. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@users.sourceforge.net) +# + +# +# Script to transcode the Type1 disassembled font to other encoding +# + +# calculation of UniqueID from old UID and encoding name +# we don't have unsigned integer arithmetic in Perl +# so we try to do at least something +sub newuid +{ + use integer; + my ($u,$enc)=@_; + my $i, $uid; + + $uid=substr($u, -6, 6); + $u=substr($u, 0, 4); + + $uid+=0; + for $i (split(//,$enc)) { + $uid*=37; + $uid+=ord($i); + $uid+=($uid>>16) & 0xff; + $uid&=0xffffff; + } + + ($uid % 1000000) + 4000000; + #$u . substr(sprintf("%d",$uid), 0, 5); +} + +if($#ARGV != 1) { + printf(STDERR "Use: trans src-table dst-table dst-font\n"); + exit 1; +} + +# tables are formatted in two columns, one row per character +# name decimal-code + +# Read the destination table + +open(FILE,"<".$ARGV[1]) + or die "Unable to read $ARGV[2]\n"; +while() { + @sl=split(/\s+/); + $dst{$sl[0]}=$sl[1]; +} +close(FILE); + +#read the source table and build the translation table + +open(FILE,"<".$ARGV[0]) + or die "Unable to read $ARGV[0]\n"; +while() { + @sl=split(/\s+/); + $trans{$sl[1]}=$dst{$sl[0]}; +} +close(FILE); + +# name of the encoding, for UniqueID +$encname=$ARGV[1]; +$encname =~ s|^.*\/||g; +$encname =~ s|\..*$||g; + +# now read the font file, skip everything upto the encoding table +# we suppose that the file was autogenerated by ttf2pt1 with my patches + +while() { + if( /^\/FontName\s+(\S+)/) { + $fontname=$1; + } + if( /^\/UniqueID\s+(\S+)/) { + use integer; + my $uid=$1; + $_=sprintf("/UniqueID %u def\n", &newuid($uid, $encname)); + } + print $_; + if(/^\/Encoding/) { + $fontfile=1; + last; + } + if(/^StartCharMetrics/) { + $fontfile=0; + last; + } +} + +# read the old encoding table and build the new encoding table + +if($fontfile) { # .t1a + while($row=) { + if( $row !~ /^dup/) { + last; + } + + @sl=split(/\s+/,$row); + + $new=$trans{$sl[1]}; + if($new eq "") { + $new=$sl[1]; + if($enc{$new} eq "") { + $enc{$new}=$sl[2]; + } + } else { + $enc{$new}=$sl[2]; + } + } + + # print new encoding table + + for $i (0..255) { + if($enc{$i}) { + printf("dup %d %s put\n",$i,$enc{$i}); + } else { + printf("dup %d /.notdef put\n",$i); + } + } +} else { # .afm + while($row=) { + if($row !~ /^C\s+(\d+)(\s*;.*)\n/) { + last; + } + $code=$1; + $part2=$2; + + $new=$trans{$code}; + if($new eq "") { + $new=$code; + if($enc{$new} eq "") { + $enc{$new}=$part2; + } + } else { + $enc{$new}=$part2; + } + } + + # print new encoding table + + for $i (0..255) { + if($enc{$i}) { + printf("C %d%s\n",$i,$enc{$i}); + } + } +} + +print $row; + +# now copy the rest of file + +while() { + if( /^\/UniqueID\s+(\S+)/) { + use integer; + my $uid=$1; + $_=sprintf("/UniqueID %u def\n", &newuid($uid, $encname)); + } + print; +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/unhtml b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/unhtml new file mode 100644 index 00000000..1e660f54 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/unhtml @@ -0,0 +1,22 @@ +#!/bin/sh +# +# This script removes the HTML formatting from a file. If the file was designed +# with such use in mind and was properly formatted besides HTML (such as the README +# file for ttf2pt1) it will look good as a plain text file. +# +# This script supports a very limited set of HTML formatting. Everything that +# goes before is removed. Any lines that +# contain only the HTML formatting or start with "" +# are completely removed. Then all the in-line formatting is removed. +# Then " ", "<", ">" are changed to " ", "<", ">". + +sed '1,/<[bB][oO][dD][yY]>/d; +/^/-/g; +s/^ *$/>>/; +s/<[^<>]*>//g; +/^< *>$/d; +/^>>$/d;s/^< //; +s/>$//; +s/&[nN][bB][sS][pP];/ /g;s/&[lL][tT];//g;s/&[aA][mM][pP];/\&/g;' diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/x2gs b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/x2gs new file mode 100644 index 00000000..558ef3df --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/x2gs @@ -0,0 +1,118 @@ +#!/bin/sh +# +# Copyright (c) 1998-2000 +# Sergey A. Babkin. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net) +# + +# Use : x2gs [cfgfile] + +# path to the configuration file + +if [ $# -eq 1 ] +then + CFGFILE=$1 +else + CFGFILE=`pwd`/convert.cfg +fi + +MYSELF=x2gs + +# include the configuration + +if [ -r $CFGFILE ] +then { + . $CFGFILE +} else { + echo " +Can't find the configuration file + $CFGFILE +Please look at the sample file convert.cfg.sample, +copy it to convert.cfg and modify for +you actual configuration." >&2 + exit 1 +} fi + +LOG=$DSTDIR/convert.log + +[ -n "$GSDIR" ] || { + echo "$MYSELF: The Ghostscript base directory is not specified." >&2 + echo "$MYSELF: Installation of the Ghostscript fonts is deferred." >&2 + exit 0 +} + +[ -n "$GSCONFDIR" -a -d "$GSCONFDIR" ] || { + echo "$MYSELF: The Ghostscript configuration directory does not exist." >&2 + echo "$MYSELF: Installation of the Ghostscript fonts is aborted." >&2 + exit 1 +} + +[ -r "$GSCONFDIR/Fontmap" ] || { + echo "$MYSELF: Can't find Fontmap in the GS configuration directory." >&2 + echo "$MYSELF: Installation of the Ghostscript fonts is aborted." >&2 + exit 1 +} + +[ -n "$GSFONTDIR" -a -d "$GSFONTDIR" ] || { + echo "$MYSELF: The Ghostscript font directory does not exist." >&2 + echo "$MYSELF: Installation of the Ghostscript fonts is aborted." >&2 + exit 1 +} + +# link the fonts to $GSFONTDIR + +rm -f $GSCONFDIR/Fontmap.ttf + +# historically x2gs supported multiple X11 directories +for d in $DSTDIR +do { + for i in $d/*.pfa $d/*.afm + do { + [ -f $i ] || break; + + n=`basename $i` + + rm -f $GSFONTDIR/$n + + ln -s $i $GSFONTDIR/$n || { + echo "$MYSELF: Unable to link $n to GS font directory">&2 + } + } done + + cat $d/Fontmap.ttf >>$GSCONFDIR/Fontmap.ttf +} done + +if [ YES = "$INSTALLFONTMAP" ] +then { + mv $GSCONFDIR/Fontmap $GSCONFDIR/Fontmap.old || { + echo "$MYSELF: can't save Fontmap.old" >&2 + exit 1 + } + + sed "\\|^% begin fonts from $DSTDIR|,\\|^% end fonts from $DSTDIR|d" \ + <$GSCONFDIR/Fontmap.old >$GSCONFDIR/Fontmap || { + echo "$MYSELF: Can't create the new Fontmap file" >&2 + echo "$MYSELF: Trying to restore the old Fontmap file" >&2 + cp $GSCONFDIR/Fontmap.old $GSCONFDIR/Fontmap + exit 1 + } + echo "% begin fonts from $DSTDIR" >>$GSCONFDIR/Fontmap + echo "" >>$GSCONFDIR/Fontmap + cat $GSCONFDIR/Fontmap.ttf >>$GSCONFDIR/Fontmap + echo "" >>$GSCONFDIR/Fontmap + echo "% end fonts from $DSTDIR" >>$GSCONFDIR/Fontmap +} fi diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/t1asm.c b/application/third_party/dompdf/lib/ttf2ufm/src/t1asm.c new file mode 100644 index 00000000..d9c3061c --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/t1asm.c @@ -0,0 +1,604 @@ +/* t1asm + * + * This program `assembles' Adobe Type-1 font programs in pseudo-PostScript + * form into either PFB or PFA format. The human readable/editable input is + * charstring- and eexec-encrypted as specified in the `Adobe Type 1 Font + * Format' version 1.1 (the `black book'). There is a companion program, + * t1disasm, which `disassembles' PFB and PFA files into a pseudo-PostScript + * file. + * + * Copyright (c) 1992 by I. Lee Hetherington, all rights reserved. + * + * Permission is hereby granted to use, modify, and distribute this program + * for any purpose provided this copyright notice and the one below remain + * intact. + * + * I. Lee Hetherington (ilh@lcs.mit.edu) + * + * Revision 1.2 92/05/22 11:54:45 ilh + * Fixed bug where integers larger than 32000 could not be encoded in + * charstrings. Now integer range is correct for four-byte + * twos-complement integers: -(1<<31) <= i <= (1<<31)-1. Bug detected by + * Piet Tutelaers (rcpt@urc.tue.nl). + * + * Revision 1.1 92/05/22 11:48:46 ilh + * initial version + * + * Ported to Microsoft C/C++ Compiler and MS-DOS operating system by + * Kai-Uwe Herbing (herbing@netmbx.netmbx.de) on June 12, 1992. Code + * specific to the MS-DOS version is encapsulated with #ifdef _MSDOS + * ... #endif, where _MSDOS is an identifier, which is automatically + * defined, if you compile with the Microsoft C/C++ Compiler. + * + */ + +#ifndef lint +static char copyright[] = + "@(#) Copyright (c) 1992 by I. Lee Hetherington, all rights reserved."; +#ifdef _MSDOS +static char portnotice[] = + "@(#) Ported to MS-DOS by Kai-Uwe Herbing (herbing@netmbx.netmbx.de)."; +#endif +#endif + +/* Note: this is ANSI C. */ + +#ifdef _MSDOS + #include + #include + #include +#endif +#include +#include +#include +#include +#include + +#ifdef WINDOWS +# ifdef STANDALONE +# define WINDOWS_FUNCTIONS +# include "windows.h" +# endif +#endif + +/* int32 must be at least 32-bit and uint16 must be at least 16-bit */ +#if INT_MAX >= 0x7FFFFFFFUL +typedef int int32; +#else +typedef long int32; +#endif +#if USHRT_MAX >= 0xFFFFUL +typedef unsigned short uint16; +#else +typedef unsigned int uint16; +#endif + +#define LINESIZE 256 + +#define MAXBLOCKLEN ((1L<<17)-6) +#define MINBLOCKLEN ((1L<<8)-6) + +#define MARKER 128 +#define ASCII 1 +#define BINARY 2 +#define DONE 3 + +typedef unsigned char byte; + +/* must be visible from outside */ +FILE *ifp; +FILE *ofp; + +/* flags */ +static int pfb = 0; +static int active = 0; +static int start_charstring = 0; +static int in_eexec = 0; + +static char line[LINESIZE]; + +/* lenIV and charstring start command */ +static int lenIV = 4; +static char cs_start[10]; + +/* for charstring buffering */ +static byte charstring_buf[65535]; +static byte *charstring_bp; + +/* for PFB block buffering */ +static byte blockbuf[MAXBLOCKLEN]; +static int32 blocklen = MAXBLOCKLEN; +static int32 blockpos = -1; +static int blocktyp = ASCII; + +/* decryption stuff */ +static uint16 er, cr; +static uint16 c1 = 52845, c2 = 22719; + +/* table of charstring commands */ +static struct command { + char *name; + int one, two; +} command_table[] = { + { "callothersubr", 12, 16 }, + { "callsubr", 10, -1 }, + { "closepath", 9, -1 }, + { "div", 12, 12 }, + { "dotsection", 12, 0 }, + { "endchar", 14, -1 }, + { "hlineto", 6, -1 }, + { "hmoveto", 22, -1 }, + { "hsbw", 13, -1 }, + { "hstem", 1, -1 }, + { "hstem3", 12, 2 }, + { "hvcurveto", 31, -1 }, + { "pop", 12, 17 }, + { "return", 11, -1 }, + { "rlineto", 5, -1 }, + { "rmoveto", 21, -1 }, + { "rrcurveto", 8, -1 }, + { "sbw", 12, 7 }, + { "seac", 12, 6 }, + { "setcurrentpoint", 12, 33 }, + { "vhcurveto", 30, -1 }, + { "vlineto", 7, -1 }, + { "vmoveto", 4, -1 }, + { "vstem", 3, -1 }, + { "vstem3", 12, 1 }, +}; /* alphabetical */ + +/* Two separate encryption functions because eexec and charstring encryption + must proceed in parallel. */ + +static byte eencrypt(byte plain) +{ + byte cipher; + + cipher = (byte) (plain ^ (er >> 8)); + er = (uint16) ((cipher + er) * c1 + c2); + return cipher; +} + +static byte cencrypt(byte plain) +{ + byte cipher; + + cipher = (byte) (plain ^ (cr >> 8)); + cr = (uint16) ((cipher + cr) * c1 + c2); + return cipher; +} + +/* This function flushes a buffered PFB block. */ + +static void output_block() +{ + int32 i; + + /* output four-byte block length */ + fputc((int) (blockpos & 0xff), ofp); + fputc((int) ((blockpos >> 8) & 0xff), ofp); + fputc((int) ((blockpos >> 16) & 0xff), ofp); + fputc((int) ((blockpos >> 24) & 0xff), ofp); + + /* output block data */ + for (i = 0; i < blockpos; i++) + fputc(blockbuf[i], ofp); + + /* mark block buffer empty and uninitialized */ + blockpos = -1; +} + +/* This function outputs a single byte. If output is in PFB format then output + is buffered through blockbuf[]. If output is in PFA format, then output + will be hexadecimal if in_eexec is set, ASCII otherwise. */ + +static void output_byte(byte b) +{ + static char *hexchar = "0123456789ABCDEF"; + static int hexcol = 0; + + if (pfb) { + /* PFB */ + if (blockpos < 0) { + fputc(MARKER, ofp); + fputc(blocktyp, ofp); + blockpos = 0; + } + blockbuf[blockpos++] = b; + if (blockpos == blocklen) + output_block(); + } else { + /* PFA */ + if (in_eexec) { + /* trim hexadecimal lines to 64 columns */ + if (hexcol >= 64) { + fputc('\n', ofp); + hexcol = 0; + } + fputc(hexchar[(b >> 4) & 0xf], ofp); + fputc(hexchar[b & 0xf], ofp); + hexcol += 2; + } else { + fputc(b, ofp); + } + } +} + +/* This function outputs a byte through possible eexec encryption. */ + +static void eexec_byte(byte b) +{ + if (in_eexec) + output_byte(eencrypt(b)); + else + output_byte(b); +} + +/* This function outputs a null-terminated string through possible eexec + encryption. */ + +static void eexec_string(char *string) +{ + while (*string) + eexec_byte((byte) *string++); +} + +/* This function gets ready for the eexec-encrypted data. If output is in + PFB format then flush current ASCII block and get ready for binary block. + We start encryption with four random (zero) bytes. */ + +static void eexec_start() +{ + eexec_string(line); + if (pfb) { + output_block(); + blocktyp = BINARY; + } + + in_eexec = 1; + er = 55665; + eexec_byte(0); + eexec_byte(0); + eexec_byte(0); + eexec_byte(0); +} + +/* This function wraps-up the eexec-encrypted data. + If output is in PFB format then this entails flushing binary block and + starting an ASCII block. */ + +static void eexec_end() +{ + int i, j; + + if (pfb) { + output_block(); + blocktyp = ASCII; + } else { + fputc('\n', ofp); + } + in_eexec = 0; + for (i = 0; i < 8; i++) { + for (j = 0; j < 64; j++) + eexec_byte('0'); + eexec_byte('\n'); + } +#if 0 + eexec_string("cleartomark\n"); +#endif +} + +/* This function writes ASCII trailer. + If output is in PFB format then this entails flushing binary block and + starting an ASCII block. */ + +static void file_end() +{ + if (pfb) { + output_block(); + fputc(MARKER, ofp); + fputc(DONE, ofp); + } +} +/* This function returns an input line of characters. A line is terminated by + length (including terminating null) greater than LINESIZE, a newline \n, or + when active (looking for charstrings) by '{'. When terminated by a newline + the newline is put into line[]. When terminated by '{', the '{' is not put + into line[], and the flag start_charstring is set to 1. */ + +static void t1asm_getline() +{ + int c; + char *p = line; + int comment = 0; + + start_charstring = 0; + while (p < line + LINESIZE) { + c = fgetc(ifp); + if (c == EOF) + break; + if (c == '%') + comment = 1; + if (active && !comment && c == '{') { + start_charstring = 1; + break; + } + *p++ = (char) c; + if (c == '\n') + break; + } + *p = '\0'; +} + +/* This function is used by the binary search, bsearch(), for command names in + the command table. */ + +static int command_compare(const void *key, const void *item) +{ + return strcmp((char *) key, ((struct command *) item)->name); +} + +/* This function returns 1 if the string is an integer and 0 otherwise. */ + +static int is_integer(char *string) +{ + if (isdigit(string[0]) || string[0] == '-' || string[0] == '+') { + while (*++string && isdigit(*string)) + ; /* deliberately empty */ + if (!*string) + return 1; + } + return 0; +} + +/* This function initializes charstring encryption. Note that this is called + at the beginning of every charstring. */ + +static void charstring_start() +{ + int i; + + charstring_bp = charstring_buf; + cr = 4330; + for (i = 0; i < lenIV; i++) + *charstring_bp++ = cencrypt((byte) 0); +} + +/* This function encrypts and buffers a single byte of charstring data. */ + +static void charstring_byte(int v) +{ + byte b = (byte) (v & 0xff); + + if (charstring_bp - charstring_buf > sizeof(charstring_buf)) { + fprintf(stderr, "error: charstring_buf full (%d bytes)\n", + sizeof(charstring_buf)); + exit(1); + } + *charstring_bp++ = cencrypt(b); +} + +/* This function outputs buffered, encrypted charstring data through possible + eexec encryption. */ + +static void charstring_end() +{ + byte *bp; + + sprintf(line, "%d ", charstring_bp - charstring_buf); + eexec_string(line); + sprintf(line, "%s ", cs_start); + eexec_string(line); + for (bp = charstring_buf; bp < charstring_bp; bp++) + eexec_byte(*bp); +} + +/* This function generates the charstring representation of an integer. */ + +static void charstring_int(int num) +{ + int x; + + if (num >= -107 && num <= 107) { + charstring_byte(num + 139); + } else if (num >= 108 && num <= 1131) { + x = num - 108; + charstring_byte(x / 256 + 247); + charstring_byte(x % 256); + } else if (num >= -1131 && num <= -108) { + x = abs(num) - 108; + charstring_byte(x / 256 + 251); + charstring_byte(x % 256); + } else if (num >= (-2147483647-1) && num <= 2147483647) { + charstring_byte(255); + charstring_byte(num >> 24); + charstring_byte(num >> 16); + charstring_byte(num >> 8); + charstring_byte(num); + } else { + fprintf(stderr, + "error: cannot format the integer %d, too large\n", num); + exit(1); + } +} + +/* This function parses an entire charstring into integers and commands, + outputting bytes through the charstring buffer. */ + +static void parse_charstring() +{ + struct command *cp; + + charstring_start(); + while (fscanf(ifp, "%s", line) == 1) { + if (line[0] == '%') { + /* eat comment to end of line */ + while (fgetc(ifp) != '\n' && !feof(ifp)) + ; /* deliberately empty */ + continue; + } + if (line[0] == '}') + break; + if (is_integer(line)) { + charstring_int(atoi(line)); + } else { + cp = (struct command *) + bsearch((void *) line, (void *) command_table, + sizeof(command_table) / sizeof(struct command), + sizeof(struct command), + command_compare); + if (cp) { + charstring_byte(cp->one); + if (cp->two >= 0) + charstring_byte(cp->two); + } else { + fprintf(stderr, "error: cannot use `%s' in charstring\n",line); + exit(1); + } + } + } + charstring_end(); +} + +static void usage() +{ + fprintf(stderr, + "usage: t1asm [-b] [-l block-length] [input [output]]\n"); + fprintf(stderr, + "\n-b means output in PFB format, otherwise PFA format.\n"); + fprintf(stderr, + "The block length applies to the length of blocks in the\n"); + fprintf(stderr, + "PFB output file; the default is to use the largest possible.\n"); + exit(1); +} + +static void print_banner() +{ + static char rcs_revision[] = ""; /* removed RCS */ + static char revision[20]; + + if (sscanf(rcs_revision, "$Revision: %19s", revision) != 1) + revision[0] = '\0'; + fprintf(stderr, "This is t1asm %s.\n", revision); +} + +#ifdef STANDALONE +int main(int argc, char **argv) +{ + char *p, *q, *r; + int c; + + extern char *optarg; + extern int optind; + + ifp = stdin; + ofp = stdout; + + print_banner(); + + /* interpret command line arguments using getopt */ + while ((c = getopt(argc, argv, "bl:")) != -1) + switch (c) { + case 'b': + pfb = 1; + break; + case 'l': + blocklen = atoi(optarg); + if (blocklen < MINBLOCKLEN) { + blocklen = MINBLOCKLEN; + fprintf(stderr, + "warning: using minimum block length of %d\n", + blocklen); + } else if (blocklen > MAXBLOCKLEN) { + blocklen = MAXBLOCKLEN; + fprintf(stderr, + "warning: using maximum block length of %d\n", + blocklen); + } + break; + default: + usage(); + break; + } + if (argc - optind > 2) + usage(); + + /* possibly open input & output files */ + if (argc - optind >= 1) { + ifp = fopen(argv[optind], "r"); + if (!ifp) { + fprintf(stderr, "error: cannot open %s for reading\n", argv[1]); + exit(1); + } + } + if (argc - optind >= 2) { + ofp = fopen(argv[optind + 1], "w"); + if (!ofp) { + fprintf(stderr, "error: cannot open %s for writing\n", argv[2]); + exit(1); + } + } + +#else +int runt1asm(int pfbflag) +{ + char *p, *q, *r; + + pfb = pfbflag; +#endif + + #ifdef _MSDOS + /* If we are processing a PFB (binary) output */ + /* file, we must set its file mode to binary. */ + if (pfb) + _setmode(_fileno(ofp), _O_BINARY); + #endif + + /* Finally, we loop until no more input. Some special things to look for + are the `currentfile eexec' line, the beginning of the `/Subrs' + definition, the definition of `/lenIV', and the definition of the + charstring start command which has `...string currentfile...' in it. */ + + while (!feof(ifp) && !ferror(ifp)) { + t1asm_getline(); + if (strcmp(line, "currentfile eexec\n") == 0) { + eexec_start(); + continue; + } else if (strstr(line, "/Subrs") && isspace(line[6])) { + active = 1; + } else if ((p = strstr(line, "/lenIV"))) { + sscanf(p, "%*s %d", &lenIV); + } else if ((p = strstr(line, "string currentfile"))) { + /* locate the name of the charstring start command */ + *p = '\0'; /* damage line[] */ + q = strrchr(line, '/'); + if (q) { + r = cs_start; + ++q; + while (!isspace(*q) && *q != '{') + *r++ = *q++; + *r = '\0'; + } + *p = 's'; /* repair line[] */ + } + /* output line data */ + eexec_string(line); + if ((p = strstr(line, "currentfile closefile"))) { + eexec_end(); + } + if (start_charstring) { + if (!cs_start[0]) { + fprintf(stderr, "error: couldn't find charstring start command\n"); + exit(1); + } + parse_charstring(); + } + } + file_end(); + + fclose(ifp); + fclose(ofp); + + return 0; +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf.c b/application/third_party/dompdf/lib/ttf2ufm/src/ttf.c new file mode 100644 index 00000000..761eb995 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf.c @@ -0,0 +1,1502 @@ +/* + * True Type Font to Adobe Type 1 font converter + * By Mark Heath + * Based on ttf2pfa by Andrew Weeks + * With help from Frank M. Siegert + * + * see COPYRIGHT + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef WINDOWS +# include +# include +#else +# include "windows.h" +#endif + +#include "ttf.h" +#include "pt1.h" +#include "global.h" + +/* prototypes of call entries */ +static void openfont(char *fname, char *arg); +static void closefont( void); +static int getnglyphs ( void); +static int glnames( GLYPH *glyph_list); +static void glmetrics( GLYPH *glyph_list); +static int glenc( GLYPH *glyph_list, int *encoding, int *unimap); +static void fnmetrics( struct font_metrics *fm); +static void glpath( int glyphno, GLYPH *glyph_list); +static void kerning( GLYPH *glyph_list); + +/* globals */ + +/* front-end descriptor */ +struct frontsw ttf_sw = { + /*name*/ "ttf", + /*descr*/ "built-in TTF support", + /*suffix*/ { "ttf" }, + /*open*/ openfont, + /*close*/ closefont, + /*nglyphs*/ getnglyphs, + /*glnames*/ glnames, + /*glmetrics*/ glmetrics, + /*glenc*/ glenc, + /*fnmetrics*/ fnmetrics, + /*glpath*/ glpath, + /*kerning*/ kerning, +}; + +/* statics */ + +static FILE *ttf_file; +static int ttf_nglyphs, long_offsets; + +static TTF_DIRECTORY *directory; +static TTF_DIR_ENTRY *dir_entry; +static char *filebuffer; +static char *filebuffer_end; +static TTF_NAME *name_table = NULL; +static TTF_NAME_REC *name_record; +static TTF_HEAD *head_table = NULL; +static TTF_HHEA *hhea_table = NULL; +static TTF_KERN *kern_table = NULL; +static TTF_CMAP *cmap_table = NULL; +static LONGHORMETRIC *hmtx_table = NULL; +static TTF_GLYF *glyf_table; +static BYTE *glyf_start = NULL; +static TTF_MAXP *maxp_table = NULL; +static TTF_POST_HEAD *post_table = NULL; +static union { + USHORT *sp; + ULONG *lp; +} loca_table; +#define short_loca_table loca_table.sp +#define long_loca_table loca_table.lp + +static short cmap_n_segs; +static USHORT *cmap_seg_start, *cmap_seg_end; +static short *cmap_idDelta, *cmap_idRangeOffset; +static TTF_CMAP_FMT0 *encoding0; +static int enc_type; + +static char *name_fields[8]; + +static int enc_found_ms, enc_found_mac; + +static char *mac_glyph_names[258] = { + ".notdef", ".null", "CR", + "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quotesingle", + "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", + "zero", "one", "two", "three", + "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", + "at", "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", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", + "grave", "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", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", + "Aring", "Ccedilla", "Eacute", "Ntilde", + "Odieresis", "Udieresis", "aacute", "agrave", + "acircumflex", "adieresis", "atilde", "aring", + "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", + "idieresis", "ntilde", "oacute", "ograve", + "ocircumflex", "odieresis", "otilde", "uacute", + "ugrave", "ucircumflex", "udieresis", "dagger", + "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", + "copyright", "trademark", "acute", "dieresis", + "notequal", "AE", "Oslash", "infinity", + "plusminus", "lessequal", "greaterequal", "yen", + "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", + "Omega", "ae", "oslash", "questiondown", + "exclamdown", "logicalnot", "radical", "florin", + "approxequal", "increment", "guillemotleft", "guillemotright", + "ellipsis", "nbspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", + "emdash", "quotedblleft", "quotedblright", "quoteleft", + "quoteright", "divide", "lozenge", "ydieresis", + "Ydieresis", "fraction", "currency", "guilsinglleft", + "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", + "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", + "Egrave", "Iacute", "Icircumflex", "Idieresis", + "Igrave", "Oacute", "Ocircumflex", "applelogo", + "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", + "breve", "dotaccent", "ring", "cedilla", + "hungarumlaut", "ogonek", "caron", "Lslash", + "lslash", "Scaron", "scaron", "Zcaron", + "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", + "minus", "multiply", "onesuperior", "twosuperior", + "threesuperior", "onehalf", "onequarter", "threequarters", + "franc", "Gbreve", "gbreve", "Idot", + "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dmacron" +}; + +/* other prototypes */ +static void draw_composite_glyf( GLYPH *g, GLYPH *glyph_list, int glyphno, + double *matrix, int level); +static void draw_simple_glyf( GLYPH *g, GLYPH *glyph_list, int glyphno, + double *matrix); +static double f2dot14( short x); + +/* get the TTF description table address and length for this index */ + +static void +get_glyf_table( + int glyphno, + TTF_GLYF **tab, + int *len +) +{ + if(tab!=NULL) { + if (long_offsets) { + *tab = (TTF_GLYF *) (glyf_start + ntohl(long_loca_table[glyphno])); + } else { + *tab = (TTF_GLYF *) (glyf_start + (ntohs(short_loca_table[glyphno]) << 1)); + } + } + if(len!=NULL) { + if (long_offsets) { + *len = ntohl(long_loca_table[glyphno + 1]) - ntohl(long_loca_table[glyphno]); + } else { + *len = (ntohs(short_loca_table[glyphno + 1]) - ntohs(short_loca_table[glyphno])) << 1; + } + } +} + +static void +handle_name(void) +{ + int j, k, lang, len, platform; + char *p, *string_area; + int found3 = 0; + + string_area = (char *) name_table + ntohs(name_table->offset); + name_record = &(name_table->nameRecords); + + for (j = 0; j < 8; j++) { + name_fields[j] = ""; + } + + for (j = 0; j < ntohs(name_table->numberOfNameRecords); j++) { + + platform = ntohs(name_record->platformID); + + if (platform == 3) { + + found3 = 1; + lang = ntohs(name_record->languageID) & 0xff; + len = ntohs(name_record->stringLength); + if (lang == 0 || lang == 9) { + k = ntohs(name_record->nameID); + if (k < 8) { + p = string_area + ntohs(name_record->stringOffset); + name_fields[k] = dupcnstring(p, len); + } + } + } + name_record++; + } + + string_area = (char *) name_table + ntohs(name_table->offset); + name_record = &(name_table->nameRecords); + + if (!found3) { + for (j = 0; j < ntohs(name_table->numberOfNameRecords); j++) { + + platform = ntohs(name_record->platformID); + + if (platform == 1) { + + found3 = 1; + lang = ntohs(name_record->languageID) & 0xff; + len = ntohs(name_record->stringLength); + if (lang == 0 || lang == 9) { + k = ntohs(name_record->nameID); + if (k < 8) { + p = string_area + ntohs(name_record->stringOffset); + name_fields[k] = dupcnstring(p, len); + } + } + } + name_record++; + } + } + if (!found3) { + fprintf(stderr, "**** Cannot decode font name fields ****\n"); + exit(1); + } + if (name_fields[4][0] == 0) { /* Full Name empty, use Family Name */ + name_fields[4] = name_fields[1]; + } + if (name_fields[6][0] == 0) { /* Font Name empty, use Full Name */ + name_fields[6] = name_fields[4]; + if (name_fields[6][0] == 0) { /* oops, empty again */ + WARNING_1 fprintf(stderr, "Font name is unknown, setting to \"Unknown\"\n"); + name_fields[6] = "Unknown"; + } + } + p = name_fields[6]; + /* must not start with a digit */ + if(isdigit(*p)) + *p+= 'A'-'0'; /* change to a letter */ + while (*p != '\0') { + if (!isalnum(*p) || *p=='_') { + *p = '-'; + } + p++; + } +} + +static void +handle_head(void) +{ + long_offsets = ntohs(head_table->indexToLocFormat); + if (long_offsets != 0 && long_offsets != 1) { + fprintf(stderr, "**** indexToLocFormat wrong ****\n"); + exit(1); + } +} + +/* limit the recursion level to avoid cycles */ +#define MAX_COMPOSITE_LEVEL 20 + +static void +draw_composite_glyf( + GLYPH *g, + GLYPH *glyph_list, + int glyphno, + double *orgmatrix, + int level +) +{ + int len; + short ncontours; + USHORT flagbyte, glyphindex; + double arg1, arg2; + BYTE *ptr; + char *bptr; + SHORT *sptr; + double matrix[6], newmatrix[6]; + + get_glyf_table(glyphno, &glyf_table, &len); + + if(len<=0) /* nothing to do */ + return; + + ncontours = ntohs(glyf_table->numberOfContours); + if (ncontours >= 0) { /* simple case */ + draw_simple_glyf(g, glyph_list, glyphno, orgmatrix); + return; + } + + if(ISDBG(COMPOSITE) && level ==0) + fprintf(stderr, "* %s [ %.2f %.2f %.2f %.2f %.2f %.2f ]\n", g->name, + orgmatrix[0], orgmatrix[1], orgmatrix[2], orgmatrix[3], + orgmatrix[4], orgmatrix[5]); + + /* complex case */ + if(level >= MAX_COMPOSITE_LEVEL) { + WARNING_1 fprintf(stderr, + "*** Glyph %s: stopped (possibly infinite) recursion at depth %d\n", + g->name, level); + return; + } + + ptr = ((BYTE *) glyf_table + sizeof(TTF_GLYF)); + sptr = (SHORT *) ptr; + do { + flagbyte = ntohs(*sptr); + sptr++; + glyphindex = ntohs(*sptr); + sptr++; + + if (flagbyte & ARG_1_AND_2_ARE_WORDS) { + arg1 = (short)ntohs(*sptr); + sptr++; + arg2 = (short)ntohs(*sptr); + sptr++; + } else { + bptr = (char *) sptr; + arg1 = (signed char) bptr[0]; + arg2 = (signed char) bptr[1]; + sptr++; + } + matrix[1] = matrix[2] = 0.0; + + if (flagbyte & WE_HAVE_A_SCALE) { + matrix[0] = matrix[3] = f2dot14(*sptr); + sptr++; + } else if (flagbyte & WE_HAVE_AN_X_AND_Y_SCALE) { + matrix[0] = f2dot14(*sptr); + sptr++; + matrix[3] = f2dot14(*sptr); + sptr++; + } else if (flagbyte & WE_HAVE_A_TWO_BY_TWO) { + matrix[0] = f2dot14(*sptr); + sptr++; + matrix[2] = f2dot14(*sptr); + sptr++; + matrix[1] = f2dot14(*sptr); + sptr++; + matrix[3] = f2dot14(*sptr); + sptr++; + } else { + matrix[0] = matrix[3] = 1.0; + } + + /* + * See * + * http://fonts.apple.com/TTRefMan/RM06/Chap6g + * lyf.html * matrix[0,1,2,3,4,5]=a,b,c,d,m,n + */ + + if (fabs(matrix[0]) > fabs(matrix[1])) + matrix[4] = fabs(matrix[0]); + else + matrix[4] = fabs(matrix[1]); + if (fabs(fabs(matrix[0]) - fabs(matrix[2])) <= 33. / 65536.) + matrix[4] *= 2.0; + + if (fabs(matrix[2]) > fabs(matrix[3])) + matrix[5] = fabs(matrix[2]); + else + matrix[5] = fabs(matrix[3]); + if (fabs(fabs(matrix[2]) - fabs(matrix[3])) <= 33. / 65536.) + matrix[5] *= 2.0; + + /* + * fprintf (stderr,"Matrix Opp %hd + * %hd\n",arg1,arg2); + */ +#if 0 + fprintf(stderr, "Matrix: %f %f %f %f %f %f\n", + matrix[0], matrix[1], matrix[2], matrix[3], + matrix[4], matrix[5]); + fprintf(stderr, "Offset: %f %f (%s)\n", + arg1, arg2, + ((flagbyte & ARGS_ARE_XY_VALUES) ? "XY" : "index")); +#endif + + if (flagbyte & ARGS_ARE_XY_VALUES) { + matrix[4] *= arg1; + matrix[5] *= arg2; + } else { + WARNING_1 fprintf(stderr, + "*** Glyph %s: reusing scale from another glyph is unsupported\n", + g->name); + /* + * must extract values from a glyph + * but it seems to be too much pain + * and it's not clear now that it + * would be really used in any + * interesting font + */ + } + + /* at this point arg1,arg2 contain what logically should be matrix[4,5] */ + + /* combine matrices */ + + newmatrix[0] = orgmatrix[0]*matrix[0] + orgmatrix[2]*matrix[1]; + newmatrix[1] = orgmatrix[0]*matrix[2] + orgmatrix[2]*matrix[3]; + + newmatrix[2] = orgmatrix[1]*matrix[0] + orgmatrix[3]*matrix[1]; + newmatrix[3] = orgmatrix[1]*matrix[2] + orgmatrix[3]*matrix[3]; + + newmatrix[4] = orgmatrix[0]*matrix[4] + orgmatrix[2]*matrix[5] + orgmatrix[4]; + newmatrix[5] = orgmatrix[1]*matrix[4] + orgmatrix[3]*matrix[5] + orgmatrix[5]; + + if(ISDBG(COMPOSITE)) { + fprintf(stderr, "%*c+-> %2d %s [ %.2f %.2f %.2f %.2f %.2f %.2f ]\n", + level+1, ' ', level, glyph_list[glyphindex].name, + matrix[0], matrix[1], matrix[2], matrix[3], + matrix[4], matrix[5]); + fprintf(stderr, "%*c = [ %.2f %.2f %.2f %.2f %.2f %.2f ]\n", + level+1, ' ', + newmatrix[0], newmatrix[1], newmatrix[2], newmatrix[3], + newmatrix[4], newmatrix[5]); + } + draw_composite_glyf(g, glyph_list, glyphindex, newmatrix, level+1); + + } while (flagbyte & MORE_COMPONENTS); +} + +static void +draw_simple_glyf( + GLYPH *g, + GLYPH *glyph_list, + int glyphno, + double *matrix +) +{ + int i, j, k, k1, len, first, cs, ce; + /* We assume that hsbw always sets to(0, 0) */ + double xlast = 0, ylast = 0; + int finished, nguide, contour_start, contour_end; + short ncontours, n_inst, last_point; + USHORT *contour_end_pt; + BYTE *ptr; +#define GLYFSZ 2000 + short xabs[GLYFSZ], yabs[GLYFSZ], xrel[GLYFSZ], yrel[GLYFSZ]; + double xcoord[GLYFSZ], ycoord[GLYFSZ]; + BYTE flags[GLYFSZ]; + double tx, ty; + int needreverse = 0; /* transformation may require + * that */ + GENTRY *lge; + + lge = g->lastentry; + + get_glyf_table(glyphno, &glyf_table, &len); + + if (len <= 0) { + WARNING_1 fprintf(stderr, + "**** Composite glyph %s refers to non-existent glyph %s, ignored\n", + g->name, + glyph_list[glyphno].name); + return; + } + ncontours = ntohs(glyf_table->numberOfContours); + if (ncontours < 0) { + WARNING_1 fprintf(stderr, + "**** Composite glyph %s refers to composite glyph %s, ignored\n", + g->name, + glyph_list[glyphno].name); + return; + } + contour_end_pt = (USHORT *) ((char *) glyf_table + sizeof(TTF_GLYF)); + + last_point = ntohs(contour_end_pt[ncontours - 1]); + n_inst = ntohs(contour_end_pt[ncontours]); + + ptr = ((BYTE *) contour_end_pt) + (ncontours << 1) + n_inst + 2; + j = k = 0; + while (k <= last_point) { + flags[k] = ptr[j]; + + if (ptr[j] & REPEAT) { + for (k1 = 0; k1 < ptr[j + 1]; k1++) { + k++; + flags[k] = ptr[j]; + } + j++; + } + j++; + k++; + } + + for (k = 0; k <= last_point; k++) { + if (flags[k] & XSHORT) { + if (flags[k] & XSAME) { + xrel[k] = ptr[j]; + } else { + xrel[k] = -ptr[j]; + } + j++; + } else if (flags[k] & XSAME) { + xrel[k] = 0.0; + } else { + xrel[k] = (short)( ptr[j] * 256 + ptr[j + 1] ); + j += 2; + } + if (k == 0) { + xabs[k] = xrel[k]; + } else { + xabs[k] = xrel[k] + xabs[k - 1]; + } + + } + + for (k = 0; k <= last_point; k++) { + if (flags[k] & YSHORT) { + if (flags[k] & YSAME) { + yrel[k] = ptr[j]; + } else { + yrel[k] = -ptr[j]; + } + j++; + } else if (flags[k] & YSAME) { + yrel[k] = 0; + } else { + yrel[k] = ptr[j] * 256 + ptr[j + 1]; + j += 2; + } + if (k == 0) { + yabs[k] = yrel[k]; + } else { + yabs[k] = yrel[k] + yabs[k - 1]; + } + } + + if (matrix) { + for (i = 0; i <= last_point; i++) { + tx = xabs[i]; + ty = yabs[i]; + xcoord[i] = fscale(matrix[0] * tx + matrix[2] * ty + matrix[4]); + ycoord[i] = fscale(matrix[1] * tx + matrix[3] * ty + matrix[5]); + } + } else { + for (i = 0; i <= last_point; i++) { + xcoord[i] = fscale(xabs[i]); + ycoord[i] = fscale(yabs[i]); + } + } + + i = j = 0; + first = 1; + + while (i <= ntohs(contour_end_pt[ncontours - 1])) { + contour_end = ntohs(contour_end_pt[j]); + + if (first) { + fg_rmoveto(g, xcoord[i], ycoord[i]); + xlast = xcoord[i]; + ylast = ycoord[i]; + contour_start = i; + first = 0; + } else if (flags[i] & ONOROFF) { + fg_rlineto(g, xcoord[i], ycoord[i]); + xlast = xcoord[i]; + ylast = ycoord[i]; + } else { + cs = i - 1; + finished = nguide = 0; + while (!finished) { + if (i == contour_end + 1) { + ce = contour_start; + finished = 1; + } else if (flags[i] & ONOROFF) { + ce = i; + finished = 1; + } else { + i++; + nguide++; + } + } + + switch (nguide) { + case 0: + fg_rlineto(g, xcoord[ce], ycoord[ce]); + xlast = xcoord[ce]; + ylast = ycoord[ce]; + break; + + case 1: + fg_rrcurveto(g, + (xcoord[cs] + 2.0 * xcoord[cs + 1]) / 3.0, + (ycoord[cs] + 2.0 * ycoord[cs + 1]) / 3.0, + (2.0 * xcoord[cs + 1] + xcoord[ce]) / 3.0, + (2.0 * ycoord[cs + 1] + ycoord[ce]) / 3.0, + xcoord[ce], + ycoord[ce] + ); + xlast = xcoord[ce]; + ylast = ycoord[ce]; + + break; + + case 2: + fg_rrcurveto(g, + (-xcoord[cs] + 4.0 * xcoord[cs + 1]) / 3.0, + (-ycoord[cs] + 4.0 * ycoord[cs + 1]) / 3.0, + (4.0 * xcoord[cs + 2] - xcoord[ce]) / 3.0, + (4.0 * ycoord[cs + 2] - ycoord[ce]) / 3.0, + xcoord[ce], + ycoord[ce] + ); + xlast = xcoord[ce]; + ylast = ycoord[ce]; + break; + + case 3: + fg_rrcurveto(g, + (xcoord[cs] + 2.0 * xcoord[cs + 1]) / 3.0, + (ycoord[cs] + 2.0 * ycoord[cs + 1]) / 3.0, + (5.0 * xcoord[cs + 1] + xcoord[cs + 2]) / 6.0, + (5.0 * ycoord[cs + 1] + ycoord[cs + 2]) / 6.0, + (xcoord[cs + 1] + xcoord[cs + 2]) / 2.0, + (ycoord[cs + 1] + ycoord[cs + 2]) / 2.0 + ); + + fg_rrcurveto(g, + (xcoord[cs + 1] + 5.0 * xcoord[cs + 2]) / 6.0, + (ycoord[cs + 1] + 5.0 * ycoord[cs + 2]) / 6.0, + (5.0 * xcoord[cs + 2] + xcoord[cs + 3]) / 6.0, + (5.0 * ycoord[cs + 2] + ycoord[cs + 3]) / 6.0, + (xcoord[cs + 3] + xcoord[cs + 2]) / 2.0, + (ycoord[cs + 3] + ycoord[cs + 2]) / 2.0 + ); + + fg_rrcurveto(g, + (xcoord[cs + 2] + 5.0 * xcoord[cs + 3]) / 6.0, + (ycoord[cs + 2] + 5.0 * ycoord[cs + 3]) / 6.0, + (2.0 * xcoord[cs + 3] + xcoord[ce]) / 3.0, + (2.0 * ycoord[cs + 3] + ycoord[ce]) / 3.0, + xcoord[ce], + ycoord[ce] + ); + ylast = ycoord[ce]; + xlast = xcoord[ce]; + + break; + + default: + k1 = cs + nguide; + fg_rrcurveto(g, + (xcoord[cs] + 2.0 * xcoord[cs + 1]) / 3.0, + (ycoord[cs] + 2.0 * ycoord[cs + 1]) / 3.0, + (5.0 * xcoord[cs + 1] + xcoord[cs + 2]) / 6.0, + (5.0 * ycoord[cs + 1] + ycoord[cs + 2]) / 6.0, + (xcoord[cs + 1] + xcoord[cs + 2]) / 2.0, + (ycoord[cs + 1] + ycoord[cs + 2]) / 2.0 + ); + + for (k = cs + 2; k <= k1 - 1; k++) { + fg_rrcurveto(g, + (xcoord[k - 1] + 5.0 * xcoord[k]) / 6.0, + (ycoord[k - 1] + 5.0 * ycoord[k]) / 6.0, + (5.0 * xcoord[k] + xcoord[k + 1]) / 6.0, + (5.0 * ycoord[k] + ycoord[k + 1]) / 6.0, + (xcoord[k] + xcoord[k + 1]) / 2.0, + (ycoord[k] + ycoord[k + 1]) / 2.0 + ); + + } + + fg_rrcurveto(g, + (xcoord[k1 - 1] + 5.0 * xcoord[k1]) / 6.0, + (ycoord[k1 - 1] + 5.0 * ycoord[k1]) / 6.0, + (2.0 * xcoord[k1] + xcoord[ce]) / 3.0, + (2.0 * ycoord[k1] + ycoord[ce]) / 3.0, + xcoord[ce], + ycoord[ce] + ); + xlast = xcoord[ce]; + ylast = ycoord[ce]; + + break; + } + } + if (i >= contour_end) { + g_closepath(g); + first = 1; + i = contour_end + 1; + j++; + } else { + i++; + } + } + + if (matrix) { + /* guess whether do we need to reverse the results */ + + double x[3], y[3]; + int max = 0, from, to; + + /* transform a triangle going in proper direction */ + /* + * the origin of triangle is in (0,0) so we know it in + * advance + */ + + x[0] = y[0] = 0; + x[1] = matrix[0] * 0 + matrix[2] * 300; + y[1] = matrix[1] * 0 + matrix[3] * 300; + x[2] = matrix[0] * 300 + matrix[2] * 0; + y[2] = matrix[1] * 300 + matrix[3] * 0; + + /* then find the topmost point */ + for (i = 0; i < 3; i++) + if (y[i] > y[max]) + max = i; + from = (max + 3 - 1) % 3; + to = (max + 1) % 3; + + needreverse = 0; + + /* special cases for horizontal lines */ + if (y[max] == y[from]) { + if (x[max] < y[from]) + needreverse = 1; + } else if (y[to] == y[from]) { + if (x[to] < x[max]) + needreverse = 1; + } else { /* generic case */ + if ((x[to] - x[max]) * (y[max] - y[from]) + > (x[max] - x[from]) * (y[to] - y[max])) + needreverse = 1; + } + + if (needreverse) { + if (lge) { + assertpath(lge->next, __FILE__, __LINE__, g->name); + reversepathsfromto(lge->next, NULL); + } else { + assertpath(g->entries, __FILE__, __LINE__, g->name); + reversepaths(g); + } + } + } +} + +static double +f2dot14( + short x +) +{ + short y = ntohs(x); + return (y >> 14) + ((y & 0x3fff) / 16384.0); +} + + +/* check that the pointer points within the file */ +/* returns 0 if pointer is good, 1 if bad */ +static int +badpointer( + void *ptr +) +{ + return (ptr < (void *)filebuffer || ptr >= (void *)filebuffer_end); +} + +/* + * Externally accessible methods + */ + +/* + * Open font and prepare to return information to the main driver. + * May print error and warning messages. + * Exit on error. + */ + +static void +openfont( + char *fname, + char *arg /* unused now */ +) +{ + int i, j; + struct stat statbuf; + static struct { + void **tbpp; /* pointer to pointer to the table */ + char name[5]; /* table name */ + char optional; /* flag: table may be missing */ + } tables[] = { + { (void **)&name_table, "name", 0 }, + { (void **)&head_table, "head", 0 }, + { (void **)&hhea_table, "hhea", 0 }, + { (void **)&post_table, "post", 0 }, + { (void **)&glyf_start, "glyf", 0 }, + { (void **)&cmap_table, "cmap", 0 }, + { (void **)&kern_table, "kern", 1 }, + { (void **)&maxp_table, "maxp", 0 }, + { (void **)&hmtx_table, "hmtx", 0 }, + { (void **)&long_loca_table, "loca", 0 }, + { NULL, "", 0 } /* end of table */ + }; + + if (stat(fname, &statbuf) == -1) { + fprintf(stderr, "**** Cannot access %s ****\n", fname); + exit(1); + } + if ((filebuffer = malloc(statbuf.st_size)) == NULL) { + fprintf(stderr, "**** Cannot malloc space for file ****\n"); + exit(1); + } + + filebuffer_end = filebuffer + statbuf.st_size; + + if ((ttf_file = fopen(fname, "rb")) == NULL) { + fprintf(stderr, "**** Cannot open file '%s'\n", fname); + exit(1); + } else { + WARNING_2 fprintf(stderr, "Processing file %s\n", fname); + } + + if (fread(filebuffer, 1, statbuf.st_size, ttf_file) != statbuf.st_size) { + fprintf(stderr, "**** Could not read whole file \n"); + exit(1); + } + fclose(ttf_file); + + directory = (TTF_DIRECTORY *) filebuffer; + + if (ntohl(directory->sfntVersion) != 0x00010000) { + fprintf(stderr, + "**** Unknown File Version number [%x], or not a TrueType file\n", + directory->sfntVersion); + exit(1); + } + + /* clear the tables */ + for(j=0; tables[j].tbpp != NULL; j++) + *(tables[j].tbpp) = NULL; + + dir_entry = &(directory->list); + + for (i = 0; i < ntohs(directory->numTables); i++) { + + for(j=0; tables[j].tbpp != NULL; j++) + if (memcmp(dir_entry->tag, tables[j].name, 4) == 0) { + *(tables[j].tbpp) = (void *) (filebuffer + ntohl(dir_entry->offset)); + break; + } + + if (memcmp(dir_entry->tag, "EBDT", 4) == 0 || + memcmp(dir_entry->tag, "EBLC", 4) == 0 || + memcmp(dir_entry->tag, "EBSC", 4) == 0) { + WARNING_1 fprintf(stderr, "Font contains bitmaps\n"); + } + dir_entry++; + } + + for(j=0; tables[j].tbpp != NULL; j++) + if(!tables[j].optional && badpointer( *(tables[j].tbpp) )) { + fprintf(stderr, "**** File contains no required table '%s'\n", tables[j].name); + exit(1); + } + + handle_name(); + + handle_head(); + + ttf_nglyphs = ntohs(maxp_table->numGlyphs); + + enc_found_ms = enc_found_mac = 0; +} + +/* + * Close font. + * Exit on error. + */ + +static void +closefont( + void +) +{ + return; /* empty operation */ +} + +/* + * Get the number of glyphs in font. + */ + +static int +getnglyphs ( + void +) +{ + return ttf_nglyphs; +} + +/* + * Get the names of the glyphs. + * Returns 0 if the names were assigned, non-zero if the font + * provides no glyph names. + */ + +static int +glnames( + GLYPH *glyph_list +) +{ + int i, len, n, npost; + unsigned int format; + USHORT *name_index; + char *ptr, *p; + char **ps_name_ptr = (char **) malloc(ttf_nglyphs * sizeof(char *)); + int n_ps_names; + int ps_fmt_3 = 0; + + format = ntohl(post_table->formatType); + + if (format == 0x00010000) { + for (i = 0; i < 258 && i < ttf_nglyphs; i++) { + glyph_list[i].name = mac_glyph_names[i]; + } + } else if (format == 0x00020000) { + npost = ntohs(post_table->numGlyphs); + if (ttf_nglyphs != npost) { + /* This is an error in the font, but we can now cope */ + WARNING_1 fprintf(stderr, "**** Postscript table size mismatch %d/%d ****\n", + npost, ttf_nglyphs); + } + n_ps_names = 0; + name_index = &(post_table->glyphNameIndex); + + /* This checks the integrity of the post table */ + for (i=0; i n_ps_names + 257) { + n_ps_names = n - 257; + } + } + + ptr = (char *) post_table + 34 + (ttf_nglyphs << 1); + i = 0; + while (*ptr > 0 && i < n_ps_names) { + len = *ptr; + /* previously the program wrote nulls into the table. If the table + was corrupt, this could put zeroes anywhere, leading to obscure bugs, + so now I malloc space for the names. Yes it is much less efficient */ + + if ((p = malloc(len+1)) == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + + ps_name_ptr[i] = p; + strncpy(p, ptr+1, len); + p[len] = '\0'; + i ++; + ptr += len + 1; + } + + if (i != n_ps_names) + { + WARNING_2 fprintf (stderr, "** Postscript Name mismatch %d != %d **\n", + i, n_ps_names); + n_ps_names = i; + } + + /* + * for (i=0; inumGlyphs); + for (i = 0; i < ttf_nglyphs; i++) { + glyph_list[i].name = mac_glyph_names[i + ptr[i]]; + } + } else { + fprintf(stderr, + "**** Postscript table in wrong format %x ****\n", + format); + exit(1); + } + + return ps_fmt_3; +} + +/* + * Get the metrics of the glyphs. + */ + +static void +glmetrics( + GLYPH *glyph_list +) +{ + int i; + int n_hmetrics = ntohs(hhea_table->numberOfHMetrics); + GLYPH *g; + LONGHORMETRIC *hmtx_entry = hmtx_table; + FWORD *lsblist; + + for (i = 0; i < n_hmetrics; i++) { + g = &(glyph_list[i]); + g->width = ntohs(hmtx_entry->advanceWidth); + g->lsb = ntohs(hmtx_entry->lsb); + hmtx_entry++; + } + + lsblist = (FWORD *) hmtx_entry; + hmtx_entry--; + + for (i = n_hmetrics; i < ttf_nglyphs; i++) { + g = &(glyph_list[i]); + g->width = ntohs(hmtx_entry->advanceWidth); + g->lsb = ntohs(lsblist[i - n_hmetrics]); + } + + for (i = 0; i < ttf_nglyphs; i++) { + g = &(glyph_list[i]); + get_glyf_table(i, &glyf_table, &g->ttf_pathlen); + + g->xMin = (short)ntohs(glyf_table->xMin); + g->xMax = (short)ntohs(glyf_table->xMax); + g->yMin = (short)ntohs(glyf_table->yMin); + g->yMax = (short)ntohs(glyf_table->yMax); + } + +} + + +static void +handle_ms_encoding( + GLYPH *glyph_list, + int *encoding, + int *unimap +) +{ + int i, j, k, kk, set_ok; + USHORT start, end, ro; + short delta, n; + + for (j = 0; j < cmap_n_segs - 1; j++) { + start = ntohs(cmap_seg_start[j]); + end = ntohs(cmap_seg_end[j]); + delta = ntohs(cmap_idDelta[j]); + ro = ntohs(cmap_idRangeOffset[j]); + + for (k = start; k <= end; k++) { + if (ro == 0) { + n = k + delta; + } else { + n = ntohs(*((ro >> 1) + (k - start) + + &(cmap_idRangeOffset[j]))); + if (delta != 0) + { + /* Not exactly sure how to deal with this circumstance, + I suspect it never occurs */ + n += delta; + fprintf (stderr, + "rangeoffset and delta both non-zero - %d/%d", + ro, delta); + } + } + if(n<0 || n>=ttf_nglyphs) { + WARNING_1 fprintf(stderr, "Font contains a broken glyph code mapping, ignored\n"); + continue; + } + + // Find the first available orig_code slot + for (i = 0; i < GLYPH_MAX_ENCODINGS; i++ ) { + + if ( glyph_list[n].orig_code[i] == -1 ) + break; + + } + + if ( i == GLYPH_MAX_ENCODINGS ) { + //#if 0 + if (strcmp(glyph_list[n].name, ".notdef") != 0) { + WARNING_2 fprintf(stderr, + "Glyph %s has >= %d encodings (A), %4.4x & %4.4x\n", + glyph_list[n].name, + GLYPH_MAX_ENCODINGS, + glyph_list[n].orig_code[0], + k); + } + //#endif + set_ok = 0; + break; + } else { + set_ok = 1; + } + if (enc_type==1 || forcemap) { + kk = unicode_rev_lookup(k); + if(ISDBG(UNICODE)) + fprintf(stderr, "Unicode %s - 0x%04x\n",glyph_list[n].name,k); + if (set_ok) { + glyph_list[n].orig_code[i] = k; + /* glyph_list[n].char_no = kk; */ + } + if (kk >= 0 && kk < ENCTABSZ && encoding[kk] == -1) + encoding[kk] = n; + } else { + if ((k & 0xff00) == 0xf000) { + if( encoding[k & 0x00ff] == -1 ) { + encoding[k & 0x00ff] = n; + if (set_ok) { + /* glyph_list[n].char_no = k & 0x00ff; */ + glyph_list[n].orig_code[i] = k; + } + } + } else { + if (set_ok) { + /* glyph_list[n].char_no = k; */ + glyph_list[n].orig_code[i] = k; + } + WARNING_2 fprintf(stderr, + "Glyph %s has non-symbol encoding %4.4x\n", + glyph_list[n].name, + k & 0xffff); + /* + * just use the code + * as it is + */ + if ((k & ~0xff) == 0 && encoding[k] == -1 ) + encoding[k] = n; + } + } + } + } +} + +static void +handle_mac_encoding( + GLYPH *glyph_list, + int *encoding, + int *unimap +) +{ + short n; + int j, size; + + size = ntohs(encoding0->length) - 6; + for (j = 0; j < size; j++) { + n = encoding0->glyphIdArray[j]; + if (glyph_list[n].char_no != -1) { + WARNING_2 fprintf(stderr, + "Glyph %s has >= two encodings (B), %4.4x & %4.4x\n", + glyph_list[n].name, + glyph_list[n].char_no, + j); + } else { + if (j < ENCTABSZ) { + if(encoding[j] == -1) { + glyph_list[n].char_no = j; + encoding[j] = n; + } + } + } + } +} + +/* + * Get the original encoding of the font. + * Returns 1 for if the original encoding is Unicode, 2 if the + * original encoding is other 16-bit, 0 if 8-bit. + */ + +static int +glenc( + GLYPH *glyph_list, + int *encoding, + int *unimap +) +{ + int num_tables = ntohs(cmap_table->numberOfEncodingTables); + BYTE *ptr; + int i, format, offset, seg_c2, found; + int platform, encoding_id; + TTF_CMAP_ENTRY *table_entry; + TTF_CMAP_FMT4 *encoding4; + + if(enc_found_ms) { + handle_ms_encoding(glyph_list, encoding, unimap); + return enc_type; + } else if(enc_found_mac) { + handle_mac_encoding(glyph_list, encoding, unimap); + return 0; + } + + enc_type = 0; + found = 0; + + for (i = 0; i < num_tables && !found; i++) { + table_entry = &(cmap_table->encodingTable[i]); + offset = ntohl(table_entry->offset); + encoding4 = (TTF_CMAP_FMT4 *) ((BYTE *) cmap_table + offset); + format = ntohs(encoding4->format); + platform = ntohs(table_entry->platformID); + encoding_id = ntohs(table_entry->encodingID); + + if (format != 4) + continue; + + if(force_pid != -1) { + if(force_pid != platform || encoding_id != force_eid) + continue; + WARNING_1 fprintf(stderr, "Found Encoding PID=%d/EID=%d\n", + force_pid, force_eid); + enc_type = 1; + } else { + if (platform == 3 ) { + switch (encoding_id) { + case 0: + WARNING_1 fputs("Found Symbol Encoding\n", stderr); + break; + case 1: + WARNING_1 fputs("Found Unicode Encoding\n", stderr); + enc_type = 1; + break; + default: + WARNING_1 { + fprintf(stderr, + "****MS Encoding ID %d not supported****\n", + encoding_id); + fputs("Treating it like Symbol encoding\n", stderr); + } + break; + } + } else + continue; + } + + found = 1; + seg_c2 = ntohs(encoding4->segCountX2); + cmap_n_segs = seg_c2 >> 1; + ptr = (BYTE *) encoding4 + 14; + cmap_seg_end = (USHORT *) ptr; + cmap_seg_start = (USHORT *) (ptr + seg_c2 + 2); + cmap_idDelta = (short *) (ptr + (seg_c2 * 2) + 2); + cmap_idRangeOffset = (short *) (ptr + (seg_c2 * 3) + 2); + enc_found_ms = 1; + + handle_ms_encoding(glyph_list, encoding, unimap); + } + + if (!found && force_pid == -1) { + WARNING_1 fputs("No Microsoft encoding, looking for MAC encoding\n", stderr); + for (i = 0; i < num_tables && !found; i++) { + table_entry = &(cmap_table->encodingTable[i]); + offset = ntohl(table_entry->offset); + encoding0 = (TTF_CMAP_FMT0 *) ((BYTE *) cmap_table + offset); + format = ntohs(encoding0->format); + platform = ntohs(table_entry->platformID); + encoding_id = ntohs(table_entry->encodingID); + + if (format == 0) { + found = 1; + enc_found_mac = 1; + + handle_mac_encoding(glyph_list, encoding, unimap); + } + } + } + + if (!found && force_pid == -1) { + WARNING_1 fputs("No MAC encoding either, looking for any format 4 encoding\n", stderr); + for (i = 0; i < num_tables && !found; i++) { + table_entry = &(cmap_table->encodingTable[i]); + offset = ntohl(table_entry->offset); + encoding4 = (TTF_CMAP_FMT4 *) ((BYTE *) cmap_table + offset); + format = ntohs(encoding4->format); + platform = ntohs(table_entry->platformID); + encoding_id = ntohs(table_entry->encodingID); + + if (format != 4) + continue; + + WARNING_1 fprintf(stderr, "Found a last ditch encoding PID=%d/EID=%d, treating it as Unicode.\n", + platform, encoding_id); + found = 1; + enc_type = 1; + seg_c2 = ntohs(encoding4->segCountX2); + cmap_n_segs = seg_c2 >> 1; + ptr = (BYTE *) encoding4 + 14; + cmap_seg_end = (USHORT *) ptr; + cmap_seg_start = (USHORT *) (ptr + seg_c2 + 2); + cmap_idDelta = (short *) (ptr + (seg_c2 * 2) + 2); + cmap_idRangeOffset = (short *) (ptr + (seg_c2 * 3) + 2); + enc_found_ms = 1; + + handle_ms_encoding(glyph_list, encoding, unimap); + + } + } + + if (!found) { + if(force_pid != -1) { + fprintf(stderr, "*** TTF encoding table PID=%d/EID=%d not found\n", + force_pid, force_eid); + } + fprintf(stderr, "**** No Recognised Encoding Table ****\n"); + if(warnlevel >= 2) { + fprintf(stderr, "Font contains the following unsupported encoding tables:\n"); + for (i = 0; i < num_tables && !found; i++) { + table_entry = &(cmap_table->encodingTable[i]); + offset = ntohl(table_entry->offset); + encoding0 = (TTF_CMAP_FMT0 *) ((BYTE *) cmap_table + offset); + format = ntohs(encoding0->format); + platform = ntohs(table_entry->platformID); + encoding_id = ntohs(table_entry->encodingID); + + fprintf(stderr, " format=%d platform=%d encoding_id=%d\n", + format, platform, encoding_id); + } + } + exit(1); + } + + return enc_type; +} + +/* + * Get the font metrics + */ +static void +fnmetrics( + struct font_metrics *fm +) +{ + char *str; + static int fieldstocheck[]= {2,4,6}; + int i, j, len; + + fm->italic_angle = (short) (ntohs(post_table->italicAngle.upper)) + + ((short) ntohs(post_table->italicAngle.lower) / 65536.0); + fm->underline_position = (short) ntohs(post_table->underlinePosition); + fm->underline_thickness = (short) ntohs(post_table->underlineThickness); + fm->is_fixed_pitch = ntohl(post_table->isFixedPitch); + + fm->ascender = (short)ntohs(hhea_table->ascender); + fm->descender = (short)ntohs(hhea_table->descender); + + fm->units_per_em = ntohs(head_table->unitsPerEm); + + fm->bbox[0] = (short) ntohs(head_table->xMin); + fm->bbox[1] = (short) ntohs(head_table->yMin); + fm->bbox[2] = (short) ntohs(head_table->xMax); + fm->bbox[3] = (short) ntohs(head_table->yMax); + + fm->name_copyright = name_fields[0]; + fm->name_family = name_fields[1]; + fm->name_style = name_fields[2]; + fm->name_full = name_fields[4]; + fm->name_version = name_fields[5]; + fm->name_ps = name_fields[6]; + + /* guess the boldness from the font names */ + fm->force_bold=0; + + for(i=0; !fm->force_bold && i= len || !islower(str[j+4])) + ) { + fm->force_bold=1; + break; + } + } + } +} + +/* + * Get the path of contrours for a glyph. + */ + +static void +glpath( + int glyphno, + GLYPH *glyf_list +) +{ + double matrix[6]; + GLYPH *g; + + g = &glyph_list[glyphno]; + + matrix[0] = matrix[3] = 1.0; + matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0.0; + draw_composite_glyf(g, glyf_list, glyphno, matrix, 0 /*level*/); +} + +/* + * Get the kerning data. + */ + +static void +kerning( + GLYPH *glyph_list +) +{ + TTF_KERN_SUB *subtable; + TTF_KERN_ENTRY *kern_entry; + int i, j; + int ntables; + int npairs; + char *ptr; + + if(kern_table == NULL) { + WARNING_1 fputs("No Kerning data\n", stderr); + return; + } + if(badpointer(kern_table)) { + fputs("**** Defective Kerning table, ignored\n", stderr); + return; + } + + ntables = ntohs(kern_table->nTables); + ptr = (char *) kern_table + 4; + + for (i = 0; i < ntables; i++) { + subtable = (TTF_KERN_SUB *) ptr; + if ((ntohs(subtable->coverage) & 0xff00) == 0) { + npairs = (short) ntohs(subtable->nPairs); + kern_entry = (TTF_KERN_ENTRY *) (ptr + sizeof(TTF_KERN_SUB)); + + kern_entry = (TTF_KERN_ENTRY *) (ptr + sizeof(TTF_KERN_SUB)); + for (j = 0; j < npairs; j++) { + if( kern_entry->value != 0) + addkernpair(ntohs(kern_entry->left), + ntohs(kern_entry->right), (short)ntohs(kern_entry->value)); + kern_entry++; + } + } + ptr += subtable->length; + } +} + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf.h b/application/third_party/dompdf/lib/ttf2ufm/src/ttf.h new file mode 100644 index 00000000..8c38808d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf.h @@ -0,0 +1,172 @@ +/* + * see COPYRIGHT + */ + +/* these definitions are mostly taken from Microsoft's True Type + documentation. +*/ + +#define BYTE unsigned char +#define CHAR signed char +#define USHORT unsigned short +#define SHORT signed short +#define ULONG unsigned int +#define LONG signed int +#define FWORD SHORT +#define UFWORD USHORT + +#define ONOROFF 0x01 +#define XSHORT 0x02 +#define YSHORT 0x04 +#define REPEAT 0x08 +#define XSAME 0x10 +#define YSAME 0x20 + +#define ARG_1_AND_2_ARE_WORDS 0x0001 +#define ARGS_ARE_XY_VALUES 0x0002 +#define XY_BOUND_TO_GRID 0x0004 +#define WE_HAVE_A_SCALE 0x0008 +#define MORE_COMPONENTS 0x0020 +#define WE_HAVE_AN_X_AND_Y_SCALE 0x0040 +#define WE_HAVE_A_TWO_BY_TWO 0x0080 +#define WE_HAVE_INSTRUCTIONS 0x0100 +#define USE_MY_METRICS 0x0200 + +typedef struct short_2 { + SHORT upper; + USHORT lower; +} FIXED ; + +typedef struct longhormetric { + UFWORD advanceWidth; + FWORD lsb; +} LONGHORMETRIC; + +typedef struct ttf_hhea { + BYTE version[4]; + SHORT ascender, descender, lineGap; + USHORT advnaceWidthMax; + SHORT minLSB, minRSB, xMaxExtent; + SHORT caretSlopeRise, caretSlopeRun; + SHORT reserved[5]; + SHORT metricDataFormat; + USHORT numberOfHMetrics; +} TTF_HHEA; + +typedef struct ttf_dir_entry { + char tag[4]; + ULONG checksum; + ULONG offset; + ULONG length; +} TTF_DIR_ENTRY ; + +typedef struct ttf_directory { + ULONG sfntVersion; + USHORT numTables; + USHORT searchRange; + USHORT entrySelector; + USHORT rangeShift; + TTF_DIR_ENTRY list; +} TTF_DIRECTORY ; + +typedef struct ttf_name_rec { + USHORT platformID; + USHORT encodingID; + USHORT languageID; + USHORT nameID; + USHORT stringLength; + USHORT stringOffset; +} TTF_NAME_REC; + +typedef struct ttf_name { + USHORT format; + USHORT numberOfNameRecords; + USHORT offset; + TTF_NAME_REC nameRecords; +} TTF_NAME ; + +typedef struct ttf_head { + ULONG version; + ULONG fontRevision; + ULONG checksumAdjust; + ULONG magicNo; + USHORT flags; + USHORT unitsPerEm; + BYTE created[8]; + BYTE modified[8]; + FWORD xMin, yMin, xMax, yMax; + USHORT macStyle, lowestRecPPEM; + SHORT fontDirection, indexToLocFormat, glyphDataFormat; +} TTF_HEAD ; + +typedef struct ttf_kern { + USHORT version, nTables; +} TTF_KERN ; + +typedef struct ttf_kern_sub { + USHORT version, length, coverage; + USHORT nPairs, searchRange, entrySelector, rangeShift; +} TTF_KERN_SUB; + +typedef struct ttf_kern_entry { + USHORT left, right; + FWORD value; +} TTF_KERN_ENTRY; + +typedef struct ttf_cmap_fmt0 { + USHORT format; + USHORT length; + USHORT version; + BYTE glyphIdArray[256]; +} TTF_CMAP_FMT0; + +typedef struct ttf_cmap_fmt4 { + USHORT format; + USHORT length; + USHORT version; + USHORT segCountX2; + USHORT searchRange; + USHORT entrySelector; + USHORT rangeShift; +} TTF_CMAP_FMT4; + +typedef struct ttf_cmap_entry { + USHORT platformID; + USHORT encodingID; + ULONG offset; +} TTF_CMAP_ENTRY; + +typedef struct ttf_cmap { + USHORT version; + USHORT numberOfEncodingTables; + TTF_CMAP_ENTRY encodingTable[1]; +} TTF_CMAP ; + +typedef struct ttf_glyf { + SHORT numberOfContours; + FWORD xMin, yMin, xMax, yMax; +} TTF_GLYF ; + +typedef struct ttf_maxp { + ULONG version; + USHORT numGlyphs, maxPoints, maxContours; + USHORT maxCompositePoints, maxCompositeContours; + USHORT maxZones, maxTwilightPoints, maxStorage; + USHORT maxFunctionDefs, maxInstructionsDefs; + USHORT maxSizeOfInstructions, maxComponentElements; + USHORT maxComponentDepth; +} TTF_MAXP ; + +typedef struct ttf_post_head { + ULONG formatType; + FIXED italicAngle; + FWORD underlinePosition; + FWORD underlineThickness; + ULONG isFixedPitch; + ULONG minMemType42; + ULONG maxMemType42; + ULONG minMemType1; + ULONG maxMemType1; + USHORT numGlyphs; + USHORT glyphNameIndex; +} TTF_POST_HEAD ; diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.1 b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.1 new file mode 100644 index 00000000..b5a416a1 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.1 @@ -0,0 +1,822 @@ +.rn '' }` +''' $RCSfile: ttf2pt1.1,v $$Revision: 1.1 $$Date: 2008-03-12 06:35:44 $ +''' +''' $Log: not supported by cvs2svn $ +''' +.de Sh +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp +.if t .sp .5v +.if n .sp +.. +.de Ip +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.de Vb +.ft CW +.nf +.ne \\$1 +.. +.de Ve +.ft R + +.fi +.. +''' +''' +''' Set up \*(-- to give an unbreakable dash; +''' string Tr holds user defined translation string. +''' Bell System Logo is used as a dummy character. +''' +.tr \(*W-|\(bv\*(Tr +.ie n \{\ +.ds -- \(*W- +.ds PI pi +.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +.ds L" "" +.ds R" "" +''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of +''' \*(L" and \*(R", except that they are used on ".xx" lines, +''' such as .IP and .SH, which do another additional levels of +''' double-quote interpretation +.ds M" """ +.ds S" """ +.ds N" """"" +.ds T" """"" +.ds L' ' +.ds R' ' +.ds M' ' +.ds S' ' +.ds N' ' +.ds T' ' +'br\} +.el\{\ +.ds -- \(em\| +.tr \*(Tr +.ds L" `` +.ds R" '' +.ds M" `` +.ds S" '' +.ds N" `` +.ds T" '' +.ds L' ` +.ds R' ' +.ds M' ` +.ds S' ' +.ds N' ` +.ds T' ' +.ds PI \(*p +'br\} +.\" If the F register is turned on, we'll generate +.\" index entries out stderr for the following things: +.\" TH Title +.\" SH Header +.\" Sh Subsection +.\" Ip Item +.\" X<> Xref (embedded +.\" Of course, you have to process the output yourself +.\" in some meaninful fashion. +.if \nF \{ +.de IX +.tm Index:\\$1\t\\n%\t"\\$2" +.. +.nr % 0 +.rr F +.\} +.TH TTF2PT1 1 "version 3.4.4" "December 31, 2003" "TTF2PT1 Font Converter" +.UC +.if n .hy 0 +.if n .na +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.de CQ \" put $1 in typewriter font +.ft CW +'if n "\c +'if t \\&\\$1\c +'if n \\&\\$1\c +'if n \&" +\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 +'.ft R +.. +.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2 +. \" AM - accent mark definitions +.bd B 3 +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds ? ? +. ds ! ! +. ds / +. ds q +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10' +. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#] +.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u' +.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u' +.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#] +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +.ds oe o\h'-(\w'o'u*4/10)'e +.ds Oe O\h'-(\w'O'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds v \h'-1'\o'\(aa\(ga' +. ds _ \h'-1'^ +. ds . \h'-1'. +. ds 3 3 +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +. ds oe oe +. ds Oe OE +.\} +.rm #[ #] #H #V #F C +.SH "NAME" +TTF2PT1 \- A True Type to PostScript Type 1 Font Converter +.SH "SYNOPSIS" +\f(CWttf2pt1 \fI[-options] ttffont.ttf [Fontname]\fR\fR +.PP +or +.PP +\f(CWttf2pt1 \fI[-options] ttffont.ttf -\fR\fR +.SH "DESCRIPTION" +Ttf2pt1 is a font converter from the True Type format (and some other formats +supported by the FreeType library as well) to the Adobe Type1 format. +.PP +The versions 3.0 and later got rather extensive post-processing algorithm that +brings the converted fonts to the requirements of the Type1 standard, tries to +correct the rounding errors introduced during conversions and some simple +kinds of bugs that are typical for the public domain TTF fonts. It +also generates the hints that enable much better rendering of fonts in +small sizes that are typical for the computer displays. But everything +has its price, and some of the optimizations may not work well for certain +fonts. That's why the options were added to the converter, to control +the performed optimizations. +.SH "OPTIONS" +The first variant creates the file \f(CWFontname.pfa\fR (or \f(CWFontname.pfb\fR if the +option \*(L'\fB\-b\fR\*(R' was used) with the converted font and \f(CWFontname.afm\fR with the +font metrics, the second one prints the font or another file (if the option +\&\*(R'\fB\-G\fR\*(R' was used) on the standard output from where it can be immediately +piped through some filter. If no \f(CWFontname\fR is specified for the first +variant, the name is generated from \f(CWttffont\fR by replacing the \f(CW.ttf\fR +filename suffix. +.PP +Most of the time no options are neccessary (with a possible exception +of \*(L'\fB\-e\fR'). But if there are some troubles with the resulting font, they +may be used to control the conversion. +The \fBoptions\fR are: +.Ip "\(bu" 2 +\f(CW\fB-a\fR\fR \- Include all the glyphs from the source file into the converted +file. If this option is not specified then only the glyphs that have +been assigned some encoding are included, because the rest of glyphs +would be inaccessible anyway and would only consume the disk space. +But some applications are clever enough to change the encoding on +the fly and thus use the other glyphs, in this case they could +benefit from using this option. But there is a catch: the X11 library +has rather low limit for the font size. Including more glyphs increases +the file size and thus increases the chance of hitting this limit. +See \f(CWapp/X11/README\fR for the description of a +patch to X11 which fixes this problem. +.Ip "\(bu" 2 +\f(CW\fB-b\fR\fR \- Encode the resulting font to produce a ready \f(CW.pfb\fR file. +.Ip "\(bu" 2 +\f(CW\fB-d \fIsuboptions\fR\fR\fR \- Debugging options. The suboptions are: +.Sp +\f(CW\fBa\fR\fR \- Print out the absolute coordinates of dots in outlines. Such +a font can not be used by any program (that's why this option is +incompatible with \*(L'\fB\-e\fR') but it has proven to be a valuable debuging +information. +.Sp +\f(CW\fBr\fR\fR \- Do not reverse the direction of outlines. The \s-1TTF\s0 fonts have +the standard direction of outlines opposite to the Type1 fonts. So +they should be reversed during proper conversion. This option +may be used for debugging or to handle a \s-1TTF\s0 font with wrong +direction of outlines (possibly, converted in a broken way from +a Type1 font). The first signs of the wrong direction are the +letters like \*(L"P\*(R" or \*(L"B\*(R" without the unpainted \*(L"holes\*(R" inside. +.Ip "\(bu" 2 +\f(CW\fB-e\fR\fR \- Assemble the resulting font to produce a ready \f(CW.pfa\fR file. +.Sp +[ S.B.: Personally I don't think that this option is particularly useful. +The same result may be achieved by piping the unassembled data +through t1asm, the Type 1 assembler. And, anyways, it's good to +have the t1utils package handy. But Mark and many users think that +this functionality is good and it took not much time to add this option. ] +.Ip "\(bu" 2 +\f(CW\fB-F\fR\fR \- Force the Unicode encoding: any type of \s-1MS\s0 encoding specified +in the font is ignored and the font is treated like it has Unicode +encoding. \fB\s-1WARNING\s0:\fR this option is intended for buggy fonts +which actually are in Unicode but are marked as something else. The +effect on the other fonts is unpredictable. +.Ip "\(bu" 2 +\f(CW\fB-G \fIsuboptions\fR\fR\fR \- File generation options. The suboptions may be lowercase +or uppercase, the lowercase ones disable the generation of particular +files, the corresponding uppercase suboptions enable the generation of the +same kind of files. If the result of ttf2pt1 is requested to be printed on +the standard output, the last enabling suboption of \fB\-G\fR determines +which file will be written to the standard output and the rest of files +will be discarded. For example, \fB\-G A\fR will request the \s-1AFM\s0 file. +The suboptions to disable/enable the generation of the files are: +.Sp +\f(CW\fBf/F\fR\fR \- The font file. Depending on the other options this file +will have one of the suffixes \f(CW.t1a\fR, \f(CW.pfa\fR or \f(CW.pfb\fR. If the conversion result +is requested on the standard output ('\f(CW-\fR\*(R' is used as the output file name) +then the font file will also be written there by default, if not overwritten +by another suboption of \fB\-G\fR. +\fBDefault: enabled\fR +.Sp +\f(CW\fBa/A\fR\fR \- The Adobe font metrics file (\f(CW.afm\fR). +\fBDefault: enabled\fR +.Sp +\f(CW\fBe/E\fR\fR \- The dvips encoding file (\f(CW.enc\fR). +\fBDefault: disabled\fR +.Ip "\(bu" 2 +\f(CW\fB-l \fIlanguage\fR[+\fIargument\fR]\fR\fR \- Extract the fonts for the specified language from a +multi-language Unicode font. If this option is not used the converter +tries to guess the language by the values of the shell variable \s-1LANG\s0. +If it is not able to guess the language by \s-1LANG\s0 it tries all the +languages in the order they are listed. +.Sp +After the plus sign an optional argument for the language extractor +may be specified. The format of the argument is absolutely up to +the particular language converter. The primary purpose of the +argument is to support selection of planes for the multi-plane +Eastern encodings but it can also be used in any other way. The +language extractor may decide to add the plane name in some form +to the name of the resulting font. None of the currently supported +languages make any use of the argument yet. +.Sp +As of now the following languages are supported: +.Sp +\ \ \f(CWlatin1\fR \- for all the languages using the Latin-1 encoding +.Sp +\ \ \f(CWlatin2\fR \- for the Central European languages +.Sp +\ \ \f(CWlatin4\fR \- for the Baltic languages +.Sp +\ \ \f(CWlatin5\fR \- for the Turkish language +.Sp +\ \ \f(CWcyrillic\fR \- for the languages with Cyrillic alphabet +.Sp +\ \ \f(CWrussian\fR \- historic synonym for cyrillic +.Sp +\ \ \f(CWbulgarian\fR \- historic synonym for cyrillic +.Sp +\ \ \f(CWadobestd\fR \- for the AdobeStandard encoding used by TeX +.Sp +\ \ \f(CWplane+\fIargument\fR\fR \- to select one plane from a multi-byte encoding +.Sp +The argument of the \*(L"\f(CWplane\fR\*(R" language may be in one of three forms: +.Sp +\ \ \f(CWplane+\fBpid=\fR\fI\fR\fB,eid=\fR\fI\fR\fR +.Sp +\ \ \f(CWplane+\fBpid=\fR\fI\fR\fB,eid=\fR\fI\fR\fB,\fR\fI\fR\fR +.Sp +\ \ \f(CWplane+\fI\fR\fR +.Sp +Pid (\s-1TTF\s0 platform id) and eid (\s-1TTF\s0 encoding id) select a particular +\s-1TTF\s0 encoding table in the original font. They are specified as decimal +numbers. If this particular encoding table is not present in the font +file then the conversion fails. The native ("ttf") front-end parser supports +only pid=3 (Windows platform), the FreeType-based ("ft") front-end supports +any platform. If pid/eid is not specified then the \s-1TTF\s0 encoding table is +determined as usual: Unicode encoding if it's first or an 8-bit encoding +if not (and for an 8-bit encoding the plane number is silently ignored). +To prevent the converter from falling back to an 8-bit encoding, specify +the Unicode pid/eid value explicitly. +.Sp +Plane_number is a hexadecimal (if starts with \*(L"\fB0x\fR") or decimal number. +It gives the values of upper bytes for which 256 characters will be +selected. If not specified, defaults to 0. It is also used as a font +name suffix (the leading \*(L"0x\*(R" is not included into the suffix). +.Sp +\fB\s-1NOTE\s0:\fR +You may notice that the language names are not uniform: some are the +names of particular languages and some are names of encodings. This +is because of the different approaches. The original idea was to +implement a conversion from Unicode to the appropriate Windows +encoding for a given language. And then use the translation tables +to generate the fonts in whatever final encodings are needed. This +would allow to pile together the Unicode fonts and the non-Unicode +Windows fonts for that language and let the program to sort them out +automatically. And then generate fonts in all the possible encodings +for that language. An example of this approach is the Russian language +support. But if there is no multiplicity of encodings used for some +languages and if the non-Unicode fonts are not considered important +by the users, another way would be simpler to implement: just provide +only one table for extraction of the target encoding from Unicode +and don't bother with the translation tables. The latin* \*(L"languages\*(R" +are examples of this approach. If somebody feels that he needs the +Type1 fonts both in Latin-* and Windows encodings he or she is absolutely +welcome to submit the code to implement it. +.Sp +\fB\s-1WARNING\s0:\fR +Some of the glyphs included into the AdobeStandard encoding are not +included into the Unicode standard. The most typical examples of such +glyphs are ligatures like \*(L'fi\*(R', \*(L'fl\*(R' etc. Because of this the font +designers may place them at various places. The converter tries to +do its best, if the glyphs have honest Adobe names and/or are +placed at the same codes as in the Microsoft fonts they will be +picked up. Otherwise a possible solution is to use the option \*(L'\fB\-L\fR\*(R' +with an external map. +.Ip "\(bu" 2 +\f(CW\fB-L \fIfile\fR[+[pid=\fI\fR,eid=\fI\fR,][\fIplane\fR]]\fR\fR \- Extract the fonts for the specified +language from a multi-language font using the map from this file. This is +rather like the option \*(L'\fB\-l\fR\*(R' but the encoding map is not +compiled into the program, it's taken from that file, so it's +easy to edit. Examples of such files are provided in +\f(CWmaps/adobe-standard-encoding.map\fR, \f(CWCP1250.map\fR. (\fB\s-1NOTE\s0:\fR +the \*(L'standard encoding\*(R' map does not include all the glyphs of the +AdobeStandard encoding, it's provided only as an example.) The +description of the supported map formats is in the file +\f(CWmaps/unicode-sample.map\fR. +.Sp +Likewise to \*(L'\fB\-l\fR\*(R', an argument may be specified after the map file +name. But in this case the argument has fixed meaning: it selects the +original \s-1TTF\s0 encoding table (the syntax is the same as in \*(L'\fB\-l plane\fR') +and/or a plane of the map file. The plane name also gets added after dash +to the font name. The plane is a concept used in the Eastern fonts with big +number of glyphs: one \s-1TTF\s0 font gets divided into multiple Type1 fonts, +each containing one plane of up to 256 glyphs. But with a little +creativity this concept may be used for other purposes of combining +multiple translation maps into one file. To extract multiple planes +from a \s-1TTF\s0 font \f(CWttf2pt1\fR must be run multiple times, each time with +a different plane name specified. +.Sp +The default original \s-1TTF\s0 encoding table used for the option \*(L'\fB\-L\fR\*(R' is +Unicode. The map files may include directives to specify different original +\s-1TTF\s0 encodings. However if the pid/eid pair is specified with +it overrides any original encoding specified in the map file. +.Ip "\(bu" 2 +\f(CW\fB-m \fItype\fR=\fIvalue\fR\fR\fR \- Set maximal or minimal limits of resources. +These limits control the the font generation by limiting the resources +that the font is permitted to require from the PostScript interpreter. +The currently supported types of limits are: +.Sp +\f(CW\fBh\fR\fR \- the maximal hint stack depth for the substituted hints. +The default value is 128, according to the limitation in X11. This seems to +be the lowest (and thus the safest) widespread value. To display the +hint stack depth required by each glyph in a \f(CW.t1a\fR file use the script +\f(CWscripts/cntstems.pl\fR. +.Ip "\(bu" 2 +\f(CW\fB-O \fIsuboptions\fR\fR\fR \- Outline processing options. The suboptions +may be lowercase or uppercase, the lowercase ones disable the features, +the corresponding uppercase suboptions enable the same features. +The suboptions to disable/enable features are: +.Sp +\f(CW\fBb/B\fR\fR \- Guessing of the ForceBold parameter. This parameter helps +the Type1 engine to rasterize the bold fonts properly at small sizes. +But the algorithm used to guess the proper value of this flag makes +that guess based solely on the font name. In rare cases that may cause +errors, in these cases you may want to disable this guessing. +\fBDefault: enabled\fR +.Sp +\f(CW\fBh/H\fR\fR \- Autogeneration of hints. The really complex outlines +may confuse the algorithm, so theoretically it may be useful +sometimes to disable them. Although up to now it seems that +even bad hints are better than no hints at all. +\fBDefault: enabled\fR +.Sp +\f(CW\fBu/U\fR\fR \- Hint substitution. Hint substitution is a technique +permitting generation of more detailed hints for the rasterizer. It allows +to use different sets of hints for different parts of a glyph and change +these sets as neccessary during rasterization (that's why \*(L"substituted"). +So it should improve the quality of the fonts rendered at small sizes. +But there are two catches: First, the X11 library has rather low limit for +the font size. More detailed hints increase the file size and thus increase +the chance of hitting this limit (that does not mean that you shall hit it +but you may if your fonts are particularly big). This is especially +probable for Unicode fonts converted with option \*(L'\fB\-a\fR\*(R', so you may want to +use \*(L'\fB\-a\fR\*(R' together with \*(L'\fB\-Ou\fR\*(R'. See \f(CWapp/X11/README\fR for the description of +a patch to X11 which fixes this problem. Second, some rasterizers (again, +X11 is the typical example) have a limitation for total number of hints +used when drawing a glyph (also known as the hint stack depth). If that +stack overflows the glyph is ignored. Starting from version 3.22 \f(CWttf2pt1\fR +uses algorithms to minimizing this depth, with the trade-off of slightly +bigger font files. The glyphs which still exceed the limit set by option +\&\*(R'\fB\-mh\fR\*(R' have all the substituted hints removed and only base hints left. +The algorithms seem to have been refined far enough to make the fonts with +substituted hints look better than the fonts without them or at least the +same. Still if the original fonts are not well-designed the detailed +hinting may emphasize the defects of the design, such as non-even thickness +of lines. So provided that you are not afraid of the X11 bug the best idea +would be to generate a font with this feature and without it, then compare +the results using the program \f(CWother/cmpf\fR (see the description +in \f(CWother/README\fR) and decide which one looks better. +\fBDefault: enabled\fR +.Sp +\f(CW\fBo/O\fR\fR \- Space optimization of the outlines\*(R' code. This kind of optimization +never hurts, and the only reason to disable this feature is for comparison +of the generated fonts with the fonts generated by the previous versions of +converter. Well, it _almost_ never hurts. As it turned out there exist +some brain-damaged printers which don't understand it. Actually this +feature does not change the outlines at all. The Type 1 font manual +provides a set of redundant operators that make font description shorter, +such as \*(L'10 hlineto\*(R' instead of \*(L'0 10 rlineto\*(R' to describe a horizontal +line. This feature enables use of these operators. +\fBDefault: enabled\fR +.Sp +\f(CW\fBs/S\fR\fR \- Smoothing of outlines. If the font is broken in some +way (even the ones that are not easily noticeable), such smoothing +may break it further. So disabling this feature is the first thing to be +tried if some font looks odd. But with smoothing off the hint generation +algorithms may not work properly too. +\fBDefault: enabled\fR +.Sp +\f(CW\fBt/T\fR\fR \- Auto-scaling to the 1000x1000 Type1 standard matrix. The +\s-1TTF\s0 fonts are described in terms of an arbitrary matrix up to +4000x4000. The converted fonts must be scaled to conform to +the Type1 standard. But the scaling introduces additional rounding +errors, so it may be curious sometimes to look at the font in its +original scale. +\fBDefault: enabled\fR +.Sp +\f(CW\fBv/V\fR\fR \- Do vectorization on the bitmap fonts. Functionally +\*(L"vectorization\*(R" is the same thing as \*(L"autotracing\*(R", a different word is +used purely to differentiate it from the Autotrace library. It tries to +produce nice smooth outlines from bitmaps. This feature is still a work +in progress though the results are already mostly decent. +\fBDefault: disabled\fR +.Sp +\f(CW\fBw/W\fR\fR \- Glyphs\*(R' width corection. This option is designed to be +used on broken fonts which specify too narrow widths for the +letters. You can tell that a font can benefit from this option +if you see that the characters are smashed together without +any whitespace between them. This option causes the converter +to set the character widths to the actual width of this character +plus the width of a typical vertical stem. But on the other hand +the well-designed fonts may have characters that look better if +their widths are set slightly narrower. Such well-designed fonts +will benefit from disabling this feature. You may want to convert +a font with and without this feature, compare the results and +select the better one. This feature may be used only on proportional +fonts, it has no effect on the fixed-width fonts. +\fBDefault: disabled\fR +.Sp +\f(CW\fBz/Z\fR\fR \- Use the Autotrace library on the bitmap fonts. The results +are horrible and \fBthe use of this option is not recommended\fR. This option is +present for experimental purposes. It may change or be removed in the +future. The working tracing can be achieved with option \f(CW\fB-OV\fR\fR. +\fBDefault: disabled\fR +.Ip "\(bu" 2 +\f(CW\fB-p \fIparser_name\fR\fR\fR \- Use the specified front-end parser to read the font file. +If this option is not used, ttf2pt1 selects the parser automatically based +on the suffix of the font file name, it uses the first parser in its +list that supports this font type. Now two parsers are supported: +.Sp +\ \ \f(CWttf\fR \- built-in parser for the ttf files (suffix \f(CW.ttf\fR) +.Sp +\ \ \f(CWbdf\fR \- built-in parser for the \s-1BDF\s0 files (suffix \f(CW.bdf\fR) +.Sp +\ \ \f(CWft\fR \- parser based on the FreeType-2 library (suffixes \f(CW.ttf\fR, +\&\f(CW.otf\fR, \f(CW.pfa\fR, \f(CW.pfb\fR) +.Sp +The parser \f(CWft\fR is \fB\s-1NOT\s0\fR linked in by default. See \f(CWMakefile\fR +for instructions how to enable it. We do no support this parser on +Windows: probably it will work but nobody tried and nobody knows how +to build it. +.Sp +The conversion of the bitmap fonts (such as \s-1BDF\s0) is simplistic yet, +producing jagged outlines. When converting such fonts, it might be +a good idea to turn off the hint substitution (using option \fB\-Ou\fR) +because the hints produced will be huge but not adding much to the +quality of the fonts. +.Ip "\(bu" 2 +\f(CW\fB-u \fInumber\fR\fR\fR \- Mark the font with this value as its +UniqueID. The UniqueID is used by the printers with the hard disks +to cache the rasterized characters and thus significantly +speed-up the printing. Some of those printers just can't +store the fonts without UniqueID on their disk.The problem +is that the \s-1ID\s0 is supposed to be unique, as it name says. And +there is no easy way to create a guaranteed unique \s-1ID\s0. Adobe specifies +the range 4000000-4999999 for private IDs but still it's difficult +to guarantee the uniqueness within it. So if you don't really need the +UniqueID don't use it, it's optional. Luckily there are a few millions of +possible IDs, so the chances of collision are rather low. +If instead of the number a special value \*(L'\f(CW\fBA\fR\fR\*(R' is given +then the converter generates the value of UniqueID automatically, +as a hash of the font name. (\fB\s-1NOTE\s0:\fR in the version 3.22 the +algorithm for autogeneration of UniqueID was changed to fit the values +into the Adobe-spacified range. This means that if UniqueIDs were used +then the printer's cache may need to be flushed before replacing the +fonts converted by an old version with fonts converted by a newer version). +A simple way to find if any of the fonts in a given directory have +duplicated UniqueIDs is to use the command: +.Sp +\f(CW\ \ cat *.pf[ab] | grep UniqueID | sort | uniq -c | grep -v ' 1 '\fR +.Sp +Or if you use \f(CWscripts/convert\fR it will do that for you automatically +plus it will also give the exact list of files with duplicate UIDs. +.Ip "\(bu" 2 +\f(CW\fB-v \fIsize\fR\fR\fR \- Re-scale the font to get the size of a typical uppercase +letter somewhere around the specified size. Actually, it re-scales +the whole font to get the size of one language-dependent letter to be +at least of the specified size. Now this letter is \*(L"A\*(R" in all the +supported languages. The size is specified in the points of the +Type 1 coordinate grids, the maximal value is 1000. This is an +experimental option and should be used with caution. It tries to +increase the visible font size for a given point size and thus make +the font more readable. But if overused it may cause the fonts to +look out of scale. As of now the interesting values of size for +this option seem to be located mostly between 600 and 850. This +re-scaling may be quite useful but needs more experience to +understand the balance of its effects. +.Ip "\(bu" 2 +\f(CW\fB-W \fIlevel\fR\fR\fR \- Select the verbosity level of the warnings. +Currently the levels from 0 to 4 are supported. Level 0 means no warnings +at all, level 4 means all the possible warnings. The default level is 3. +Other levels may be added in the future, so using the level number 99 is +recommended to get all the possible warnings. Going below level 2 is +not generally recommended because you may miss valuable information about +the problems with the fonts being converted. +.Ip "\(bu" 2 +\fBObsolete option:\fR +\f(CW\fB-A\fR\fR \- Print the font metrics (.afm file) instead of the font on \s-1STDOUT\s0. +Use \fB\-\s-1GA\s0\fR instead. +.Ip "\(bu" 2 +\fBVery obsolete option:\fR +.Sp +The algorithm that implemented the forced fixed width had major +flaws, so it was disabled. The code is still in the program and +some day it will be refined and returned back. Meanwhile the +option name \*(L'\fB\-f\fR\*(R' was reused for another option. The old version was: +.Sp +\f(CW\fB-f\fR\fR \- Don't try to force the fixed width of font. Normally the converter +considers the fonts in which the glyph width deviates by not more +than 5% as buggy fixed width fonts and forces them to have really +fixed width. If this is undesirable, it can be disabled by this option. +.PP +The \f(CW.pfa\fR font format supposes that the description of the characters +is binary encoded and encrypted. This converter does not encode or +encrypt the data by default, you have to specify the option \*(L'\fB\-e\fR\*(R' +or use the \f(CWt1asm\fR program to assemble (that means, encode and +encrypt) the font program. The \f(CWt1asm\fR program that is included with +the converter is actually a part of the \f(CWt1utils\fR package, rather old +version of which may be obtained from +.PP +http://ttf2pt1.sourceforge.net/t1utils.tar.gz +.PP +Note that \f(CWt1asm\fR from the old version of that package won't work properly +with the files generated by \f(CWttf2pt1\fR version 3.20 and later. Please use +\f(CWt1asm\fR packaged with \f(CWttf2pt1\fR or from the new version \f(CWt1utils\fR +instead. For a newer version of \f(CWt1utils\fR please look at +.PP +http://www.lcdf.org/~eddietwo/type/ +.SH "EXAMPLES" +So, the following command lines: +.PP +\f(CWttf2pt1 -e ttffont.ttf t1font\fR +.PP +\f(CWttf2pt1 ttffont.ttf - | t1asm >t1font.pfa\fR +.PP +represent two ways to get a working font. The benefit of the second form +is that other filters may be applied to the font between the converter +and assembler. +.SH "FILES" +.Ip "\(bu" 2 +\s-1TTF2PT1_LIBXDIR/\s0t1asm +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR\s0/* +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0scripts/* +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0other/* +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/README\s0 +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/FONTS\s0 +.SH "SEE ALSO" +.Ip "\(bu" 4 +the \fIttf2pt1_convert(1)\fR manpage +.Ip "\(bu" 4 +the \fIttf2pt1_x2gs(1)\fR manpage +.Ip "\(bu" 4 +the \fIt1asm(1)\fR manpage +.Ip "\(bu" 4 +ttf2pt1-announce@lists.sourceforge.net +.Sp +The mailing list with announcements about ttf2pt1. It is a moderated mailing +with extremely low traffic. Everyone is encouraged to subscribe to keep in +touch with the current status of project. To subscribe use the Web interface +at http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-announce. +If you have only e-mail access to the Net then send a subscribe request to +the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody +will help you with subscription. +.Ip "\(bu" 4 +ttf2pt1-devel@lists.sourceforge.net +.Sp +ttf2pt1-users@lists.sourceforge.net +.Sp +The ttf2pt1 mailing lists for development and users issues. They have not +that much traffic either. To subscribe use the Web interface at +http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-devel +and http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-users. +If you have only e-mail access to the Net then send a subscribe request to +the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody +will help you with subscription. +.Ip "\(bu" 4 +http://ttf2pt1.sourceforge.net +.Sp +The main page of the project. +.Sp +http://www.netspace.net.au/~mheath/ttf2pt1/ +.Sp +The old main page of the project. +.SH "BUGS" +It seems that many Eastern fonts use features of the TTF format that are +not supported by the ttf2pt1's built-in front-end parser. Because of +this for now we recommend using the FreeType-based parser (option +\&\*(R'\fB\-p ft\fR') with the \*(L"\f(CWplane\fR\*(R" language. +.Sh "Troubleshooting and bug reports" +Have problems with conversion of some font ? The converter dumps core ? Or your +printer refuses to understand the converted fonts ? Or some characters are +missing ? Or some characters look strange ? +.PP +Send the bug reports to the ttf2pt1 development mailing list at +ttf2pt1-devel@lists.sourceforge.net. +.PP +Try to collect more information about the problem and include it into +the bug report. (Of course, even better if you would provide a ready +fix, but just a detailed bug report is also good). Provide detailed +information about your problem, this will speed up the response greatly. +Don't just write \*(L"this font looks strange after conversion\*(R" but describe +what's exactly wrong with it: for example, what characters look wrong +and what exactly is wrong about their look. Providing a link to the +original font file would be also a good idea. Try to do a little +troublehooting and report its result. This not only would help with +the fix but may also give you a temporary work-around for the bug. +.PP +First, enable full warnings with option \*(L'\fB\-W99\fR\*(R', save them to +a file and read carefully. Sometimes the prolem is with a not implemented +feature which is reported in the warnings. Still, reporting about such +problems may be a good idea: some features were missed to cut corners, +in hope that no real font is using them. So a report about a font using +such a feature may motivate someone to implement it. Of course, you +may be the most motivated person: after all, you are the one wishing +to convert that font. ;\-) Seriously, the philosophy \*(L"scrath your own itch\*(R" +seems to be the strongest moving force behind the Open Source software. +.PP +The next step is playing with the options. This serves a dual purpose: +on one hand, it helps to localize the bug, on the other hand you may be +able to get a working version of the font for the meantime while the +bug is being fixed. The typical options to try out are: first \*(L'\fB\-Ou\fR\*(R', if +it does not help then \*(L'\fB\-Os\fR\*(R', then \*(L'\fB\-Oh\fR\*(R', then \*(L'\fB\-Oo\fR\*(R'. +They are described in a bit more detail above. Try them one by one +and in combinations. See if with them the resulting fonts look better. +.PP +On some fonts ttf2pt1 just crashes. Commonly that happens because the +font being converted is highly defective (although sometimes the bug +is in ttf2pt1 itself). In any case it should not crash, so the reports +about such cases will help to handle these defects properly in future. +.PP +We try to respond to the bug reports in a timely fashion but alas, this +may not always be possible, especially if the problem is complex. +This is a volunteer project and its resources are limited. Because +of this we would appreciate bug reports as detailed as possible, +and we would appreciate the ready fixes and contributions even more. +.SH "HISTORY" +Based on ttf2pfa by Andrew Weeks, and help from Frank Siegert. +.PP +Modification by Mark Heath. +.PP +Further modification by Sergey Babkin. +.PP +The Type1 assembler by I. Lee Hetherington with modifications by +Kai-Uwe Herbing. + +.rn }` '' +.IX Title "TTF2PT1 1" +.IX Name "TTF2PT1 - A True Type to PostScript Type 1 Font Converter" + +.IX Header "NAME" + +.IX Header "SYNOPSIS" + +.IX Header "DESCRIPTION" + +.IX Header "OPTIONS" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "EXAMPLES" + +.IX Header "FILES" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "SEE ALSO" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "BUGS" + +.IX Subsection "Troubleshooting and bug reports" + +.IX Header "HISTORY" + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.c b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.c new file mode 100644 index 00000000..5e7b9c8f --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.c @@ -0,0 +1,2694 @@ +/* + * True Type Font to Adobe Type 1 font converter + * By Mark Heath + * Based on ttf2pfa by Andrew Weeks + * With help from Frank M. Siegert + * + * see COPYRIGHT for full copyright notice + * +*********************************************************************** + * + * Orion Richardson + * + * Added bounding box calculations for Unicode glyphs in the .ufm file + * +*********************************************************************** + * + * Steven Wittens + * + * Added generation of .ufm file + * +*********************************************************************** + * + * Sergey Babkin , + * + * Added post-processing of resulting outline to correct the errors + * both introduced during conversion and present in the original font, + * autogeneration of hints (has yet to be improved though) and BlueValues, + * scaling to 1000x1000 matrix, option to print the result on STDOUT, + * support of Unicode to CP1251 conversion, optimization of the + * resulting font code by space (that improves the speed too). Excluded + * the glyphs that are unaccessible through the encoding table from + * the output file. Added the built-in Type1 assembler (taken from + * the `t1utils' package). + * +*********************************************************************** + * + * Thomas Henlich + * + * Added generation of .afm file (font metrics) + * Read encoding information from encoding description file + * Fixed bug in error message about unknown language ('-l' option) + * Added `:' after %%!PS-AdobeFont-1.0 + * changed unused entries in ISOLatin1Encoding[] from .notdef to c127,c128... + * +*********************************************************************** + * + * Thomas Henlich + * + * Added generation of .afm file (font metrics) + * +*********************************************************************** + * + * Bug Fixes: +************************************************************************ + * + * Sun, 21 Jun 1998 Thomas Henlich + * 1. "width" should be "short int" because otherwise: + * characters with negative widths (e.g. -4) become *very* wide (65532) + * 2. the number of /CharStrings is numglyphs and not numglyphs+1 + * +*********************************************************************** + * + * + * + * The resultant font file produced by this program still needs to be ran + * through t1asm (from the t1utils archive) to produce a completely valid + * font. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _GNU_SOURCE +#include +#endif + +#ifndef WINDOWS +# include +# include +# define BITBUCKET "/dev/null" +# include +#else +# define WINDOWS_FUNCTIONS /* ask to define functions - in one file only */ +# include "windows.h" +# define BITBUCKET "NUL" +# define snprintf _snprintf +#endif + +#include "pt1.h" +#include "global.h" +#include "version.h" + +/* globals */ + +/* table of front-ends */ + +extern struct frontsw ttf_sw; +extern struct frontsw bdf_sw; +#if defined(USE_FREETYPE) + extern struct frontsw freetype_sw; +#endif + +struct frontsw *frontswtab[] = { + &bdf_sw, +#if defined(USE_FREETYPE) && defined(PREFER_FREETYPE) + &freetype_sw, +#endif + &ttf_sw, +#if defined(USE_FREETYPE) && !defined(PREFER_FREETYPE) + &freetype_sw, +#endif + NULL /* end of table */ +}; + +struct frontsw *cursw=0; /* the active front end */ +char *front_arg=""; /* optional argument */ + +/* options */ +int encode = 0; /* encode the resulting file */ +int pfbflag = 0; /* produce compressed file */ +int wantafm=0; /* want to see .afm instead of .t1a on stdout */ +int correctvsize=0; /* try to correct the vertical size of characters */ +int wantuid = 0; /* user wants UniqueID entry in the font */ +int allglyphs = 0; /* convert all glyphs, not only 256 of them */ +int warnlevel = 3; /* the level of permitted warnings */ +int forcemap = 0; /* do mapping even on non-Unicode fonts */ +/* options - maximal limits */ +int max_stemdepth = 128; /* maximal depth of stem stack in interpreter (128 - limit from X11) */ +/* options - debugging */ +int absolute = 0; /* print out in absolute values */ +int reverse = 1; /* reverse font to Type1 path directions */ +/* options - suboptions of Outline Processing, defaults are set in table */ +int optimize; /* enables space optimization */ +int smooth; /* enable smoothing of outlines */ +int transform; /* enables transformation to 1000x1000 matrix */ +int hints; /* enables autogeneration of hints */ +int subhints; /* enables autogeneration of substituted hints */ +int trybold; /* try to guess whether the font is bold */ +int correctwidth; /* try to correct the character width */ +int vectorize; /* vectorize the bitmaps */ +int use_autotrace; /* use the autotrace library on bitmap */ +/* options - suboptions of File Generation, defaults are set in table */ +int gen_pfa; /* generate the font file */ +int gen_afm; /* generate the metrics file */ +int gen_ufm; /* generate the unicode metrics file */ +int gen_dvienc; /* generate the dvips encoding file */ + +/* not quite options to select a particular source encoding */ +int force_pid = -1; /* specific platform id */ +int force_eid = -1; /* specific encoding id */ + +/* structure to define the sub-option lists controlled by the + * case: uppercase enables them, lowercase disables + */ +struct subo_case { + char disbl; /* character to disable - enforced lowercase */ + char enbl; /* character to enable - auto-set as toupper(disbl) */ + int *valp; /* pointer to the actual variable containing value */ + int dflt; /* default value */ + char *descr; /* description */ +}; + +int debug = DEBUG; /* debugging flag */ + +FILE *null_file, *pfa_file, *afm_file, *ufm_file, *dvienc_file; +int numglyphs; +struct font_metrics fontm; + +/* non-globals */ +static char *strUID = 0; /* user-supplied UniqueID */ +static unsigned long numUID; /* auto-generated UniqueID */ + +static int ps_fmt_3 = 0; +static double scale_factor, original_scale_factor; + +static char *glyph_rename[ENCTABSZ]; + +/* the names assigned if the original font + * does not specify any + */ + +static char *Fmt3Encoding[256] = { + "c0", "c1", "c2", "c3", + "c4", "c5", "c6", "c7", + "c8", "c9", "c10", "c11", + "c12", "CR", "c14", "c15", + "c16", "c17", "c18", "c19", + "c20", "c21", "c22", "c23", + "c24", "c25", "c26", "c27", + "c28", "c29", "c30", "c31", + "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quotesingle", + "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", + "zero", "one", "two", "three", + "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", + "at", "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", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", + "grave", "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", "braceleft", + "bar", "braceright", "asciitilde", "c127", + "c128", "c129", "quotesinglbase", "florin", + "quotedblbase", "ellipsis", "dagger", "daggerdbl", + "circumflex", "perthousand", "Scaron", "guilsinglleft", + "OE", "c141", "c142", "c143", + "c144", "quoteleft", "quoteright", "quotedblleft", + "quotedblright", "bullet", "endash", "emdash", + "tilde", "trademark", "scaron", "guilsinglright", + "oe", "c157", "c158", "Ydieresis", + "nbspace", "exclamdown", "cent", "sterling", + "currency", "yen", "brokenbar", "section", + "dieresis", "copyright", "ordfeminine", "guillemotleft", + "logicalnot", "sfthyphen", "registered", "macron", + "degree", "plusminus", "twosuperior", "threesuperior", + "acute", "mu", "paragraph", "periodcentered", + "cedilla", "onesuperior", "ordmasculine", "guillemotright", + "onequarter", "onehalf", "threequarters", "questiondown", + "Agrave", "Aacute", "Acircumflex", "Atilde", + "Adieresis", "Aring", "AE", "Ccedilla", + "Egrave", "Eacute", "Ecircumflex", "Edieresis", + "Igrave", "Iacute", "Icircumflex", "Idieresis", + "Eth", "Ntilde", "Ograve", "Oacute", + "Ocircumflex", "Otilde", "Odieresis", "multiply", + "Oslash", "Ugrave", "Uacute", "Ucircumflex", + "Udieresis", "Yacute", "Thorn", "germandbls", + "agrave", "aacute", "acircumflex", "atilde", + "adieresis", "aring", "ae", "ccedilla", + "egrave", "eacute", "ecircumflex", "edieresis", + "igrave", "iacute", "icircumflex", "idieresis", + "eth", "ntilde", "ograve", "oacute", + "ocircumflex", "otilde", "odieresis", "divide", + "oslash", "ugrave", "uacute", "ucircumflex", + "udieresis", "yacute", "thorn", "ydieresis" +}; + +#ifdef notdef /* { */ +/* This table is not used anywhere in the code + * so it's ifdef-ed out by default but left in + * the source code for reference purposes (and + * possibly for future use) + */ + +static char *ISOLatin1Encoding[256] = { + ".null", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", "CR", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quoteright", + "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", + "zero", "one", "two", "three", + "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", + "at", "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", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", + "grave", "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", "braceleft", + "bar", "braceright", "asciitilde", "c127", + "c128", "c129", "quotesinglbase", "florin", + "quotedblbase", "ellipsis", "dagger", "daggerdbl", + "circumflex", "perthousand", "Scaron", "guilsinglleft", + "OE", "c141", "c142", "c143", + "c144", "quoteleft", "quoteright", "quotedblleft", + "quotedblright", "bullet", "endash", "emdash", + "tilde", "trademark", "scaron", "guilsinglright", + "oe", "c157", "c158", "Ydieresis", + "nbspace", "exclamdown", "cent", "sterling", + "currency", "yen", "brokenbar", "section", + "dieresis", "copyright", "ordfeminine", "guillemotleft", + "logicalnot", "sfthyphen", "registered", "macron", + "degree", "plusminus", "twosuperior", "threesuperior", + "acute", "mu", "paragraph", "periodcentered", + "cedilla", "onesuperior", "ordmasculine", "guillemotright", + "onequarter", "onehalf", "threequarters", "questiondown", + "Agrave", "Aacute", "Acircumflex", "Atilde", + "Adieresis", "Aring", "AE", "Ccedilla", + "Egrave", "Eacute", "Ecircumflex", "Edieresis", + "Igrave", "Iacute", "Icircumflex", "Idieresis", + "Eth", "Ntilde", "Ograve", "Oacute", + "Ocircumflex", "Otilde", "Odieresis", "multiply", + "Oslash", "Ugrave", "Uacute", "Ucircumflex", + "Udieresis", "Yacute", "Thorn", "germandbls", + "agrave", "aacute", "acircumflex", "atilde", + "adieresis", "aring", "ae", "ccedilla", + "egrave", "eacute", "ecircumflex", "edieresis", + "igrave", "iacute", "icircumflex", "idieresis", + "eth", "ntilde", "ograve", "oacute", + "ocircumflex", "otilde", "odieresis", "divide", + "oslash", "ugrave", "uacute", "ucircumflex", + "udieresis", "yacute", "thorn", "ydieresis" +}; + +#endif /* } notdef */ + +static char *adobe_StandardEncoding[256] = { + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quoteright", + "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", + "zero", "one", "two", "three", + "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", + "at", "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", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", + "quoteleft", "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", "braceleft", + "bar", "braceright", "asciitilde", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", "exclamdown", "cent", "sterling", + "fraction", "yen", "florin", "section", + "currency", "quotesingle", "quotedblleft", "guillemotleft", + "guilsinglleft", "guilsinglright", "fi", "fl", + ".notdef", "endash", "dagger", "daggerdbl", + "periodcentered", ".notdef", "paragraph", "bullet", + "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", + "ellipsis", "perthousand", ".notdef", "questiondown", + ".notdef", "grave", "acute", "circumflex", + "tilde", "macron", "breve", "dotaccent", + "dieresis", ".notdef", "ring", "cedilla", + ".notdef", "hungarumlaut", "ogonek", "caron", + "emdash", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", "AE", ".notdef", "ordfeminine", + ".notdef", ".notdef", ".notdef", ".notdef", + "Lslash", "Oslash", "OE", "ordmasculine", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", "ae", ".notdef", ".notdef", + ".notdef", "dotlessi", ".notdef", ".notdef", + "lslash", "oslash", "oe", "germandbls", + ".notdef", ".notdef", ".notdef", ".notdef" +}; + +/* + * Decription of the supported conversions from Unicode + * + * SB + * Yes, I know that the compiled-in conversion is stupid but + * it is simple to implement and allows not to worry about the + * filesystem context. After all, the source is always available + * and adding another language to it is easy. + * + * The language name is expected to be the same as the subdirectory name + * in the `encodings' directory (for possible future extensions). + * The primary use of the aliases is for guessing based on the current + * locale. + */ + +#define MAXUNIALIAS 10 +#define MAXUNITABLES 3 + +/* the character used as the language argument separator */ +#define LANG_ARG_SEP '+' + + +/* + * Types of language-related routines. Arguments are: + * name is the glyph name + * arg is the user-specified language-dependent argument + * which can for example select the subfont plane for Eastern fonts. + * If none is supplied by user then an empty string ("") is passed. + * If no language is specified by user and auto-guessing happens + * then NULL is passed. + * when shows if the conversion by name was called before conversion by + * map or after (it's called twice) + */ + +/* type of the Unicode map initialization routine */ +typedef void uni_init_t(char *arg); + +/* type of Unicode converter-by-name function + * it's called for each glyph twice: one time for each glyph + * before doing conversion by map and one time after + */ +typedef int uni_conv_t(char *name, char *arg, int when); +#define UNICONV_BYNAME_BEFORE 0 +#define UNICONV_BYNAME_AFTER 1 + +struct uni_language { + uni_init_t *init[MAXUNITABLES]; /* map initialization routines */ + uni_conv_t *convbyname; /* the name-based conversion function */ + char *name; /* the language name */ + char *descr; /* description */ + char *alias[MAXUNIALIAS]; /* aliases of the language name */ + int sample_upper; /* code of some uppercase character for correctvsize() */ +}; + +/* the converter routines have an option of adding this suffix to the font name */ +static char *uni_font_name_suffix = ""; /* empty by default */ +/* this buffer may be used to store the suffix */ +#define UNI_MAX_SUFFIX_LEN 100 +static char uni_suffix_buf[UNI_MAX_SUFFIX_LEN+1]; + +/* + * Prototypes of the conversion routines + */ + +static uni_init_t unicode_latin1; +static uni_init_t unicode_latin2; +static uni_init_t unicode_latin4; +static uni_init_t unicode_latin5; +static uni_init_t unicode_cyrillic; +static uni_init_t unicode_adobestd; +static uni_init_t unicode_plane; +static uni_conv_t unicode_adobestd_byname; + +static uni_init_t unicode_init_user; + +/* + * The order of descriptions is important: if we can't guess the + * language we just call all the conversion routines in order until + * we find one that understands this glyph. + */ +static struct uni_language uni_lang[]= { + /* pseudo-language for all the languages using Latin1 */ + { + { unicode_latin1 }, + 0, /* no name-based mapping */ + "latin1", + "works for most of the Western languages", + { "en_", "de_", "fr_", "nl_", "no_", "da_", "it_" }, + 'A' + }, + { /* by Szalay Tamas */ + { unicode_latin2 }, + 0, /* no name-based mapping */ + "latin2", + "works for Central European languages", + { "hu_","pl_","cz_","si_","sk_" }, + 'A' + }, + { /* by Rièardas Èepas */ + { unicode_latin4 }, + 0, /* no name-based mapping */ + "latin4", + "works for Baltic languages", + { "lt_", "lv_" }, /* doubt about ee_ */ + 'A' + }, + { /* by Turgut Uyar */ + { unicode_latin5 }, + 0, /* no name-based mapping */ + "latin5", + "for Turkish", + { "tr_" }, + 'A' + }, + { /* by Zvezdan Petkovic */ + { unicode_cyrillic, unicode_latin1 }, + 0, /* no name-based mapping */ + "cyrillic", + "in Windows encoding", + { "bg_", "be_", "mk_", "ru_", "sr_", "su_", "uk_" }, + 'A' + }, + { + { unicode_cyrillic, unicode_latin1 }, + 0, /* no name-based mapping */ + "russian", + "obsolete, use cyrillic instead", + { 0 }, + 'A' + }, + { + { unicode_cyrillic, unicode_latin1 }, + 0, /* no name-based mapping */ + "bulgarian", + "obsolete, use cyrillic instead", + { 0 }, + 'A' + }, + { + { unicode_adobestd }, + unicode_adobestd_byname, + "adobestd", + "Adobe Standard, expected by TeX", + { NULL }, + 'A' + }, + { + { unicode_plane }, + 0, /* no name-based mapping */ + "plane", + "one plane of Unicode or other multi-byte encoding as is", + { NULL }, + 0 /* no easy way to predict the capital letters */ + }, +}; + +static struct uni_language uni_lang_user = { + { unicode_init_user }, + 0, /* no name-based mapping */ + 0, /* no name */ + 0, /* no description */ + { 0 }, + 0 /* no sample */ +}; + +static struct uni_language *uni_lang_selected=0; /* 0 means "unknown, try all" */ +static int uni_sample='A'; /* sample of an uppercase character */ +static char *uni_lang_arg=""; /* user-supplied language-dependent argument */ + +extern int runt1asm(int); + +/* + * user-defined loadable maps + */ + + +/* The idea begind buckets is to avoid comparing every code with all ENCTABSZ codes in table. + * All the 16-bit unicode space is divided between a number of equal-sized buckets. + * Initially all the buckets are marked with 0. Then if any code in the bucket is + * used it's marked with 1. Later during translation we check the code's bucket first + * and it it's 0 then return failure right away. This may be useful for + * Chinese fonts with many thousands of glyphs. + */ + +#define BUCKET_ID_BITS 11 +#define MARK_UNI_BUCKET(unicode) SET_BITMAP(uni_user_buckets, (unicode)>>(16-BUCKET_ID_BITS)) +#define IS_UNI_BUCKET(unicode) IS_BITMAP(uni_user_buckets, (unicode)>>(16-BUCKET_ID_BITS)) + +static DEF_BITMAP(uni_user_buckets, 1< UNI_MAX_SUFFIX_LEN-1) + arg = NULL; + else { + sprintf(uni_suffix_buf, "-%s", arg); + uni_font_name_suffix = uni_suffix_buf; + } + } + + /* now read in the encoding description file, if requested */ + if ((unicode_map_file = fopen(path, "r")) == NULL) { + fprintf(stderr, "**** Cannot access map file '%s' ****\n", path); + exit(1); + } + + sawplane = 0; + if(arg==NULL) + enabled = found = 1; + else + enabled = found = 0; + + lineno=0; curpos=0; + while (fgets (buffer, UNIBFSZ, unicode_map_file) != NULL) { + char name[UNIBFSZ]; + + lineno++; + + if(sscanf(buffer, "plane %s", name)==1) { + sawplane = 1; + if(arg == 0) { + fprintf(stderr, "**** map file '%s' requires plane name\n", path); + fprintf(stderr, "for example:\n"); + fprintf(stderr, " ttf2pt1 -L %s%c[pid=N,eid=N,]%s ...\n", + path, LANG_ARG_SEP, name); + fprintf(stderr, "to select plane '%s'\n", name); + exit(1); + } + if( !strcmp(arg, name) ) { + enabled = found = 1; + curpos = 0; + } else { + enabled = 0; + if(found) /* no need to read further */ + break; + } + continue; + } + + if(sscanf(buffer, "id %d %d", pid, eid)==2) { + if( !overid /* only if the user has not overriden */ + && (enabled || !sawplane) ) { + force_pid = pid; force_eid = eid; + forcemap = 1; + } + continue; + } + + if( !enabled ) + continue; /* skip to the next plane */ + + if( sscanf(buffer, "at %i", &curpos) == 1 ) { + if(curpos > 255) { + fprintf(stderr, "**** map file '%s' line %d: code over 255\n", path, lineno); + exit(1); + } + if(ISDBG(EXTMAP)) fprintf(stderr, "=== at 0x%x\n", curpos); + continue; + } + + /* try the format of Roman Czyborra's files */ + if ( sscanf (buffer, " =%x U+%4x", &code, &unicode) == 2 + /* try the format of Linux locale charmap file */ + || sscanf (buffer, " <%*s /x%x ", &code, &unicode) == 2 ) { + if (code < ENCTABSZ) { + if(code >= enctabsz) enctabsz=code+1; + unicode_map[code] = unicode; + glyph_rename[code] = NULL; + } + } + /* try the format with glyph renaming */ + else if (sscanf (buffer, " !%x U+%4x %128s", &code, + &unicode, name) == 3) { + if (code < ENCTABSZ) { + if(code >= enctabsz) enctabsz=code+1; + unicode_map[code] = unicode; + glyph_rename[code] = strdup(name); + } + } + /* try the compact sequence format */ + else if( (n=sscanf(buffer, " %i%n", &unicode, &cnt)) == 1 ) { + p = buffer; + do { + if(curpos > 255) { + fprintf(stderr, "**** map file '%s' line %d: code over 255 for unicode 0x%x\n", + path, lineno, unicode); + exit(1); + } + if(ISDBG(EXTMAP)) fprintf(stderr, "=== 0x%d -> 0x%x\n", curpos, unicode); + unicode_map[curpos++] = unicode; + p += cnt; + if( sscanf(p, " %[,-]%n", &next,&cnt) == 1 ) { + if(ISDBG(EXTMAP)) fprintf(stderr, "=== next: '%c'\n", next); + p += cnt; + if( next == '-' ) { /* range */ + if ( sscanf(p, " %i%n", &unicode2, &cnt) != 1 ) { + fprintf(stderr, "**** map file '%s' line %d: missing end of range\n", path, lineno); + exit(1); + } + p += cnt; + if(ISDBG(EXTMAP)) fprintf(stderr, "=== range 0x%x to 0x%x\n", unicode, unicode2); + for(unicode++; unicode <= unicode2; unicode++) { + if(curpos > 255) { + fprintf(stderr, "**** map file '%s' line %d: code over 255 in unicode range ...-0x%x\n", + path, lineno, unicode2); + exit(1); + } + if(ISDBG(EXTMAP)) fprintf(stderr, "=== 0x%x -> 0x%x\n", curpos, unicode); + unicode_map[curpos++] = unicode; + } + } + } + } while ( sscanf(p, " %i%n", &unicode, &cnt) == 1 ); + } + + } + + fclose (unicode_map_file); + + if( !found ) { + fprintf(stderr, "**** map file '%s' has no plane '%s'\n", path, arg); + exit(1); + } + + if(unicode_map['A'] == 'A') + uni_sample = 'A'; /* seems to be compatible with Latin */ + else + uni_sample = 0; /* don't make any assumptions */ +} + +/* + * by Zvezdan Petkovic + */ +static void +unicode_cyrillic( + char *arg +) +{ + int i; + static unsigned int cyrillic_unicode_map[] = { + 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, /* 80 */ + 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, /* 88 */ + 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */ + 0x02dc, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, /* 98 */ + 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, /* A0 */ + 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, /* A8 */ + 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, /* B0 */ + 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, /* B8 */ + }; + + for(i=0; i<=0x7F; i++) + unicode_map[i] = i; + + for(i=0x80; i<=0xBF; i++) + unicode_map[i] = cyrillic_unicode_map[i-0x80]; + + for(i=0xC0; i<=0xFF; i++) + unicode_map[i] = i+0x350; + +} + +static void +unicode_latin1( + char *arg +) +{ + int i; + static unsigned int latin1_unicode_map[] = { + 0x20ac, -1, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, /* 80 */ + 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f, /* 88 */ + 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */ + 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178, /* 98 */ + }; + + for(i=0; i<=0x7F; i++) + unicode_map[i] = i; + + for(i=0x80; i<=0x9F; i++) + unicode_map[i] = latin1_unicode_map[i-0x80]; + + for(i=0xA0; i<=0xFF; i++) + unicode_map[i] = i; +} + +static void +unicode_adobestd( + char *arg +) +{ + int i; + static unsigned int adobestd_unicode_map[] = { + -1, 0x00a1, 0x00a2, 0x00a3, 0x2215, 0x00a5, 0x0192, 0x00a7, /* A0 */ + 0x00a4, 0x0027, 0x201c, 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, /* A8 */ + -1, 0x2013, 0x2020, 0x2021, 0x2219, -1, 0x00b6, 0x2022, /* B0 */ + 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030, -1, 0x00bf, /* B8 */ + -1, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x02c9, 0x02d8, 0x02d9, /* C0 */ + 0x00a8, -1, 0x02da, 0x00b8, -1, 0x02dd, 0x02db, 0x02c7, /* C8 */ + 0x2014, -1, -1, -1, -1, -1, -1, -1, /* D0 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* D8 */ + -1, 0x00c6, -1, 0x00aa, -1, -1, -1, -1, /* E0 */ + 0x0141, 0x00d8, 0x0152, 0x00ba, -1, -1, -1, -1, /* E8 */ + -1, 0x00e6, -1, -1, -1, 0x0131, -1, -1, /* F0 */ + 0x0142, 0x00f8, 0x0153, 0x00df, -1, -1, -1, -1, /* F8 */ + }; + + for(i=0; i<=0x7F; i++) + unicode_map[i] = i; + + unicode_map[0x27] = 0x2019; + unicode_map[0x60] = -1; + + /* 0x80 to 0x9F is a hole */ + + for(i=0xA0; i<=0xFF; i++) + unicode_map[i] = adobestd_unicode_map[i-0xA0]; +} + +/* + * Not all of the Adobe glyphs are in the Unicode + * standard maps, so the font creators have + * different ideas about their codes. Because + * of this we try to map based on the glyph + * names instead of Unicode codes. If there are + * no glyph names (ps_fmt_3!=0) we fall back + * to the code-based scheme. + */ + +static int +unicode_adobestd_byname( + char *name, + char *arg, + int where +) +{ + int i; + + /* names always take precedence over codes */ + if(where == UNICONV_BYNAME_AFTER) + return -1; + + for(i=32; i<256; i++) { + if(!strcmp(name, adobe_StandardEncoding[i])) + return i; + } + return -1; + +} + +static void +unicode_latin2( + char *arg +) +{ + int i; + static unsigned int latin2_unicode_map[] = { + 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, /* A0 */ + 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, /* A8 */ + 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, /* B0 */ + 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* B8 */ + 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, /* C0 */ + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* C8 */ + 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, /* D0 */ + 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* D8 */ + 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, /* E0 */ + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* E8 */ + 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, /* F0 */ + 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, /* F8 */ + }; + + for(i=0; i<=0x7E; i++) + unicode_map[i] = i; + + /* 7F-9F are unused */ + + for(i=0xA0; i<=0xFF; i++) + unicode_map[i] = latin2_unicode_map[i-0xA0]; +} + +static void +unicode_latin4( + char *arg +) +{ + int i; + static unsigned int latin4_unicode_map[] = { + 0x0080, 0x0081, 0x201a, 0x0192, -1, 0x2026, 0x2020, 0x2021, /* 80 */ + 0x02c6, 0x2030, -1, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, /* 88 */ + 0x201e, 0x201c, 0x2019, -1, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */ + 0x02dc, 0x2122, -1, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, /* 98 */ + 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, /* A0 */ + 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, /* A8 */ + 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, /* B0 */ + 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, /* B8 */ + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, /* C0 */ + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, /* C8 */ + 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, /* D0 */ + 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, /* D8 */ + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, /* E0 */ + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, /* E8 */ + 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, /* F0 */ + 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, /* F8 */ + }; + + for(i=0; i<=0x7F; i++) + unicode_map[i] = i; + + for(i=0x80; i<=0xFF; i++) + unicode_map[i] = latin4_unicode_map[i-0x80]; + +#if 0 /* for documentation purposes only */ + case 0x201e: return 0x90; /* these two quotes are a hack only */ + case 0x201c: return 0x91; /* these two quotes are a hack only */ + case 0x00A0: return 0xA0; /* NO-BREAK SPACE */ + case 0x0104: return 0xA1; /* LATIN CAPITAL LETTER A WITH OGONEK */ + case 0x0138: return 0xA2; /* LATIN SMALL LETTER KRA */ + case 0x0156: return 0xA3; /* LATIN CAPITAL LETTER R WITH CEDILLA */ + case 0x00A4: return 0xA4; /* CURRENCY SIGN */ + case 0x0128: return 0xA5; /* LATIN CAPITAL LETTER I WITH TILDE */ + case 0x013B: return 0xA6; /* LATIN CAPITAL LETTER L WITH CEDILLA */ + case 0x00A7: return 0xA7; /* SECTION SIGN */ + case 0x00A8: return 0xA8; /* DIAERESIS */ + case 0x0160: return 0xA9; /* LATIN CAPITAL LETTER S WITH CARON */ + case 0x0112: return 0xAA; /* LATIN CAPITAL LETTER E WITH MACRON */ + case 0x0122: return 0xAB; /* LATIN CAPITAL LETTER G WITH CEDILLA */ + case 0x0166: return 0xAC; /* LATIN CAPITAL LETTER T WITH STROKE */ + case 0x00AD: return 0xAD; /* SOFT HYPHEN */ + case 0x017D: return 0xAE; /* LATIN CAPITAL LETTER Z WITH CARON */ + case 0x00AF: return 0xAF; /* MACRON */ + case 0x00B0: return 0xB0; /* DEGREE SIGN */ + case 0x0105: return 0xB1; /* LATIN SMALL LETTER A WITH OGONEK */ + case 0x02DB: return 0xB2; /* OGONEK */ + case 0x0157: return 0xB3; /* LATIN SMALL LETTER R WITH CEDILLA */ + case 0x00B4: return 0xB4; /* ACUTE ACCENT */ + case 0x0129: return 0xB5; /* LATIN SMALL LETTER I WITH TILDE */ + case 0x013C: return 0xB6; /* LATIN SMALL LETTER L WITH CEDILLA */ + case 0x02C7: return 0xB7; /* CARON */ + case 0x00B8: return 0xB8; /* CEDILLA */ + case 0x0161: return 0xB9; /* LATIN SMALL LETTER S WITH CARON */ + case 0x0113: return 0xBA; /* LATIN SMALL LETTER E WITH MACRON */ + case 0x0123: return 0xBB; /* LATIN SMALL LETTER G WITH CEDILLA */ + case 0x0167: return 0xBC; /* LATIN SMALL LETTER T WITH STROKE */ + case 0x014A: return 0xBD; /* LATIN CAPITAL LETTER ENG */ + case 0x017E: return 0xBE; /* LATIN SMALL LETTER Z WITH CARON */ + case 0x014B: return 0xBF; /* LATIN SMALL LETTER ENG */ + case 0x0100: return 0xC0; /* LATIN CAPITAL LETTER A WITH MACRON */ + case 0x00C1: return 0xC1; /* LATIN CAPITAL LETTER A WITH ACUTE */ + case 0x00C2: return 0xC2; /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ + case 0x00C3: return 0xC3; /* LATIN CAPITAL LETTER A WITH TILDE */ + case 0x00C4: return 0xC4; /* LATIN CAPITAL LETTER A WITH DIAERESIS */ + case 0x00C5: return 0xC5; /* LATIN CAPITAL LETTER A WITH RING ABOVE */ + case 0x00C6: return 0xC6; /* LATIN CAPITAL LIGATURE AE */ + case 0x012E: return 0xC7; /* LATIN CAPITAL LETTER I WITH OGONEK */ + case 0x010C: return 0xC8; /* LATIN CAPITAL LETTER C WITH CARON */ + case 0x00C9: return 0xC9; /* LATIN CAPITAL LETTER E WITH ACUTE */ + case 0x0118: return 0xCA; /* LATIN CAPITAL LETTER E WITH OGONEK */ + case 0x00CB: return 0xCB; /* LATIN CAPITAL LETTER E WITH DIAERESIS */ + case 0x0116: return 0xCC; /* LATIN CAPITAL LETTER E WITH DOT ABOVE */ + case 0x00CD: return 0xCD; /* LATIN CAPITAL LETTER I WITH ACUTE */ + case 0x00CE: return 0xCE; /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ + case 0x012A: return 0xCF; /* LATIN CAPITAL LETTER I WITH MACRON */ + case 0x0110: return 0xD0; /* LATIN CAPITAL LETTER D WITH STROKE */ + case 0x0145: return 0xD1; /* LATIN CAPITAL LETTER N WITH CEDILLA */ + case 0x014C: return 0xD2; /* LATIN CAPITAL LETTER O WITH MACRON */ + case 0x0136: return 0xD3; /* LATIN CAPITAL LETTER K WITH CEDILLA */ + case 0x00D4: return 0xD4; /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ + case 0x00D5: return 0xD5; /* LATIN CAPITAL LETTER O WITH TILDE */ + case 0x00D6: return 0xD6; /* LATIN CAPITAL LETTER O WITH DIAERESIS */ + case 0x00D7: return 0xD7; /* MULTIPLICATION SIGN */ + case 0x00D8: return 0xD8; /* LATIN CAPITAL LETTER O WITH STROKE */ + case 0x0172: return 0xD9; /* LATIN CAPITAL LETTER U WITH OGONEK */ + case 0x00DA: return 0xDA; /* LATIN CAPITAL LETTER U WITH ACUTE */ + case 0x00DB: return 0xDB; /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ + case 0x00DC: return 0xDC; /* LATIN CAPITAL LETTER U WITH DIAERESIS */ + case 0x0168: return 0xDD; /* LATIN CAPITAL LETTER U WITH TILDE */ + case 0x016A: return 0xDE; /* LATIN CAPITAL LETTER U WITH MACRON */ + case 0x00DF: return 0xDF; /* LATIN SMALL LETTER SHARP S */ + case 0x0101: return 0xE0; /* LATIN SMALL LETTER A WITH MACRON */ + case 0x00E1: return 0xE1; /* LATIN SMALL LETTER A WITH ACUTE */ + case 0x00E2: return 0xE2; /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ + case 0x00E3: return 0xE3; /* LATIN SMALL LETTER A WITH TILDE */ + case 0x00E4: return 0xE4; /* LATIN SMALL LETTER A WITH DIAERESIS */ + case 0x00E5: return 0xE5; /* LATIN SMALL LETTER A WITH RING ABOVE */ + case 0x00E6: return 0xE6; /* LATIN SMALL LIGATURE AE */ + case 0x012F: return 0xE7; /* LATIN SMALL LETTER I WITH OGONEK */ + case 0x010D: return 0xE8; /* LATIN SMALL LETTER C WITH CARON */ + case 0x00E9: return 0xE9; /* LATIN SMALL LETTER E WITH ACUTE */ + case 0x0119: return 0xEA; /* LATIN SMALL LETTER E WITH OGONEK */ + case 0x00EB: return 0xEB; /* LATIN SMALL LETTER E WITH DIAERESIS */ + case 0x0117: return 0xEC; /* LATIN SMALL LETTER E WITH DOT ABOVE */ + case 0x00ED: return 0xED; /* LATIN SMALL LETTER I WITH ACUTE */ + case 0x00EE: return 0xEE; /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ + case 0x012B: return 0xEF; /* LATIN SMALL LETTER I WITH MACRON */ + case 0x0111: return 0xF0; /* LATIN SMALL LETTER D WITH STROKE */ + case 0x0146: return 0xF1; /* LATIN SMALL LETTER N WITH CEDILLA */ + case 0x014D: return 0xF2; /* LATIN SMALL LETTER O WITH MACRON */ + case 0x0137: return 0xF3; /* LATIN SMALL LETTER K WITH CEDILLA */ + case 0x00F4: return 0xF4; /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ + case 0x00F5: return 0xF5; /* LATIN SMALL LETTER O WITH TILDE */ + case 0x00F6: return 0xF6; /* LATIN SMALL LETTER O WITH DIAERESIS */ + case 0x00F7: return 0xF7; /* DIVISION SIGN */ + case 0x00F8: return 0xF8; /* LATIN SMALL LETTER O WITH STROKE */ + case 0x0173: return 0xF9; /* LATIN SMALL LETTER U WITH OGONEK */ + case 0x00FA: return 0xFA; /* LATIN SMALL LETTER U WITH ACUTE */ + case 0x00FB: return 0xFB; /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ + case 0x00FC: return 0xFC; /* LATIN SMALL LETTER U WITH DIAERESIS */ + case 0x0169: return 0xFD; /* LATIN SMALL LETTER U WITH TILDE */ + case 0x016B: return 0xFE; /* LATIN SMALL LETTER U WITH MACRON */ + case 0x02D9: return 0xFF; /* DOT ABOVE */ +#endif +} + +static void +unicode_latin5( + char *arg +) +{ + int i; + static unsigned int latin5_unicode_map1[] = { + 0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, /* 80 */ + 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, /* 88 */ + 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */ + 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, /* 98 */ + }; + static unsigned int latin5_unicode_map2[] = { + 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, /* D0 */ + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, /* D8 */ + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, /* E0 direct */ + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* E8 direct */ + 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, /* F0 */ + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, /* F8 */ + }; + + for(i=0; i<=0x7F; i++) + unicode_map[i] = i; + + for(i=0x80; i<=0x9F; i++) + unicode_map[i] = latin5_unicode_map1[i-0x80]; + + for(i=0xA0; i<=0xCF; i++) + unicode_map[i] = i; + + for(i=0xD0; i<=0xFF; i++) + unicode_map[i] = latin5_unicode_map2[i-0xD0]; +} + +/* a way to select one 256-character plane from Unicode + * or other multi-byte encoding + */ + +static void +unicode_plane( + char *arg +) +{ + static unsigned plane; + int nchars; + int c1, c2, i; + + if(uni_lang_selected == 0) + return; /* don't participate in auto-guessing */ + + plane = 0; force_pid = force_eid = -1; + + c1 = sscanf(arg, "pid=%d,eid=%d%n", &force_pid, &force_eid, &nchars); + if(c1 == 2) { + arg += nchars; + if(*arg == ',') + arg++; + } + if(arg[0] == '0' && (arg[1]=='x' || arg[1]=='X') ) { + arg += 2; + c2 = sscanf(arg, "%x", &plane); + } else { + c2 = sscanf(arg, "%d", &plane); + } + + if( (c1!=2 && c1!=0) || (c1==0 && c2==0) ) { + fprintf(stderr, "**** option -l plane expects one of the following formats:\n"); + fprintf(stderr, " -l plane+0xNN - select hexadecimal number of plane of Unicode\n"); + fprintf(stderr, " -l plane+NN - select decimal number of plane of Unicode\n"); + fprintf(stderr, " -l plane+pid=N,eid=N - select plane 0 of specified encoding\n"); + fprintf(stderr, " -l plane+pid=N,eid=N,0xNN - select hex plane of TTF encoding with this PID/EID\n"); + fprintf(stderr, " -l plane+pid=N,eid=N,NN - select decimal plane of TTF encoding with this PID/EID\n"); + exit(1); + } + + if(c2!=0) { + if(strlen(arg) > sizeof(uni_suffix_buf)-2) { + fprintf(stderr, "**** plane number is too large\n"); + } + + sprintf(uni_suffix_buf, "-%s", arg); + uni_font_name_suffix = uni_suffix_buf; + } else { + uni_font_name_suffix = ""; + } + + plane <<= 8; + for(i=0; i<=0xFF; i++) + unicode_map[i] = plane | i; +} + +/* look up the 8-bit code by unicode */ + +int +unicode_rev_lookup( + int unival +) +{ + int res; + + if( ! IS_UNI_BUCKET(unival) ) + return -1; + + for (res = 0; res < enctabsz; res++) + if (unicode_map[res] == unival) + return res; + return -1; +} + +/* mark the buckets for quick lookup */ + +static void +unicode_prepare_buckets( + void +) +{ + int i; + + memset(uni_user_buckets, 0, sizeof uni_user_buckets); + for(i=0; i 126) { + sprintf(res+i, "\\x%02X", c); + i+=4; + } else { + res[i++] = c; + } + } + if(*s != 0) { + res[i++] = '.'; + res[i++] = '.'; + res[i++] = '.'; + } + res[i++] = 0; + return res; +} + +/* + * Scale the values according to the scale_factor + */ + +double +fscale( + double val +) +{ + return scale_factor * val; +} + +int +iscale( + int val +) +{ + return (int) (val > 0 ? scale_factor * val + 0.5 + : scale_factor * val - 0.5); +} + +/* + * Try to force fixed width of characters + */ + +static void +alignwidths(void) +{ + int i; + int n = 0, avg, max = 0, min = 3000, sum = 0, x; + + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].flags & GF_USED) { + x = glyph_list[i].width; + + if (x != 0) { + if (x < min) + min = x; + if (x > max) + max = x; + + sum += x; + n++; + } + } + } + + if (n == 0) + return; + + avg = sum / n; + + WARNING_3 fprintf(stderr, "widths: max=%d avg=%d min=%d\n", max, avg, min); + + /* if less than 5% variation from average */ + /* force fixed width */ + if (20 * (avg - min) < avg && 20 * (max - avg) < avg) { + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].flags & GF_USED) + glyph_list[i].width = avg; + } + fontm.is_fixed_pitch = 1; + } +} + +static void +convert_glyf( + int glyphno +) +{ + GLYPH *g; + int ncurves; + + g = &glyph_list[glyphno]; + + + g->scaledwidth = iscale(g->width); + + g->entries = 0; + g->lastentry = 0; + g->path = 0; + if (g->ttf_pathlen != 0) { + cursw->glpath(glyphno, glyph_list); + g->lastentry = 0; + + if(ISDBG(BUILDG)) + dumppaths(g, NULL, NULL); + + assertpath(g->entries, __FILE__, __LINE__, g->name); + + fclosepaths(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + + /* float processing */ + if(smooth) { + ffixquadrants(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + + fsplitzigzags(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + + fforceconcise(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + + fstraighten(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + } + + pathtoint(g); + /* all processing past this point expects integer path */ + assertpath(g->entries, __FILE__, __LINE__, g->name); + +#if 0 + fixcontours(g); + testfixcvdir(g); +#endif + + /* int processing */ + if (smooth) { + smoothjoints(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + } + + ncurves = 0; + { + GENTRY *ge; + for(ge = g->entries; ge; ge = ge->next) + ncurves++; + } + if (ncurves > 200) { + WARNING_3 fprintf(stderr, + "** Glyph %s is too long, may display incorrectly\n", + g->name); + } + } else { + /* for buildstems */ + g->flags &= ~GF_FLOAT; + } +} + +static void +handle_gnames(void) +{ + int i, n, found, c, type; + + /* get the names from the font file */ + ps_fmt_3 = cursw->glnames(glyph_list); + + /* check for names with wrong characters */ + for (n = 0; n < numglyphs; n++) { + int c; + for (i = 0; (c = glyph_list[n].name[i]) != 0; i++) { + if (!(isalnum(c) || c == '.' || c == '_' || c == '-') + || i==0 && isdigit(c)) { /* must not start with a digit */ + WARNING_3 fprintf(stderr, "Glyph %d %s (%s), ", + n, isdigit(c) ? "name starts with a digit" : + "has bad characters in name", + nametoprint(glyph_list[n].name)); + glyph_list[n].name = malloc(16); + sprintf(glyph_list[n].name, "_b_%d", n); + WARNING_3 fprintf(stderr, "changing to %s\n", glyph_list[n].name); + break; + } + } + } + + if( !ps_fmt_3 ) { + /* check for duplicate names */ + for (n = 0; n < numglyphs; n++) { + found = 0; + for (i = 0; i < n && !found; i++) { + if (strcmp(glyph_list[i].name, glyph_list[n].name) == 0) { + if (( glyph_list[n].name = malloc(16) )==0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + sprintf(glyph_list[n].name, "_d_%d", n); + + /* if the font has no names in it (what the native parser + * recognises as ps_fmt_3), FreeType returns all the + * names as .notdef, so don't complain in this case + */ + if(strcmp(glyph_list[i].name, ".notdef")) { + WARNING_3 fprintf(stderr, + "Glyph %d has the same name as %d: (%s), changing to %s\n", + n, i, + glyph_list[i].name, + glyph_list[n].name); + } + found = 1; + } + } + } + + } + + /* start the encoding stuff */ + for (i = 0; i < ENCTABSZ; i++) { + encoding[i] = -1; + } + + /* do the 1st round of encoding by name */ + if(!ps_fmt_3 && uni_lang_selected && uni_lang_selected->convbyname) { + for (n = 0; n < numglyphs; n++) { + c = uni_lang_selected->convbyname(glyph_list[n].name, + uni_lang_arg, UNICONV_BYNAME_BEFORE); + if(c>=0 && cinit[i]; i++) { + for (n = 0; n < ENCTABSZ; n++) + unicode_map[n] = -1; + uni_lang_selected->init[i](uni_lang_arg); + unicode_prepare_buckets(); + type = cursw->glenc(glyph_list, encoding, unicode_map); + if( type == 0 ) + /* if we have an 8-bit encoding we don't need more tries */ + break; + } + } else { + /* language is unknown, try the first table of each */ + for(i=0; i < sizeof uni_lang/(sizeof uni_lang[0]); i++) { + if(uni_lang[i].init[0] == NULL) + continue; + for (n = 0; n < ENCTABSZ; n++) + unicode_map[n] = -1; + uni_lang[i].init[0](uni_lang_arg); + unicode_prepare_buckets(); + type = cursw->glenc(glyph_list, encoding, unicode_map); + if( type == 0 ) + /* if we have an 8-bit encoding we don't need more tries */ + break; + } + } + + if (ps_fmt_3) { + /* get rid of the old names, they are all "UNKNOWN" anyawy */ + for (i = 0; i < numglyphs; i++) { + glyph_list[i].name = 0; + } + if(type == 0) { + /* 8-bit - give 8859/1 names to the first 256 glyphs */ + for (i = 0; i < 256; i++) { /* here 256, not ENCTABSZ */ + if (encoding[i] > 0) { + glyph_list[encoding[i]].name = Fmt3Encoding[i]; + } + } + } else if(type == 1) { + /* Unicode - give 8859/1 names to the first 256 glyphs of Unicode */ + for (n = 0; n < 256; n++) { /* here 256, not ENCTABSZ */ + i = unicode_rev_lookup(n); + if (i>=0 && encoding[i] > 0) { + glyph_list[encoding[i]].name = Fmt3Encoding[i]; + } + } + } /* for other types of encodings just give generated names */ + /* assign unique names to the rest of the glyphs */ + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].name == 0) { + if (( glyph_list[i].name = malloc(16) )==0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + sprintf(glyph_list[i].name, "_d_%d", i); + } + } + } + + /* do the 2nd round of encoding by name */ + if(uni_lang_selected && uni_lang_selected->convbyname) { + for (n = 0; n < numglyphs; n++) { + c = uni_lang_selected->convbyname(glyph_list[n].name, + uni_lang_arg, UNICONV_BYNAME_AFTER); + if(c>=0 && c 0) + glyph_list[0].name = ".notdef"; + if(numglyphs > 1) + glyph_list[1].name = ".null"; + + for (i = 0; i < ENCTABSZ; i++) { + if ((encoding[i] != 0) && glyph_rename[i]) { + glyph_list[encoding[i]].name = glyph_rename[i]; + } + } + +} + +/* duplicate a string with counter to a 0-terminated string, + * and by the way filter out the characters that won't look good + * in the Postscript strings or comments; limit the length + * to a reasonable amount. + */ + +char * +dupcnstring( + unsigned char *s, + int len +) +{ + char *res, *out; + int i, c; + static int warned=0; + + if(len > 255) { + WARNING_1 fprintf(stderr, "Some font name strings are longer than 255 characters, cut down\n"); + len = 255; + } + + if(( res = malloc(len+1) )==NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + + out = res; + for(i=0; i=' ' && c!=127) { + /* translate the inconvenient chacracters */ + if( c== '(' ) + c = '['; + else if( c== ')' ) + c = ']'; + *out++ = c; + } else if( c=='\n' || c=='\r' ) { + WARNING_1 fprintf(stderr, "Some font name strings contain end of line or Unicode, cut down\n"); + *out = 0; + return res; + } else if(!warned) { + warned=1; + WARNING_1 fprintf(stderr, "Some font name strings are in Unicode, may not show properly\n"); + } + } + *out = 0; + return res; +} + +static void +usage(void) +{ + +#ifdef _GNU_SOURCE +# define fplop(txt) fputs(txt, stderr); +#else +# define fplop(txt) +#endif + + fputs("Use:\n", stderr); + fputs("ttf2pt1 [-] [-l language | -L file] []\n", stderr); + fputs(" or\n", stderr); + fputs("ttf2pt1 [-] [-l language | -L file] -\n", stderr); + fputs(" or\n", stderr); + fputs("ttf2pt1 [-] [-l language | -L file] - | t1asm > \n", stderr); + + fplop("\n"); + fplop("This build supports both short and long option names,\n"); + fplop("the long options are listed before corresponding short ones\n"); + + fplop(" --all-glyphs\n"); + fputs(" -a - include all glyphs, even those not in the encoding table\n", stderr); + fplop(" --pfb\n"); + fputs(" -b - produce a compressed .pfb file\n", stderr); + fplop(" --debug dbg_suboptions\n"); + fputs(" -d dbg_suboptions - debugging options, run ttf2pt1 -d? for help\n", stderr); + fplop(" --encode\n"); + fputs(" -e - produce a fully encoded .pfa file\n", stderr); + fplop(" --force-unicode\n"); + fputs(" -F - force use of Unicode encoding even if other MS encoding detected\n", stderr); + fplop(" --generate suboptions\n"); + fputs(" -G suboptions - control the file generation, run ttf2pt1 -G? for help\n", stderr); + fplop(" --language language\n"); + fputs(" -l language - convert Unicode to specified language, run ttf2pt1 -l? for list\n", stderr); + fplop(" --language-map file\n"); + fputs(" -L file - convert Unicode according to encoding description file\n", stderr); + fplop(" --limit =\n"); + fputs(" -m = - set maximal limit of given type to value, types:\n", stderr); + fputs(" h - maximal hint stack depth in the PostScript interpreter\n", stderr); + fplop(" --processing suboptions\n"); + fputs(" -O suboptions - control outline processing, run ttf2pt1 -O? for help\n", stderr); + fplop(" --parser name\n"); + fputs(" -p name - use specific front-end parser, run ttf2pt1 -p? for list\n", stderr); + fplop(" --uid id\n"); + fputs(" -u id - use this UniqueID, -u A means autogeneration\n", stderr); + fplop(" --vertical-autoscale size\n"); + fputs(" -v size - scale the font to make uppercase letters >size/1000 high\n", stderr); + fplop(" --version\n"); + fputs(" -V - print ttf2pt1 version number\n", stderr); + fplop(" --warning number\n"); + fputs(" -W number - set the level of permitted warnings (0 - disable)\n", stderr); + fputs("Obsolete options (will be removed in future releases):\n", stderr); + fplop(" --afm\n"); + fputs(" -A - write the .afm file to STDOUT instead of the font, now -GA\n", stderr); + fputs(" -f - don't try to guess the value of the ForceBold hint, now -Ob\n", stderr); + fputs(" -h - disable autogeneration of hints, now -Oh\n", stderr); + fputs(" -H - disable hint substitution, now -Ou\n", stderr); + fputs(" -o - disable outline optimization, now -Oo\n", stderr); + fputs(" -s - disable outline smoothing, now -Os\n", stderr); + fputs(" -t - disable auto-scaling to 1000x1000 standard matrix, now -Ot\n", stderr); + fputs(" -w - correct the glyph widths (use only for buggy fonts), now -OW\n", stderr); + fputs("With no , write to with suffix replaced.\n", stderr); + fputs("The last '-' means 'use STDOUT'.\n", stderr); + +#undef fplop + +} + +static void +printversion(void) +{ + fprintf(stderr, "ttf2pt1 %s\n", TTF2PT1_VERSION); +} + +/* initialize a table of suboptions */ +static void +init_subo_tbl( + struct subo_case *tbl +) +{ + int i; + + for(i=0; tbl[i].disbl != 0; i++) { + tbl[i].disbl = tolower(tbl[i].disbl); + tbl[i].enbl = toupper(tbl[i].disbl); + *(tbl[i].valp) = tbl[i].dflt; + } +} + +/* print the default value of the suboptions */ +static void +print_subo_dflt( + FILE *f, + struct subo_case *tbl +) +{ + int i; + + for(i=0; tbl[i].disbl != 0; i++) { + if(tbl[i].dflt) + putc(tbl[i].enbl, f); + else + putc(tbl[i].disbl, f); + } +} + +/* print the usage message for the suboptions */ +static void +print_subo_usage( + FILE *f, + struct subo_case *tbl +) +{ + int i; + + fprintf(f,"The lowercase suboptions disable features, corresponding\n"); + fprintf(f,"uppercase suboptions enable them. The supported suboptions,\n"); + fprintf(f,"their default states and the features they control are:\n"); + for(i=0; tbl[i].disbl != 0; i++) { + fprintf(f," %c/%c - [%s] %s\n", tbl[i].disbl, tbl[i].enbl, + tbl[i].dflt ? "enabled" : "disabled", tbl[i].descr); + } +} + +/* find and set the entry according to suboption, + * return the found entry (or if not found return NULL) + */ +struct subo_case * +set_subo( + struct subo_case *tbl, + int subopt +) +{ + int i; + + for(i=0; tbl[i].disbl != 0; i++) { + if(subopt == tbl[i].disbl) { + *(tbl[i].valp) = 0; + return &tbl[i]; + } else if(subopt == tbl[i].enbl) { + *(tbl[i].valp) = 1; + return &tbl[i]; + } + } + return NULL; +} + + +int +main( + int argc, + char **argv +) +{ + int i, j; + time_t now; + char filename[4096]; + int c,nchars,nmetrics; + int ws; + int forcebold= -1; /* -1 means "don't know" */ + char *lang; + int oc; + int subid; + char *cmdline; +#ifdef _GNU_SOURCE +# define ttf2pt1_getopt(a, b, c, d, e) getopt_long(a, b, c, d, e) + static struct option longopts[] = { + { "afm", 0, NULL, 'A' }, + { "all-glyphs", 0, NULL, 'a' }, + { "pfb", 0, NULL, 'b' }, + { "debug", 1, NULL, 'd' }, + { "encode", 0, NULL, 'e' }, + { "force-unicode", 0, NULL, 'F' }, + { "generate", 1, NULL, 'G' }, + { "language", 1, NULL, 'l' }, + { "language-map", 1, NULL, 'L' }, + { "limit", 1, NULL, 'm' }, + { "processing", 1, NULL, 'O' }, + { "parser", 1, NULL, 'p' }, + { "uid", 1, NULL, 'u' }, + { "vertical-autoscale", 1, NULL, 'v' }, + { "version", 0, NULL, 'V' }, + { "warning", 1, NULL, 'W' }, + { NULL, 0, NULL, 0 } + }; +#else +# define ttf2pt1_getopt(a, b, c, d, e) getopt(a, b, c) +#endif + /* table of Outline Processing (may think also as Optimization) options */ + static struct subo_case opotbl[] = { + { 'b', 0/*auto-set*/, &trybold, 1, "guessing of the ForceBold hint" }, + { 'h', 0/*auto-set*/, &hints, 1, "autogeneration of hints" }, + { 'u', 0/*auto-set*/, &subhints, 1, "hint substitution technique" }, + { 'o', 0/*auto-set*/, &optimize, 1, "space optimization of font files" }, + { 's', 0/*auto-set*/, &smooth, 1, "smoothing and repair of outlines" }, + { 't', 0/*auto-set*/, &transform, 1, "auto-scaling to the standard matrix 1000x1000" }, + { 'w', 0/*auto-set*/, &correctwidth, 0, "correct the glyph widths (use only for buggy fonts)" }, + { 'v', 0/*auto-set*/, &vectorize, 0, "vectorize (trace) the bitmaps" }, +#ifdef USE_AUTOTRACE + { 'z', 0/*auto-set*/, &use_autotrace, 0, "use the autotrace library on bitmaps (works badly)" }, +#endif /*USE_AUTOTRACE*/ + { 0, 0, 0, 0, 0} /* terminator */ + }; + /* table of the File Generation options */ + static struct subo_case fgotbl[] = { + { 'f', 0/*auto-set*/, &gen_pfa, 1, "generate the font file (.t1a, .pfa or .pfb)" }, + { 'a', 0/*auto-set*/, &gen_afm, 1, "generate the Adobe metrics file (.afm)" }, + { 'u', 0/*auto-set*/, &gen_ufm, 1, "generate the Unicode metrics file (.ufm)" }, + { 'e', 0/*auto-set*/, &gen_dvienc, 0, "generate the dvips encoding file (.enc)" }, + { 0, 0, 0, 0, 0} /* terminator */ + }; + int *genlast = NULL; + + + init_subo_tbl(opotbl); /* initialize sub-options of -O */ + init_subo_tbl(fgotbl); /* initialize sub-options of -G */ + + /* save the command line for the record + * (we don't bother about escaping the shell special characters) + */ + + j = 0; + for(i=1; ivalp) ) + genlast = s->valp; + } + break; + } + case 'h': + fputs("Warning: option -h is obsolete, use -Oh instead\n", stderr); + hints = 0; + break; + case 'H': + fputs("Warning: meaning of option -H has been changed to its opposite\n", stderr); + fputs("Warning: option -H is obsolete, use -Ou instead\n", stderr); + subhints = 0; + break; + case 'f': + fputs("Warning: option -f is obsolete, use -Ob instead\n", stderr); + trybold = 0; + break; + case 'w': + fputs("Warning: option -w is obsolete, use -OW instead\n", stderr); + correctwidth = 1; + break; + case 'u': + if(wantuid) { + fprintf(stderr, "**** UniqueID may be specified only once ****\n"); + exit(1); + } + wantuid = 1; + if(optarg[0]=='A' && optarg[1]==0) + strUID=0; /* will be generated automatically */ + else { + strUID=optarg; + for(i=0; optarg[i]!=0; i++) + if( !isdigit(optarg[i]) ) { + fprintf(stderr, "**** UniqueID must be numeric or A for automatic ****\n"); + exit(1); + } + } + break; + case 'v': + correctvsize = atoi(optarg); + if(correctvsize <= 0 && correctvsize > 1000) { + fprintf(stderr, "**** wrong vsize '%d', ignored ****\n", correctvsize); + correctvsize=0; + } + break; + case 'p': + if(cursw!=0) { + fprintf(stderr, "**** only one front-end parser be used ****\n"); + exit(1); + } + + { /* separate parser from parser-specific argument */ + char *p = strchr(optarg, LANG_ARG_SEP); + if(p != 0) { + *p = 0; + front_arg = p+1; + } else + front_arg = ""; + } + for(i=0; frontswtab[i] != NULL; i++) + if( !strcmp(frontswtab[i]->name, optarg) ) { + cursw = frontswtab[i]; + break; + } + + if(cursw==0) { + if (strcmp(optarg, "?")) + fprintf(stderr, "**** unknown front-end parser '%s' ****\n", optarg); + fputs("the following front-ends are supported now:\n", stderr); + for(i=0; frontswtab[i] != NULL; i++) { + fprintf(stderr," %s (%s)\n file suffixes: ", + frontswtab[i]->name, + frontswtab[i]->descr ? frontswtab[i]->descr : "no description" + ); + for(j=0; jsuffix[j]) + fprintf(stderr, "%s ", frontswtab[i]->suffix[j]); + fprintf(stderr, "\n"); + } + exit(1); + } + break; + case 'l': + if(uni_lang_selected!=0) { + fprintf(stderr, "**** only one language option may be used ****\n"); + exit(1); + } + + { /* separate language from language-specific argument */ + char *p = strchr(optarg, LANG_ARG_SEP); + if(p != 0) { + *p = 0; + uni_lang_arg = p+1; + } else + uni_lang_arg = ""; + } + for(i=0; i < sizeof uni_lang/(sizeof uni_lang[0]); i++) + if( !strcmp(uni_lang[i].name, optarg) ) { + uni_lang_selected = &uni_lang[i]; + uni_sample = uni_lang[i].sample_upper; + break; + } + + if(uni_lang_selected==0) { + if (strcmp(optarg, "?")) + fprintf(stderr, "**** unknown language '%s' ****\n", optarg); + fputs(" the following languages are supported now:\n", stderr); + for(i=0; i < sizeof uni_lang/(sizeof uni_lang[0]); i++) + fprintf(stderr," %s (%s)\n", + uni_lang[i].name, + uni_lang[i].descr ? uni_lang[i].descr : "no description" + ); + exit(1); + } + break; + case 'L': + if(uni_lang_selected!=0) { + fprintf(stderr, "**** only one language option may be used ****\n"); + exit(1); + } + uni_lang_selected = &uni_lang_user; + uni_lang_arg = optarg; + break; + case 'V': + printversion(); + exit(0); + break; + default: + usage(); + exit(1); + break; + } + } + argc-=optind-1; /* the rest of code counts from argv[0] */ + argv+=optind-1; + + if (absolute && encode) { + fprintf(stderr, "**** options -a and -e are incompatible ****\n"); + exit(1); + } + if ((argc != 2) && (argc != 3)) { + usage(); + exit(1); + } + + /* try to guess the language by the locale used */ + if(uni_lang_selected==0 && (lang=getenv("LANG"))!=0 ) { + for(i=0; i < sizeof uni_lang/sizeof(struct uni_language); i++) { + if( !strncmp(uni_lang[i].name, lang, strlen(uni_lang[i].name)) ) { + uni_lang_selected = &uni_lang[i]; + goto got_a_language; + } + } + /* no full name ? try aliases */ + for(i=0; i < sizeof uni_lang/sizeof(struct uni_language); i++) { + for(c=0; csuffix[j] + && !strcmp(p, frontswtab[i]->suffix[j]) ) { + cursw = frontswtab[i]; + WARNING_1 fprintf(stderr, "Auto-detected front-end parser '%s'\n", + cursw->name); + WARNING_1 fprintf(stderr, " (use ttf2pt1 -p? to get the full list of available front-ends)\n"); + break; + } + } + free(s); + } + + if(cursw==0) { + cursw = frontswtab[0]; + WARNING_1 fprintf(stderr, "Can't detect front-end parser, using '%s' by default\n", + cursw->name); + WARNING_1 fprintf(stderr, " (use ttf2pt1 -p? to get the full list of available front-ends)\n"); + } + } + + /* open the input file */ + cursw->open(argv[1], front_arg); + + /* Get base name of output file (if not specified) + * by removing (known) suffixes + */ + if (argc == 2) { + char *p; + argv[2] = strdup (argv[1]); + p = strrchr(argv[2], '.'); + if (p != NULL) + for (j = 0; (j < MAXSUFFIX) && (cursw->suffix[j]); j++) + if (!strcmp(p+1, cursw->suffix[j])) { + *p = '\0'; + break; + } + } + + if ((null_file = fopen(BITBUCKET, "w")) == NULL) { + fprintf(stderr, "**** Cannot open %s ****\n", + BITBUCKET); + exit(1); + } + + if (argv[2][0] == '-' && argv[2][1] == 0) { +#ifdef WINDOWS + if(encode) { + fprintf(stderr, "**** can't write encoded file to stdout ***\n"); + exit(1); + } +#endif /* WINDOWS */ + pfa_file = ufm_file = afm_file = dvienc_file = null_file; + + if(wantafm || genlast == &gen_afm) { /* print .afm instead of .pfa */ + afm_file=stdout; + } else if(genlast == &gen_dvienc) { /* print .enc instead of .pfa */ + dvienc_file=stdout; + } else { + pfa_file=stdout; + } + } else { +#ifndef WINDOWS + snprintf(filename, sizeof filename, "%s.%s", argv[2], encode ? (pfbflag ? "pfb" : "pfa") : "t1a" ); +#else /* WINDOWS */ + snprintf(filename, sizeof filename, "%s.t1a", argv[2]); +#endif /* WINDOWS */ + if(gen_pfa) { + if ((pfa_file = fopen(filename, "w+b")) == NULL) { + fprintf(stderr, "**** Cannot create %s ****\n", filename); + exit(1); + } else { + WARNING_2 fprintf(stderr, "Creating file %s\n", filename); + } + } else + pfa_file = null_file; + + if(gen_ufm) { + snprintf(filename, sizeof filename, "%s.ufm", argv[2]) ; + if ((ufm_file = fopen(filename, "w+")) == NULL) { + fprintf(stderr, "**** Cannot create %s ****\n", filename); + exit(1); + } + } else + ufm_file = null_file; + + if(gen_afm) { + snprintf(filename, sizeof filename, "%s.afm", argv[2]) ; + if ((afm_file = fopen(filename, "w+")) == NULL) { + fprintf(stderr, "**** Cannot create %s ****\n", filename); + exit(1); + } + } else + afm_file = null_file; + + if(gen_dvienc) { + snprintf(filename, sizeof filename, "%s.enc", argv[2]) ; + if ((dvienc_file = fopen(filename, "w+")) == NULL) { + fprintf(stderr, "**** Cannot create %s ****\n", filename); + exit(1); + } + } else + dvienc_file = null_file; + } + + /* + * Now check whether we want a fully encoded .pfa file + */ +#ifndef WINDOWS + if (encode && pfa_file != null_file) { + int p[2]; + extern FILE *ifp, *ofp; /* from t1asm.c */ + + ifp=stdin; + ofp=stdout; + + if (pipe(p) < 0) { + perror("**** Cannot create pipe ****\n"); + exit(1); + } + ofp = pfa_file; + ifp = fdopen(p[0], "r"); + if (ifp == NULL) { + perror("**** Cannot use pipe for reading ****\n"); + exit(1); + } + pfa_file = fdopen(p[1], "w"); + if (pfa_file == NULL) { + perror("**** Cannot use pipe for writing ****\n"); + exit(1); + } + switch (fork()) { + case -1: + perror("**** Cannot fork the assembler process ****\n"); + exit(1); + case 0: /* child */ + fclose(pfa_file); + exit(runt1asm(pfbflag)); + default: /* parent */ + fclose(ifp); fclose(ofp); + } + } +#endif /* WINDOWS */ + + numglyphs = cursw->nglyphs(); + + WARNING_3 fprintf(stderr, "numglyphs = %d\n", numglyphs); + + glyph_list = (GLYPH *) calloc(numglyphs, sizeof(GLYPH)); + + /* initialize non-0 fields */ + for (i = 0; i < numglyphs; i++) { + int j; + GLYPH *g; + + g = &glyph_list[i]; + g->char_no = -1; + for (j = 0; j < GLYPH_MAX_ENCODINGS; j++ ) { + g->orig_code[j] = -1; + } + g->name = "UNKNOWN"; + g->flags = GF_FLOAT; /* we start with float representation */ + } + + handle_gnames(); + + cursw->glmetrics(glyph_list); + cursw->fnmetrics(&fontm); + + original_scale_factor = 1000.0 / (double) fontm.units_per_em; + + if(transform == 0) + scale_factor = 1.0; /* don't transform */ + else + scale_factor = original_scale_factor; + + if(correctvsize && uni_sample!=0) { /* only for known languages */ + /* try to adjust the scale factor to make a typical + * uppercase character of hight at least (correctvsize), this + * may improve the appearance of the font but also + * make it weird, use with caution + */ + int ysz; + + ysz = iscale(glyph_list[encoding[uni_sample]].yMax); + if( ysz 45.0 || italic_angle < -45.0) + italic_angle = 0.0; /* consider buggy */ + + if (hints) { + findblues(); + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].flags & GF_USED) { + DBG_TO_GLYPH(&glyph_list[i]); + buildstems(&glyph_list[i]); + assertpath(glyph_list[i].entries, __FILE__, __LINE__, glyph_list[i].name); + DBG_FROM_GLYPH(&glyph_list[i]); + } + } + stemstatistics(); + } else { + for(i=0; i<4; i++) + bbox[i] = iscale(fontm.bbox[i]); + } + /* don't touch the width of fixed width fonts */ + if( fontm.is_fixed_pitch ) + correctwidth=0; + docorrectwidth(); /* checks correctwidth inside */ + if (reverse) + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].flags & GF_USED) { + DBG_TO_GLYPH(&glyph_list[i]); + reversepaths(&glyph_list[i]); + assertpath(glyph_list[i].entries, __FILE__, __LINE__, glyph_list[i].name); + DBG_FROM_GLYPH(&glyph_list[i]); + } + } + + +#if 0 + /* + ** It seems to bring troubles. The problem is that some + ** styles of the font may be recognized as fixed-width + ** while other styles of the same font as proportional. + ** So it's better to be commented out yet. + */ + if (tryfixed) + alignwidths(); +#endif + + if(trybold) { + forcebold = fontm.force_bold; + } + + fprintf(pfa_file, "%%!PS-AdobeFont-1.0: %s %s\n", fontm.name_ps, fontm.name_copyright); + time(&now); + fprintf(pfa_file, "%%%%CreationDate: %s", ctime(&now)); + fprintf(pfa_file, "%% Converted by ttf2pt1 %s/%s\n", TTF2PT1_VERSION, cursw->name); + fprintf(pfa_file, "%% Args: %s\n", cmdline); + fprintf(pfa_file, "%%%%EndComments\n"); + fprintf(pfa_file, "12 dict begin\n/FontInfo 9 dict dup begin\n"); + + WARNING_3 fprintf(stderr, "FontName %s%s\n", fontm.name_ps, uni_font_name_suffix); + + + fprintf(pfa_file, "/version (%s) readonly def\n", fontm.name_version); + + fprintf(pfa_file, "/Notice (%s) readonly def\n", fontm.name_copyright); + + fprintf(pfa_file, "/FullName (%s) readonly def\n", fontm.name_full); + fprintf(pfa_file, "/FamilyName (%s) readonly def\n", fontm.name_family); + + if(wantuid) { + if(strUID) + fprintf(pfa_file, "/UniqueID %s def\n", strUID); + else { + numUID=0; + for(i=0; fontm.name_full[i]!=0; i++) { + numUID *= 37; /* magic number, good for hash */ + numUID += fontm.name_full[i]-' '; + /* if the name is long the first chars + * may be lost forever, so re-insert + * them thus making kind of CRC + */ + numUID += (numUID>>24) & 0xFF; + } + /* the range for private UIDs is 4 000 000 - 4 999 999 */ + fprintf(pfa_file, "/UniqueID %lu def\n", numUID%1000000+4000000); + } + } + + fprintf(pfa_file, "/Weight (%s) readonly def\n", fontm.name_style); + + fprintf(pfa_file, "/ItalicAngle %f def\n", italic_angle); + fprintf(pfa_file, "/isFixedPitch %s def\n", + fontm.is_fixed_pitch ? "true" : "false"); + + /* we don't print out the unused glyphs */ + nchars = 0; + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].flags & GF_USED) { + nchars++; + } + } + + fprintf(afm_file, "StartFontMetrics 4.1\n"); + fprintf(afm_file, "FontName %s%s\n", fontm.name_ps, uni_font_name_suffix); + fprintf(afm_file, "FullName %s\n", fontm.name_full); + fprintf(afm_file, "Notice %s\n", fontm.name_copyright); + fprintf(afm_file, "EncodingScheme FontSpecific\n"); + fprintf(afm_file, "FamilyName %s\n", fontm.name_family); + fprintf(afm_file, "Weight %s\n", fontm.name_style); + fprintf(afm_file, "Version %s\n", fontm.name_version); + fprintf(afm_file, "Characters %d\n", nchars); + fprintf(afm_file, "ItalicAngle %.1f\n", italic_angle); + + fprintf(afm_file, "Ascender %d\n", iscale(fontm.ascender)); + fprintf(afm_file, "Descender %d\n", iscale(fontm.descender)); + + fprintf(ufm_file, "StartFontMetrics 4.1\n"); + fprintf(ufm_file, "FontName %s%s\n", fontm.name_ps, uni_font_name_suffix); + fprintf(ufm_file, "FullName %s\n", fontm.name_full); + fprintf(ufm_file, "Notice %s\n", fontm.name_copyright); + fprintf(ufm_file, "EncodingScheme FontSpecific\n"); + fprintf(ufm_file, "FamilyName %s\n", fontm.name_family); + fprintf(ufm_file, "Weight %s\n", fontm.name_style); + fprintf(ufm_file, "Version %s\n", fontm.name_version); + fprintf(ufm_file, "Characters %d\n", nchars); + fprintf(ufm_file, "ItalicAngle %.1f\n", italic_angle); + + fprintf(ufm_file, "Ascender %d\n", iscale(fontm.ascender)); + fprintf(ufm_file, "Descender %d\n", iscale(fontm.descender)); + + fprintf(pfa_file, "/UnderlinePosition %d def\n", + iscale(fontm.underline_position)); + + fprintf(pfa_file, "/UnderlineThickness %hd def\nend readonly def\n", + iscale(fontm.underline_thickness)); + + fprintf(afm_file, "UnderlineThickness %d\n", + iscale(fontm.underline_thickness)); + + fprintf(afm_file, "UnderlinePosition %d\n", + iscale(fontm.underline_position)); + + fprintf(afm_file, "IsFixedPitch %s\n", + fontm.is_fixed_pitch ? "true" : "false"); + fprintf(afm_file, "FontBBox %d %d %d %d\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + + fprintf(ufm_file, "UnderlineThickness %d\n", + iscale(fontm.underline_thickness)); + + fprintf(ufm_file, "UnderlinePosition %d\n", + iscale(fontm.underline_position)); + + fprintf(ufm_file, "IsFixedPitch %s\n", + fontm.is_fixed_pitch ? "true" : "false"); + fprintf(ufm_file, "FontBBox %d %d %d %d\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + + fprintf(pfa_file, "/FontName /%s%s def\n", fontm.name_ps, uni_font_name_suffix); + fprintf(pfa_file, "/PaintType 0 def\n/StrokeWidth 0 def\n"); + /* I'm not sure if these are fixed */ + fprintf(pfa_file, "/FontType 1 def\n"); + + if (transform) { + fprintf(pfa_file, "/FontMatrix [0.001 0 0 0.001 0 0] def\n"); + } else { + fprintf(pfa_file, "/FontMatrix [%9.7f 0 0 %9.7f 0 0] def\n", + original_scale_factor / 1000.0, original_scale_factor / 1000.0); + } + + fprintf(pfa_file, "/FontBBox {%d %d %d %d} readonly def\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + + fprintf(pfa_file, "/Encoding 256 array\n"); + /* determine number of elements for metrics table */ + nmetrics = 256; + for (i = 0; i < numglyphs; i++) { + if( glyph_list[i].flags & GF_USED + && glyph_list[i].char_no == -1 ) { + nmetrics++; + } + } + fprintf(afm_file, "StartCharMetrics %d\n", nmetrics); + fprintf(ufm_file, "StartCharMetrics %d\n", nmetrics); + + fprintf(dvienc_file, "/%s%sEncoding [\n", + fontm.name_ps, uni_font_name_suffix); + + for (i = 0; i < 256; i++) { /* here 256, not ENCTABSZ */ + fprintf(pfa_file, + "dup %d /%s put\n", i, glyph_list[encoding[i]].name); + if( glyph_list[encoding[i]].flags & GF_USED ) { + int j = 0; + print_glyph_metrics(afm_file, i, encoding[i]); + while ( glyph_list[encoding[i]].orig_code[j] != -1 ) { + //print_glyph_metrics_ufm(ufm_file, glyph_list[encoding[i]].orig_code, encoding[i]); + //print_glyph_metrics_ufm(ufm_file, i, encoding[i]); + print_glyph_metrics_ufm(ufm_file, glyph_list[encoding[i]].orig_code[j], encoding[i]); + j++; + } + } + if (encoding[i]) + fprintf (dvienc_file, "/index0x%04X\n", encoding[i]); + else + fprintf (dvienc_file, "/.notdef\n"); + } + + /* print the metrics for glyphs not in encoding table */ + for(i=0; ikerning(glyph_list); + print_kerning(afm_file); + } + if(ufm_file != null_file) { /* save time if the output would be wasted */ + /* print the kerning data if present */ + cursw->kerning(glyph_list); + print_kerning(ufm_file); + } + + fprintf(afm_file, "EndFontMetrics\n"); + if(afm_file != null_file) + fclose(afm_file); + + fprintf(ufm_file, "EndFontMetrics\n"); + if(ufm_file != null_file) + fclose(ufm_file); + + fprintf(dvienc_file, "] def\n"); + if(dvienc_file != null_file) + fclose(dvienc_file); + + WARNING_1 fprintf(stderr, "Finished - font files created\n"); + + cursw->close(); + +#ifndef WINDOWS + while (wait(&ws) > 0) { + } +#else + if (encode && pfa_file != null_file) { + extern FILE *ifp, *ofp; /* from t1asm.c */ + + snprintf(filename, sizeof filename, "%s.%s", argv[2], pfbflag ? "pfb" : "pfa" ); + + if ((ofp = fopen(filename, "w+b")) == NULL) { + fprintf(stderr, "**** Cannot create %s ****\n", filename); + exit(1); + } else { + WARNING_2 fprintf(stderr, "Creating file %s\n", filename); + } + + snprintf(filename, sizeof filename, "%s.t1a", argv[2]); + + if ((ifp = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "**** Cannot read %s ****\n", filename); + exit(1); + } else { + WARNING_2 fprintf(stderr, "Converting file %s\n", filename); + } + + runt1asm(pfbflag); + + WARNING_2 fprintf(stderr, "Removing file %s\n", filename); + if(unlink(filename) < 0) + WARNING_1 fprintf(stderr, "Unable to remove file %s\n", filename); + } +#endif /* WINDOWS */ + + fclose(null_file); + return 0; +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_convert.1 b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_convert.1 new file mode 100644 index 00000000..beada4fc --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_convert.1 @@ -0,0 +1,506 @@ +.rn '' }` +''' $RCSfile: ttf2pt1_convert.1,v $$Revision: 1.1 $$Date: 2008-03-12 06:35:44 $ +''' +''' $Log: not supported by cvs2svn $ +''' +.de Sh +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp +.if t .sp .5v +.if n .sp +.. +.de Ip +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.de Vb +.ft CW +.nf +.ne \\$1 +.. +.de Ve +.ft R + +.fi +.. +''' +''' +''' Set up \*(-- to give an unbreakable dash; +''' string Tr holds user defined translation string. +''' Bell System Logo is used as a dummy character. +''' +.tr \(*W-|\(bv\*(Tr +.ie n \{\ +.ds -- \(*W- +.ds PI pi +.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +.ds L" "" +.ds R" "" +''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of +''' \*(L" and \*(R", except that they are used on ".xx" lines, +''' such as .IP and .SH, which do another additional levels of +''' double-quote interpretation +.ds M" """ +.ds S" """ +.ds N" """"" +.ds T" """"" +.ds L' ' +.ds R' ' +.ds M' ' +.ds S' ' +.ds N' ' +.ds T' ' +'br\} +.el\{\ +.ds -- \(em\| +.tr \*(Tr +.ds L" `` +.ds R" '' +.ds M" `` +.ds S" '' +.ds N" `` +.ds T" '' +.ds L' ` +.ds R' ' +.ds M' ` +.ds S' ' +.ds N' ` +.ds T' ' +.ds PI \(*p +'br\} +.\" If the F register is turned on, we'll generate +.\" index entries out stderr for the following things: +.\" TH Title +.\" SH Header +.\" Sh Subsection +.\" Ip Item +.\" X<> Xref (embedded +.\" Of course, you have to process the output yourself +.\" in some meaninful fashion. +.if \nF \{ +.de IX +.tm Index:\\$1\t\\n%\t"\\$2" +.. +.nr % 0 +.rr F +.\} +.TH TTF2PT1_CONVERT 1 "version 3.4.4" "December 31, 2003" "TTF2PT1 Font Converter" +.UC +.if n .hy 0 +.if n .na +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.de CQ \" put $1 in typewriter font +.ft CW +'if n "\c +'if t \\&\\$1\c +'if n \\&\\$1\c +'if n \&" +\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 +'.ft R +.. +.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2 +. \" AM - accent mark definitions +.bd B 3 +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds ? ? +. ds ! ! +. ds / +. ds q +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10' +. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#] +.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u' +.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u' +.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#] +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +.ds oe o\h'-(\w'o'u*4/10)'e +.ds Oe O\h'-(\w'O'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds v \h'-1'\o'\(aa\(ga' +. ds _ \h'-1'^ +. ds . \h'-1'. +. ds 3 3 +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +. ds oe oe +. ds Oe OE +.\} +.rm #[ #] #H #V #F C +.SH "NAME" +\fBttf2pt1_convert\fR \- convenience font conversion script +.SH "SYNOPSIS" +ttf2pt1_convert \fB[config-file]\fR +.SH "DESCRIPTION" +`\fBConvert\fR\*(R' is the master conversion script provided with ttf2pt1. +When installed into a public directory it's named `\fBttf2pt1_convert\fR\*(R' +to avoid name collisions with the other programs. +.PP +If the configuration file is not specified as an argument then the file +`\f(CWconvert.cfg\fR\*(R' in the current directory is used. This file contains +a set of configuration variables. The distribution contains a sample file +file `\f(CWconvert.cfg.sample\fR\*(R'. Please copy it to `\f(CWconvert.cfg\fR\*(R', +look inside it and change the configuration variables. The more stable +configuration variables, such as the path names of the scripts and +encoding files are located in `\f(CWconvert\fR\*(R' itself, they are +automatically updated when installing \fBttf2pt1\fR. +.PP +Put all the TTF fonts you want to convert into some directory (this +may be just the directory that already contains all the Windows +fonts on a mounted FAT filesystem). If you have fonts in different +source encoding then put the fonts in each of the encodings +into a separate directory. Up to 10 source directories are +supported. If you (in a rather unlikely case) have more source +directories then you can make two separate runs of the converter, +converting up to 10 directories at a time. +.PP +The variables in the configuration file are: +.Ip "\(bu" 2 +\fB\f(CWSRCDIRS\fR\fR \- the list of directories (with absolute paths) with +\s-1TTF\s0 fonts. Each line contains at least 3 fields: the name of the directory, +the language of the fonts in it (if you have fonts for different +languages you have to put them into the separate directories) and the +encoding of the fonts. Again, if you have some of the \s-1TTF\s0 typefaces in +one encoding, and some in another (say, \s-1CP\s0\-1251 and \s-1KOI\s0\-8), you have +to put them into the separate source directories. Some lines may contain +4 fields. Then the fourth field is the name of the external map to +convert the Unicode fonts into the desirable encoding. This map is +used instead of the built-in map for the specified language. +.Sp +*8* +An interesting thing is that some languages have more than one +widely used character encodings. For example, the widely used +encodings for Russian are \s-1IBM\s0 \s-1CP\s0\-866 (\s-1MS\s0\-\s-1DOS\s0 and Unix), \s-1KOI\s0\-8 +(Unix and \s-1VAX\s0, also the standard Internet encoding), \s-1IBM\s0 \s-1CP\s0\-1251 (\s-1MS\s0 Windows). +That's why I have provided the means to generate the converted fonts +in more than one encoding. See the file encodings/\s-1README\s0 for +details about the encoding tables. Actually, if you plan to use +these fonts with Netscape Navigator better use the aliases +cp-866 instead of ibm-866 and windows-1251 instead of ibm-1251 +because that's what Netscape wants. +.Ip "\(bu" 2 +\fB\f(CWDSTDIR\fR\fR \- directory for the resulting Type1 fonts. Be careful! +This directory gets completely wiped out before conversion, +so don't use any already existing directory for this purpose. +.Ip "\(bu" 2 +\fB\f(CWDSTENC\fI{language}\fR\fR\fR \- the list of encodings in which the destination +fonts will be generated for each language. Each font of that +language will be generated in each of the specified +encodings. If you don't want any translation, just specify both +\f(CWSRCENC\fR and \f(CWDSTENC\fR as iso8859-1 (or if you want any other encoding +specified in the fonts.dir, copy the description of 8859-1 with +new name and use this new name for \f(CWSRCENC\fR and \f(CWDSTENC\fR). +.Ip "\(bu" 2 +\fB\f(CWFOUNDRY\fR\fR \- the foundry name to be used in the fonts.dir file. I have +set it to `fromttf\*(R' to avoid name conflicts with any existing font for +sure. But this foundry name is not registered in X11 standards and +if you want to get the full standard compliance or have a font server +that enforces such a compliance, use `misc\*(R'. +.PP +The next few parameters control the general behavior of the converter. +They default values are set to something reasonable. +.Ip "\(bu" 2 +\fB\f(CWCORRECTWIDTH\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then use the +converter option \f(CW\fB-w\fR\fR, otherwise don't use it. See the description of +this option in the \s-1README\s0 file. +.Ip "\(bu" 2 +\fB\f(CWREMOVET1A\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then after +conversion remove the un-encoded \f(CW.t1a\fR font files and the +intermediate \f(CW.xpfa\fR font metric files. +.Ip "\(bu" 2 +\fB\f(CWINSTALLFONTMAP\fR\fR \- a Ghostscript parameter, if the value is set to +\fB\f(CWYES\fR\fR then install the entries for the new fonts +right into the main \f(CWFontmap\fR file. Otherwise just leave +the file \f(CWFontmap.ttf\fR in the Ghostscript configuration +directory. +.Ip "\(bu" 2 +\fB\f(CWHINTSUBST\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR use the option +\f(CW\fB-H\fR\fR, otherwise don't use it. This option enables the +hint substitution technique. If you have not installed the X11 patch +described above, use this option with great caution. See further +description of this option in the \s-1README\s0 file. +.Ip "\(bu" 2 +\fB\f(CWENFORCEISO\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then +disguise the resulting fonts as the fonts in ISOLatin1 encoding. Historically +this was neccessary due to the way the installer scripts created the +X11 font configuration files. It is not neccessary any more for this +purpose. But if you plan to use these fonts with some other application +that expects ISOLatin1 encoding then better enable this option. +.Ip "\(bu" 2 +\fB\f(CWALLGLYPHS\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then +include all the glyphs from the source fonts into the resulting fonts, even +if these glyphs are inaccessible. If it's set to \fB\f(CWNO\fR\fR then +include only the glyphs which have codes assigned to them. The glyphs +without codes can not be used directly. But some clever programs, +such as the Type 1 library from XFree86 3.9 and higher can change +the encoding on the fly and use another set of glyphs. If you have not +installed the X11 patch described above, use this option with great +caution. See further description of the option option \f(CW\fB-a\fR\fR in the +\s-1README\s0 file. +.Ip "\(bu" 2 +\fB\f(CWGENUID\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then use +the option \f(CW\fB-uA\fR\fR of the converter to generate UniqueIDs for +the converted fonts. The standard X11 Type 1 library does not use +this \s-1ID\s0, so it may only be neccessary for the other applications. +The script is clever enough to generate different UniqueID for the +same font converted to multiple encodings. Also after conversion it +checks all the fonts generacted during the session for duplicated +UniqueID and shows those. Still, this does not quarantee that these +UniqueIDs won't overlap with some other fonts. The UniqueIDs are +generated as hash values from the font names, so it's guaranteed +that if the `\f(CWconvert\fR\*(R' script runs multiple times it will +generate the same UniqueIDs during each run. See further description +of this option in the \s-1README\s0 file. +.Ip "\(bu" 2 +\fB\f(CWGENUID\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then create +the \f(CW.pfb\fR files, otherwise the \f(CW.pfa\fR files. The \f(CW.pfb\fR +files are more compact but contain binary data, so you may experience some +troubles when transferring them through the network. +.PP +The following parameters are used to locate the other scripts and +configuration files. By default the scripts do a bit of guessing for them: +they search in the \fBttf2pt1\fR installation directory if \fBttf2pt1\fR +was installed or otherwise suppose that you are running `\f(CWconvert\fR\*(R' with +`\f(CWscripts\fR\*(R' subdirectory being the current directory. +.Ip "\(bu" 2 +\fB\f(CWENCDIR\fR\fR \- directory containing the descriptions of encodings +.Ip "\(bu" 2 +\fB\f(CWMAPDIR\fR\fR \- directory containing the external map files +.PP +Besides that a few parameters are built into the `\f(CWconvert\fR\*(R' script itself. +You probably won't need to change them: +.Ip "\(bu" 2 +\f(CW\fBT1ASM\fR\fR, \f(CW\fBTTF2PT1\fR\fR, \f(CW\fBTRANS\fR\fR, \f(CW\fBT1FDIR\fR\fR, \f(CW\fBFORCEISO\fR\fR \- paths to the other script +.PP +Also there are a few parameters controlling the installation of +fonts for Ghostscript. Please look at their description in the +Ghostscript section of documentation or in the \fBttf2pt1_x2gs(1)\fR +manual page before running `\f(CWconvert\fR\*(R'. If these parameters are +set, `\f(CWconvert\fR\*(R' will call the `\f(CWx2gs\fR\*(R' script automatically +to install the newly converted fonts in Ghostscript. +.PP +After creating the configuration file run the `\f(CWconvert\fR\*(R' script. Look at +the result and the log file in \f(CWDSTDIR\fR. +.PP +Add the directory with newly converted fonts to the configuration +of X server or font server. For most of the systems this step is +very straightforward. For \s-1HP\s0\-\s-1UX\s0 it's rather tricky and poorly +documented, so the file \s-1FONTS\s0.hpux gives a short description. +.PP +If you don't have the privileges of the root user, you still can +configure your private font server. Just use some non-standard +port number (see \s-1FONTS\s0.hpux for an example, exept that you won't +need all the \s-1HP\s0\-related stuff on any other system). +.SH "FILES" +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0scripts/convert.cfg.sample +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0scripts/* +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/README\s0 +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/FONTS\s0 +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR\s0/* +.Ip "\(bu" 2 +\s-1TTF2PT1_BINDIR/\s0ttf2pt1 +.SH "SEE ALSO" +.Ip "\(bu" 4 +the \fIttf2pt1(1)\fR manpage +.Ip "\(bu" 4 +the \fIttf2pt1_x2gs(1)\fR manpage +.Ip "\(bu" 4 +the \fIt1asm(1)\fR manpage +.SH "BUGS" +.Sh "Known problems" +.Ip "\(bu" 4 +One catch is that the X11 Type 1 font library has a rather low limit +on the font size. Because of this the fonts with more complicated +outlines and the enabled hint substitution may not fit into +this limit. The same applies to the fonts with very complicated +outlines or with very many glyphs (especially the fonts with +over 256 glyphs). So you will need to excercise caution with +these options if you plan using these fonts with X11. Some vendors +such as \s-1HP\s0 provide the Type 1 implementation licensed from Adobe +which should have no such problem. +.Sp +But there is a solution even for the generic X11. A patch located +in the subdirectory `\f(CWapp/X11\fR\*(R' fixes this problem as well +as some other minor problems. Its description is provided in +app/X11/\s-1README\s0. +.Sp +To fix the X11 font library, you have to get the X11 sources. I +can recommend the ftp sites of the XFree86 project ftp://ftp.xfree86.org +or of the Open Group ftp://ftp.x.org. This patch was made on the sources +of XFree86 so you may have better success with applying it to the +XFree86 distribution. After you have got the sources, make sure +that you can compile them. Then apply the patch as described. +Make sure that it was applied properly. Compile the sources again +(actually, you need only the fonts library, the fonts server, and +possibly the X server). It would be prudent now to save your old +font library, font server and, possibly, X server. Then install +the new recently compiled versions of these files. Of course, +if you know someone who already has compiled these files for the +same \s-1OS\s0 as yours, you can just copy the binary fles from him. +.Sp +Alas, building the X11 system from the source code is not the +easiest thing in the world and if you have no experience it +can be quite difficult. In this case just avoid the aforementioned +features or check each converted font to make sure that it +works properly. +.Ip "\(bu" 4 +The Type1 font library from the standard X11 distribution +does not work on \s-1HP\s0\-\s-1UX\s0 (at least, up to 10.01). The font server +supplied with \s-1HP\s0\-\s-1UX\s0 up to 10.01 is also broken. Starting from +\s-1HP\s0\-\s-1UX\s0 10.20 (I don't know about 10.10) they supply a proprietary font +library and the converted fonts work fine with it, provided that +they are configured properly (see the file \s-1FONTS\s0.hpux). +.Ip "\(bu" 4 +The \f(CWfonts.scale\fR files created by the older versions of the +\f(CWttf2pt1\fR installation program (up to release 3.1) have conflicted +with the language definitions of the \f(CWXfsft\fR font server and +parts of it included into XFree86. To overcome this incompatibility +the never versions creats the \f(CWfonts.scale\fR file describing all the +fonts as belonging to the \f(CWadobe-fontspecific\fR encoding and +the \f(CWfonts.alias\fR file with the proper names. The drawback of +this solution is that \f(CWxlsfonts\fR gives the list of twice more +fonts. But as a side effect the option \f(CW\fBENFORCEISO\fR\fR in +`\f(CWconvert.cfg\fR\*(R' is not required for X11 any more. +.Ip "\(bu" 4 +The conversion script has no support for Eastern multi-plane fonts. +Contribution of such a support would be welcome. + +.rn }` '' +.IX Title "TTF2PT1_CONVERT 1" +.IX Name "B - convenience font conversion script" + +.IX Header "NAME" + +.IX Header "SYNOPSIS" + +.IX Header "DESCRIPTION" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "FILES" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "SEE ALSO" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "BUGS" + +.IX Subsection "Known problems" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_x2gs.1 b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_x2gs.1 new file mode 100644 index 00000000..b8fc998e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_x2gs.1 @@ -0,0 +1,313 @@ +.rn '' }` +''' $RCSfile: ttf2pt1_x2gs.1,v $$Revision: 1.1 $$Date: 2008-03-12 06:35:44 $ +''' +''' $Log: not supported by cvs2svn $ +''' +.de Sh +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp +.if t .sp .5v +.if n .sp +.. +.de Ip +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.de Vb +.ft CW +.nf +.ne \\$1 +.. +.de Ve +.ft R + +.fi +.. +''' +''' +''' Set up \*(-- to give an unbreakable dash; +''' string Tr holds user defined translation string. +''' Bell System Logo is used as a dummy character. +''' +.tr \(*W-|\(bv\*(Tr +.ie n \{\ +.ds -- \(*W- +.ds PI pi +.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +.ds L" "" +.ds R" "" +''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of +''' \*(L" and \*(R", except that they are used on ".xx" lines, +''' such as .IP and .SH, which do another additional levels of +''' double-quote interpretation +.ds M" """ +.ds S" """ +.ds N" """"" +.ds T" """"" +.ds L' ' +.ds R' ' +.ds M' ' +.ds S' ' +.ds N' ' +.ds T' ' +'br\} +.el\{\ +.ds -- \(em\| +.tr \*(Tr +.ds L" `` +.ds R" '' +.ds M" `` +.ds S" '' +.ds N" `` +.ds T" '' +.ds L' ` +.ds R' ' +.ds M' ` +.ds S' ' +.ds N' ` +.ds T' ' +.ds PI \(*p +'br\} +.\" If the F register is turned on, we'll generate +.\" index entries out stderr for the following things: +.\" TH Title +.\" SH Header +.\" Sh Subsection +.\" Ip Item +.\" X<> Xref (embedded +.\" Of course, you have to process the output yourself +.\" in some meaninful fashion. +.if \nF \{ +.de IX +.tm Index:\\$1\t\\n%\t"\\$2" +.. +.nr % 0 +.rr F +.\} +.TH TTF2PT1_X2GS 1 "version 3.4.4" "December 31, 2003" "TTF2PT1 Font Converter" +.UC +.if n .hy 0 +.if n .na +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.de CQ \" put $1 in typewriter font +.ft CW +'if n "\c +'if t \\&\\$1\c +'if n \\&\\$1\c +'if n \&" +\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 +'.ft R +.. +.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2 +. \" AM - accent mark definitions +.bd B 3 +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds ? ? +. ds ! ! +. ds / +. ds q +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10' +. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#] +.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u' +.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u' +.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#] +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +.ds oe o\h'-(\w'o'u*4/10)'e +.ds Oe O\h'-(\w'O'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds v \h'-1'\o'\(aa\(ga' +. ds _ \h'-1'^ +. ds . \h'-1'. +. ds 3 3 +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +. ds oe oe +. ds Oe OE +.\} +.rm #[ #] #H #V #F C +.SH "NAME" +\fBttf2pt1_x2gs\fR \- font installer for Ghostscript +.SH "SYNOPSIS" +ttf2pt1_x2gs \fB[config-file]\fR +.SH "DESCRIPTION" +The fonts generated with \fBttf2pt1\fR work fine with Ghostscript by +themselves. The script `\fBx2gs\fR\*(R' (or `\fBttf2pt1_x2gs\fR\*(R' when installed +into a public directory, to avoid name conflicts with other +programs) links the font files from the X11 direcotry into the Ghostscript +directory and automatically creates the description file (\f(CWFontmap\fR) +in Ghostscript format. +.PP +If the configuration file is not specified as an argument then the file +`\f(CWconvert.cfg\fR\*(R' in the current directory is used, just like the +`\f(CWconvert\fR\*(R' script does. Indeed, this configuration file is used for +both scripts. +.PP +The Ghostscript-related parameters in the configuration file are: +.PP +\fB\f(CWDSTDIR\fR\fR \- the X11 font directory used by `\f(CWx2gs\fR\*(R' as the +source of the fonts. This parameter is common with the X11 +configuration. +.PP +\fB\f(CWGSDIR\fR\fR \- the base directory of Ghostsript. If this +parameter is set to an empty string then `\f(CWconvert\fR\*(R' won't +call `\f(CWx2gs\fR\*(R'. So if you want to get only the X11 fonts +installed then set this parameter to an empty string. This +directory may vary on various system, so please check your +system and set this value accordingly before running the script. +.PP +\fB\f(CWGSFONTDIR\fR\fR \- the font directory of Ghostscript. In the standard +Ghostscript installation it's a subdirectory of \f(CWGSDIR\fR +but some systems may use completely different directories. +.PP +\fB\f(CWGSCONFDIR\fR\fR \- the configuration subdirectory of Ghostscript +that contains the \f(CWFontmap\fR file. +.PP +\fB\f(CWINSTALLFONTMAP\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then +install the entries for the new fonts right into the main +\f(CWFontmap\fR file. Otherwise just leave the file \f(CWFontmap.ttf\fR +in the Ghostscript configuration directory. +.PP +After preparing the configuration file run the script. It symbolicaly links +all the font files and creates the description file \f(CWFontmap.ttf\fR in +\f(CWGSCONDFIR\fR. After that there are two choices. +.PP +If the option \f(CWINSTALLFONTMAP\fR was set to \f(CWYES\fR then +the font descriptions are also automatically installed into the +master \f(CWFontmap\fR file. The script is clever enough to +detect if it was run multiple times with the same directories +and if so it replaces the old \f(CWFontmap\fR entries with +the new ones instead of just accumulating all of them. You +may also run it multiple times for multiple X11 directories +and all the results will be properly collected in the \f(CWFontmap\fR. +But it's your responsibility to watch that the names of the +font files don't overlap. If the X11 font directory gets +renamed then you have to remove its font entries from the +\f(CWFontmap\fR and only after that re-run `\f(CWx2gs\fR\*(R' +for the new directory. +.PP +On the other hand if the option \f(CWINSTALLFONTMAP\fR was set to +\f(CWNO\fR then go to the \f(CWGSCONFDIR\fR directory and insert the +contents of \f(CWFontmap.ttf\fR into the \f(CWFontmap\fR file +manually. This step may be left manual to make the installation +a little bit more safe. +.PP +After that you may also want to redefine some of the aliases in +\f(CWFontmap\fR to refer to the newly installed fonts. +But the redefinition of the aliases may be dangerous if the width of +characters in the new font will be different from the old font. +Alas, there is no visible solution of this problem yet. +.SH "FILES" +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0scripts/convert.cfg.sample +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0scripts/* +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/README\s0 +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/FONTS\s0 +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR\s0/* +.Ip "\(bu" 2 +\s-1TTF2PT1_BINDIR/\s0ttf2pt1 +.SH "SEE ALSO" +.Ip "\(bu" 4 +the \fIttf2pt1(1)\fR manpage +.Ip "\(bu" 4 +the \fIttf2pt1_convert(1)\fR manpage +.Ip "\(bu" 4 +the \fIt1asm(1)\fR manpage + +.rn }` '' +.IX Title "TTF2PT1_X2GS 1" +.IX Name "B - font installer for Ghostscript" + +.IX Header "NAME" + +.IX Header "SYNOPSIS" + +.IX Header "DESCRIPTION" + +.IX Header "FILES" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "SEE ALSO" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf2ufm b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2ufm new file mode 100644 index 00000000..5b6b3173 Binary files /dev/null and b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2ufm differ diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/version.h b/application/third_party/dompdf/lib/ttf2ufm/src/version.h new file mode 100644 index 00000000..d13c4c46 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/version.h @@ -0,0 +1,7 @@ +/* + * see COPYRIGHT + */ + + +/* version number */ +#define TTF2PT1_VERSION "3.4.4" diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/winbuild.bat b/application/third_party/dompdf/lib/ttf2ufm/src/winbuild.bat new file mode 100644 index 00000000..59a157ca --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/winbuild.bat @@ -0,0 +1,11 @@ +rem file to build ttf2pt1 with Visual C++ + +cl -DWINDOWS -c bdf.c +cl -DWINDOWS -c ttf2pt1.c +cl -DWINDOWS -c pt1.c +cl -DWINDOWS -c ttf.c +cl -DWINDOWS -c t1asm.c +cl -DWINDOWS -c bitmap.c +cl -o ttf2ufm ttf2pt1.obj pt1.obj t1asm.obj ttf.obj bdf.obj bitmap.obj +cl -o t1asm -DWINDOWS -DSTANDALONE t1asm.c + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/windows.h b/application/third_party/dompdf/lib/ttf2ufm/src/windows.h new file mode 100644 index 00000000..a90ecf7e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/windows.h @@ -0,0 +1,93 @@ +/* + * Implementation of things missing in Windows + */ + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#undef ntohs +#undef ntohl +#undef htonl + +#ifdef WINDOWS_FUNCTIONS +/* byte order */ + +static unsigned short StoM(unsigned short inv) { + union iconv { + unsigned short ui; + unsigned char uc[2]; + } *inp, outv; + + inp = (union iconv *)&inv; + + outv.uc[0] = inp->uc[1]; + outv.uc[1] = inp->uc[0]; + + return (outv.ui); +} + +static unsigned int ItoM(unsigned int inv) { + union iconv { + unsigned int ui; + unsigned char uc[4]; + } *inp, outv; + + inp = (union iconv *)&inv; + + outv.uc[0] = inp->uc[3]; + outv.uc[1] = inp->uc[2]; + outv.uc[2] = inp->uc[1]; + outv.uc[3] = inp->uc[0]; + + return (outv.ui); +} + +unsigned short ntohs(unsigned short inv) { return StoM(inv); } +unsigned long ntohl(unsigned long inv) { return ItoM(inv); } +unsigned long htonl(unsigned long inv) { return ItoM(inv); } + +char *optarg; +int optind=1; + +char getopt(int argc, char **argv, char *args) { + int n,nlen=strlen(args),nLen=0; + char nCmd; + + if (argv[optind] && *argv[optind]=='-') { + nCmd=*((argv[optind]+1)); + + for (n=0;n + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +require_once("dompdf_config.inc.php"); + +/** + * @access private + */ +define("_TTF2AFM", escapeshellarg(TTF2AFM) . " -a -GAef -OW "); + +if ( !file_exists(TTF2AFM) ) { + die("Unable to locate the ttf2afm / ttf2pt1 executable (checked " . TTF2AFM . ").\n"); +} + + +/** + * Display command line usage + * + */ +function usage() { + + echo << array("_Bold", "b", "B", "bd", "BD"), + "italic" => array("_Italic", "i", "I"), + "bold_italic" => array("_Bold_Italic", "bi", "BI", "ib", "IB"), + ); + + foreach ($patterns as $type => $_patterns) { + if ( !isset($$type) || !is_readable($$type) ) { + foreach($_patterns as $_pattern) { + if ( is_readable("$path$_pattern$ext") ) { + $$type = "$path$_pattern$ext"; + break; + } + } + if ( is_null($$type) ) + echo ("Unable to find $type face file.\n"); + } + } + + $fonts = compact("normal", "bold", "italic", "bold_italic"); + $entry = array(); + + if ( $ext === ".pfb" || $ext === ".ttf" || $ext === ".otf" ) { + + // Copy the files to the font directory. + foreach ($fonts as $var => $src) { + if ( is_null($src) ) { + $entry[$var] = DOMPDF_FONT_DIR . basename($normal); + continue; + } + + // Verify that the fonts exist and are readable + if ( !is_readable($src) ) + throw new DOMPDF_Exception("Requested font '$pathname' is not readable"); + + $dest = DOMPDF_FONT_DIR . basename($src); + if ( !is_writeable(dirname($dest)) ) + throw new DOMPDF_Exception("Unable to write to destination '$dest'."); + + echo "Copying $src to $dest...\n"; + + if ( !copy($src, $dest) ) + throw new DOMPDF_Exception("Unable to copy '$src' to '" . DOMPDF_FONT_DIR . "$dest'."); + + $entry[$var] = $dest; + } + + } else + throw new DOMPDF_Exception("Unable to process fonts of type '$ext'."); + + + // If the extension is a ttf, try and convert the fonts to afm too + if ( $ext === ".ttf" || $ext === ".otf" ) { + foreach ($fonts as $var => $font) { + if ( is_null($font) ) { + $entry[$var] = DOMPDF_FONT_DIR . mb_substr(basename($normal), 0, -4); + continue; + } + + $dest = DOMPDF_FONT_DIR . mb_substr(basename($font), 0 , -4); + $stdout = ( ( strpos(PHP_OS, "WIN") === false ) ? " >/dev/null" : " 2>&1" ); + $command = _TTF2AFM . " " . escapeshellarg($font) . " " . escapeshellarg($dest) . $stdout; + echo "Generating .afm for $font...\n"; + //echo $command . "\n"; + exec( $command, $output, $ret ); + + $entry[$var] = $dest; + } + } + + // FIXME: how to generate afms from pfb? + + // Store the fonts in the lookup table + Font_Metrics::set_font_family($fontname, $entry); + + // Save the changes + Font_Metrics::save_font_families(); +} + +// If installing system fonts (may take a long time) +if ( $_SERVER["argv"][1] === "system_fonts" ) { + $fonts = Font_Metrics::get_system_fonts(); + var_dump($fonts); + foreach ( $fonts as $family => $files ) { + echo " >> Installing '$family'... \n"; + + if ( !isset($files["normal"]) ) { + echo "No 'normal' style font file\n"; + } + else { + install_font_family( $family, @$files["normal"], @$files["bold"], @$files["italic"], @$files["bold_italic"]); + echo "Done !\n"; + } + + echo "\n"; + } +} +else { + call_user_func_array("install_font_family", array_slice($_SERVER["argv"], 1)); +} \ No newline at end of file diff --git a/application/third_party/dompdf/www/controller.php b/application/third_party/dompdf/www/controller.php new file mode 100644 index 00000000..289aca01 --- /dev/null +++ b/application/third_party/dompdf/www/controller.php @@ -0,0 +1,15 @@ +"; + break; +} \ No newline at end of file diff --git a/application/third_party/dompdf/www/cssSandpaper/css/reset.css b/application/third_party/dompdf/www/cssSandpaper/css/reset.css new file mode 100644 index 00000000..93463b4e --- /dev/null +++ b/application/third_party/dompdf/www/cssSandpaper/css/reset.css @@ -0,0 +1,71 @@ +/* + * CSS Reset based on code from + * http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/ + * + * Earlier copy stated: + * "If you want to use my reset styles, then feel free! It's all + * explicitly in the public domain (I have to formally say that + * or else people ask me about licensing)." + */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-weight: inherit; + font-style: inherit; + font-size: 100%; + font-family: inherit; + vertical-align: baseline; +} +/* remember to define focus styles! */ +:focus { + outline: 0; +} +body { + line-height: 1; + color: black; + background: white; +} +ol, ul { + list-style: none; +} +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: separate; + border-spacing: 0; +} +caption, th, td { + text-align: left; + font-weight: normal; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ""; +} +blockquote, q { + quotes: "" ""; +} + +/* + * Added 2009/02/04 to fix IE7's issue with interpolated + * scaling not turned on by default. Based on an idea from + * http://acidmartin.wordpress.com/2009/01/05/better-image-scaling-and-resampling-in-internet-explorer/ + */ +img +{ + -ms-interpolation-mode: bicubic; +} +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/application/third_party/dompdf/www/cssSandpaper/js/EventHelpers.js b/application/third_party/dompdf/www/cssSandpaper/js/EventHelpers.js new file mode 100644 index 00000000..52fe7e67 --- /dev/null +++ b/application/third_party/dompdf/www/cssSandpaper/js/EventHelpers.js @@ -0,0 +1,441 @@ +/******************************************************************************* + * This notice must be untouched at all times. + * + * This javascript library contains helper routines to assist with event + * handling consinstently among browsers + * + * EventHelpers.js v.1.3 available at http://www.useragentman.com/ + * + * released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + *******************************************************************************/ +var EventHelpers = new function(){ + var me = this; + + var safariTimer; + var isSafari = /WebKit/i.test(navigator.userAgent); + var globalEvent; + + me.init = function () { + if (me.hasPageLoadHappened(arguments)) { + return; + } + + if (document.createEventObject){ + // dispatch for IE + globalEvent = document.createEventObject(); + } else if (document.createEvent) { + globalEvent = document.createEvent("HTMLEvents"); + } + + me.docIsLoaded = true; + } + + /** + * Adds an event to the document. Examples of usage: + * me.addEvent(window, "load", myFunction); + * me.addEvent(docunent, "keydown", keyPressedFunc); + * me.addEvent(document, "keyup", keyPressFunc); + * + * @author Scott Andrew - http://www.scottandrew.com/weblog/articles/cbs-events + * @author John Resig - http://ejohn.org/projects/flexible-javascript-events/ + * @param {Object} obj - a javascript object. + * @param {String} evType - an event to attach to the object. + * @param {Function} fn - the function that is attached to the event. + */ + me.addEvent = function(obj, evType, fn){ + + if (obj.addEventListener) { + obj.addEventListener(evType, fn, false); + } else if (obj.attachEvent) { + obj['e' + evType + fn] = fn; + obj[evType + fn] = function(){ + obj["e" + evType + fn](self.event); + } + obj.attachEvent("on" + evType, obj[evType + fn]); + } + } + + + /** + * Removes an event that is attached to a javascript object. + * + * @author Scott Andrew - http://www.scottandrew.com/weblog/articles/cbs-events + * @author John Resig - http://ejohn.org/projects/flexible-javascript-events/ * @param {Object} obj - a javascript object. + * @param {String} evType - an event attached to the object. + * @param {Function} fn - the function that is called when the event fires. + */ + me.removeEvent = function(obj, evType, fn){ + + if (obj.removeEventListener) { + obj.removeEventListener(evType, fn, false); + } else if (obj.detachEvent) { + try { + obj.detachEvent("on" + evType, obj[evType + fn]); + obj[evType + fn] = null; + obj["e" + evType + fn] = null; + } + catch (ex) { + // do nothing; + } + } + } + + function removeEventAttribute(obj, beginName){ + var attributes = obj.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i] + var name = attribute.name + if (name.indexOf(beginName) == 0) { + //obj.removeAttributeNode(attribute); + attribute.specified = false; + } + } + } + + me.addScrollWheelEvent = function(obj, fn){ + if (obj.addEventListener) { + /** DOMMouseScroll is for mozilla. */ + obj.addEventListener('DOMMouseScroll', fn, true); + } + + /** IE/Opera. */ + if (obj.attachEvent) { + obj.attachEvent("onmousewheel", fn); + } + + } + + me.removeScrollWheelEvent = function(obj, fn){ + if (obj.removeEventListener) { + /** DOMMouseScroll is for mozilla. */ + obj.removeEventListener('DOMMouseScroll', fn, true); + } + + /** IE/Opera. */ + if (obj.detachEvent) { + obj.detatchEvent("onmousewheel", fn); + } + + } + + /** + * Given a mouse event, get the mouse pointer's x-coordinate. + * + * @param {Object} e - a DOM Event object. + * @return {int} - the mouse pointer's x-coordinate. + */ + me.getMouseX = function(e){ + if (!e) { + return; + } + // NS4 + if (e.pageX != null) { + return e.pageX; + // IE + } else if (window.event != null && window.event.clientX != null && + document.body != null && + document.body.scrollLeft != null) + return window.event.clientX + document.body.scrollLeft; + // W3C + else if (e.clientX != null) + return e.clientX; + else + return null; + } + + /** + * Given a mouse event, get the mouse pointer's y-coordinate. + * @param {Object} e - a DOM Event Object. + * @return {int} - the mouse pointer's y-coordinate. + */ + me.getMouseY = function(e){ + // NS4 + if (e.pageY != null) + return e.pageY; + // IE + else if (window.event != null && window.event.clientY != null && + document.body != null && + document.body.scrollTop != null) + return window.event.clientY + document.body.scrollTop; + // W3C + else if (e.clientY != null) { + return e.clientY; + } + } + /** + * Given a mouse scroll wheel event, get the "delta" of how fast it moved. + * @param {Object} e - a DOM Event Object. + * @return {int} - the mouse wheel's delta. It is greater than 0, the + * scroll wheel was spun upwards; if less than 0, downwards. + */ + me.getScrollWheelDelta = function(e){ + var delta = 0; + if (!e) /* For IE. */ + e = window.event; + if (e.wheelDelta) { /* IE/Opera. */ + delta = e.wheelDelta / 120; + /** In Opera 9, delta differs in sign as compared to IE. + */ + if (window.opera) { + delta = -delta; + } + } else if (e.detail) { /** Mozilla case. */ + /** In Mozilla, sign of delta is different than in IE. + * Also, delta is multiple of 3. + */ + delta = -e.detail / 3; + } + return delta + } + + /** + * Sets a mouse move event of a document. + * + * @deprecated - use only if compatibility with IE4 and NS4 is necessary. Otherwise, just + * use EventHelpers.addEvent(window, 'mousemove', func) instead. Cannot be used to add + * multiple mouse move event handlers. + * + * @param {Function} func - the function that you want a mouse event to fire. + */ + me.addMouseEvent = function(func){ + + if (document.captureEvents) { + document.captureEvents(Event.MOUSEMOVE); + } + + document.onmousemove = func; + window.onmousemove = func; + window.onmouseover = func; + + } + + + + /** + * Find the HTML object that fired an Event. + * + * @param {Object} e - an HTML object + * @return {Object} - the HTML object that fired the event. + */ + me.getEventTarget = function(e){ + // first, IE method for mouse events(also supported by Safari and Opera) + if (e.toElement) { + return e.toElement; + // W3C + } else if (e.currentTarget) { + return e.currentTarget; + + // MS way + } else if (e.srcElement) { + return e.srcElement; + } else { + return null; + } + } + + + + + /** + * Given an event fired by the keyboard, find the key associated with that event. + * + * @param {Object} e - an event object. + * @return {String} - the ASCII character code representing the key associated with the event. + */ + me.getKey = function(e){ + if (e.keyCode) { + return e.keyCode; + } else if (e.event && e.event.keyCode) { + return window.event.keyCode; + } else if (e.which) { + return e.which; + } + } + + + /** + * Will execute a function when the page's DOM has fully loaded (and before all attached images, iframes, + * etc., are). + * + * Usage: + * + * EventHelpers.addPageLoadEvent('init'); + * + * where the function init() has this code at the beginning: + * + * function init() { + * + * if (EventHelpers.hasPageLoadHappened(arguments)) return; + * + * // rest of code + * .... + * } + * + * @author This code is based off of code from http://dean.edwards.name/weblog/2005/09/busted/ by Dean + * Edwards, with a modification by me. + * + * @param {String} funcName - a string containing the function to be called. + */ + me.addPageLoadEvent = function(funcName){ + + var func = eval(funcName); + + // for Internet Explorer (using conditional comments) + /*@cc_on @*/ + /*@if (@_win32) + pageLoadEventArray.push(func); + return; + /*@end @*/ + if (isSafari) { // sniff + pageLoadEventArray.push(func); + + if (!safariTimer) { + + safariTimer = setInterval(function(){ + if (/loaded|complete/.test(document.readyState)) { + clearInterval(safariTimer); + + /* + * call the onload handler + * func(); + */ + me.runPageLoadEvents(); + return; + } + set = true; + }, 10); + } + /* for Mozilla */ + } else if (document.addEventListener) { + var x = document.addEventListener("DOMContentLoaded", func, null); + + /* Others */ + } else { + me.addEvent(window, 'load', func); + } + } + + var pageLoadEventArray = new Array(); + + me.runPageLoadEvents = function(e){ + if (isSafari || e.srcElement.readyState == "complete") { + + for (var i = 0; i < pageLoadEventArray.length; i++) { + pageLoadEventArray[i](); + } + } + } + /** + * Determines if either addPageLoadEvent('funcName') or addEvent(window, 'load', funcName) + * has been executed. + * + * @see addPageLoadEvent + * @param {Function} funcArgs - the arguments of the containing. function + */ + me.hasPageLoadHappened = function(funcArgs){ + // If the function already been called, return true; + if (funcArgs.callee.done) + return true; + + // flag this function so we don't do the same thing twice + funcArgs.callee.done = true; + } + + + + /** + * Used in an event method/function to indicate that the default behaviour of the event + * should *not* happen. + * + * @param {Object} e - an event object. + * @return {Boolean} - always false + */ + me.preventDefault = function(e){ + + if (e.preventDefault) { + e.preventDefault(); + } + + try { + e.returnValue = false; + } + catch (ex) { + // do nothing + } + + } + + me.cancelBubble = function(e){ + if (e.stopPropagation) { + e.stopPropagation(); + } + + try { + e.cancelBubble = true; + } + catch (ex) { + // do nothing + } + } + + /* + * Fires an event manually. + * @author Scott Andrew - http://www.scottandrew.com/weblog/articles/cbs-events + * @author John Resig - http://ejohn.org/projects/flexible-javascript-events/ * @param {Object} obj - a javascript object. + * @param {String} evType - an event attached to the object. + * @param {Function} fn - the function that is called when the event fires. + * + */ + me.fireEvent = function (element,event, options){ + + if(!element) { + return; + } + + if (document.createEventObject){ + /* + var stack = DebugHelpers.getStackTrace(); + var s = stack.toString(); + jslog.debug(s); + if (s.indexOf('fireEvent') >= 0) { + return; + } + */ + return element.fireEvent('on' + event, globalEvent) + jslog.debug('ss'); + + } + else{ + // dispatch for firefox + others + globalEvent.initEvent(event, true, true); // event type,bubbling,cancelable + return !element.dispatchEvent(globalEvent); + } +} + + /* EventHelpers.init () */ + function init(){ + // Conditional comment alert: Do not remove comments. Leave intact. + // The detection if the page is secure or not is important. If + // this logic is removed, Internet Explorer will give security + // alerts. + /*@cc_on @*/ + /*@if (@_win32) + + document.write(' + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + + + +
+
diff --git a/application/third_party/dompdf/www/demo.php b/application/third_party/dompdf/www/demo.php new file mode 100644 index 00000000..6d07acc2 --- /dev/null +++ b/application/third_party/dompdf/www/demo.php @@ -0,0 +1,84 @@ +load_html($_POST["html"]); + $dompdf->set_paper($_POST["paper"], $_POST["orientation"]); + $dompdf->render(); + + $dompdf->stream("dompdf_out.pdf", array("Attachment" => false)); + + exit(0); +} + +?> + + +
+

Demo

+ + + +

Enter your html snippet in the text box below to see it rendered as a +PDF: (Note by default, remote stylesheets, images & inline PHP are disabled.)

+ +
" method="post"> +

Paper size and orientation: + + +

+ + + +
+ +
+ +
+

(Note: if you use a KHTML +based browser and are having difficulties loading the sample output, try +saving it to a file first.)

+ + + +

+ User input has been disabled for remote connections. +

+ + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/examples.php b/application/third_party/dompdf/www/examples.php new file mode 100644 index 00000000..06a541c2 --- /dev/null +++ b/application/third_party/dompdf/www/examples.php @@ -0,0 +1,96 @@ + + + + + + + +

Samples

+ +

Below are some sample files. The PDF version is generated on the fly by dompdf. (The source HTML & CSS for +these files is included in the test/ directory of the distribution +package.)

+ + array(), + "dom" => array(), + "image" => array(), + "page" => array(), + "encoding" => array(), + "script" => array(), + "quirks" => array(), + "other" => array(), +); + +//if dompdf.php runs in virtual server root, dirname does not return empty folder but '/' or '\' (windows). +//This leads to a duplicate separator in unix etc. and an error in Windows. Therefore strip off. + +$dompdf = dirname(dirname($_SERVER["PHP_SELF"])); +if ( $dompdf == '/' || $dompdf == '\\') { + $dompdf = ''; +} + +$dompdf .= "/dompdf.php?base_path=" . rawurlencode("www/test/"); + + +foreach ( $test_files as $file ) { + preg_match("@[\\/](([^_]+)_?(.*))\.(".implode("|", $extensions).")$@i", $file, $matches); + $prefix = $matches[2]; + + if ( array_key_exists($prefix, $sections) ) { + $sections[$prefix][] = array($file, $matches[3]); + } + else { + $sections["other"][] = array($file, $matches[1]); + } +} + +foreach ( $sections as $section => $files ) { + echo "

$section

"; + + echo "
    "; + foreach ( $files as $file ) { + $filename = basename($file[0]); + $title = $file[1]; + $arrow = "images/arrow_0" . rand(1, 6) . ".gif"; + echo "
  • \n"; + echo " + [HTML] + [PDF] "; + echo $title; + echo "
  • \n"; + } + echo "
"; +} +?> + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/foot.inc b/application/third_party/dompdf/www/foot.inc new file mode 100644 index 00000000..81b1819f --- /dev/null +++ b/application/third_party/dompdf/www/foot.inc @@ -0,0 +1,10 @@ + + + + diff --git a/application/third_party/dompdf/www/head.inc b/application/third_party/dompdf/www/head.inc new file mode 100644 index 00000000..8eb0213b --- /dev/null +++ b/application/third_party/dompdf/www/head.inc @@ -0,0 +1,37 @@ +'; +} +function li_star() { + return '
  • '; +} +?> + + + + dompdf - The PHP 5 HTML to PDF Converter + + + + + + + + + + + +
    \ No newline at end of file diff --git a/application/third_party/dompdf/www/images/arrow_01.gif b/application/third_party/dompdf/www/images/arrow_01.gif new file mode 100644 index 00000000..0a49fe88 Binary files /dev/null and b/application/third_party/dompdf/www/images/arrow_01.gif differ diff --git a/application/third_party/dompdf/www/images/arrow_02.gif b/application/third_party/dompdf/www/images/arrow_02.gif new file mode 100644 index 00000000..d5f3c378 Binary files /dev/null and b/application/third_party/dompdf/www/images/arrow_02.gif differ diff --git a/application/third_party/dompdf/www/images/arrow_03.gif b/application/third_party/dompdf/www/images/arrow_03.gif new file mode 100644 index 00000000..66ce13e8 Binary files /dev/null and b/application/third_party/dompdf/www/images/arrow_03.gif differ diff --git a/application/third_party/dompdf/www/images/arrow_04.gif b/application/third_party/dompdf/www/images/arrow_04.gif new file mode 100644 index 00000000..a4898407 Binary files /dev/null and b/application/third_party/dompdf/www/images/arrow_04.gif differ diff --git a/application/third_party/dompdf/www/images/arrow_05.gif b/application/third_party/dompdf/www/images/arrow_05.gif new file mode 100644 index 00000000..f5a62cf0 Binary files /dev/null and b/application/third_party/dompdf/www/images/arrow_05.gif differ diff --git a/application/third_party/dompdf/www/images/arrow_06.gif b/application/third_party/dompdf/www/images/arrow_06.gif new file mode 100644 index 00000000..7ccdf5ce Binary files /dev/null and b/application/third_party/dompdf/www/images/arrow_06.gif differ diff --git a/application/third_party/dompdf/www/images/css2.png b/application/third_party/dompdf/www/images/css2.png new file mode 100644 index 00000000..9fcaead5 Binary files /dev/null and b/application/third_party/dompdf/www/images/css2.png differ diff --git a/application/third_party/dompdf/www/images/dompdf_simple.png b/application/third_party/dompdf/www/images/dompdf_simple.png new file mode 100644 index 00000000..1362ba0e Binary files /dev/null and b/application/third_party/dompdf/www/images/dompdf_simple.png differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/box/l-blue.gif b/application/third_party/dompdf/www/images/favicon.ico similarity index 50% rename from app/resources/appunto-auth/theme/appunto-auth/images/box/l-blue.gif rename to application/third_party/dompdf/www/images/favicon.ico index 5ed7f004..4c4c7c29 100644 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/box/l-blue.gif and b/application/third_party/dompdf/www/images/favicon.ico differ diff --git a/application/third_party/dompdf/www/images/favicon.png b/application/third_party/dompdf/www/images/favicon.png new file mode 100644 index 00000000..a6de7bdb Binary files /dev/null and b/application/third_party/dompdf/www/images/favicon.png differ diff --git a/application/third_party/dompdf/www/images/h_bar.gif b/application/third_party/dompdf/www/images/h_bar.gif new file mode 100644 index 00000000..a55e2f1c Binary files /dev/null and b/application/third_party/dompdf/www/images/h_bar.gif differ diff --git a/application/third_party/dompdf/www/images/left_arrow.gif b/application/third_party/dompdf/www/images/left_arrow.gif new file mode 100644 index 00000000..ecfae80f Binary files /dev/null and b/application/third_party/dompdf/www/images/left_arrow.gif differ diff --git a/application/third_party/dompdf/www/images/logo.png b/application/third_party/dompdf/www/images/logo.png new file mode 100644 index 00000000..3fb7ad67 Binary files /dev/null and b/application/third_party/dompdf/www/images/logo.png differ diff --git a/application/third_party/dompdf/www/images/logo.xcf b/application/third_party/dompdf/www/images/logo.xcf new file mode 100644 index 00000000..f78f35fc Binary files /dev/null and b/application/third_party/dompdf/www/images/logo.xcf differ diff --git a/application/third_party/dompdf/www/images/php5-power-micro.png b/application/third_party/dompdf/www/images/php5-power-micro.png new file mode 100644 index 00000000..19c4953b Binary files /dev/null and b/application/third_party/dompdf/www/images/php5-power-micro.png differ diff --git a/application/third_party/dompdf/www/images/small_logo.png b/application/third_party/dompdf/www/images/small_logo.png new file mode 100644 index 00000000..0b8517dc Binary files /dev/null and b/application/third_party/dompdf/www/images/small_logo.png differ diff --git a/application/third_party/dompdf/www/images/star_01.gif b/application/third_party/dompdf/www/images/star_01.gif new file mode 100644 index 00000000..e110f505 Binary files /dev/null and b/application/third_party/dompdf/www/images/star_01.gif differ diff --git a/application/third_party/dompdf/www/images/star_02.gif b/application/third_party/dompdf/www/images/star_02.gif new file mode 100644 index 00000000..75de4600 Binary files /dev/null and b/application/third_party/dompdf/www/images/star_02.gif differ diff --git a/application/third_party/dompdf/www/images/star_03.gif b/application/third_party/dompdf/www/images/star_03.gif new file mode 100644 index 00000000..b3733cd8 Binary files /dev/null and b/application/third_party/dompdf/www/images/star_03.gif differ diff --git a/application/third_party/dompdf/www/images/star_04.gif b/application/third_party/dompdf/www/images/star_04.gif new file mode 100644 index 00000000..3735525c Binary files /dev/null and b/application/third_party/dompdf/www/images/star_04.gif differ diff --git a/application/third_party/dompdf/www/images/star_05.gif b/application/third_party/dompdf/www/images/star_05.gif new file mode 100644 index 00000000..4983634d Binary files /dev/null and b/application/third_party/dompdf/www/images/star_05.gif differ diff --git a/application/third_party/dompdf/www/images/title.gif b/application/third_party/dompdf/www/images/title.gif new file mode 100644 index 00000000..9d2574e8 Binary files /dev/null and b/application/third_party/dompdf/www/images/title.gif differ diff --git a/application/third_party/dompdf/www/images/v_bar.gif b/application/third_party/dompdf/www/images/v_bar.gif new file mode 100644 index 00000000..ccbc3fe3 Binary files /dev/null and b/application/third_party/dompdf/www/images/v_bar.gif differ diff --git a/application/third_party/dompdf/www/images/xhtml10.png b/application/third_party/dompdf/www/images/xhtml10.png new file mode 100644 index 00000000..30f1e8e6 Binary files /dev/null and b/application/third_party/dompdf/www/images/xhtml10.png differ diff --git a/application/third_party/dompdf/www/index.php b/application/third_party/dompdf/www/index.php new file mode 100644 index 00000000..7e787f33 --- /dev/null +++ b/application/third_party/dompdf/www/index.php @@ -0,0 +1,28 @@ + + + +

    Overview

    + +

    dompdf is an HTML to PDF converter. At its heart, dompdf is (mostly) +CSS2.1 compliant HTML layout and rendering engine written in PHP. It is +a style-driven renderer: it will download and read external stylesheets, +inline style tags, and the style attributes of individual HTML elements. It +also supports most presentational HTML attributes.

    + +

    PDF rendering is currently provided either by PDFLib (www.pdflib.com) or by a bundled +version the R&OS CPDF class written by Wayne Munro (www.ros.co.nz/pdf). (Some +performance related changes have been made to the R&OS class, +however). In order to use PDFLib with dompdf, the PDFLib PECL +extension is required. Using PDFLib improves performance and reduces +the memory requirements of dompdf somewhat, while the R&OS CPDF class, +though slightly slower, eliminates any dependencies on external PDF +libraries.

    + +

    Please note that dompdf works only with PHP 5. There are no plans for +a PHP 4 port. If your web host does not offer PHP 4, I suggest either pestering +them, or setting up your own PHP 5 box and using it to run dompdf. Your scripts +on your web host can redirect PDF requests to your PHP 5 box.

    + + diff --git a/application/third_party/dompdf/www/jquery-1.4.2.js b/application/third_party/dompdf/www/jquery-1.4.2.js new file mode 100644 index 00000000..48a88b8f --- /dev/null +++ b/application/third_party/dompdf/www/jquery-1.4.2.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
    a"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

    ";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="
    ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
    ","
    "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
    ").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
    "; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); \ No newline at end of file diff --git a/application/third_party/dompdf/www/setup.php b/application/third_party/dompdf/www/setup.php new file mode 100644 index 00000000..6bc64daa --- /dev/null +++ b/application/third_party/dompdf/www/setup.php @@ -0,0 +1,325 @@ + + + +

    Setup

    + +

    System Configuration

    + + array( + "required" => "5.0", + "value" => phpversion(), + "result" => version_compare(phpversion(), "5.0"), + ), + "DOMDocument extension" => array( + "required" => true, + "value" => phpversion("DOM"), + "result" => class_exists("DOMDocument"), + ), + "PCRE" => array( + "required" => true, + "value" => phpversion("pcre"), + "result" => function_exists("preg_match"), + ), + "Zlib" => array( + "required" => true, + "value" => phpversion("zlib"), + "result" => function_exists("gzcompress"), + "fallback" => "Recommended to compress PDF documents", + ), + "MBString extension" => array( + "required" => true, + "value" => phpversion("mbstring"), + "result" => function_exists("mb_send_mail"), // Should never be reimplemented in dompdf + "fallback" => "Recommended, will use fallback functions", + ), + "GD" => array( + "required" => true, + "value" => phpversion("gd"), + "result" => function_exists("imagecreate"), + "fallback" => "Required if you have images in your documents", + ), + "APC" => array( + "required" => true, + "value" => phpversion("apc"), + "result" => function_exists("apc_fetch"), + "fallback" => "Recommended for better performances", + ), +); + +?> + + + + + + + + + $server_config) { ?> + + + + + + + +
    RequiredPresent
    "> + No. ".$server_config["fallback"].""; + } + ?> +
    + +

    DOMPDF Configuration

    + + array( + "desc" => "Root directory of DOMPDF", + "success" => "read", + ), + "DOMPDF_INC_DIR" => array( + "desc" => "Include directory of DOMPDF", + "success" => "read", + ), + "DOMPDF_LIB_DIR" => array( + "desc" => "Third-party libraries directory of DOMPDF", + "success" => "read", + ), + "DOMPDF_FONT_DIR" => array( + "desc" => "Additional fonts directory", + "success" => "read", + ), + "DOMPDF_FONT_CACHE" => array( + "desc" => "Font metrics cache", + "success" => "write", + ), + "DOMPDF_TEMP_DIR" => array( + "desc" => "Temporary folder", + "success" => "write", + ), + "DOMPDF_CHROOT" => array( + "desc" => "Restricted path", + "success" => "read", + ), + "DOMPDF_UNICODE_ENABLED" => array( + "desc" => "Unicode support (thanks to additionnal fonts)", + ), + "TTF2AFM" => array( + "desc" => "Path to the ttf2afm executable", + "success" => "read", + ), + "DOMPDF_PDF_BACKEND" => array( + "desc" => "Backend library that makes the outputted file (PDF, image)", + "success" => "backend", + ), + "DOMPDF_DEFAULT_MEDIA_TYPE" => array( + "desc" => "Default media type (print, screen, ...)", + ), + "DOMPDF_DEFAULT_PAPER_SIZE" => array( + "desc" => "Default paper size (A4, letter, ...)", + ), + "DOMPDF_DEFAULT_FONT" => array( + "desc" => "Default font, used if the specified font in the CSS stylesheet was not found", + ), + "DOMPDF_DPI" => array( + "desc" => "DPI scale of the document", + ), + "DOMPDF_ENABLE_PHP" => array( + "desc" => "Inline PHP support", + ), + "DOMPDF_ENABLE_JAVASCRIPT" => array( + "desc" => "Inline JavaScript support", + ), + "DOMPDF_ENABLE_REMOTE" => array( + "desc" => "Allow remote stylesheets and images", + "success" => "remote", + ), + "DEBUGPNG" => array( + "desc" => "Debug PNG images", + ), + "DEBUGKEEPTEMP" => array( + "desc" => "Keep temporary image files", + ), + "DEBUGCSS" => array( + "desc" => "Debug CSS", + ), + "DEBUG_LAYOUT" => array( + "desc" => "Debug layout", + ), + "DEBUG_LAYOUT_LINES" => array( + "desc" => "Debug text lines layout", + ), + "DEBUG_LAYOUT_BLOCKS" => array( + "desc" => "Debug block elements layout", + ), + "DEBUG_LAYOUT_INLINE" => array( + "desc" => "Debug inline elements layout", + ), + "DEBUG_LAYOUT_PADDINGBOX" => array( + "desc" => "Debug padding boxes layout", + ), + "DOMPDF_LOG_OUTPUT_FILE" => array( + "desc" => "The file in which dompdf will write warnings and messages", + "success" => "write", + ), + "DOMPDF_FONT_HEIGHT_RATIO" => array( + "desc" => "The line height ratio to apply to get a render like web browsers", + ), + "DOMPDF_ENABLE_CSS_FLOAT" => array( + "desc" => "Enable CSS float support (experimental)", + ), +); +?> + + + + + + + + + + $value) { ?> + + + + + + + + +
    Config nameValueDescriptionStatus
    >
    + +

    Installed fonts for the Cpdf Backend

    + + + + + + + + + + + + + + + + + + + + $variants) { ?> + + + $path) { + if ($i > 0) { + echo ""; + } + + echo " + "; + + foreach ($extensions as $ext) { + $v = ""; + $class = ""; + + if (is_readable("$path.$ext")) { + // if not cache file + if (strpos($ext, ".php") === false) { + $class = "ok"; + $v = $ext; + } + + // cache file + else { + // check if old cache format + $content = file_get_contents("$path.$ext", null, null, null, 50); + if (strpos($content, '$this->')) { + $v = "DEPREC."; + } + else { + ob_start(); + $d = include("$path.$ext"); + ob_end_clean(); + + if ($d == 1) + $v = "DEPREC."; + else { + $class = "ok"; + $v = $d["_version_"]; + } + } + } + } + + echo ""; + } + + echo ""; + $i++; + } + ?> + + +
    Font familyVariantsFile versions
    TTFAFMAFM cacheUFMUFM cache
    + (default)'; + ?> +
    + $name : $path
    +
    $v
    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/style.css b/application/third_party/dompdf/www/style.css new file mode 100644 index 00000000..a86a0468 --- /dev/null +++ b/application/third_party/dompdf/www/style.css @@ -0,0 +1,251 @@ +body, select { + color: #7d7a7a; + font-family: 'trebuchet ms', verdana, sans-serif; + font-size: 13px; +} + +a:link, a:visited, a:active { + color: #5F83BA; + text-decoration: none; +} + +a:hover { + color: #5f83ba; + text-decoration: underline; +} + +img { + border: none; +} + +pre, +code { + font-size: 0.8em; + font-family: "lucida console", monospace; +} + +pre { + background-color: #f8f8f8; + padding: 10px; +} + +select { + font-weight: bold; +} + +h2 { + margin: 0.3em 0; +} + +.bar { + background-image: url('images/h_bar.gif'); + background-repeat: repeat-x; + background-position: bottom right; +} + +#header { + height: 50px; + line-height: 30px; +} + +#footer { + font-size: 0.75em; + padding-top: 12px; + background-image: url('images/h_bar.gif'); + background-repeat: repeat-x; + background-position: top left; + height: 35px; + vertical-align: middle; + clear: both; +} + +#logo { + position: absolute; + top: 0px; + right: 0px; + border: none; +} + +.badges { + float: right; +} + +#left_col, #content { + vertical-align: top; +} +/* +#left_col { + padding: 3px 3px 2em 3px; + margin-top: 2px; + width: 210px; + padding-right: 10px; + background-image: url('images/v_bar.gif'); + background-repeat: repeat-y; + background-position: top right; +} +*/ + +#left_col { + padding: 3px 3px 3em 3px; + margin-top: 2px; + width: 120px; + padding-right: 10px; + float: left; +} + +#left_col h2 { + font-size: 1.0em; + margin-top: 0.5em; + margin-bottom: 0.25em; +} + +#left_col ul { + margin-top: 0.25em; + padding-left: 0px; + margin-left: 0px; + position: fixed; +} + +#left_col ul li { list-style-position: inside; } + +#left_col iframe { margin-left: 40px; margin-top: 10px; } + +#content { + margin-left: 120px; + padding: 1em 1em 1em 2em; + min-width: 800px; + background-image: url('images/v_bar.gif'); + background-repeat: repeat-y; + background-position: top left; +} + +.message { + margin-top: 1em; + border: 1px dashed #5E83BA; +} + +#content li { + margin-top: 0.3em; + vertical-align: top; +} + +#content>*>li { + margin-right: 40px; /* keep things in line */ +} + +#content h2 { + text-align: left; + color: #4A9166; +} + +#content h3 { + margin-top: 2em; +} + +#content p { + text-align: justify; +} + +#content table td, +#content table th { + padding: 0.3em; +} + +#content table td.input { + white-space: nowrap; + font-family: "lucida console", monospace; + font-size: 0.8em; +} + +#content textarea { + padding: 4px; + width: 100%; + border: 1px dashed #5F83BA; + -moz-box-shadow: inset 3px 3px 3px rgba(0,0,0,0.1); + -webkit-box-shadow: inset 3px 3px 3px rgba(0,0,0,0.1); + box-shadow: inset 3px 3px 3px rgba(0,0,0,0.1); +} + +#content button { + color: #6d6a6a; + font-family: 'trebuchet ms', verdana, sans-serif; +} + +#preview { + float: right; + height: 800px; + min-width: 400px; + width: 60%; + border: 1px solid #666; + margin-left: 1em; + -moz-box-shadow: 0px 0px 6px rgba(0,0,0,0.5); + -webkit-box-shadow: 0px 0px 6px rgba(0,0,0,0.5); + box-shadow: 0px 0px 6px rgba(0,0,0,0.5); +} + +table.setup { + border: 1px solid #ccc; + border-collapse: collapse; +} + +table.setup td, +table.setup th { + border: 1px solid #ccc; +} + +table.setup th { + background-color: #ddd; +} + +table.setup td.title { + background-color: #f6f6f6; +} + +table.setup td.ok, +table.setup tr:hover td.ok { + background-color: #9e4; +} + +table.setup td.failed, +table.setup tr:hover td.failed { + background-color: #f43; + color: white; +} + +table.setup td.warning, +table.setup tr:hover td.warning { + background-color: #FCC612; +} + +table.setup tr:hover td { + background-color: #EBF1F7; +} + +table.setup tr:hover td.title { + background-color: #D0E0F2; +} + +/* Method definitions from phpdoc */ +.method-definition { + background-image: url('images/h_bar.gif'); + background-position: bottom center; + background-repeat: repeat-x; + padding: 10px 10px 20px 10px; + margin-bottom: 1em; +} + +.method-title { + color: #5F83BA; +} + +.var-name, +.method-name, +.method-title { + font-weight: bold; +} + +.var-type, +.method-result { + color: #4A9166; + font-style: italic; +} diff --git a/application/third_party/dompdf/www/test/backgroundcolor_fontdecoration_pageborder.html b/application/third_party/dompdf/www/test/backgroundcolor_fontdecoration_pageborder.html new file mode 100644 index 00000000..3b8dfd64 --- /dev/null +++ b/application/third_party/dompdf/www/test/backgroundcolor_fontdecoration_pageborder.html @@ -0,0 +1,139 @@ + + + + + + + + +
    +

    Background color, text decoration, page border

    +

    see more testcases with background images in image_variants.html

    + +
    +
    + +

     

    + +

    Text

    +

    Link

    + +

     

    + +

    +block +inline +block +_underlinex +block +_underline stylex +block +_line-through stylex +block +_overline stylex +block +
    + +

     

    + +

    +block +inline +block +_underlinex +block +_underline stylex +block +_line-through stylex +block +_overline stylex +block +
    + +

     

    + +

    +block +inline +block +_underlinex +block +_underline stylex +block +_line-through stylex +block +_overline stylex +block +
    + +

     

    + +

    +block +inline +block +_underlinex +block +_underline stylex +block +_line-through stylex +block +_overline stylex +block +
    +

     

    + +

    +block +inline + +underline sdfjsfh sdfs sfd sf sf sdfsdfasf asdfasdfa asdfasdf asdf asdfas dfasdf afsafasf asdfasdasdf adfasfasdf + +block +
    + +

     

    + +

    +block +inline +block +underline +block +underline style +block +
    + +

     

    + +

    +The PHP 5 HTML to PDF converter +

    + +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +
    + diff --git a/application/third_party/dompdf/www/test/css/common.css b/application/third_party/dompdf/www/test/css/common.css new file mode 100644 index 00000000..eb8c732b --- /dev/null +++ b/application/third_party/dompdf/www/test/css/common.css @@ -0,0 +1,128 @@ +/* Notes +-----------------------------------------------------------------------*/ +.note_form { + display: none; +} + + +/* Page +-----------------------------------------------------------------------*/ +.page { + background-color: white; + padding: 20px; + font-size: 0.7em; + margin-bottom: 15px; + margin-right: 5px; +} + +.page table.header td h1 { + margin: 0px; +} + +.page table.header { + border-bottom: 1px solid black; +} + +.page h1 { + text-align: center; + color: black; + font-style: normal; + font-size: 2em; +} + +.page h2 { + text-align: center; + color: black; +} + +.page h3 { + color: black; + font-size: 1em; +} + +.page p { + text-align: justify; + font-size: 1em; +} + +.page em { + font-weight: bold; + font-style: normal; + text-decoration: underline; + margin-left: 1%; + margin-right: 1%; + +} + +.money_table { + width: 85%; + margin-left: auto; + margin-right: auto; +} + +.money { + text-align: right; + padding-right: 20px; +} + +.money_field { + text-align: right; + padding: 0px 15px 5px 15px; + font-weight: bold; +} + +.total_label { + border-top: 2px double black; + font-weight: bold; +} + +.total_field { + border-top: 2px double black; + text-align: right; + padding: 0px 15px 5px 15px; + font-weight: bold; +} + +.written_field { + border-bottom: 0.1pt solid black; +} + +.page .indent * { margin-left: 4em; } + +.checkbox { + border: 1px solid black; + padding: 1px 2px; + font-size: 7px; + font-weight: bold; +} + +table.fax_head { + width: 100%; + font-weight: bold; + font-size: 1.1em; + border-bottom: 1px solid black; +} + +/* Sales-agreement specific +-----------------------------------------------------------------------*/ +table.sa_signature_box { + margin: 2em auto 2em auto; +} + +table.sa_signature_box tr td { + padding-top: 1.5em; + vertical-align: top; + white-space: nowrap; +} + +.special_conditions { + font-style: italic; + margin-left: 2em; + white-space: pre; + font-weight: bold; +} + +.page h2 { + text-align: left; +} + diff --git a/application/third_party/dompdf/www/test/css/importabs.css b/application/third_party/dompdf/www/test/css/importabs.css new file mode 100644 index 00000000..d6cbfb9c --- /dev/null +++ b/application/third_party/dompdf/www/test/css/importabs.css @@ -0,0 +1,2 @@ +p.importabs {background-color:#ffffc0;} + diff --git a/application/third_party/dompdf/www/test/css/importall.css b/application/third_party/dompdf/www/test/css/importall.css new file mode 100644 index 00000000..89f4379b --- /dev/null +++ b/application/third_party/dompdf/www/test/css/importall.css @@ -0,0 +1,2 @@ +li.import {background-color:#ffffc0;} + diff --git a/application/third_party/dompdf/www/test/css/importdisplay.css b/application/third_party/dompdf/www/test/css/importdisplay.css new file mode 100644 index 00000000..7610d901 --- /dev/null +++ b/application/third_party/dompdf/www/test/css/importdisplay.css @@ -0,0 +1,2 @@ +p.import {background-color:#c0c0ff;} + diff --git a/application/third_party/dompdf/www/test/css/importprint.css b/application/third_party/dompdf/www/test/css/importprint.css new file mode 100644 index 00000000..cc9e8c5f --- /dev/null +++ b/application/third_party/dompdf/www/test/css/importprint.css @@ -0,0 +1,2 @@ +p.import {background-color:#eeeeee;} + diff --git a/application/third_party/dompdf/www/test/css/importsub.css b/application/third_party/dompdf/www/test/css/importsub.css new file mode 100644 index 00000000..96b5338f --- /dev/null +++ b/application/third_party/dompdf/www/test/css/importsub.css @@ -0,0 +1,2 @@ +p.importsub {background-color:#ffffc0;} + diff --git a/application/third_party/dompdf/www/test/css/linkall.css b/application/third_party/dompdf/www/test/css/linkall.css new file mode 100644 index 00000000..d3668cfc --- /dev/null +++ b/application/third_party/dompdf/www/test/css/linkall.css @@ -0,0 +1,2 @@ +li.link {background-color:#ffffc0;} + diff --git a/application/third_party/dompdf/www/test/css/linkdefault.css b/application/third_party/dompdf/www/test/css/linkdefault.css new file mode 100644 index 00000000..06115010 --- /dev/null +++ b/application/third_party/dompdf/www/test/css/linkdefault.css @@ -0,0 +1,2 @@ +li.link {color:#ff0000;} + diff --git a/application/third_party/dompdf/www/test/css/linkdisplay.css b/application/third_party/dompdf/www/test/css/linkdisplay.css new file mode 100644 index 00000000..77f3d191 --- /dev/null +++ b/application/third_party/dompdf/www/test/css/linkdisplay.css @@ -0,0 +1,2 @@ +p.link {background-color:#c0c0ff;} + diff --git a/application/third_party/dompdf/www/test/css/linkprint.css b/application/third_party/dompdf/www/test/css/linkprint.css new file mode 100644 index 00000000..dd3f3ca5 --- /dev/null +++ b/application/third_party/dompdf/www/test/css/linkprint.css @@ -0,0 +1,2 @@ +p.link {background-color:#eeeeee;} + diff --git a/application/third_party/dompdf/www/test/css/print_static.css b/application/third_party/dompdf/www/test/css/print_static.css new file mode 100644 index 00000000..2acd05d6 --- /dev/null +++ b/application/third_party/dompdf/www/test/css/print_static.css @@ -0,0 +1,701 @@ +/* Default style definitions */ + +@import url(common.css); + +@page { + margin: 0.25in; +} + +/* General +-----------------------------------------------------------------------*/ +body { + background-color: transparent; + color: black; + font-family: "verdana", "sans-serif"; + margin: 0px; + padding-top: 0px; + font-size: 1em; +} + +@media print { + p { margin: 2px; } +} + +h1 { + font-size: 1.1em; + font-style: italic; +} + +h2 { + font-size: 1.05em; +} + +img { + border: none; +} + +pre { + font-family: "verdana", "sans-serif"; + font-size: 0.7em; +} + +ul { + list-style-type: circle; + list-style-position: inside; + margin: 0px; + padding: 3px; +} + +li.alpha { + list-style-type: lower-alpha; + margin-left: 15px; +} + +p { + font-size: 0.8em; +} + +a:link, +a:visited { + /* font-weight: bold; */ + text-decoration: none; + color: black; +} + +a:hover { + text-decoration: underline; +} + +#body { + padding-bottom: 2em; + padding-top: 5px; +} + +#body pre { +} + +.center { + text-align: center; +} + +.right { + text-align: right; +} + +#money { + text-align: right; + padding-right: 20px; +} + +/* Footer +-----------------------------------------------------------------------*/ +#footer { + color: black; +} + +#copyright { + padding: 5px; + font-size: 0.6em; + background-color: white; +} + +#footer_spacer_row { + width: 100%; +} + +#footer_spacer_row td { + padding: 0px; + border-bottom: 1px solid #000033; + background-color: #F7CF07; + height: 2px; + font-size: 2px; + line-height: 2px; +} + +#logos { + padding: 5px; + float: right; +} + +/* Section Header +-----------------------------------------------------------------------*/ +#section_header { + text-align: center; +} + +#job_header { + text-align: left; + background-color: white; + margin-left: 5px; + padding: 5px; + border: 1px dashed black; +} + +#job_info { + font-weight: bold; +} + +.header_details td { + font-size: 0.6em; +} + +.header_label { + padding-left: 20px; +} + +.header_field { + padding-left: 5px; + font-weight: bold; +} + +/* Content +-----------------------------------------------------------------------*/ +#content { + padding: 0.2em 1% 0.2em 1%; + min-height: 15em; +} + +.page_buttons { + text-align: center; + margin: 3px; + font-size: 0.7em; + white-space: nowrap; + font-weight: bold; + width: 74%; +} + +.link_bar { + font-size: 0.7em; + text-align: center; + margin: auto; +/* white-space: nowrap; */ +} + +.link_bar a { + white-space: nowrap; + font-weight: bold; +} + +.page_menu li { + margin: 5px; + font-size: 0.8em; +} + +/* Detail +-----------------------------------------------------------------------*/ +.detail_table { + border-top: 1px solid black; + border-bottom: 1px solid black; + padding: 3px; + margin: 15px; +} + +.detail_head td { + background-color: #ddd; + color: black; + font-weight: bold; + padding: 3px; + font-size: 0.75em; + text-align: center; +} + +.detail_label { + padding: 3px; + font-size: 0.75em; + width: 16%; + border-top: 1px solid #fff; + border-bottom: 1px solid #fff; + background-color: #ddd; +} + +.detail_field { + width: 33%; + font-size: 0.8em; + color: ; + text-align: center; + padding: 3px; +} + +.detail_sub_table { + font-size: 1em; +} + +.detail_spacer_row td { + border-top: 1px solid white; + border-bottom: 1px solid white; + background-color: #999; + font-size: 2px; + line-height: 2px; +} + +#narrow { + width: 50%; +} + +.operation { + width: 1%; +} + +.summary_spacer_row { + font-size: 0.1em; +} + +.bar { + border-top: 1px solid black; +} + +/* Forms +-----------------------------------------------------------------------*/ +.form { + border-top: 1px solid black; + border-bottom: 1px solid black; + margin-top: 10px; +} + +.form td { + padding: 3px; +} + +.form th, .form_head td { + background-color: #ddd + border-bottom: 1px solid black; + color: black; + padding: 3px; + text-align: center; + font-size: 0.65em; + font-weight: bold; +} + +.form_head a:link, +.form_head a:visited { + color: black; +} + +.form_head a:hover { +} + +.sub_form_head td { + border: none; + font-size: 0.9em; + white-space: nowrap; +} + +.form input { + color: black; + background-color: white; + border: 1px solid black; + padding: 1px 2px 1px 2px; + text-decoration: none; + font-size: 1em; +} + +.form textarea { + color: black; + background-color: white; + border: 1px solid black; + font-size: 1em; +} + +.form select { + color: black; + background-color: white; + font-size: 1em; +} + +.button, a.button { + color: black; + background-color: white; + border: 1px solid black; + font-weight: normal; + white-space: nowrap; + text-decoration: none; +} + +a.button { + display: inline-block; + text-align: center; + padding: 2px; +} + +a.button:hover { + text-decoration: none; + color: black; +} + +.form_field { + color: black; + background-color: white; + font-size: 0.7em; +} + +.form_label { + color: black; + background-color: #ddd; + font-size: 0.7em; + padding: 3px; +} + +/* +.form_foot { + background-color: #E5D9C3; + font-size: 0.6em; +} +*/ + +.form_foot td { + background-color: #ddd + border-bottom: 1px solid black; + color: black; + padding: 3px; + text-align: center; + font-size: 0.65em; + font-weight: bold; +} + +.form_foot a:link, +.form_foot a:visited { + color: black; +} + +.form_foot a:hover { + color: black; +} + +.no_border_input input { + border: none; +} + +.no_wrap { + white-space: nowrap; +} + +tr.row_form td { + white-space: nowrap; +} + +/* Wizards +-----------------------------------------------------------------------*/ +.wizard { + font-size: 0.8em; + border-top: 1px solid black; +} + +#no_border { + border: none; +} + +.wizard p { + text-indent: 2%; +} + +.wizard td { + padding: 3px; +/* padding-left: 3px; + padding-right: 3px; + padding-bottom: 3px;*/ +} + +.wizard input { + color: black; + background-color: white; + border: 1px solid black; + padding: 1px 2px 1px 2px; + text-decoration: none; +} + +.wizard textarea { + color: black; + background-color: white; + border: 1px solid black; +} + +.wizard select { + color: black; + background-color: white; + border: 1px solid black; +} + +.wizard_head { + color: black; + font-weight: bold; +} + +.wizard_buttons { + border-top: 1px solid black; + padding-top: 3px; +} + +.wizard_buttons a { + background-color: white; + border: 1px solid black; + padding: 2px 3px 2px 3px; +} + +/* List +-----------------------------------------------------------------------*/ +.list_table, +.notif_list_table { + color: black; + padding-bottom: 4px; + background-color: white; +} + +.list_table td, +.notif_list_table td { + padding: 3px 5px 3px 5px; +} + +.list_table input { + color: black; + background-color: white; + border: 1px solid black; + padding: 1px 2px 1px 2px; + text-decoration: none; +} + +.list_head, +.notif_list_head { + font-weight: bold; + background-color: #ddd; + font-size: 0.65em; +} + +.list_head td, +.notif_list_head td { + border-top: 1px solid black; + border-bottom: 1px solid black; + color: black; + text-align: center; + white-space: nowrap; +} + +.list_head a:link, +.list_head a:visited, +.notif_list_head a:link, +.notif_list_head a:visited { + color: black; +} + +.list_head a:hover, +.notif_list_head a:hover { +} + +.list_foot { + font-weight: bold; + background-color: #ddd; + font-size: 0.65em; +} + +.list_foot td { + border-top: 1px solid black; + border-bottom: 1px solid black; + color: black; + text-align: right; + white-space: nowrap; +} + +.sub_list_head td { + border: none; + font-size: 0.7em; +} + +.odd_row td { +/* background-color: #EDF2F7; + border-top: 2px solid #FFFFff;*/ + background-color: transparent; + border-bottom: 0.9px solid #ddd; /* 0.9 so table borders take precedence */ +} + +.even_row td { +/* background-color: #F8EEE4; + border-top: 3px solid #FFFFff;*/ + background-color: #f6f6f6; + border-bottom: 0.9px solid #ddd; +} + +.spacer_row td { + line-height: 2px; + font-size: 2px; +} + +.phone_table td { + border: none; + font-size: 0.8em; +} + +div.notif_list_text { + margin-bottom: 1px; + font-size: 1.1em; +} + +.notif_list_row td.notif_list_job { + text-align: center; + font-weight: bold; + font-size: 0.65em; +} + +.notif_list_row td.notif_list_dismiss table td { + text-align: center; + font-size: 1em; + border: none; + padding: 0px 2px 0px 2px; +} + +.notif_list_row td { + padding: 5px 5px 7px 5px; + border-bottom: 1px dotted #ddd; + background-color: white; + font-size: 0.6em; +} + +.notif_list_row:hover td { + background-color: #ddd; +} + +/* Page +-----------------------------------------------------------------------*/ +.page { + border: none; + padding: 0in; + margin-right: 0.1in; + margin-left: 0.1in; + /*margin: 0.33in 0.33in 0.4in 0.33in; */ + background-color: transparent; +} + +.page table.header h1{ + font-size: 12pt; +} + +.page>h2, +.page>p { + margin-top: 2pt; + margin-bottom: 2pt; +} + +.page h2 { + page-break-after: avoid; +} + +.money_table { + border-collapse: collapse; + font-size: 6pt; +} + +/* Tree +-----------------------------------------------------------------------*/ +.tree_div { + display: none; + background-color: #ddd; + border: 1px solid #333; +} + +.tree_div .tree_step_bottom_border { + border-bottom: 1px dashed #8B9DBE; +} + +.tree_div .button, .tree_row_table .button, +.tree_div .no_button { + width: 110px; + font-size: 0.7em; + padding: 3px; + text-align: center; +} + +/* +.tree_div .button a, .tree_row_table .button a { + text-decoration: none; + color: #114C8D; +} +*/ + +.tree_row_desc { + font-weight: bold; + font-size: 0.7em; + text-indent: -10px; +} + +.tree_row_info { + font-size: 0.7em; + width: 200px; +} + +.tree_div_head a, +.tree_row_desc a { + color: #000033; + text-decoration: none; +} + +.tree_div_head { + font-weight: bold; + font-size: 0.7em; +} + +/* Summaries +-----------------------------------------------------------------------*/ +.summary { + border: 1px solid black; + background-color: white; + padding: 1%; + font-size: 0.8em; +} + +.summary h1 { + color: black; + font-style: normal; +} + +/* Sales-agreement specific +-----------------------------------------------------------------------*/ +table.sa_signature_box { + margin: 2em auto 2em auto; +} + +table.sa_signature_box tr td { + padding-top: 1.25em; + vertical-align: top; + white-space: nowrap; +} + +.special_conditions { + font-style: italic; + margin-left: 2em; + white-space: pre; +} + +.sa_head * { + font-size: 7pt; +} + +/* Change order specific +-----------------------------------------------------------------------*/ +table.change_order_items { + font-size: 8pt; + width: 100%; + border-collapse: collapse; + margin-top: 2em; + margin-bottom: 2em; +} + +table.change_order_items>tbody { + border: 1px solid black; +} + +table.change_order_items>tbody>tr>th { + border-bottom: 1px solid black; +} + +table.change_order_items>tbody>tr>td { + border-right: 1px solid black; + padding: 0.5em; +} + +td.change_order_total_col { + padding-right: 4pt; + text-align: right; +} + +td.change_order_unit_col { + padding-left: 2pt; + text-align: left; +} \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/css_2d_transforms.html b/application/third_party/dompdf/www/test/css_2d_transforms.html new file mode 100644 index 00000000..c0820cbe --- /dev/null +++ b/application/third_party/dompdf/www/test/css_2d_transforms.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + +

    none

    +
     
    + +

    rotate

    +
     
    + +

    scale

    +
     
    +
     
    +
     
    +
     
    + +

    translate

    +
     
    +
     
    +
     
    +
     
    + +

    skew

    +
     
    +
     
    +
     
    +
     
    + +

    mixed

    +
     
    + + + diff --git a/application/third_party/dompdf/www/test/css_baseline.html b/application/third_party/dompdf/www/test/css_baseline.html new file mode 100644 index 00000000..198260ad --- /dev/null +++ b/application/third_party/dompdf/www/test/css_baseline.html @@ -0,0 +1,16 @@ + + + + + + +(enter your text here) + + + diff --git a/application/third_party/dompdf/www/test/css_block_height.html b/application/third_party/dompdf/www/test/css_block_height.html new file mode 100644 index 00000000..c42ba0c1 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_block_height.html @@ -0,0 +1,14 @@ + + + + + + + +
    +  +
    + + + diff --git a/application/third_party/dompdf/www/test/css_border.html b/application/third_party/dompdf/www/test/css_border.html new file mode 100644 index 00000000..f793c677 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_border.html @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + +
    dotteddashedsoliddouble
    grooveridgeinsetoutset
    + +

    partial attributes merged

    + +
    border:thin solid red;
    +
    border:red thin solid;
    +
    { border:thin solid; }{border:blue; } (merged, reset all - color has no effect)
    +
    { border:thin solid; }{border-color:green; } (merged, overwrite only color)
    +
    { border:thin solid; }{border:blue; } (merged, reset all - color has no effect)
    +
    { border:thin solid; }{border-color:green; } (merged, overwrite only color)
    +
    { border:thin blue solid; }{border-color:green; } (merged, overwrite only color)
    +
    { border:thin blue solid; }{border-style:dashed; } (merged, overwrite only style)
    +
    { border:thin blue solid; }{border-width:thick; } (merged, overwrite only width)
    +
    { border:thin blue solid; }{border-width:medium; } (merged, overwrite only width)
    +
    { border:thin blue solid; }{border-width:3pt; } (merged, overwrite only width)
    + +

    top:

    + +
    border-top:thin solid red;
    +
    border-top:red thin solid;
    +
    { border-top:thin solid; }{border-top-color:green; } (merged, overwrite only color)
    +
    { border-top:thin solid; }{border-top:blue; } (merged, reset all - color has no effect)
    + +

    right left bottom:

    + +
    border-right:thin solid red;
    +
    border-left:thin solid red;
    +
    border-bottom:thin solid red;
    + +

    Individual Attributes

    +
    {border:thin blue solid;}{border-top-color:red;}
    +
    {border:thin blue solid;}{border-right-color:red;}
    +
    {border:thin blue solid;}{border-bottom-color:red;}
    +
    {border:thin blue solid;}{border-left-color:red;}
    + +
    {border:thin blue solid;}{border-top-style:dashed;}
    +
    {border:thin blue solid;}{border-right-style:dashed;}
    +
    {border:thin blue solid;}{border-bottom-style:dashed;}
    +
    {border:thin blue solid;}{border-left-style:dashed;}
    + +
    {border:thin blue solid;}{border-top-width:medium;}
    +
    {border:thin blue solid;}{border-right-width:medium;}
    +
    {border:thin blue solid;}{border-bottom-width:medium;}
    +
    {border:thin blue solid;}{border-left-width:medium;}
    + +

    Individual side specific Attributes

    + +
    {border:thin blue solid;}{border-color:red;}
    +
    {border:thin blue solid;}{border-color:red green;}
    +
    {border:thin blue solid;}{border-color:red green blue;}
    +
    {border:thin blue solid;}{border-color:red green blue gray;}
    + +
    {border:thin blue solid;}{border-style:dashed;}
    +
    {border:thin blue solid;}{border-style:dashed dotted;}
    +
    {border:thin blue solid;}{border-style:dashed dotted double;}
    +
    {border:thin blue solid;}{border-style:dashed dotted double groove;}
    + +
    {border:thin blue solid;}{border-width:1pt;}
    +
    {border:thin blue solid;}{border-width:1pt 2pt;}
    +
    {border:thin blue solid;}{border-width:1pt 2pt 3pt;}
    +
    {border:thin blue solid;}{border-width:1pt 2pt 3pt 4pt;}
    + + diff --git a/application/third_party/dompdf/www/test/css_border_values.html b/application/third_party/dompdf/www/test/css_border_values.html new file mode 100644 index 00000000..99a6c6b6 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_border_values.html @@ -0,0 +1,41 @@ + + + + + + +
    +
    +
    +
    +
    +
    + + diff --git a/application/third_party/dompdf/www/test/css_color_cmyk.html b/application/third_party/dompdf/www/test/css_color_cmyk.html new file mode 100644 index 00000000..46a719e6 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_color_cmyk.html @@ -0,0 +1,51 @@ + + + + + + + + + + +All these rectangles should look red: + +
    + +
    + +
    + +
    + +
    + +
    +
    +
    + +CMYK JPEG:
    + + +

    +CMYK: +
    + +
    + +
    + +
    + + + diff --git a/application/third_party/dompdf/www/test/css_content.html b/application/third_party/dompdf/www/test/css_content.html new file mode 100644 index 00000000..4558df51 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_content.html @@ -0,0 +1,47 @@ + + + + + + + + + Look at the HTML source ! + +

    quote <q>

    +

    to

    + +

    +

    +

    + + + + diff --git a/application/third_party/dompdf/www/test/css_float.html b/application/third_party/dompdf/www/test/css_float.html new file mode 100644 index 00000000..5e422351 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_float.html @@ -0,0 +1,55 @@ + + + + + + + + + +
    + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. + Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. + + + Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. + Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. + Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. + Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. + Mauris ac mauris sed pede pellentesque fermentum. + +
    + + diff --git a/application/third_party/dompdf/www/test/css_font_selection.html b/application/third_party/dompdf/www/test/css_font_selection.html new file mode 100644 index 00000000..68059ff1 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_font_selection.html @@ -0,0 +1,116 @@ + + + + + + + +

    Font Selection

    + +

    Available font-family:

    +
      +
    • serif (default) (Aliases: times, times-roman)
    • +
    • sans-serif (Aliases: helvetica)
    • +
    • monospace (Aliases: fixed, courier)
    • +
    +

    Available font-style:

    +
      +
    • normal (default)
    • +
    • italic
    • +
    +

    Available font-weight:

    +
      +
    • normal (default)
    • +
    • bold
    • +
    +

    Other variations are falling back to a combination of the above

    +

    Special fonts

    +
      +
    • symbol
    • +
    • zapfdingbats
    • +
    + +

    Font selection

    + +

    abcdefghijk ABCDEFGHIJK - (Helvetica) - (sans-serif) - sans-serif

    +

    abcdefghijk ABCDEFGHIJK - (Helvetica) - (sans-serif) - helvetica

    +

    abcdefghijk ABCDEFGHIJK - (Times-Roman) - (serif) - serif

    +

    abcdefghijk ABCDEFGHIJK - (Times-Roman) - (serif) - times

    +

    abcdefghijk ABCDEFGHIJK - (Times-Roman) - (serif) - times-roman

    +

    abcdefghijk ABCDEFGHIJK - (Courier)- (monospace) - mononospace

    +

    abcdefghijk ABCDEFGHIJK - (Courier)- (monospace) - fixed

    +

    abcdefghijk ABCDEFGHIJK - (Courier)- (monospace) - courier

    + +

    Font search path

    + +

    abcdefghijk ABCDEFGHIJK - serif - "font-family:dummy1,dummy2;"

    +

    abcdefghijk ABCDEFGHIJK - sans-serif - "font-family:dummy1,dummy2,sans-serif;"

    +

    abcdefghijk ABCDEFGHIJK - sans-serif - "font-family:sans-serif,dummy1,dummy2;"

    +

    abcdefghijk ABCDEFGHIJK - sans-serif - "font-family:sans-serif,courier;"

    + +

    Font variations

    + +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:normal;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:lighter;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:100;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:200;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:300;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:400;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:500;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:600;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:700;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:800;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:900;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:bold;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:bolder;"

    +

    abcdefghijk ABCDEFGHIJK - serif - italic - "font-style:italic; font-weight:normal;"

    +

    abcdefghijk ABCDEFGHIJK - serif - italic - "font-style:oblique; font-weight:normal;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold_italic - "font-style:italic; font-weight:bold;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-variant:small-caps; font-style:normal; font-weight:normal;"

    small-caps + +

    Font size

    + +

    abcdefghijk ABCDEFGHIJK - xx-small

    +

    abcdefghijk ABCDEFGHIJK - x-small

    +

    abcdefghijk ABCDEFGHIJK - small

    +

    abcdefghijk ABCDEFGHIJK - medium

    +

    abcdefghijk ABCDEFGHIJK - large

    +

    abcdefghijk ABCDEFGHIJK - x-large

    +

    abcdefghijk ABCDEFGHIJK - xx-large

    +

    abcdefghijk ABCDEFGHIJK - 10pt

    +

    abcdefghijk ABCDEFGHIJK - 12pt

    +

    abcdefghijk ABCDEFGHIJK - l4pt

    +

    abcdefghijk ABCDEFGHIJK - smaller

    +

    abcdefghijk ABCDEFGHIJK - larger

    + +

    Line height

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 100%

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 120%

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 140%

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 100%

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 120%

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 140%

    + +

    Font combined setting

    +

    style="font:italic small-caps bold 14pt/160% sans-serif;"
    (all attributes)

    +

    style="font:normal 10pt/160% sans-serif;"
    (partial attributes)

    +

    style="font:700 10pt/160% sans-serif;"
    (partial attributes)

    +

    style="font:small sans-serif;"
    (partial attributes)

    +
    + +

    inherit style="font:italic small-caps bold 14pt/160% sans-serif;" :

    + +

    +style="font:small sans-serif;"
    +(partial attributes - reset inherited)
    +style="font-weight:bold;"
    +(partial overwrite)

    +(resume partial attributes) +

    + +

    continue inherited

    + +
    + + + diff --git a/application/third_party/dompdf/www/test/css_important_flag.html b/application/third_party/dompdf/www/test/css_important_flag.html new file mode 100644 index 00000000..76751f13 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_important_flag.html @@ -0,0 +1,54 @@ + + + + + + + + +

    Handling of "!important" property flag

    +

    +Normally later css style properties defined later are overriding earlier ones.
    +Except if they are marked with the flag "!important".
    +Those can only be overridden by style properties which are also marked "!important". +

    + +

    There are two classes of property overriding

    +
      +
    • inherit (nested html tags)
    • +
    • merging (more css properties to the same html tag)
    • +
    +

    This is handled similarly for all styles, so we check only examples here

    + +

    ul { line-height:160% }

    + +

    merge a { border-bottom:dashed 1pt red !important; text-decoration:none !important; }

    + +

    dummy links, text decoration/border bottom:

    + + + +

    Inherit .monospace { font-family:monospace !important; }

    +

    font family selection:

    +
      +
    • (default)
    • +
    • font-family:sans-serif; (ignored)
    • +
    • font-family:sans-serif!important; (override)
    • +
    + + + diff --git a/application/third_party/dompdf/www/test/css_letter_spacing.html b/application/third_party/dompdf/www/test/css_letter_spacing.html new file mode 100644 index 00000000..fb813cbb --- /dev/null +++ b/application/third_party/dompdf/www/test/css_letter_spacing.html @@ -0,0 +1,102 @@ + + + + + + + + +
    +

    This has letter spacing of 5px

    +

    This has letter spacing of 4px

    +

    This has letter spacing of 3px

    +

    This has letter spacing of 2px

    +

    This has letter spacing of 1px

    +

    This has normal letter spacing

    +

    This has letter spacing of -1px

    +

    This has letter spacing of -2px

    +

    This has letter spacing of -3px

    +

    This has letter spacing of -4px

    +

    This has letter spacing of -5px

    +
    + +
    +

    This has letter spacing of 5px

    +

    This has letter spacing of 4px

    +

    This has letter spacing of 3px

    +

    This has letter spacing of 2px

    +

    This has letter spacing of 1px

    +

    This has normal letter spacing

    +

    This has letter spacing of -1px

    +

    This has letter spacing of -2px

    +

    This has letter spacing of -3px

    +

    This has letter spacing of -4px

    +

    This has letter spacing of -5px

    +
    + +
    +

    This has letter spacing of 5px

    +

    This has letter spacing of 4px

    +

    This has letter spacing of 3px

    +

    This has letter spacing of 2px

    +

    This has letter spacing of 1px

    +

    This has normal letter spacing

    +

    This has letter spacing of -1px

    +

    This has letter spacing of -2px

    +

    This has letter spacing of -3px

    +

    This has letter spacing of -4px

    +

    This has letter spacing of -5px

    +
    + +
    +

    This has letter spacing of 5px. This has letter spacing of 5px. This has letter spacing of 5px.

    +

    This has letter spacing of 4px. This has letter spacing of 4px. This has letter spacing of 4px.

    +

    This has letter spacing of 3px. This has letter spacing of 3px. This has letter spacing of 3px.

    +

    This has letter spacing of 2px. This has letter spacing of 2px. This has letter spacing of 2px.

    +

    This has letter spacing of 1px. This has letter spacing of 1px. This has letter spacing of 1px.

    +

    This has normal letter spacing. This has normal letter spacing. This has normal letter spacing.

    +

    This has letter spacing of -1px. This has letter spacing of -1px. This has letter spacing of -1px.

    +

    This has letter spacing of -2px. This has letter spacing of -2px. This has letter spacing of -2px.

    +

    This has letter spacing of -3px. This has letter spacing of -3px. This has letter spacing of -3px.

    +

    This has letter spacing of -4px. This has letter spacing of -4px. This has letter spacing of -4px.

    +

    This has letter spacing of -5px. This has letter spacing of -5px. This has letter spacing of -5px.

    +
    + + diff --git a/application/third_party/dompdf/www/test/css_line_height.html b/application/third_party/dompdf/www/test/css_line_height.html new file mode 100644 index 00000000..7589b795 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_line_height.html @@ -0,0 +1,63 @@ + + + + +CSS Line Height Inheritance + + + +

    Use only <number> for line-height

    +

    unless you like solving inexplicable inheritance problems or setting an explicit line-height on every element

    +

    div {line-height: 1}; div div {font-size: 200%}

    +
    The quick brown fox
    jumps over the crazy +
    The quick brown fox
    jumps over the crazy
    +

    div {line-height: 1em}; div div {font-size: 200%}

    +
    The quick brown fox
    jumps over the crazy +
    The quick brown fox
    jumps over the crazy
    +

    div {line-height: 100%}; div div {font-size: 200%}

    +
    The quick brown fox
    jumps over the crazy +
    The quick brown fox
    jumps over the crazy
    +
    +

    When rendered according to the +css 2.1 spec, +the 200% text in the second two div divs, those for which line-height of the parent +are specified in em or %, will overlap, the child divs being 1/2 the height of their containing +divs; while the first div div will be 2/3 the height of its containing div, +and its text won't overlap. The overlapping text in the latter div divs is because the spec requires the calculated +line-height specified in em or % be inherited by the children. In contrast, it is <number> itself that is inherited by +the children, which allows the line-height specified to be applied in reference to the font-size of the child div instead of +the ancestor.

    +
    +IE has an additional problem with line-height. +
    +
    + +
    + +Valid HTML 4.01! +
    +Last Modified
    2005.11.29
    © Felix Miata
    +Felix's Home +
    + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/css_margin.html b/application/third_party/dompdf/www/test/css_margin.html new file mode 100644 index 00000000..0efdc932 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_margin.html @@ -0,0 +1,38 @@ + + + + + + + + +

    (margin: 1em;) The PHP Development +Team would like to announce the immediate availability of PHP 5.0.1. This is +a maintenance release that in addition to many non-critical bug fixes also +includes new UNIX and Windows installation docs which are now auto-generated +from the PHP Manual.

    + +

    (margin: 1em 1em 1em +50%;) PHP 4.3.9RC1 has been released for testing. This is the first +release candidate and should have a very low number of problems and/or +bugs. Nevertheless, please download and test it as much as possible on +real-life applications to uncover any remaining issues.

    + +

    (margin: 4em 1em 4em +1em;) PHP Tunisie has just released the second issue of its monthly +french PHP Magazine. In this issue you'll find a large plan on PostgreSQL, +Databases abstractions with PHP, your mini template engine, an article on +images generation with PHP, the migration towards PHP5 with +EasyPHP1.7... And many other articles and latests PHP news.

    + +

    (margin: 1em auto 1em +auto;) The traditional International PHP Conference 2004 will be +taking place from 7th November to 10th November in Frankfurt (FFM). The Call +for Papers has been issued, so if you have an interesting talk, the +organizers would love to hear about it! You can expect a gathering of PHP +experts and core developers.

    + + + diff --git a/application/third_party/dompdf/www/test/css_media.html b/application/third_party/dompdf/www/test/css_media.html new file mode 100644 index 00000000..d01cd732 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_media.html @@ -0,0 +1,150 @@ + + + + + + + + + +

    css @media media types

    +

    +Depending on dompdf_config.inc.php setting DOMPDF_DEFAULT_MEDIA_TYPE here the +background color appeares different: +

    +
      +
    • print: light gray
    • +
    • screen: light blue
    • +
    • projection: light yellow
    • +
    + +

    css @import media types

    +

    +Depending on dompdf_config.inc.php setting DOMPDF_DEFAULT_MEDIA_TYPE here the +background color appeares different: +

    +
      +
    • print: light gray
    • +
    • screen or projection: light blue
    • +
    • all: this line yellow
    • +
    + +

    yellow by import css from subfolder

    + +

    yellow by import css from absolute local folder. +Note: Only works if www\test\images/importabs.css was copied to /absimagetest/importabs.css +

    + + +

    css link media types

    + +
      +
    • print: light gray
    • +
    • screen or projection: light blue
    • + +
    + + +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    + diff --git a/application/third_party/dompdf/www/test/css_multiple_class.html b/application/third_party/dompdf/www/test/css_multiple_class.html new file mode 100644 index 00000000..c4f68d5d --- /dev/null +++ b/application/third_party/dompdf/www/test/css_multiple_class.html @@ -0,0 +1,18 @@ + + + + + + +

    class="a"

    +

    class="b"

    +

    class="c"

    +

    class="a b"

    +

    class="a b c"

    + + diff --git a/application/third_party/dompdf/www/test/css_opacity.html b/application/third_party/dompdf/www/test/css_opacity.html new file mode 100644 index 00000000..733e568a --- /dev/null +++ b/application/third_party/dompdf/www/test/css_opacity.html @@ -0,0 +1,107 @@ + + + + + + + +

    Nested block elements

    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +

    Inline elements

    + + + ab + cb + ef + gh + ij + kl + mn + op + qr + st + + +
    + + + ab + cb + ef + gh + ij + kl + mn + op + qr + st + + +
    0.1
    +
    0.2
    +
    0.3
    +
    0.4
    +
    0.5
    +
    0.6
    +
    0.7
    +
    0.8
    +
    0.9
    +
    1.0
    + +
    1.0 opacity
    +
    No opacity
    + +
    +
    +
    +
    +
    +
    +
    + + diff --git a/application/third_party/dompdf/www/test/css_outline.html b/application/third_party/dompdf/www/test/css_outline.html new file mode 100644 index 00000000..00ce313e --- /dev/null +++ b/application/third_party/dompdf/www/test/css_outline.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
    The dotted gray line is the border box
    dotteddashedsoliddouble
    grooveridgeinsetoutset
    + +

    partial attributes merged

    + +
    outline:thin solid red;
    +
    outline:red thin solid;
    +
    { outline:thin solid; }{outline:blue; } (merged, reset all - color has no effect)
    +
    { outline:thin solid; }{outline-color:green; } (merged, overwrite only color)
    +
    { outline:thin solid; }{outline:blue; } (merged, reset all - color has no effect)
    +
    { outline:thin solid; }{outline-color:green; } (merged, overwrite only color)
    +
    { outline:thin blue solid; }{outline-color:green; } (merged, overwrite only color)
    +
    { outline:thin blue solid; }{outline-style:dashed; } (merged, overwrite only style)
    +
    { outline:thin blue solid; }{outline-width:thick; } (merged, overwrite only width)
    +
    { outline:thin blue solid; }{outline-width:medium; } (merged, overwrite only width)
    +
    { outline:thin blue solid; }{outline-width:3pt; } (merged, overwrite only width)
    + + diff --git a/application/third_party/dompdf/www/test/css_overflow_hidden.html b/application/third_party/dompdf/www/test/css_overflow_hidden.html new file mode 100644 index 00000000..a2bd2915 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_overflow_hidden.html @@ -0,0 +1,38 @@ + + + + + + + +

    overflow: hidden

    +
    + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. + Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. +
    + +

    overflow: visible

    +
    + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. + Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. +
    + + + diff --git a/application/third_party/dompdf/www/test/css_position_all.html b/application/third_party/dompdf/www/test/css_position_all.html new file mode 100644 index 00000000..0007c6d7 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_position_all.html @@ -0,0 +1,379 @@ + + + + + +Printed document + + + + + + + +

    Examples from
    http://www.barelyfitz.com/screencast/html-training/css/positioning/

    + +position: static +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +position: relative +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +position: absolute +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +position: relative + position: absolute +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +two column absolute +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +two column absolute height +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +float +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +float columns +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +float columns with clear +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + + + + diff --git a/application/third_party/dompdf/www/test/css_position_fixed.html b/application/third_party/dompdf/www/test/css_position_fixed.html new file mode 100644 index 00000000..e5d1a3cd --- /dev/null +++ b/application/third_party/dompdf/www/test/css_position_fixed.html @@ -0,0 +1,215 @@ + + + + + +Printed document + + + + + + +
    +
    + Header line 1
    + Header line 2
    + Header line 3
    + Header line 4
    +
    +
    + + + +
    +
    + +
    +
    + +

    Section 1

    + +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non +risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, +ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula +massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci +nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit +amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat +in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero +pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo +in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue +blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus +et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed +pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales +hendrerit.

    + +
    + +

    Section 2

    + +

    Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut +orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, +ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus +sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer +id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae +elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer +adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et +sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue +eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non +elementum posuere, metus purus iaculis lectus, et tristique ligula +justo vitae magna.

    + +
    + +

    Section 3

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + + diff --git a/application/third_party/dompdf/www/test/css_selectors.html b/application/third_party/dompdf/www/test/css_selectors.html new file mode 100644 index 00000000..baa7b8fe --- /dev/null +++ b/application/third_party/dompdf/www/test/css_selectors.html @@ -0,0 +1,53 @@ + + + + + + + +a[target=equal_1] +a[target='equal_2'] +a[target="equal_3"] + +a[href$=ends_1] +a[href$='ends_2'] +a[href$="ends_3"] + +

    +a[href*=contains_1] +a[href*='contains_2'] +a[href*="contains_3"] +

    + +a[href^=starts_1] +a[href^='starts_2'] +a[href^="starts_3"] + + + diff --git a/application/third_party/dompdf/www/test/css_table_height.html b/application/third_party/dompdf/www/test/css_table_height.html new file mode 100644 index 00000000..ec638b0a --- /dev/null +++ b/application/third_party/dompdf/www/test/css_table_height.html @@ -0,0 +1,15 @@ + + + + + + + + + + + +
    Some text
    + + diff --git a/application/third_party/dompdf/www/test/css_text_align.html b/application/third_party/dompdf/www/test/css_text_align.html new file mode 100644 index 00000000..c795af25 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_text_align.html @@ -0,0 +1,61 @@ + + + + + + + +

    text-align: left

    +
    +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus +convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. +
    +Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer +iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum +a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque. +
    + +

    text-align: center

    +
    +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus +convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. +
    +Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer +iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum +a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque. +
    + +

    text-align: right

    +
    +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus +convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. +
    +Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer +iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum +a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque. +
    + +

    text-align: justify

    +
    +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus +convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. +
    +Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer +iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum +a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque. +
    + + + diff --git a/application/third_party/dompdf/www/test/css_z_index.html b/application/third_party/dompdf/www/test/css_z_index.html new file mode 100644 index 00000000..0c097ae0 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_z_index.html @@ -0,0 +1,40 @@ + + + + + z-index + + + + +
    + z-index: 3, order: 1 +
    + +
    + z-index: 2, order: 2 +
    + +
    + z-index: 1, order: 3 +
    + +
    + z-index: auto, order: 1 +
    + +
    + z-index: auto, order: 2 +
    + +
    + z-index: auto, order: 3 +
    + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/demo_01.html b/application/third_party/dompdf/www/test/demo_01.html new file mode 100644 index 00000000..d4696381 --- /dev/null +++ b/application/third_party/dompdf/www/test/demo_01.html @@ -0,0 +1,214 @@ + + + + + + + + +
    + +
    +
    + +
    + +
    + + + + + +

    SCHEDULE A

    Job: 132-003

    + + + + + + + + + + + + + + + + +
    Job: 132-003Purchasers(s): Palmer
    Created: 2004-08-13Last Change: 2004-08-16 9:28 AM
    Address: 667 Pine Lodge Dr.Legal: N/A
    + + + + + + + + + + +
    Model: FranklinElevation: BSize: 1160 Cu. Ft.Style: Reciprocating
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Standard Items:

    ItemDescriptionQuantityUnit CostTotal
    1Sprockets (13 tooth)50$10.00Ea.$5,000.00
    2Cogs (Cylindrical)45$25.00Ea.$1125.00
    3Gears (15 tooth)32$19.00Ea.$608.00
    4Leaf springs (13 N/m)6$125.00Ea.$750.00
    5Coil springs (6 N/deg)7$11.00Ea.$77.00
    (Tax is not included; it will be collected on closing.)GRAND TOTAL:$7560.00
    + + + + + + + + + + + + + + + + + + + + +
    WITNESS: PURCHASER:X
     Mr. Leland Palmer
    +This change order shall have no force or effect until approved and signed +by an authorizing signing officer of the supplier. Any change or special +request not noted on this document is not contractual. +
    ACCEPTED THIS +  +DAY OF  , +20 . +TWIN PEAKS SUPPLY LTD.

    +PER: +  +
    + +
    + +
    +
    + + + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/dom_anchor_link.html b/application/third_party/dompdf/www/test/dom_anchor_link.html new file mode 100644 index 00000000..851f2323 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_anchor_link.html @@ -0,0 +1,210 @@ + + + + + + + + + +

    Lorem ipsum dolor sit amet

    +

    Anchor 1

    + +

    link to anchor3

    +

    www.dompdf.com

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.

    + +

    Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo +non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis +diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi +massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus +mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam +vel erat tempus purus molestie suscipit. Vestibulum odio lorem, +sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis +ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, +rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla +sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa +adipiscing lorem, bibendum luctus nisl tortor vitae leo.

    + +

    Etiam a mauris. Proin justo elit, accumsan sit amet, tempus et, +blandit id, tellus. Morbi varius, nisi id iaculis aliquam, lacus +ligula facilisis velit, ac pharetra ipsum augue a massa. Etiam rhoncus +commodo orci. Mauris ullamcorper sagittis turpis. Nullam magna libero, +sagittis sed, auctor faucibus, accumsan vitae, urna. Pellentesque +volutpat. Aliquam sapien ipsum, eleifend nec, imperdiet vitae, +consectetuer id, quam. Donec a urna. Suspendisse sit amet +velit. Curabitur quis nisi id dui viverra ornare. Sed condimentum enim +quis tortor. Ut condimentum, magna non tempus tincidunt, leo nibh +molestie tellus, vitae convallis dolor ante sed ante. Nunc et +metus. Phasellus ultricies. Fusce faucibus tortor sit amet mauris.

    + +

    Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque +volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit +amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed +felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, +eleifend in, porttitor in, malesuada non, neque. Etiam sed +augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer +adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, +nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem +malesuada facilisis. Vestibulum porta, metus sit amet egestas +interdum, urna justo euismod erat, id tristique urna leo quis +nibh. Morbi non erat.

    + +

    Cras fringilla, nulla id egestas elementum, augue nunc iaculis nibh, +ac adipiscing nibh justo id tortor. Donec vel orci a nisi ultricies +aliquet. Nunc urna quam, adipiscing molestie, vehicula non, +condimentum non, magna. Integer magna. Donec quam metus, pulvinar id, +suscipit eget, euismod ac, orci. Nulla facilisi. Nullam nec +mauris. Morbi in mi. Etiam urna lectus, pulvinar ac, sollicitudin eu, +euismod ac, lectus. Fusce elit. Sed ultricies odio ac felis.

    + +

    Cras iaculis. Nulla facilisi.

    +

    Anchor 2

    +

    link to anchor1

    +

    Cras iaculis. Nulla facilisi. Fusce vitae arcu. Integer lectus mauris, +ornare vel, accumsan eget, scelerisque vel, nunc. Maecenas justo urna, +volutpat vel, vehicula vel, ullamcorper nec, odio. Suspendisse laoreet +nisi sed erat. Cras convallis sollicitudin sapien. Phasellus ac erat +eu mi rutrum rhoncus. Morbi et velit. Morbi odio nisi, pharetra eget, +sollicitudin sed, aliquam at, nisl. Quisque euismod diam in +sapien. Integer accumsan urna in risus.

    + +

    Proin sit amet nisl. Phasellus dui ipsum, laoreet a, pulvinar id, +fringilla ut, libero. In hac habitasse platea dictumst. Maecenas mi +magna, cursus sed, rutrum eget, molestie nec, dui. Suspendisse +lacus. Vivamus nibh urna, accumsan sit amet, gravida sed, convallis a, +leo. Cras sollicitudin orci sit amet eros. Pellentesque eu odio et +velit tempor dignissim. Morbi vehicula malesuada enim. Pellentesque +tincidunt, tellus ac fringilla tempor, justo libero interdum nunc, eu +sollicitudin tortor augue nec tellus. Nullam eget leo quis tellus +gravida faucibus. Nam gravida. Curabitur rhoncus egestas +nunc. Curabitur mollis, nisi sed suscipit gravida, enim felis interdum +justo, vel accumsan magna nunc ut libero. Ut fermentum. Fusce luctus, +est sit amet feugiat lobortis, nisl eros bibendum libero, ut suscipit +felis ligula in massa. Proin congue elit et nisi. Cras ac nisl. Nunc +ullamcorper neque vel diam.

    + +

    Ut pellentesque arcu ac lectus.

    +

    Sed ac lorem. Ut pellentesque arcu ac lectus. Cum sociis natoque +penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Pellentesque ultrices metus sollicitudin pede. Donec fermentum +est a velit fringilla mollis. Duis ligula. Fusce viverra laoreet +odio. Suspendisse sit amet ligula. Maecenas nunc velit, sagittis eu, +bibendum eu, placerat at, nibh. Praesent ut erat eget nisi gravida +imperdiet. Quisque vitae sapien. Ut eros.

    + +

    Donec eros ligula, dignissim vel, ultricies id, mattis in, massa. Duis +lobortis dui nec orci. Sed ullamcorper metus non massa. Aliquam eget +mauris ac nulla elementum posuere. Sed porta, augue vitae rhoncus +aliquet, felis quam eleifend est, vitae rutrum metus arcu vel +lorem. Proin laoreet, mauris sit amet aliquet eleifend, nisl sem +molestie nisi, eu varius eros ligula non erat. Integer ac +sem. Suspendisse lectus. Aliquam erat volutpat. Fusce sit amet leo +faucibus erat molestie ultrices. Maecenas lacinia lectus eget +dui. Etiam porta porttitor ante. Phasellus sit amet lacus adipiscing +enim mollis iaculis. Fusce congue, nulla a commodo aliquam, erat dui +fermentum dui, pellentesque faucibus orci enim at mauris. Pellentesque +a diam porta magna tempor posuere. Donec lorem.

    + +

    Sed viverra aliquam turpis. Aliquam lacus. Duis id massa. Nullam +ante. Suspendisse condimentum. Donec adipiscing, felis vel semper +sollicitudin, lacus justo pretium est, sed blandit pede risus eu +ante. Praesent ante nulla, fringilla id, ultrices et, feugiat a, +metus. Proin ac velit a metus suscipit fermentum. Integer aliquet. Sed +sapien nulla, placerat at, rutrum at, condimentum quis, libero. In +accumsan, tellus nec tincidunt malesuada, pede arcu commodo ipsum, ac +mattis tortor urna vitae enim. Aenean nonummy, mauris eget commodo +bibendum, augue sem ultrices nunc, eget rhoncus metus erat placerat +lectus. Aliquam mollis lectus in justo. Vivamus iaculis lacus sit amet +ligula. Etiam consectetuer convallis diam. Curabitur sollicitudin, +felis eu vehicula scelerisque, nisl urna aliquam orci, sit amet +laoreet mi turpis id ligula. Donec at enim non nulla adipiscing +dapibus. Aenean nisl.

    + +

    Ut in lacus nec enim volutpat pellentesque. Integer euismod. In odio +eros, malesuada in, mattis vel, tempor nec, sem. In libero tellus, +varius vitae, bibendum in, elementum quis, nisl. Duis tortor. Etiam at +justo. Pellentesque facilisis mauris non nunc. Praesent eros mi, +dapibus eget, placerat ac, lobortis quis, sem. Nulla rhoncus +turpis. Nulla vitae mi. Proin id massa. Nunc eros.

    + +

    Aliquam molestie pulvinar ligula.

    +

    Anchor 3

    +

    link to anchor2

    +

    Vestibulum dui risus, varius ut, semper et, consequat ultrices, +felis. Pellentesque iaculis urna in velit. Ut pharetra. Nunc +fringilla, nisi vitae fringilla placerat, enim justo semper erat, +mollis feugiat leo neque eu sem. Vestibulum orci urna, suscipit a, +accumsan nec, fringilla in, risus. Nullam ante. Nullam nec +eros. Nullam varius. Nulla facilisi. In auctor libero in +metus. Aliquam porttitor congue eros. Nulla facilisi. Mauris euismod +turpis ut felis. Ut nunc nisl, cursus quis, eleifend at, viverra +bibendum, lacus. Donec consequat lacus eu sapien. Fusce pulvinar +lectus quis nunc. In hac habitasse platea dictumst.

    + +

    Aliquam molestie pulvinar ligula. Maecenas imperdiet, urna eget +ultrices adipiscing, nibh ante elementum neque, id molestie massa quam +ut nunc. Nullam porta. Phasellus a magna in sem volutpat +viverra. Quisque aliquet nunc ac turpis. Mauris dolor enim, viverra +rutrum, placerat et, laoreet et, justo. In id nulla. Donec +erat. Phasellus nec mi sed velit mollis cursus. Vestibulum +tincidunt. Praesent dui libero, facilisis eu, vulputate eget, aliquet +nec, ipsum. Pellentesque in nisl in mauris pretium euismod.

    + + diff --git a/application/third_party/dompdf/www/test/dom_br.html b/application/third_party/dompdf/www/test/dom_br.html new file mode 100644 index 00000000..2402bf85 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_br.html @@ -0,0 +1,46 @@ + + + + + +

    Line break test

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel,
    +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +
    +
    +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.

    + +

    Line break at beginning of next paragraph:

    +


    +Line 2

    + +

    Line break within a font tag: +ABCDE
    FGHIJK

    + +

    Line break within two nested spans: span 1 2
    break

    + +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel,
    +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +
    +
    +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.

    + + + diff --git a/application/third_party/dompdf/www/test/dom_large_table.html b/application/third_party/dompdf/www/test/dom_large_table.html new file mode 100644 index 00000000..0bf54497 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_large_table.html @@ -0,0 +1,2198 @@ + + + + + + + + + + + + + + + +
    +

    SCHEDULE A

    +
    +

    404-135 - Schedule A

    +APPROVED: 2004-11-18 +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Job:404-135Purchasers: +Komant
    Created:2004-09-28Last change:2004-11-18
    Job address:2904-26 StreetLegal:28B/22/032-5210
    + + + + + + + + + + + + + +
    Model:Elevation:Size:Style:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ItemDescriptionQuantityUnit CostTotal
    Standard items:
    1add bank of drawers - to bathroom vanity2$125.00Ea.$250.00
    2add sweep outlet - central vac1$100.00Ea.$100.00
    3run central vac rough in to attached garage c/w separate circuit1$120.00Ea.$120.00
    4add fan to FIREPLACE1$195.00Ea.$195.00
    5upgrade to laminate flooring - Entire Main Floor1$2,400.00Ea.$2,400.00
    6upgrade oh door to insulated (9ft)1$95.00Ea.$95.00
    7change upper stairwell ledge to painted MDF1$45.00Ea.$45.00
    8upgrade standard door to pocket door1$145.00Ea.$145.00
    9add RIDP1$400.00Ea.$400.00
    Standard items:
    1add bank of drawers - to bathroom vanity2$125.00Ea.$250.00
    2add sweep outlet - central vac1$100.00Ea.$100.00
    3run central vac rough in to attached garage c/w separate circuit1$120.00Ea.$120.00
    4add fan to FIREPLACE1$195.00Ea.$195.00
    5upgrade to laminate flooring - Entire Main Floor1$2,400.00Ea.$2,400.00
    6upgrade oh door to insulated (9ft)1$95.00Ea.$95.00
    7change upper stairwell ledge to painted MDF1$45.00Ea.$45.00
    8upgrade standard door to pocket door1$145.00Ea.$145.00
    9add RIDP1$400.00Ea.$400.00
    Custom items:
    1upgrade to brushed chrome hardware 1$195.00Ea.$195.00
    2box out FIREPLACE as per plan attached1$250.00Ea.$250.00
    3reduce WIC size by 6" to 8" to allow for large vanity ensuite1$0.00Ea.$0.00
    4add gas line to basement for future gas FP1$300.00Ea.$300.00
    5add pocket dorr to ensuite joining WIC and Ensuite. Delete 2 existing doors1$0.00Ea.$0.00
    6Main floor to be ISLAND Kitchen design1$0.00Ea.$0.00
    7price adjustment1($0.37)Ea.($0.37)
    Custom items:
    1upgrade to brushed chrome hardware 1$195.00Ea.$195.00
    2box out FIREPLACE as per plan attached1$250.00Ea.$250.00
    3reduce WIC size by 6" to 8" to allow for large vanity ensuite1$0.00Ea.$0.00
    4add gas line to basement for future gas FP1$300.00Ea.$300.00
    5add pocket dorr to ensuite joining WIC and Ensuite. Delete 2 existing doors1$0.00Ea.$0.00
    (GST is not included)   +Grand total:$4,494.63
    + + + + + + + + + + + +
    WITNESS: PURCHASER:X
      + Tammy Komant
    +

    This change order shall have no force or effect until approved and signed +by an authorizing signing officer of the Builder. Any change or special +request not noted on this document is not contractual.

    + + + + + + + + +
    ACCEPTED THIS +18 DAY OF NOVEMBER, 2004 +LINCOLNBERG COMMUNITIES

    +PER: +Keith Jansen +
    +
    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/dom_long_table.php b/application/third_party/dompdf/www/test/dom_long_table.php new file mode 100644 index 00000000..86cf2391 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_long_table.php @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + +" . ($i * $j) . "\n"; +} +?> + + +
    Header
    Footer
    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/dom_nbsp.html b/application/third_party/dompdf/www/test/dom_nbsp.html new file mode 100644 index 00000000..c49d040f --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_nbsp.html @@ -0,0 +1,6 @@ + + + + +

    a b c 

    diff --git a/application/third_party/dompdf/www/test/dom_nested_table.html b/application/third_party/dompdf/www/test/dom_nested_table.html new file mode 100644 index 00000000..c141ad28 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_nested_table.html @@ -0,0 +1,62 @@ + + + + + + + + + + + +
    + + + + + + + +
    foo
    bar
    +
    + + + + + + + + + + +
    + + + + + + + + +
    + + + + + + + + +
    a
    bc
    +
    d
    e
    +
    f
    gh
    + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/dom_ol.html b/application/third_party/dompdf/www/test/dom_ol.html new file mode 100644 index 00000000..e13b0fa2 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_ol.html @@ -0,0 +1,148 @@ + + + + + + + + + +

    none

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    decimal

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    lower-alpha

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    lower-latin

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    lower-roman

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    lower-greek

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    upper-alpha

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    upper-latin

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    upper-roman

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    Advanced

    +
      +
    1. Item 1
    2. +
    3. Item 2 +
        +
      1. Item 1 +
          +
        1. Item 1
        2. +
        3. Item 2
        4. +
        5. Item 3
        6. +
        +
      2. +
      3. Item 2
      4. +
      5. Item 3 +
          +
        1. Item 1
        2. +
        3. Item 2
        4. +
        5. Item 3
        6. +
        +
      6. +
      +
    4. +
    5. Item 3
    6. +
    + +

    decimal-leading-zero

    +
      +
    1. Item #
    2. +
    3. Item #
    4. +
    5. Item #
    6. +
    7. Item #
    8. +
    9. Item #
    10. +
    11. Item #
    12. +
    13. Item #
    14. +
    15. Item #
    16. +
    17. Item #
    18. +
    19. Item #
    20. +
    21. Item #
    22. +
    23. Item #
    24. +
    25. Item #
    26. +
    27. Item #
    28. +
    29. Item #
    30. +
    31. Item #
    32. +
    33. Item #
    34. +
    35. Item #
    36. +
    37. Item #
    38. +
    39. Item #
    40. +
    41. Item #
    42. +
    43. Item #
    44. +
    45. Item #
    46. +
    47. Item #
    48. +
    49. Item #
    50. +
    51. Item #
    52. +
    + + + diff --git a/application/third_party/dompdf/www/test/dom_simple_ul.html b/application/third_party/dompdf/www/test/dom_simple_ul.html new file mode 100644 index 00000000..1d6bd959 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_simple_ul.html @@ -0,0 +1,39 @@ + + + + + + + + +

    Here's a simple list from my favourite website:

    + +
      +
    • The Zend Engine II with a new object model and dozens of new features.
    • + +
    • XML support has been completely redone in PHP 5, all extensions are + now focused around the excellent libxml2 library + (http://www.xmlsoft.org/).
    • + +
    • A new SimpleXML extension for easily accessing and manipulating XML + as PHP objects. It can also interface with the DOM extension and + vice-versa.
    • + +
    • A brand new built-in SOAP extension for interoperability with Web Services.
    • + +
    • A new MySQL extension named MySQLi for developers using MySQL 4.1 and + later. This new extension includes an object-oriented interface in + addition to a traditional interface; as well as support for many of + MySQL's new features, such as prepared statements.
    • + +
    • SQLite has been bundled with PHP. For more information on SQLite, + please visit their website.
    • + +
    • Streams have been greatly improved, including the ability to access low-level socket operations on streams.
    • + +
    • And lots more...
    • + +
      • Sublists
      • work
      • too!
      +
    + + diff --git a/application/third_party/dompdf/www/test/dom_table.html b/application/third_party/dompdf/www/test/dom_table.html new file mode 100644 index 00000000..e74af607 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_table.html @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    head 1head 2head 3head 4
    cell 1cell 2cell 3
    cell 4cell 5
    cell 6
    cell 7
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    head 1head 2head 3head 4
    cell 1cell 2cell 3cell 4
    cell 5cell 6cell 7
    cell 8cell 9cell 10
    cell 11
    + + + diff --git a/application/third_party/dompdf/www/test/dom_table_01.html b/application/third_party/dompdf/www/test/dom_table_01.html new file mode 100644 index 00000000..99bd9c8d --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_table_01.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + +
    Title
    KaireDesine
    + + + diff --git a/application/third_party/dompdf/www/test/dom_table_image.html b/application/third_party/dompdf/www/test/dom_table_image.html new file mode 100644 index 00000000..f563a380 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_table_image.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + +
    Some Text
    More TextBlah
    + + + diff --git a/application/third_party/dompdf/www/test/dom_ul.html b/application/third_party/dompdf/www/test/dom_ul.html new file mode 100644 index 00000000..7d64ec73 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_ul.html @@ -0,0 +1,312 @@ + + + + + + + + +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
      • Sub 1
      • +
      • Sub 2
      • +
      • Sub 3
      • +
      +
    + +
      +
    • Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.
    • +
    • Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo +non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis +diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi +massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus +mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam +vel erat tempus purus molestie suscipit. Vestibulum odio lorem, +sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis +ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, +rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla +sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa +adipiscing lorem, bibendum luctus nisl tortor vitae leo.
    • +
    • Inside. Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque +volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit +amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed +felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, +eleifend in, porttitor in, malesuada non, neque. Etiam sed +augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer +adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, +nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem +malesuada facilisis. Vestibulum porta, metus sit amet egestas +interdum, urna justo euismod erat, id tristique urna leo quis +nibh. Morbi non erat.
    • +
    + +
      +
    • Item 1 disc
    • +
    • Item 2 disc
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 disc
    • +
    + +
      +
    • Item 1 circle
    • +
    • Item 2 circle
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 circle
    • +
    + +
      +
    • Item 1 square
    • +
    • Item 2 square
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 square
    • +
    + +
      +
    • Item 1 image
    • +
    • Item 2 image
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 image
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 7 noimage
    • + +
        +
      • sub Item 1 image
      • +
      • sub Item 2 image
      • +
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      • sub Item 5 noimage
      • +
      + +
    + +
      +
    • Item 1 missing image - fallback square
    • +
    • Item 2 missing image - fallback square
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 missing image - fallback square
    • +
    + +
      +
    • Item 1 nobullet
    • +
    • Item 2 nobullet
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 nobullet
    • +
    + +
      +
    • Item 1 missing image - fallback none
    • +
    • Item 2 missing image - fallback none
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 missing image - fallback none
    • +
    + +
      +
    • Item 1 bigimage
    • +
    • Item 2 bigimage
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 bigimage
    • +
    + +
      +
    • margin Item 1 image
    • +
    • margin Item 2 image
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • margin Item 4 image
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • margin Item 7 noimage
    • + +
        +
      • margin sub Item 1 image
      • +
      • margin sub Item 2 image
      • +
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      • margin sub Item 5 noimage
      • +
      + +
    + +
      +
    • padding Item 1 image
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
        +
      • padding sub Item 1 image
      • +
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      +
    + +
      +
    • margin Item 1 square
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
        +
      • margin sub Item 1 square
      • +
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      +
    + +
      +
    • padding Item 1 square
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
        +
      • padding sub Item 1 square
      • +
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      +
    + +

    combined list attributes list-style

    + +
      +
    • list-style:square inside url(dummy.png);
    • +
    • list-style:outside;[overwrites only position]
    • +
    +
      +
    • list-style:square inside url(images/png.png);
    • +
    • list-style-position:outside;[overwrites only position]
    • +
    • list-style-position:outside;[overwrite attributes - firefox3: all; dompdf, internet explorer 8: only position]
    • +
    • list-style:none; [resets both, bullet and image]
    • +
    + + + diff --git a/application/third_party/dompdf/www/test/encoding_entities.html b/application/third_party/dompdf/www/test/encoding_entities.html new file mode 100644 index 00000000..79c66bfd --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_entities.html @@ -0,0 +1,14 @@ + + + + + + +

    é © « avoir et être α β

    +

    é © « avoir et être α β

    + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/encoding_latin1.html b/application/third_party/dompdf/www/test/encoding_latin1.html new file mode 100644 index 00000000..9a8b05e0 --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_latin1.html @@ -0,0 +1,1162 @@ + + + + +HTML 4.0 Latin-1 Entities + + + + + + +

    Latin-1 Entities

    + +

    The following table gives the character entity reference, decimal +character reference, and hexadecimal character reference for 8-bit +characters in the Latin-1 (ISO-8859-1) character set, as well as the +rendering of each in your browser. Glyphs of the characters are +available at the Unicode +Consortium.

    + +

    Browser support is generally best for the decimal character +references, except for the accented characters (decimal 192-214, +216-246, 248-255), where the character entity references hold a slight +edge.

    + +

    Note that most Mac browsers will render fourteen Latin-1 characters +incorrectly. These characters are decimal 166, 178, 179, 185, 188, +189, 190, 208, 215, 221, 222, 240, 253, and 254. See ISO-8859-1 +and the Mac platform for more information.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CharacterEntityDecimalHexRendering in Your Browser
    EntityDecimalHex
    no-break space = non-breaking space&nbsp;&#160;&#xA0;   
    inverted exclamation mark&iexcl;&#161;&#xA1;¡¡¡
    cent sign&cent;&#162;&#xA2;¢¢¢
    pound sign&pound;&#163;&#xA3;£££
    currency sign&curren;&#164;&#xA4;¤¤¤
    yen sign = yuan sign&yen;&#165;&#xA5;¥¥¥
    broken bar = broken vertical bar&brvbar;&#166;&#xA6;¦¦¦
    section sign&sect;&#167;&#xA7;§§§
    diaeresis = spacing diaeresis&uml;&#168;&#xA8;¨¨¨
    copyright sign&copy;&#169;&#xA9;©©©
    feminine ordinal indicator&ordf;&#170;&#xAA;ªªª
    left-pointing double angle quotation mark = left pointing guillemet&laquo;&#171;&#xAB;«««
    not sign&not;&#172;&#xAC;¬¬¬
    soft hyphen = discretionary hyphen&shy;&#173;&#xAD;­­­
    registered sign = registered trade mark sign&reg;&#174;&#xAE;®®®
    macron = spacing macron = overline = APL overbar&macr;&#175;&#xAF;¯¯¯
    degree sign&deg;&#176;&#xB0;°°°
    plus-minus sign = plus-or-minus sign&plusmn;&#177;&#xB1;±±±
    superscript two = superscript digit two = squared&sup2;&#178;&#xB2;²²²
    superscript three = superscript digit three = cubed&sup3;&#179;&#xB3;³³³
    acute accent = spacing acute&acute;&#180;&#xB4;´´´
    micro sign&micro;&#181;&#xB5;µµµ
    pilcrow sign = paragraph sign&para;&#182;&#xB6;
    middle dot = Georgian comma = Greek middle dot&middot;&#183;&#xB7;···
    cedilla = spacing cedilla&cedil;&#184;&#xB8;¸¸¸
    superscript one = superscript digit one&sup1;&#185;&#xB9;¹¹¹
    masculine ordinal indicator&ordm;&#186;&#xBA;ººº
    right-pointing double angle quotation mark = right pointing guillemet&raquo;&#187;&#xBB;»»»
    vulgar fraction one quarter = fraction one quarter&frac14;&#188;&#xBC;¼¼¼
    vulgar fraction one half = fraction one half&frac12;&#189;&#xBD;½½½
    vulgar fraction three quarters = fraction three quarters&frac34;&#190;&#xBE;¾¾¾
    inverted question mark = turned question mark&iquest;&#191;&#xBF;¿¿¿
    Latin capital letter A with grave = Latin capital letter A grave&Agrave;&#192;&#xC0;ÀÀÀ
    Latin capital letter A with acute&Aacute;&#193;&#xC1;ÁÁÁ
    Latin capital letter A with circumflex&Acirc;&#194;&#xC2;ÂÂÂ
    Latin capital letter A with tilde&Atilde;&#195;&#xC3;ÃÃÃ
    Latin capital letter A with diaeresis&Auml;&#196;&#xC4;ÄÄÄ
    Latin capital letter A with ring above = Latin capital letter A ring&Aring;&#197;&#xC5;ÅÅÅ
    Latin capital letter AE = Latin capital ligature AE&AElig;&#198;&#xC6;ÆÆÆ
    Latin capital letter C with cedilla&Ccedil;&#199;&#xC7;ÇÇÇ
    Latin capital letter E with grave&Egrave;&#200;&#xC8;ÈÈÈ
    Latin capital letter E with acute&Eacute;&#201;&#xC9;ÉÉÉ
    Latin capital letter E with circumflex&Ecirc;&#202;&#xCA;ÊÊÊ
    Latin capital letter E with diaeresis&Euml;&#203;&#xCB;ËËË
    Latin capital letter I with grave&Igrave;&#204;&#xCC;ÌÌÌ
    Latin capital letter I with acute&Iacute;&#205;&#xCD;ÍÍÍ
    Latin capital letter I with circumflex&Icirc;&#206;&#xCE;ÎÎÎ
    Latin capital letter I with diaeresis&Iuml;&#207;&#xCF;ÏÏÏ
    Latin capital letter ETH&ETH;&#208;&#xD0;ÐÐÐ
    Latin capital letter N with tilde&Ntilde;&#209;&#xD1;ÑÑÑ
    Latin capital letter O with grave&Ograve;&#210;&#xD2;ÒÒÒ
    Latin capital letter O with acute&Oacute;&#211;&#xD3;ÓÓÓ
    Latin capital letter O with circumflex&Ocirc;&#212;&#xD4;ÔÔÔ
    Latin capital letter O with tilde&Otilde;&#213;&#xD5;ÕÕÕ
    Latin capital letter O with diaeresis&Ouml;&#214;&#xD6;ÖÖÖ
    multiplication sign&times;&#215;&#xD7;×××
    Latin capital letter O with stroke = Latin capital letter O slash&Oslash;&#216;&#xD8;ØØØ
    Latin capital letter U with grave&Ugrave;&#217;&#xD9;ÙÙÙ
    Latin capital letter U with acute&Uacute;&#218;&#xDA;ÚÚÚ
    Latin capital letter U with circumflex&Ucirc;&#219;&#xDB;ÛÛÛ
    Latin capital letter U with diaeresis&Uuml;&#220;&#xDC;ÜÜÜ
    Latin capital letter Y with acute&Yacute;&#221;&#xDD;ÝÝÝ
    Latin capital letter THORN&THORN;&#222;&#xDE;ÞÞÞ
    Latin small letter sharp s = ess-zed&szlig;&#223;&#xDF;ßßß
    Latin small letter a with grave = Latin small letter a grave&agrave;&#224;&#xE0;ààà
    Latin small letter a with acute&aacute;&#225;&#xE1;ááá
    Latin small letter a with circumflex&acirc;&#226;&#xE2;âââ
    Latin small letter a with tilde&atilde;&#227;&#xE3;ããã
    Latin small letter a with diaeresis&auml;&#228;&#xE4;äää
    Latin small letter a with ring above = Latin small letter a ring&aring;&#229;&#xE5;ååå
    Latin small letter ae = Latin small ligature ae&aelig;&#230;&#xE6;æææ
    Latin small letter c with cedilla&ccedil;&#231;&#xE7;ççç
    Latin small letter e with grave&egrave;&#232;&#xE8;èèè
    Latin small letter e with acute&eacute;&#233;&#xE9;ééé
    Latin small letter e with circumflex&ecirc;&#234;&#xEA;êêê
    Latin small letter e with diaeresis&euml;&#235;&#xEB;ëëë
    Latin small letter i with grave&igrave;&#236;&#xEC;ììì
    Latin small letter i with acute&iacute;&#237;&#xED;ííí
    Latin small letter i with circumflex&icirc;&#238;&#xEE;îîî
    Latin small letter i with diaeresis&iuml;&#239;&#xEF;ïïï
    Latin small letter eth&eth;&#240;&#xF0;ððð
    Latin small letter n with tilde&ntilde;&#241;&#xF1;ñññ
    Latin small letter o with grave&ograve;&#242;&#xF2;òòò
    Latin small letter o with acute&oacute;&#243;&#xF3;óóó
    Latin small letter o with circumflex&ocirc;&#244;&#xF4;ôôô
    Latin small letter o with tilde&otilde;&#245;&#xF5;õõõ
    Latin small letter o with diaeresis&ouml;&#246;&#xF6;ööö
    division sign&divide;&#247;&#xF7;÷÷÷
    Latin small letter o with stroke = Latin small letter o slash&oslash;&#248;&#xF8;øøø
    Latin small letter u with grave&ugrave;&#249;&#xF9;ùùù
    Latin small letter u with acute&uacute;&#250;&#xFA;úúú
    Latin small letter u with circumflex&ucirc;&#251;&#xFB;ûûû
    Latin small letter u with diaeresis&uuml;&#252;&#xFC;üüü
    Latin small letter y with acute&yacute;&#253;&#xFD;ýýý
    Latin small letter thorn&thorn;&#254;&#xFE;þþþ
    Latin small letter y with diaeresis&yuml;&#255;&#xFF;ÿÿÿ
    + + + + diff --git a/application/third_party/dompdf/www/test/encoding_special.html b/application/third_party/dompdf/www/test/encoding_special.html new file mode 100644 index 00000000..5f9b42d1 --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_special.html @@ -0,0 +1,570 @@ + + + + +HTML 4.0 Special Entities + + + + + + + + +

    Special Entities

    +

    The following table gives the character entity reference, decimal character reference, and hexadecimal character reference for markup-significant and internationalization characters, as well as the rendering of each in your browser. Glyphs of the characters are available at the Unicode Consortium.

    +

    With the exception of HTML 2.0's &quot;, &amp;, &lt;, and &gt;, browser support for these entities is generally quite poor, but recent browsers support some of the character entity references and decimal character references.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CharacterEntityDecimalHexRendering in Your Browser
    EntityDecimalHex
    quotation mark = APL quote&quot;&#34;&#x22;"""
    ampersand&amp;&#38;&#x26;&&&
    less-than sign&lt;&#60;&#x3C;<<<
    greater-than sign&gt;&#62;&#x3E;>>>
    Latin capital ligature OE&OElig;&#338;&#x152;ŒŒŒ
    Latin small ligature oe&oelig;&#339;&#x153;œœœ
    Latin capital letter S with caron&Scaron;&#352;&#x160;ŠŠŠ
    Latin small letter s with caron&scaron;&#353;&#x161;ššš
    Latin capital letter Y with diaeresis&Yuml;&#376;&#x178;ŸŸŸ
    modifier letter circumflex accent&circ;&#710;&#x2C6;ˆˆˆ
    small tilde&tilde;&#732;&#x2DC;˜˜˜
    en space&ensp;&#8194;&#x2002;
    em space&emsp;&#8195;&#x2003;
    thin space&thinsp;&#8201;&#x2009;
    zero width non-joiner&zwnj;&#8204;&#x200C;
    zero width joiner&zwj;&#8205;&#x200D;
    left-to-right mark&lrm;&#8206;&#x200E;
    right-to-left mark&rlm;&#8207;&#x200F;
    en dash&ndash;&#8211;&#x2013;
    em dash&mdash;&#8212;&#x2014;
    left single quotation mark&lsquo;&#8216;&#x2018;
    right single quotation mark&rsquo;&#8217;&#x2019;
    single low-9 quotation mark&sbquo;&#8218;&#x201A;
    left double quotation mark&ldquo;&#8220;&#x201C;
    right double quotation mark&rdquo;&#8221;&#x201D;
    double low-9 quotation mark&bdquo;&#8222;&#x201E;
    dagger&dagger;&#8224;&#x2020;
    double dagger&Dagger;&#8225;&#x2021;
    per mille sign&permil;&#8240;&#x2030;
    single left-pointing angle quotation mark&lsaquo;&#8249;&#x2039;
    single right-pointing angle quotation mark&rsaquo;&#8250;&#x203A;
    euro sign&euro;&#8364;&#x20AC;
    + + + + diff --git a/application/third_party/dompdf/www/test/encoding_symbols.html b/application/third_party/dompdf/www/test/encoding_symbols.html new file mode 100644 index 00000000..c487bd4b --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_symbols.html @@ -0,0 +1,1400 @@ + + + + +HTML 4.0 Entities for Symbols and Greek Letters + + + + + + + + + +

    Entities for Symbols and Greek Letters

    +

    The following table gives the character entity reference, decimal character reference, and hexadecimal character reference for symbols and Greek letters, as well as the rendering of each in your browser. Glyphs of the characters are available at the Unicode Consortium.

    +

    Browser support for these entities is generally quite poor, but recent browsers support some of the character entity references and decimal character references.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CharacterEntityDecimalHexRendering in Your Browser
    EntityDecimalHex
    Latin small f with hook = function = florin&fnof;&#402;&#x192;ƒƒƒ
    Greek capital letter alpha&Alpha;&#913;&#x391;ΑΑΑ
    Greek capital letter beta&Beta;&#914;&#x392;ΒΒΒ
    Greek capital letter gamma&Gamma;&#915;&#x393;ΓΓΓ
    Greek capital letter delta&Delta;&#916;&#x394;ΔΔΔ
    Greek capital letter epsilon&Epsilon;&#917;&#x395;ΕΕΕ
    Greek capital letter zeta&Zeta;&#918;&#x396;ΖΖΖ
    Greek capital letter eta&Eta;&#919;&#x397;ΗΗΗ
    Greek capital letter theta&Theta;&#920;&#x398;ΘΘΘ
    Greek capital letter iota&Iota;&#921;&#x399;ΙΙΙ
    Greek capital letter kappa&Kappa;&#922;&#x39A;ΚΚΚ
    Greek capital letter lambda&Lambda;&#923;&#x39B;ΛΛΛ
    Greek capital letter mu&Mu;&#924;&#x39C;ΜΜΜ
    Greek capital letter nu&Nu;&#925;&#x39D;ΝΝΝ
    Greek capital letter xi&Xi;&#926;&#x39E;ΞΞΞ
    Greek capital letter omicron&Omicron;&#927;&#x39F;ΟΟΟ
    Greek capital letter pi&Pi;&#928;&#x3A0;ΠΠΠ
    Greek capital letter rho&Rho;&#929;&#x3A1;ΡΡΡ
    Greek capital letter sigma&Sigma;&#931;&#x3A3;ΣΣΣ
    Greek capital letter tau&Tau;&#932;&#x3A4;ΤΤΤ
    Greek capital letter upsilon&Upsilon;&#933;&#x3A5;ΥΥΥ
    Greek capital letter phi&Phi;&#934;&#x3A6;ΦΦΦ
    Greek capital letter chi&Chi;&#935;&#x3A7;ΧΧΧ
    Greek capital letter psi&Psi;&#936;&#x3A8;ΨΨΨ
    Greek capital letter omega&Omega;&#937;&#x3A9;ΩΩΩ
    Greek small letter alpha&alpha;&#945;&#x3B1;ααα
    Greek small letter beta&beta;&#946;&#x3B2;βββ
    Greek small letter gamma&gamma;&#947;&#x3B3;γγγ
    Greek small letter delta&delta;&#948;&#x3B4;δδδ
    Greek small letter epsilon&epsilon;&#949;&#x3B5;εεε
    Greek small letter zeta&zeta;&#950;&#x3B6;ζζζ
    Greek small letter eta&eta;&#951;&#x3B7;ηηη
    Greek small letter theta&theta;&#952;&#x3B8;θθθ
    Greek small letter iota&iota;&#953;&#x3B9;ιιι
    Greek small letter kappa&kappa;&#954;&#x3BA;κκκ
    Greek small letter lambda&lambda;&#955;&#x3BB;λλλ
    Greek small letter mu&mu;&#956;&#x3BC;μμμ
    Greek small letter nu&nu;&#957;&#x3BD;ννν
    Greek small letter xi&xi;&#958;&#x3BE;ξξξ
    Greek small letter omicron&omicron;&#959;&#x3BF;οοο
    Greek small letter pi&pi;&#960;&#x3C0;πππ
    Greek small letter rho&rho;&#961;&#x3C1;ρρρ
    Greek small letter final sigma&sigmaf;&#962;&#x3C2;ςςς
    Greek small letter sigma&sigma;&#963;&#x3C3;σσσ
    Greek small letter tau&tau;&#964;&#x3C4;τττ
    Greek small letter upsilon&upsilon;&#965;&#x3C5;υυυ
    Greek small letter phi&phi;&#966;&#x3C6;φφφ
    Greek small letter chi&chi;&#967;&#x3C7;χχχ
    Greek small letter psi&psi;&#968;&#x3C8;ψψψ
    Greek small letter omega&omega;&#969;&#x3C9;ωωω
    Greek small letter theta symbol&thetasym;&#977;&#x3D1;ϑϑϑ
    Greek upsilon with hook symbol&upsih;&#978;&#x3D2;ϒϒϒ
    Greek pi symbol&piv;&#982;&#x3D6;ϖϖϖ
    bullet = black small circle&bull;&#8226;&#x2022;
    horizontal ellipsis = three dot leader&hellip;&#8230;&#x2026;
    prime = minutes = feet&prime;&#8242;&#x2032;
    double prime = seconds = inches&Prime;&#8243;&#x2033;
    overline = spacing overscore&oline;&#8254;&#x203E;
    fraction slash&frasl;&#8260;&#x2044;
    script capital P = power set = Weierstrass p&weierp;&#8472;&#x2118;
    blackletter capital I = imaginary part&image;&#8465;&#x2111;
    blackletter capital R = real part symbol&real;&#8476;&#x211C;
    trade mark sign&trade;&#8482;&#x2122;
    alef symbol = first transfinite cardinal&alefsym;&#8501;&#x2135;
    leftwards arrow&larr;&#8592;&#x2190;
    upwards arrow&uarr;&#8593;&#x2191;
    rightwards arrow&rarr;&#8594;&#x2192;
    downwards arrow&darr;&#8595;&#x2193;
    left right arrow&harr;&#8596;&#x2194;
    downwards arrow with corner leftwards = carriage return&crarr;&#8629;&#x21B5;
    leftwards double arrow&lArr;&#8656;&#x21D0;
    upwards double arrow&uArr;&#8657;&#x21D1;
    rightwards double arrow&rArr;&#8658;&#x21D2;
    downwards double arrow&dArr;&#8659;&#x21D3;
    left right double arrow&hArr;&#8660;&#x21D4;
    for all&forall;&#8704;&#x2200;
    partial differential&part;&#8706;&#x2202;
    there exists&exist;&#8707;&#x2203;
    empty set = null set = diameter&empty;&#8709;&#x2205;
    nabla = backward difference&nabla;&#8711;&#x2207;
    element of&isin;&#8712;&#x2208;
    not an element of&notin;&#8713;&#x2209;
    contains as member&ni;&#8715;&#x220B;
    n-ary product = product sign&prod;&#8719;&#x220F;
    n-ary sumation&sum;&#8721;&#x2211;
    minus sign&minus;&#8722;&#x2212;
    asterisk operator&lowast;&#8727;&#x2217;
    square root = radical sign&radic;&#8730;&#x221A;
    proportional to&prop;&#8733;&#x221D;
    infinity&infin;&#8734;&#x221E;
    angle&ang;&#8736;&#x2220;
    logical and = wedge&and;&#8743;&#x2227;
    logical or = vee&or;&#8744;&#x2228;
    intersection = cap&cap;&#8745;&#x2229;
    union = cup&cup;&#8746;&#x222A;
    integral&int;&#8747;&#x222B;
    therefore&there4;&#8756;&#x2234;
    tilde operator = varies with = similar to&sim;&#8764;&#x223C;
    approximately equal to&cong;&#8773;&#x2245;
    almost equal to = asymptotic to&asymp;&#8776;&#x2248;
    not equal to&ne;&#8800;&#x2260;
    identical to&equiv;&#8801;&#x2261;
    less-than or equal to&le;&#8804;&#x2264;
    greater-than or equal to&ge;&#8805;&#x2265;
    subset of&sub;&#8834;&#x2282;
    superset of&sup;&#8835;&#x2283;
    not a subset of&nsub;&#8836;&#x2284;
    subset of or equal to&sube;&#8838;&#x2286;
    superset of or equal to&supe;&#8839;&#x2287;
    circled plus = direct sum&oplus;&#8853;&#x2295;
    circled times = vector product&otimes;&#8855;&#x2297;
    up tack = orthogonal to = perpendicular&perp;&#8869;&#x22A5;
    dot operator&sdot;&#8901;&#x22C5;
    left ceiling = APL upstile&lceil;&#8968;&#x2308;
    right ceiling&rceil;&#8969;&#x2309;
    left floor = APL downstile&lfloor;&#8970;&#x230A;
    right floor&rfloor;&#8971;&#x230B;
    left-pointing angle bracket = bra&lang;&#9001;&#x2329;
    right-pointing angle bracket = ket&rang;&#9002;&#x232A;
    lozenge&loz;&#9674;&#x25CA;
    black spade suit&spades;&#9824;&#x2660;
    black club suit = shamrock&clubs;&#9827;&#x2663;
    black heart suit = valentine&hearts;&#9829;&#x2665;
    black diamond suit&diams;&#9830;&#x2666;
    + + + + diff --git a/application/third_party/dompdf/www/test/encoding_unicode.html b/application/third_party/dompdf/www/test/encoding_unicode.html new file mode 100644 index 00000000..90c21044 --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_unicode.html @@ -0,0 +1,8 @@ + + + + + +献给æ¯äº²çš„爱 + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/encoding_unicode_wrapping.html b/application/third_party/dompdf/www/test/encoding_unicode_wrapping.html new file mode 100644 index 00000000..8c964d32 --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_unicode_wrapping.html @@ -0,0 +1,13 @@ + + + + +Wrapping of non-ANSI characters + + + +No se tendrá en cuenta el hecho de que las partes tengan sus establecimientos en Estados diferentes +cuando ello no resulte del contrato, ni de los tratos entre ellas, ni de información revelada por +las partes en cualquier momento antes de la celebración del contrato o en el momento de su celebración. + + diff --git a/application/third_party/dompdf/www/test/encoding_utf-8.html b/application/third_party/dompdf/www/test/encoding_utf-8.html new file mode 100644 index 00000000..21a1f2fa --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_utf-8.html @@ -0,0 +1,793 @@ + + + + + +Unicode (UTF-8) Test + + + + +

    Unicode (UTF-8) test

    + +

    You can use this document to check if your browser and your installed fonts display multilingual HTML documents in Unicode (UTF-8) correctly.

    + +
    + +

    Latin extended

    + +
    +
    Letters with acute
    +
    Aà aá   CĆ cć   EÉ eé   Ià ií   LĹ lĺ   NŃ nÅ„   OÓ oó   RÅ” rÅ•   SÅš sÅ›   UÚ uú   Yà yý   ZŹ zź
    + +
    Letters with apostrophe (hacek)
    +
    dÄ   LĽ lľ   tÅ¥
    + +
    Letters with breve
    +
    AÄ‚ aă   GÄž gÄŸ   UŬ uÅ­
    + +
    Letters with caron (hacek)
    +
    CÄŒ cÄ   DÄŽ   EÄš eÄ›   NŇ nň   RŘ rÅ™   SÅ  sÅ¡   TŤ   ZŽ zž
    + +
    Letters with cedilla (comma)
    +
    CÇ cç   GÄ¢ gÄ£   KĶ kÄ·   LÄ» lļ   NÅ… nņ   RÅ– rÅ—   SÅž sÅŸ   TÅ¢ tÅ£
    + +
    Letters with circumflex
    +
    A aâ   CĈ cĉ   EÊ eê   GÄœ gÄ   HĤ hÄ¥   IÃŽ iî   JÄ´ jĵ   OÔ oô   SÅœ sÅ   UÛ uû   WÅ´ wŵ   YŶ yÅ·
    + +
    Letters with diaeresis (umlaut)
    +
    AÄ aä   EË eë   Ià iï   OÖ oö   UÜ uü   YŸ yÿ
    + +
    Letters with/without dot above
    +
    CÄŠ cÄ‹   EÄ– eÄ—   GÄ  gÄ¡   Iİ iı   ZÅ» zż
    + +
    Letters with double acute
    +
    OÅ oÅ‘   UŰ uű
    + +
    Letters with grave
    +
    AÀ aà   EÈ eè   IÃŒ iì   OÃ’ oò   UÙ uù
    + +
    Letters with horn
    +
    OÆ  oÆ¡   UƯ uư
    + +
    Letters with macron
    +
    AÄ€ aÄ   EÄ’ eÄ“   IĪ iÄ«   OÅŒ oÅ   UŪ uÅ«
    + +
    Letters with ogonek
    +
    AÄ„ aÄ…   EĘ eÄ™   IÄ® iį   UŲ uų
    + +
    Letters with ring above
    +
    AÃ… aÃ¥   UÅ® uů
    + +
    Letters with stroke
    +
    DÄ dÄ‘   HĦ hħ   LÅ lÅ‚   OØ oø
    + +
    Letters with tilde
    +
    AÃ aã   NÑ nñ   OÕ oõ
    + +
    Ligatures
    +
    AEÆ aeæ   OEÅ’ oeÅ“
    + +
    Eth & Thorn
    +
    Dà dð   THÞ thþ
    + +
    German sharp s & long s
    +
    ß   Å¿
    +
    + +

    Combining diacritical marks
     

    + +
    + +

    Greek

    + +
    +
    Capital letters
    +
    Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ ΠΞ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω
    + +
    Capital letters with tonos
    +
    Ά   Έ   Ή   Ί   ÎŒ   ÎŽ   Î
    + +
    Capital letters with dialytika
    +
    Ϊ   Ϋ
    + +
    Small letters
    +
    α β γ δ ε ζ η θ ι κ λ μ ν ξ ο Ï€ Ï ÏƒÏ‚ Ï„ Ï… φ χ ψ ω
    + +
    Small letters with tonos
    +
    ά   έ   ή   ί   ÏŒ   Ï   ÏŽ
    + +
    Small letters with dialytika
    +
    ÏŠ   Ï‹
    + +
    Small letters with dialytika and tonos
    +
    Î   ΰ
    +
    + +
    + +

    Cyrillic

    + +
    +
    Russian alphabet
    + +
    РБ В Г Д Е РЖ З И Й К Л М РО П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я +
    а б в г д е Ñ‘ ж з и й к л м н о п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч ш щ ÑŠ Ñ‹ ÑŒ Ñ ÑŽ Ñ
    + +
    Belarussian alphabet
    + +
    РБ В Г Д Е РЖ З І Й К Л М РО П Р С Т У Ў Ф Х Ц Ч Ш Ы Ь Э Ю Я +
    а б в г д е Ñ‘ ж з Ñ– й к л м н о п Ñ€ Ñ Ñ‚ у Ñž Ñ„ Ñ… ц ч ш Ñ‹ ÑŒ Ñ ÑŽ Ñ
    + +
    Ukrainian alphabet
    + +
    РБ Ð’ Г Ò Ð” Е Є Ж З И І Ї Й К Л М РО П Р С Т У Ф Ð¥ Ц Ч Ш Щ Ь Ю Я +
    а б в г Ò‘ д е Ñ” ж з и Ñ– Ñ— й к л м н о п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч ш щ ÑŒ ÑŽ Ñ
    + +
    Bulgarian alphabet
    + +
    РБ В Г Д Е Ж З И Й К Л М РО П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ь Ю Я +
    а б в г д е ж з и й к л м н о п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч ш щ ÑŠ ÑŒ ÑŽ Ñ
    + +
    Macedonian alphabet
    + +
    РБ В Г Д Ѓ Е Ж З Ѕ И Ј К Л Љ М РЊ О П Р С Т Ќ У Ф Х Ц Ч РШ +
    а б в г д Ñ“ е ж з Ñ• и ј к л Ñ™ м н Ñš о п Ñ€ Ñ Ñ‚ Ñœ у Ñ„ Ñ… ц ч ÑŸ ш
    + +
    Serbian alphabet
    + +
    РБ В Г Д Ђ Е Ж З И Ј К Л Љ М РЊ О П Р С Т Ћ У Ф Х Ц Ч РШ +
    а б в г д Ñ’ е ж з и ј к л Ñ™ м н Ñš о п Ñ€ Ñ Ñ‚ Ñ› у Ñ„ Ñ… ц ч ÑŸ ш
    + +
    Mongolian alphabet
    + +
    +A B V G D E Ë Zh Z I J K L M N O Ö P R S T U Ü F X C Ch Sh Shh " Y ' E Ju Ja
    +
    РБ В Г Д Е РЖ З И Й К Л М РО Ө П Р С Т У Ү Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я +
    а б в г д е Ñ‘ ж з и й к л м н о Ó© п Ñ€ Ñ Ñ‚ у Ò¯ Ñ„ Ñ… ц ч ш щ ÑŠ Ñ‹ ÑŒ Ñ ÑŽ Ñ
    +
    + +
    + +

    Armenian

    + +
    +
    Capital letters
    + +
    a b g d e z ê ă th +  ž i l x c’ k’ h dz ğ +  č’ m j n š o č p’ dž +  rr s v t’ r c w ph kh +  ô f
    +
    +Ô± +Ô² +Ô³ +Ô´ +Ôµ +Ô¶ +Ô· +Ô¸ +Ô¹   +Ôº +Ô» +Ô¼ +Ô½ +Ô¾ +Ô¿ +Õ€ +Õ +Õ‚   +Õƒ +Õ„ +Õ… +Õ† +Õ‡ +Õˆ +Õ‰ +ÕŠ +Õ‹   +ÕŒ +Õ +ÕŽ +Õ +Õ +Õ‘ +Õ’ +Õ“ +Õ”   +Õ• +Õ– +
    + +
    Small letters
    + +
    a b g d e z ê ă th +  ž i l x c’ k’ h dz ğ +  č’ m j n š o č p’ dž +  rr s v t’ r c w ph kh +  ew ô f
    +
    +Õ¡ +Õ¢ +Õ£ +Õ¤ +Õ¥ +Õ¦ +Õ§ +Õ¨ +Õ©   +Õª +Õ« +Õ¬ +Õ­ +Õ® +Õ¯ +Õ° +Õ± +Õ²   +Õ³ +Õ´ +Õµ +Õ¶ +Õ· +Õ¸ +Õ¹ +Õº +Õ»   +Õ¼ +Õ½ +Õ¾ +Õ¿ +Ö€ +Ö +Ö‚ +Öƒ +Ö„   +Ö‡ +Ö… +Ö† +
    +
    + +
    + +

    Georgian

    + +
    +
    Mxedruli (Mkhedruli) script
    + +
    a b g d e v z th +  i k’ l m n o p’ ž +  r s t’ u ph kh ğ q’ š +  č c dz c’ č’ x dž h
    +
    +რ+ბ +გ +დ +ე +ვ +ზ +თ   +ი +კ +ლ +მ +ნ +რ+პ +ჟ   +რ +ს +ტ +უ +ფ +ქ +ღ +ყ +შ   +ჩ +ც +ძ +წ +ჭ +ხ +ჯ +ჰ +
    +
    + +
    + +

    Hebrew

    + +
    +
    Hebrew alphabet
    + +
    ’ v g d h w z H T y xx l mm nn s ‘ ff cc q r S ( š ś ) t
    +
      +× ×‘ ×’ ד ×” ו ×– ×— ט ×™ כך ל ×ž× × ×Ÿ ס ×¢ פף צץ ×§ ר ש ( ×©× ×©×‚ ) ת +
    + +
    Letters with dagesh (mappiq)
    + +
    ’ b g d h w z   T y kk l m  n  s   pp c  q r S ( š ś ) t
    +
      +×Ö¼ בּ ×’Ö¼ דּ ×”Ö¼ וּ ×–Ö¼ טּ ×™Ö¼ כּךּ לּ מּ × Ö¼ סּ פּףּ צּ ×§Ö¼ רּ שּ ( ×©Ö¼× ×©Ö¼×‚ ) תּ +
    + +
    Yiddish digraphs
    + +
    ww   wy   yy
    +
      +×° ×± ײ +
    + +
    Letters with rafe
    + +
    v   x   f
    +
      +בֿ   +×›Ö¿   +פֿ
    + +
    Vowels with points
    + +
    a   å   o   u   i   ai
    +
      +×Ö·   +×Ö¸   +וֹ   +וּ   +×™Ö´   +ײַ
    +
    + +
    + +

    Arabic

    + +
    +
    Arabic alphabet
    + +
    ’a a b t þ j H x d ð r z s š S D T Z ‘ ğ f v q k l m n h -t w ÿ y -a
    +
    ـآ Ø¢  + Ù€Ø§ ا  + Ø¨Ù€Ø¨Ù€Ø¨ ب  + ØªÙ€ØªÙ€Øª ت  + Ø«Ù€Ø«Ù€Ø« Ø«  + Ø¬Ù€Ø¬Ù€Ø¬ ج  + Ø­Ù€Ø­Ù€Ø­ Ø­  + Ø®Ù€Ø®Ù€Ø® Ø®  + Ù€Ø¯ د  + Ù€Ø° ذ  + Ù€Ø± ر  + Ù€Ø² ز  + Ø³Ù€Ø³Ù€Ø³ س  + Ø´Ù€Ø´Ù€Ø´ Ø´  + ØµÙ€ØµÙ€Øµ ص  + Ø¶Ù€Ø¶Ù€Ø¶ ض  + Ø·Ù€Ø·Ù€Ø· Ø·  + Ø¸Ù€Ø¸Ù€Ø¸ ظ  + Ø¹Ù€Ø¹Ù€Ø¹ ع  + ØºÙ€ØºÙ€Øº غ  + ÙÙ€ÙÙ€Ù Ù  + Ú¤Ù€Ú¤Ù€Ú¤ Ú¤  + Ù‚ـقـق Ù‚  + ÙƒÙ€ÙƒÙ€Ùƒ Ùƒ  + Ù„ـلـل Ù„  + Ù…ـمـم Ù…  + Ù†Ù€Ù†Ù€Ù† Ù†  + Ù‡Ù€Ù‡Ù€Ù‡ Ù‡  + Ù€Ø© Ø©  + Ù€Ùˆ Ùˆ  + ÙŠÙ€ÙŠÙ€ÙŠ ÙŠ  + ÛŒÙ€ÛŒÙ€ÛŒ ÛŒ  + Ù€Ù‰ Ù‰  +
    + +
    Letters with hamzah  
    + +
    Ø¡  + Ù€Ø¥ Ø¥  + Ù€Ø£ Ø£  + Ù€Ø¤ ؤ  + Ø¦Ù€Ø¦Ù€Ø¦ ئ  +
    + +
    Persian alphabet  
    + +
    ’a a b p t s j c H x d z r z ž s š S Z T Z ‘ ğ f q k g l m n v h y
    +
    ـآ Ø¢  + Ù€Ø§ ا  + Ø¨Ù€Ø¨Ù€Ø¨ ب  + Ù¾Ù€Ù¾Ù€Ù¾ Ù¾  + ØªÙ€ØªÙ€Øª ت  + Ø«Ù€Ø«Ù€Ø« Ø«  + Ø¬Ù€Ø¬Ù€Ø¬ ج  + Ú†Ù€Ú†Ù€Ú† Ú†  + Ø­Ù€Ø­Ù€Ø­ Ø­  + Ø®Ù€Ø®Ù€Ø® Ø®  + Ù€Ø¯ د  + Ù€Ø° ذ  + Ù€Ø± ر  + Ù€Ø² ز  + Ù€Ú˜ Ú˜  + Ø³Ù€Ø³Ù€Ø³ س  + Ø´Ù€Ø´Ù€Ø´ Ø´  + ØµÙ€ØµÙ€Øµ ص  + Ø¶Ù€Ø¶Ù€Ø¶ ض  + Ø·Ù€Ø·Ù€Ø· Ø·  + Ø¸Ù€Ø¸Ù€Ø¸ ظ  + Ø¹Ù€Ø¹Ù€Ø¹ ع  + ØºÙ€ØºÙ€Øº غ  + ÙÙ€ÙÙ€Ù Ù  + Ù‚ـقـق Ù‚  + Ú©Ù€Ú©Ù€Ú© Ú©  + Ú¯Ù€Ú¯Ù€Ú¯ Ú¯  + Ù„ـلـل Ù„  + Ù…ـمـم Ù…  + Ù†Ù€Ù†Ù€Ù† Ù†  + Ù€Ùˆ Ùˆ  + Ù‡Ù€Ù‡Ù€Ù‡ Ù‡  + ÛŒÙ€ÛŒÙ€ÛŒ ÛŒ  +
    + +
    Urdu alphabet  
    + +
    ’a a b p t t. s j c H x d d. z r r. z ž s š S Z T Z ‘ ğ f q k g l m n -n v h h y -e
    +
    ـآ Ø¢  + Ù€Ø§ ا  + Ø¨Ù€Ø¨Ù€Ø¨ ب  + Ù¾Ù€Ù¾Ù€Ù¾ Ù¾  + ØªÙ€ØªÙ€Øª ت  + Ù¹Ù€Ù¹Ù€Ù¹ Ù¹  + Ø«Ù€Ø«Ù€Ø« Ø«  + Ø¬Ù€Ø¬Ù€Ø¬ ج  + Ú†Ù€Ú†Ù€Ú† Ú†  + Ø­Ù€Ø­Ù€Ø­ Ø­  + Ø®Ù€Ø®Ù€Ø® Ø®  + Ù€Ø¯ د  + Ù€Úˆ Úˆ  + Ù€Ø° ذ  + Ù€Ø± ر  + Ù€Ú‘ Ú‘  + Ù€Ø² ز  + Ù€Ú˜ Ú˜  + Ø³Ù€Ø³Ù€Ø³ س  + Ø´Ù€Ø´Ù€Ø´ Ø´  + ØµÙ€ØµÙ€Øµ ص  + Ø¶Ù€Ø¶Ù€Ø¶ ض  + Ø·Ù€Ø·Ù€Ø· Ø·  + Ø¸Ù€Ø¸Ù€Ø¸ ظ  + Ø¹Ù€Ø¹Ù€Ø¹ ع  + ØºÙ€ØºÙ€Øº غ  + ÙÙ€ÙÙ€Ù Ù  + Ù‚ـقـق Ù‚  + Ú©Ù€Ú©Ù€Ú© Ú©  + Ú¯Ù€Ú¯Ù€Ú¯ Ú¯  + Ù„ـلـل Ù„  + Ù…ـمـم Ù…  + Ù†Ù€Ù†Ù€Ù† Ù†  + Ù€Úº Úº  + Ù€Ùˆ Ùˆ  + ÛÙ€ÛÙ€Û Û  + Ú¾Ù€Ú¾Ù€Ú¾ Ú¾  + ÛŒÙ€ÛŒÙ€ÛŒ ÛŒ  + Ù€Û’ Û’  +
    + +
    Arabic-Indic digits  
    + +
    +0 1 2 3 4 5 6 7 8 9 10 11 12
    +
    + 0 1 2 3 4 5 6 7 8 9 10 11 12
    + ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ١٠ ١١ ١٢
    + Û° Û± Û² Û³ Û´ Ûµ Û¶ Û· Û¸ Û¹ Û±Û° Û±Û± Û±Û² +
    +
    + +
    + +

    Devanagari

    + +
    +
    Sanskrit alphabet
    + +
    a aa i ii u uu   r rr l   e ai o au
    +
    +अ à¤† à¤‡ à¤ˆ à¤‰ à¤Š   +ऋ à¥  à¤Œ   +ठठओ à¤” +
    + +
    kaa ki kii ku kuu   kr krr kl   ke kai ko kau
    +
    +का कि की कॠकू   +कृ à¤•ॄ à¤•ॢ   +के कै को कौ +
    + +
    k kh g gh ng   +c ch j jh ñ   +t. t.h d. d.h n.   +t th d dh n   +p ph b bh m   +y r l. l v   +ś s. s h
    +
    +क à¤– à¤— à¤˜ à¤™   +च à¤› à¤œ à¤ à¤ž   +ट à¤  à¤¡ à¤¢ à¤£   +त à¤¥ à¤¦ à¤§ à¤¨   +प à¤« à¤¬ à¤­ à¤®   +य à¤° à¤³ à¤² à¤µ   +श à¤· à¤¸ à¤¹ +
    + +
    Hindi/Urdu letters with nuqta
    + +
    q x ğ z r. r.h f
    +
    +क़ ख़ ग़ ज़ +ड़ ॠफ़ +
    + +
    Sample conjuncts
    + +
    ks. jñ tt tr rt
    +
    +कà¥à¤· जà¥à¤ž तà¥à¤¤ तà¥à¤° रà¥à¤¤ +
    + +
    Devanagari digits
    + +
    +0 1 2 3 4 5 6 7 8 9 10
    +
    +० १ २ ३ ४ ५ ६ ७ ८ ९ १०
    +
    + +
    + +

    Gujarati

    + +
    +
    Sanskrit alphabet
    + +
    a aa i ii u uu   r rr   e ai o au
    +
    +અ àª† àª‡ àªˆ àª‰ àªŠ   +ઋ à«    +ઠઠઓ àª” +
    + +
    kaa ki kii ku kuu   kr krr   ke kai ko kau
    +
    +કા કિ કી કૠકૂ   +કૃ àª•à«„   +કે કૈ કો કૌ +
    + +
    k kh g gh ng   +c ch j jh ñ   +t. t.h d. d.h n.   +t th d dh n   +p ph b bh m   +y r l. l v   +ś s. s h
    +
    +ક àª– àª— àª˜ àª™   +ચ àª› àªœ àª àªž   +ટ àª  àª¡ àª¢ àª£   +ત àª¥ àª¦ àª§ àª¨   +પ àª« àª¬ àª­ àª®   +ય àª° àª³ àª² àªµ   +શ àª· àª¸ àª¹ +
    + +
    Sample conjuncts
    + +
    ks. jñ tt tr rt
    +
    +કà«àª· જà«àªž તà«àª¤ તà«àª° રà«àª¤ +
    + +
    Gujarati digits
    + +
    +0 1 2 3 4 5 6 7 8 9 10
    +
    +૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯ ૧૦
    +
    + +
    + +

    Bengali

    + +
    +
    Sanskrit alphabet
    + +
    a aa i ii u uu   r rr l   e ai o au
    +
    +অ à¦† à¦‡ à¦ˆ à¦‰ à¦Š   +ঋ à§  à¦Œ   +ঠঠও à¦” +
    + +
    kaa ki kii ku kuu   kr krr kl   ke kai ko kau
    +
    +কা কি কী কৠকূ   +কৃ à¦•à§„ à¦•à§¢   +কে কৈ কো কো +
    + +
    k kh g gh ng   +c ch j jh ñ   +t. t.h d. d.h n.   +t th d dh n   +p ph b bh m   +y r l v   +ś s. s h
    +
    +ক à¦– à¦— à¦˜ à¦™   +চ à¦› à¦œ à¦ à¦ž   +ট à¦  à¦¡ à¦¢ à¦£   +ত à¦¥ à¦¦ à¦§ à¦¨   +প à¦« à¦¬ à¦­ à¦®   +য à¦° à¦² à¦¬   +শ à¦· à¦¸ à¦¹ +
    + +
    Letters with nukta & Assamese letters
    + +
    r. r.h y.   r v
    +
    +à§œ à§ à§Ÿ   +à§° à§± +
    + +
    Sample conjuncts
    + +
    ks. jñ tt tr rt
    +
    +কà§à¦· জà§à¦ž তà§à¦¤ তà§à¦° রà§à¦¤ +
    + +
    Bengali digits
    + +
    +0 1 2 3 4 5 6 7 8 9 10
    +
    +০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ ১০
    +
    + +
    + +

    Gurmukhi

    + +
    +
    Panjabi alphabet
    + +
    a aa i ii u uu   e ai o au
    +
    +ਅ ਆ ਇ ਈ ਉ ਊ   +ਠਠਓ ਔ +
    + +
    kaa ki kii ku kuu   ke kai ko kau
    +
    +ਕਾ ਕਿ ਕੀ ਕ੠ਕੂ   +ਕੇ ਕੈ ਕੋ ਕੌ +
    + +
    k kh g gh ng   +c ch j jh ñ   +t. t.h d. d.h n.   +t th d dh n   +p ph b bh m   +y r l v r.   +s h
    +
    +ਕ à¨– à¨— à¨˜ à¨™   +ਚ à¨› à¨œ à¨ à¨ž   +ਟ à¨  à¨¡ à¨¢ à¨£   +ਤ à¨¥ à¨¦ à¨§ à¨¨   +ਪ à¨« à¨¬ à¨­ à¨®   +ਯ à¨° à¨² à¨µ à©œ   +ਸ à¨¹ +
    + +
    Letters with nukta
    + +
    x ğ z f l. š
    +
    +ਖ਼ ਗ਼ ਜ਼ +ਫ਼ ਲ਼ ਸ਼ +
    + +
    Gurmukhi digits
    + +
    +0 1 2 3 4 5 6 7 8 9 10
    +
    +੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੧੦
    +
    + +
    + +

    Symbols

    + + ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    •bullet
    ¢cent sign
    ©copyright sign
    ¤currency sign
    †dagger
    °degree sign
    ÷division sign
    «double angle quotation mark (guillemet) <<
    »double angle quotation mark (guillemet) >>
    “double quotation mark 66
    â€double quotation mark 99
    „double quotation mark low-99
    …ellipsis
    —em dash
    –en dash
    €euro sign
    ―horizontal bar (quotation dash)
    µmicro sign
    ·middle dot (centered period)
    ·middle dot (centered period, Greek ano teleia)
    ×multiplication sign
    ¬not sign
    â„–numero sign
    ‰per mille (per thousand) sign
    ¶pilcrow (paragraph) sign
    ±plus-minus sign
    £pound sterling sign
    ®registered sign
    §section sign
    ₪sheqel sign
    ‹single angle quotation mark (guillemet) <
    ›single angle quotation mark (guillemet) >
    ‘single quotation mark 6
    ’single quotation mark 9 (apostrophe)
    ¹superscript 1
    ²superscript 2
    ³superscript 3
    â„¢trademark sign
    ¥yen sign
    ØŒArabic comma
    Ù«Arabic decimal separator
    ÙªArabic percent sign
    ØŸArabic question mark
    ؛Arabic semicolon
    Û”Arabic-Urdu full stop (Arabic-Urdu period)
    Ö¾Hebrew hyphen (maqaf)
    ׳Hebrew prime (geresh)
    ×´Hebrew double prime (gershayim)
    ॰Indic abbreviation sign
    ।Indic danda
    ॥Indic double danda
    + +
    + +


    19 February 2010

    + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/encoding_utf-8_w3.html b/application/third_party/dompdf/www/test/encoding_utf-8_w3.html new file mode 100644 index 00000000..9a10ffce --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_utf-8_w3.html @@ -0,0 +1,220 @@ + + + + UTF-8 test file + + + +

    Original by Markus Kuhn, adapted for HTML by Martin Dürst.

    +
     
    +UTF-8 encoded sample plain-text file
    +‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
    + 
    +Markus Kuhn [ˈmaʳkÊŠs kuËn] <mkuhn@acm.org> — 1999-08-20
    + 
    + 
    +The ASCII compatible UTF-8 encoding of ISO 10646 and Unicode
    +plain-text files is defined in RFC 2279 and in ISO 10646-1 Annex R.
    + 
    + 
    +Using Unicode/UTF-8, you can write in emails and source code things such as
    + 
    +Mathematics and Sciences:
    + 
    +  ∮ Eâ‹…da = Q,  n → ∞, ∑ f(i) = ∠g(i), ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β),
    + 
    +  ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ ℂ, ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B),
    + 
    +  2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm
    + 
    +Linguistics and dictionaries:
    + 
    +  ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn
    +  Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘]
    + 
    +APL:
    + 
    +  ((Vâ³V)=â³â´V)/Vâ†,V    ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈
    + 
    +Nicer typography in plain text files:
    + 
    +  â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•—
    +  â•‘                                          â•‘
    +  ║   • ‘single’ and “double†quotes         ║
    +  â•‘                                          â•‘
    +  ║   • Curly apostrophes: “We’ve been here†║
    +  â•‘                                          â•‘
    +  ║   • Latin-1 apostrophe and accents: '´`  ║
    +  â•‘                                          â•‘
    +  ║   • ‚deutsche‘ „Anführungszeichen“       ║
    +  â•‘                                          â•‘
    +  ║   • †, ‡, ‰, •, 3–4, —, −5/+5, ™, …      ║
    +  â•‘                                          â•‘
    +  ║   • ASCII safety test: 1lI|, 0OD, 8B     ║
    +  ║                      ╭─────────╮         ║
    +  ║   • the euro symbol: │ 14.95 € │         ║
    +  ║                      ╰─────────╯         ║
    +  ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
    + 
    +Greek (in Polytonic):
    + 
    +  The Greek anthem:
    + 
    +  Σὲ γνωÏίζω ἀπὸ τὴν κόψη
    +  τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ,
    +  σὲ γνωÏίζω ἀπὸ τὴν ὄψη
    +  ποὺ μὲ βία μετÏάει τὴ γῆ.
    + 
    +  ᾿Απ᾿ τὰ κόκκαλα βγαλμένη
    +  τῶν ῾Ελλήνων τὰ ἱεÏá½±
    +  καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη
    +  χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά!
    + 
    +  From a speech of Demosthenes in the 4th century BC:
    + 
    +  Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι,
    +  ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς
    +  λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ
    +  τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ 
    +  εἰς τοῦτο Ï€Ïοήκοντα,  ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ
    +  Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν
    +  οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι,
    +  οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν
    +  ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
    +  τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι
    +  γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
    +  Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους
    +  σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ
    +  τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ
    +  τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς
    +  τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον.
    + 
    +  Δημοσθένους, Γ´ ᾿Ολυνθιακὸς
    + 
    +Georgian:
    + 
    +  From a Unicode conference invitation:
    + 
    +  გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ
    +  კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡,
    +  ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡
    +  ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი,
    +  ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ
    +  áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში,
    +  ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში.
    + 
    +Russian:
    + 
    +  From a Unicode conference invitation:
    + 
    +  ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по
    +  Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии.
    +  ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по  вопроÑам глобального
    +  Интернета и Unicode, локализации и интернационализации, воплощению и
    +  применению Unicode в различных операционных ÑиÑтемах и программных
    +  приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах.
    + 
    +Thai (UCS Level 2):
    + 
    +  Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese
    +  classic 'San Gua'):
    + 
    +  [----------------------------|------------------------]
    +    ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š  พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่
    +  สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป       สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸²
    +    ทรงนับถือขันทีเป็นที่พึ่ง           บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸²
    +  โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา         หมายจะฆ่ามดชั่วตัวสำคัà¸
    +    เหมือนขับไสไล่เสือจาà¸à¹€à¸„หา      รับหมาป่าเข้ามาเลยอาสัà¸
    +  à¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™          ใช้สาวนั้นเป็นชนวนชื่นชวนใจ
    +    พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ          ช่างอาเพศจริงหนาฟ้าร้องไห้
    +  ต้องรบราฆ่าฟันจนบรรลัย           ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ
    + 
    +  (The above is a two-column text. If combining characters are handled
    +  correctly, the lines of the second column should be aligned with the
    +  | character above.)
    + 
    +Ethiopian:
    + 
    +  Proverbs in the Amharic language:
    + 
    +  ሰማይ አይታረስ ንጉሥ አይከሰስá¢
    +  ብላ ካለአእንደአባቴ በቆመጠáŠá¢
    +  ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢
    +  ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢
    +  የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢
    +  አይጥ በበላ ዳዋ ተመታá¢
    +  ሲተረጉሙ ይደረáŒáˆ™á¢
    +  ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢
    +  ድር ቢያብር አንበሳ ያስርá¢
    +  ሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢
    +  እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢
    +  የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…á¢
    +  ሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢
    +  ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢
    +  የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካá¢
    +  ተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢
    +  ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢
    +  እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋá¢
    + 
    +Runes:
    + 
    +  ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ
    + 
    +  (Old English, which transcribed into Latin reads 'He cwaeth that he
    +  bude thaem lande northweardum with tha Westsae.' and means 'He said
    +  that he lived in the northern land near the Western Sea.')
    + 
    +Braille:
    + 
    +  ⡌â â §â ‘ â ¼â â ’  â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌
    + 
    +  â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞
    +  â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž
    +  â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂
    +  â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™
    +  ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ 
    +  â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ²
    + 
    +  ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ²
    + 
    +  â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹
    +  â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž
    +  â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ •
    +  ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ 
    +  â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ 
    +  â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž
    +  â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳
    +  ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž
    +  â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ²
    + 
    +  (The first couple of paragraphs of "A Christmas Carol" by Dickens)
    + 
    +Compact font selection example text:
    + 
    +  ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
    +  abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ
    +  –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд
    +  ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×Ô±áƒ
    + 
    +Greetings in various languages:
    + 
    +  Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ
    + 
    +Box drawing alignment tests:                                          â–ˆ
    +                                                                      â–‰
    +  â•”â•â•╦â•â•â•—  ┌──┬──┠ ╭──┬──╮  ╭──┬──╮  â”â”â”┳â”â”┓  ┎┒â”┑   â•·  â•» â”┯┓ ┌┰┠   â–Š ╱╲╱╲╳╳╳
    +  ║┌─╨─â”â•‘  │╔â•â•§â•╗│  │╒â•╪â•╕│  │╓─â•─╖│  ┃┌─╂─â”┃  ┗╃╄┙  ╶┼╴╺╋╸┠┼┨ â”╋┥    â–‹ ╲╱╲╱╳╳╳
    +  ║│╲ ╱│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ â•¿ │┃  â”╅╆┓   ╵  ╹ â”—â”·â”› └┸┘    â–Œ ╱╲╱╲╳╳╳
    +  â• â•¡ ╳ ╞╣  ├╢   ╟┤  ├┼─┼─┼┤  ├╫─╂─╫┤  ┣┿╾┼╼┿┫  ┕┛┖┚     ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳
    +  ║│╱ ╲│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╽ │┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╠ ┇ ┋ ▎
    +  ║└─╥─┘║  │╚â•╤â•â•│  │╘â•╪â•╛│  │╙─╀─╜│  ┃└─╂─┘┃  ░░▒▒▓▓██ ┊  ┆ ╎ â•  ┇ ┋ â–
    +  ╚â•â•â•©â•â•â•  └──┴──┘  ╰──┴──╯  ╰──┴──╯  â”—â”â”â”»â”â”â”›           └╌╌┘ ╎ â”—â•â•â”› ┋  â–▂▃▄▅▆▇█
    + 
    +
    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/image_background.html b/application/third_party/dompdf/www/test/image_background.html new file mode 100644 index 00000000..15b2efd8 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_background.html @@ -0,0 +1,68 @@ + + + + + +

    Lorem ipsum dolor sit amet

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.

    + +

    Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo +non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis +diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi +massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus +mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam +vel erat tempus purus molestie suscipit. Vestibulum odio lorem, +sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis +ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, +rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla +sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa +adipiscing lorem, bibendum luctus nisl tortor vitae leo.

    + +

    Etiam a mauris. Proin justo elit, accumsan sit amet, tempus et, +blandit id, tellus. Morbi varius, nisi id iaculis aliquam, lacus +ligula facilisis velit, ac pharetra ipsum augue a massa. Etiam rhoncus +commodo orci. Mauris ullamcorper sagittis turpis. Nullam magna libero, +sagittis sed, auctor faucibus, accumsan vitae, urna. Pellentesque +volutpat. Aliquam sapien ipsum, eleifend nec, imperdiet vitae, +consectetuer id, quam. Donec a urna. Suspendisse sit amet +velit. Curabitur quis nisi id dui viverra ornare. Sed condimentum enim +quis tortor. Ut condimentum, magna non tempus tincidunt, leo nibh +molestie tellus, vitae convallis dolor ante sed ante. Nunc et +metus. Phasellus ultricies. Fusce faucibus tortor sit amet mauris.

    + +

    Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque +volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit +amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed +felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, +eleifend in, porttitor in, malesuada non, neque. Etiam sed +augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer +adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, +nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem +malesuada facilisis. Vestibulum porta, metus sit amet egestas +interdum, urna justo euismod erat, id tristique urna leo quis +nibh. Morbi non erat.

    + +

    Cras fringilla, nulla id egestas elementum, augue nunc iaculis nibh, +ac adipiscing nibh justo id tortor. Donec vel orci a nisi ultricies +aliquet. Nunc urna quam, adipiscing molestie, vehicula non, +condimentum non, magna. Integer magna. Donec quam metus, pulvinar id, +suscipit eget, euismod ac, orci. Nulla facilisi. Nullam nec +mauris. Morbi in mi. Etiam urna lectus, pulvinar ac, sollicitudin eu, +euismod ac, lectus. Fusce elit. Sed ultricies odio ac felis.

    + + + diff --git a/application/third_party/dompdf/www/test/image_basic.html b/application/third_party/dompdf/www/test/image_basic.html new file mode 100644 index 00000000..30b071b9 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_basic.html @@ -0,0 +1,20 @@ + + + + + + + + +
    + +
    +The PHP 5 HTML to PDF converter +
    + + diff --git a/application/third_party/dompdf/www/test/image_bmp.html b/application/third_party/dompdf/www/test/image_bmp.html new file mode 100644 index 00000000..2a574720 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_bmp.html @@ -0,0 +1,130 @@ + + + + + BMP image test suite + + + + + +

    + This test suite was grabbed from http://wvnvaxa.wvnet.edu/vmswww/bmp.html. +

    + +

    Not every BMP format is supported but the most used is the 24 bit format

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BMPPNG
    1 bit (2 color)
    4 bit
    8 bit
    16 bit
    24 bit
    32 bit
    4 bit compressed
    8 bit compressed
    16 bit 555 bitfield
    16 bit 565 bitfield
    32 bit 888 bitfield
    32 bit 888 bitfield version 4
    32 bit version 5
    32 bit transparent version 4
    + +

    +Note that as of December 2005, Mozilla and Internet Explorer +do not support transparent BMP images. +

    + +

    +The images (except for the last three and the OS/2 version 2 image) +are from Jason Summer's BMP Suite. +

    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/image_datauri.html b/application/third_party/dompdf/www/test/image_datauri.html new file mode 100644 index 00000000..513c4e1d --- /dev/null +++ b/application/third_party/dompdf/www/test/image_datauri.html @@ -0,0 +1,35 @@ + + + + + + + +

    + Embedded <img> :
    + +

    + +

    + Normal <img> :
    + +

    + +

    + Embedded background image +

    + +

    + Normal background image +

    + + + + diff --git a/application/third_party/dompdf/www/test/image_gif.html b/application/third_party/dompdf/www/test/image_gif.html new file mode 100644 index 00000000..52845b7a --- /dev/null +++ b/application/third_party/dompdf/www/test/image_gif.html @@ -0,0 +1,9 @@ + + + + + + + +

    + diff --git a/application/third_party/dompdf/www/test/image_remote.html b/application/third_party/dompdf/www/test/image_remote.html new file mode 100644 index 00000000..c3ac5f72 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_remote.html @@ -0,0 +1,21 @@ + + + + + + + +
    +

    Remote CSS & Image Test

    +

    CSS: http://dompdf.googlecode.com/svn/trunk/dompdf/www/style.css

    +

    Testing remote image:

    +

    Note: DOMPDF_ENABLE_REMOTE must be enabled for this test to work.

    +
    + + diff --git a/application/third_party/dompdf/www/test/image_transparent_gif.html b/application/third_party/dompdf/www/test/image_transparent_gif.html new file mode 100644 index 00000000..145d687b --- /dev/null +++ b/application/third_party/dompdf/www/test/image_transparent_gif.html @@ -0,0 +1,23 @@ + + + + + + + + + +
    + +
    + +
    + +
    + + diff --git a/application/third_party/dompdf/www/test/image_transparent_png.html b/application/third_party/dompdf/www/test/image_transparent_png.html new file mode 100644 index 00000000..686f5548 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_transparent_png.html @@ -0,0 +1,189 @@ + + + + + PNG transparency test + + + + + +

    PNG transparency test

    + +Examples from http://entropymine.com/jason/testbed/pngtrans/ + +

    +Not all possible results are shown; there are too many combinations +of background colors and shapes of the opaque region. However, I +intend to include every result that actually occurs in a mainstream +browser. If I am missing any, please +let me know. + +

    It's come to my attention that my images which show how +alpha transparency should look are not quite perfect +in regard to precisely how transparent they are at various points. +Rather than try to modify this page to test gamma +correction issues as well, I've created a +separate test page for that. + +

    +This test page was constructed by +Jason Summers. +Comments may be emailed to jason1@pobox.com.
    +There are +other test +pages listed at the PNG web site. + + + + + +

    + +

    Alpha and palette transparency

    + +

    Expected result:
    +[Test image] +

    + +

    (T1) 8-bit palette, includes background color:
    +[Test image] +

    + +

    (T2) 8-bit palette, no background color:
    +[Test image] +

    + +

    (T3) 32-bit RGBA, includes background color:
    +[Test image] +

    + +

    (T4) 32-bit RGBA, no background color:
    +[Test image] +

    + +

    (T5) 64-bit RGBA, includes background color:
    +[Test image] +

    + +

    (T6) 64-bit RGBA, no background color:
    +[Test image] +

    + +

    RGB binary transparency

    + +

    Expected result:
    +[Test image] +

    + +

    (T7) 24-bit RGB, binary transparency, includes background color:
    +[Test image] +

    + +

    (T8) 24-bit RGB, binary transparency, no background color:
    +[Test image] +

    + +

    (T9) 48-bit RGB, binary transparency, includes background color:
    +[Test image] +

    + +

    (T10) 48-bit RGB, binary transparency, no background color:
    +[Test image] +

    + + +

    Grayscale alpha transparency

    + +

    Expected result:
    +[Test image] +

    + +

    (G1) 16 bpp grayscale (8 gray + 8 alpha), includes background color:
    +[Test image] +

    + +

    (G2) 16 bpp grayscale (8 gray + 8 alpha), no background color:
    +[Test image] +

    + +

    (G3) 32 bpp grayscale (16 gray + 16 alpha), includes background color:
    +[Test image] +

    + +

    (G4) 32 bpp grayscale (16 gray + 16 alpha), no background color:
    +[Test image] + + +

    Grayscale binary transparency

    + +

    Expected result:
    +[Test image] +

    + +

    (G5) 8 bpp grayscale (8 gray), includes background color:
    +[Test image] +

    + +

    (G6) 8 bpp grayscale (8 gray), no background color:
    +[Test image] +

    + +

    (G7) 16 bpp grayscale (16 gray), includes background color:
    +[Test image] +

    + +

    (G8) 16 bpp grayscale (16 gray), no background color:
    +[Test image] + +

    Miscellaneous

    + +

    (M1) 8-bit palette, no transparency, includes background color:
    +Expected result:
    +[Test image]
    +[Test image] +

    + +

    (M2) (4-bit) palette, binary transparency only, no background color:
    +Expected result:
    +[Test image]
    +[Test image]
    +(This tests a few things that may have slipped through the cracks.) +

    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/image_variants.html b/application/third_party/dompdf/www/test/image_variants.html new file mode 100644 index 00000000..04ecc492 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_variants.html @@ -0,0 +1,149 @@ + + + + + + + + +
    + +

    40% of box width:

    +
    + +
    + +

    multiple identical images jpg:

    + + + + +

    multiple identical images gif (will be recoded to png by dompdf):

    + + + + +

    multiple identical images png:

    + + + + +

    local png image with alpha channel:

    + + +

    Attention!

    + +

    For external images to work, the following configuration is required:

    +
    dompdf_config.inc.php :
    + +
    define("DOMPDF_ENABLE_REMOTE", true);
    + +

    external png Image with alpha channel:

    + + +

    external image, dynamically created with id in url parameter at end of parameter(.jpg):

    + + +

    external image, dynamically created with id in url parameter not at end of parameter (.jpg):

    + + +

    external Image without file extension (.gif):

    + + +

    Background images

    +
    + + + + + + +
    +

    paragraph link no-repeat position:default

    +

    paragraph text no-repeat position:left-top; more text text more text text bla bla sdfjkhs sdfsjksdfks sdfkjsfsf skjfh ksjdfhsd

    +

    paragraph text no-repeat position:left-center; more text text more text text bla bla sdfjkhs sdfsjksdfks sdfkjsfsf skjfh ksjdfhsd

    +

    +The PHP 5 HTML to PDF converter +

    + +
    + + diff --git a/application/third_party/dompdf/www/test/images/bmp/test1.bmp b/application/third_party/dompdf/www/test/images/bmp/test1.bmp new file mode 100644 index 00000000..a7203476 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test1.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test1.png b/application/third_party/dompdf/www/test/images/bmp/test1.png new file mode 100644 index 00000000..3cdc4981 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test1.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test16.bmp b/application/third_party/dompdf/www/test/images/bmp/test16.bmp new file mode 100644 index 00000000..a5a3195c Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test16.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test16.png b/application/third_party/dompdf/www/test/images/bmp/test16.png new file mode 100644 index 00000000..32a1cb30 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test16.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test16bf555.bmp b/application/third_party/dompdf/www/test/images/bmp/test16bf555.bmp new file mode 100644 index 00000000..639a57f8 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test16bf555.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test16bf555.png b/application/third_party/dompdf/www/test/images/bmp/test16bf555.png new file mode 100644 index 00000000..32a1cb30 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test16bf555.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test16bf565.bmp b/application/third_party/dompdf/www/test/images/bmp/test16bf565.bmp new file mode 100644 index 00000000..cb0ea24f Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test16bf565.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test16bf565.png b/application/third_party/dompdf/www/test/images/bmp/test16bf565.png new file mode 100644 index 00000000..62237907 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test16bf565.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test24.bmp b/application/third_party/dompdf/www/test/images/bmp/test24.bmp new file mode 100644 index 00000000..d6d9e6af Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test24.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test24.png b/application/third_party/dompdf/www/test/images/bmp/test24.png new file mode 100644 index 00000000..46211a8c Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test24.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test32.bmp b/application/third_party/dompdf/www/test/images/bmp/test32.bmp new file mode 100644 index 00000000..9524f765 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test32.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test32.png b/application/third_party/dompdf/www/test/images/bmp/test32.png new file mode 100644 index 00000000..46211a8c Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test32.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test32bf.bmp b/application/third_party/dompdf/www/test/images/bmp/test32bf.bmp new file mode 100644 index 00000000..0f41534e Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test32bf.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test32bf.png b/application/third_party/dompdf/www/test/images/bmp/test32bf.png new file mode 100644 index 00000000..46211a8c Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test32bf.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test32bfv4.bmp b/application/third_party/dompdf/www/test/images/bmp/test32bfv4.bmp new file mode 100644 index 00000000..37060373 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test32bfv4.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test32bfv4.png b/application/third_party/dompdf/www/test/images/bmp/test32bfv4.png new file mode 100644 index 00000000..0525bc74 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test32bfv4.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test32v5.bmp b/application/third_party/dompdf/www/test/images/bmp/test32v5.bmp new file mode 100644 index 00000000..8ad3cfa6 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test32v5.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test32v5.png b/application/third_party/dompdf/www/test/images/bmp/test32v5.png new file mode 100644 index 00000000..659164e8 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test32v5.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test4.bmp b/application/third_party/dompdf/www/test/images/bmp/test4.bmp new file mode 100644 index 00000000..a064f66a Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test4.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test4.png b/application/third_party/dompdf/www/test/images/bmp/test4.png new file mode 100644 index 00000000..29f1c343 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test4.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test4os2v2.bmp b/application/third_party/dompdf/www/test/images/bmp/test4os2v2.bmp new file mode 100644 index 00000000..874a277f Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test4os2v2.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test4os2v2.png b/application/third_party/dompdf/www/test/images/bmp/test4os2v2.png new file mode 100644 index 00000000..a939a515 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test4os2v2.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test8.bmp b/application/third_party/dompdf/www/test/images/bmp/test8.bmp new file mode 100644 index 00000000..3be9a206 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test8.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test8.png b/application/third_party/dompdf/www/test/images/bmp/test8.png new file mode 100644 index 00000000..47870313 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test8.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test8os2.bmp b/application/third_party/dompdf/www/test/images/bmp/test8os2.bmp new file mode 100644 index 00000000..f7f9f579 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test8os2.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/test8os2.png b/application/third_party/dompdf/www/test/images/bmp/test8os2.png new file mode 100644 index 00000000..47870313 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/test8os2.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/testcompress4.bmp b/application/third_party/dompdf/www/test/images/bmp/testcompress4.bmp new file mode 100644 index 00000000..7239fa66 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/testcompress4.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/testcompress4.png b/application/third_party/dompdf/www/test/images/bmp/testcompress4.png new file mode 100644 index 00000000..29f1c343 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/testcompress4.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/testcompress8.bmp b/application/third_party/dompdf/www/test/images/bmp/testcompress8.bmp new file mode 100644 index 00000000..082f7f48 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/testcompress8.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/testcompress8.png b/application/third_party/dompdf/www/test/images/bmp/testcompress8.png new file mode 100644 index 00000000..47870313 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/testcompress8.png differ diff --git a/application/third_party/dompdf/www/test/images/bmp/trans.bmp b/application/third_party/dompdf/www/test/images/bmp/trans.bmp new file mode 100644 index 00000000..edd5ed81 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/trans.bmp differ diff --git a/application/third_party/dompdf/www/test/images/bmp/trans.png b/application/third_party/dompdf/www/test/images/bmp/trans.png new file mode 100644 index 00000000..653d44af Binary files /dev/null and b/application/third_party/dompdf/www/test/images/bmp/trans.png differ diff --git a/application/third_party/dompdf/www/test/images/cmyk_test2.jpg b/application/third_party/dompdf/www/test/images/cmyk_test2.jpg new file mode 100644 index 00000000..9b982295 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/cmyk_test2.jpg differ diff --git a/application/third_party/dompdf/www/test/images/dokuwiki-128.png b/application/third_party/dompdf/www/test/images/dokuwiki-128.png new file mode 100644 index 00000000..b2306ac9 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/dokuwiki-128.png differ diff --git a/application/third_party/dompdf/www/test/images/dompdf_simple.png b/application/third_party/dompdf/www/test/images/dompdf_simple.png new file mode 100644 index 00000000..fd3265e5 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/dompdf_simple.png differ diff --git a/application/third_party/dompdf/www/test/images/goldengate.jpg b/application/third_party/dompdf/www/test/images/goldengate.jpg new file mode 100644 index 00000000..42802744 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/goldengate.jpg differ diff --git a/application/third_party/dompdf/www/test/images/green.gif b/application/third_party/dompdf/www/test/images/green.gif new file mode 100644 index 00000000..151a83c0 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/green.gif differ diff --git a/application/third_party/dompdf/www/test/images/html.png b/application/third_party/dompdf/www/test/images/html.png new file mode 100644 index 00000000..672cbce4 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/html.png differ diff --git a/application/third_party/dompdf/www/test/images/pdf.png b/application/third_party/dompdf/www/test/images/pdf.png new file mode 100644 index 00000000..638066de Binary files /dev/null and b/application/third_party/dompdf/www/test/images/pdf.png differ diff --git a/application/third_party/dompdf/www/test/images/php.gif b/application/third_party/dompdf/www/test/images/php.gif new file mode 100644 index 00000000..f352c730 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/php.gif differ diff --git a/application/third_party/dompdf/www/test/images/png.png b/application/third_party/dompdf/www/test/images/png.png new file mode 100644 index 00000000..f0b5b00e Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png.png differ diff --git a/application/third_party/dompdf/www/test/images/png/gray16a.png b/application/third_party/dompdf/www/test/images/png/gray16a.png new file mode 100644 index 00000000..946006b1 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/gray16a.png differ diff --git a/application/third_party/dompdf/www/test/images/png/gray16a_bk.png b/application/third_party/dompdf/www/test/images/png/gray16a_bk.png new file mode 100644 index 00000000..afbb9c86 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/gray16a_bk.png differ diff --git a/application/third_party/dompdf/www/test/images/png/gray16b.png b/application/third_party/dompdf/www/test/images/png/gray16b.png new file mode 100644 index 00000000..46aca9ce Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/gray16b.png differ diff --git a/application/third_party/dompdf/www/test/images/png/gray16b_bk.png b/application/third_party/dompdf/www/test/images/png/gray16b_bk.png new file mode 100644 index 00000000..67977083 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/gray16b_bk.png differ diff --git a/application/third_party/dompdf/www/test/images/png/gray8a.png b/application/third_party/dompdf/www/test/images/png/gray8a.png new file mode 100644 index 00000000..df7cefcd Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/gray8a.png differ diff --git a/application/third_party/dompdf/www/test/images/png/gray8a_bk.png b/application/third_party/dompdf/www/test/images/png/gray8a_bk.png new file mode 100644 index 00000000..fcb8483a Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/gray8a_bk.png differ diff --git a/application/third_party/dompdf/www/test/images/png/gray8b.png b/application/third_party/dompdf/www/test/images/png/gray8b.png new file mode 100644 index 00000000..9ad1ab25 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/gray8b.png differ diff --git a/application/third_party/dompdf/www/test/images/png/gray8b_bk.png b/application/third_party/dompdf/www/test/images/png/gray8b_bk.png new file mode 100644 index 00000000..ca246e81 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/gray8b_bk.png differ diff --git a/application/third_party/dompdf/www/test/images/png/pal.png b/application/third_party/dompdf/www/test/images/png/pal.png new file mode 100644 index 00000000..7fec549c Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/pal.png differ diff --git a/application/third_party/dompdf/www/test/images/png/pal_bk.png b/application/third_party/dompdf/www/test/images/png/pal_bk.png new file mode 100644 index 00000000..1923b038 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/pal_bk.png differ diff --git a/application/third_party/dompdf/www/test/images/png/pal_bk_notrns.png b/application/third_party/dompdf/www/test/images/png/pal_bk_notrns.png new file mode 100644 index 00000000..b89efae6 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/pal_bk_notrns.png differ diff --git a/application/third_party/dompdf/www/test/images/png/palb.png b/application/third_party/dompdf/www/test/images/png/palb.png new file mode 100644 index 00000000..65a8351c Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/palb.png differ diff --git a/application/third_party/dompdf/www/test/images/png/result_16ns.gif b/application/third_party/dompdf/www/test/images/png/result_16ns.gif new file mode 100644 index 00000000..55c4a396 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_16ns.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_1trns.gif b/application/third_party/dompdf/www/test/images/png/result_1trns.gif new file mode 100644 index 00000000..8a981309 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_1trns.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_bla.gif b/application/third_party/dompdf/www/test/images/png/result_bla.gif new file mode 100644 index 00000000..c29b13f5 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_bla.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_dith.gif b/application/third_party/dompdf/www/test/images/png/result_dith.gif new file mode 100644 index 00000000..b76f4847 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_dith.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_gra.gif b/application/third_party/dompdf/www/test/images/png/result_gra.gif new file mode 100644 index 00000000..fb348ff9 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_gra.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_mag.gif b/application/third_party/dompdf/www/test/images/png/result_mag.gif new file mode 100644 index 00000000..fa72b527 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_mag.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_magthr1.gif b/application/third_party/dompdf/www/test/images/png/result_magthr1.gif new file mode 100644 index 00000000..478250fd Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_magthr1.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_no.gif b/application/third_party/dompdf/www/test/images/png/result_no.gif new file mode 100644 index 00000000..e64739a4 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_no.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_nsbug.gif b/application/third_party/dompdf/www/test/images/png/result_nsbug.gif new file mode 100644 index 00000000..52a87b3f Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_nsbug.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_ok.gif b/application/third_party/dompdf/www/test/images/png/result_ok.gif new file mode 100644 index 00000000..f8699883 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_ok.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_oprbug.gif b/application/third_party/dompdf/www/test/images/png/result_oprbug.gif new file mode 100644 index 00000000..5fac687a Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_oprbug.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_thr1.gif b/application/third_party/dompdf/www/test/images/png/result_thr1.gif new file mode 100644 index 00000000..66ee0f62 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_thr1.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_thr128.gif b/application/third_party/dompdf/www/test/images/png/result_thr128.gif new file mode 100644 index 00000000..998fb74e Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_thr128.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_thr255.gif b/application/third_party/dompdf/www/test/images/png/result_thr255.gif new file mode 100644 index 00000000..a7b719ce Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_thr255.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_whi.gif b/application/third_party/dompdf/www/test/images/png/result_whi.gif new file mode 100644 index 00000000..74ddabc0 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_whi.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_yel.gif b/application/third_party/dompdf/www/test/images/png/result_yel.gif new file mode 100644 index 00000000..681d0883 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_yel.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/result_yelthr1.gif b/application/third_party/dompdf/www/test/images/png/result_yelthr1.gif new file mode 100644 index 00000000..6049157b Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/result_yelthr1.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultb_bla.gif b/application/third_party/dompdf/www/test/images/png/resultb_bla.gif new file mode 100644 index 00000000..bcbd4d96 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultb_bla.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultb_bug.gif b/application/third_party/dompdf/www/test/images/png/resultb_bug.gif new file mode 100644 index 00000000..3789f2b0 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultb_bug.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultb_mag.gif b/application/third_party/dompdf/www/test/images/png/resultb_mag.gif new file mode 100644 index 00000000..f051aa46 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultb_mag.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultb_moz2.gif b/application/third_party/dompdf/www/test/images/png/resultb_moz2.gif new file mode 100644 index 00000000..312f7345 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultb_moz2.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultb_no.gif b/application/third_party/dompdf/www/test/images/png/resultb_no.gif new file mode 100644 index 00000000..9cb7801e Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultb_no.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultb_ok.gif b/application/third_party/dompdf/www/test/images/png/resultb_ok.gif new file mode 100644 index 00000000..23981255 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultb_ok.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultb_whi.gif b/application/third_party/dompdf/www/test/images/png/resultb_whi.gif new file mode 100644 index 00000000..a21af08b Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultb_whi.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultb_yel.gif b/application/third_party/dompdf/www/test/images/png/resultb_yel.gif new file mode 100644 index 00000000..969db3d1 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultb_yel.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultg_bla.gif b/application/third_party/dompdf/www/test/images/png/resultg_bla.gif new file mode 100644 index 00000000..c4ecc4e0 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultg_bla.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultg_dgr.gif b/application/third_party/dompdf/www/test/images/png/resultg_dgr.gif new file mode 100644 index 00000000..17fbb6c8 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultg_dgr.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultg_lgr.gif b/application/third_party/dompdf/www/test/images/png/resultg_lgr.gif new file mode 100644 index 00000000..68914a2f Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultg_lgr.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultg_no.gif b/application/third_party/dompdf/www/test/images/png/resultg_no.gif new file mode 100644 index 00000000..3e3619a0 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultg_no.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultga.gif b/application/third_party/dompdf/www/test/images/png/resultga.gif new file mode 100644 index 00000000..33ce2f88 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultga.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultgb.gif b/application/third_party/dompdf/www/test/images/png/resultgb.gif new file mode 100644 index 00000000..76ecb545 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultgb.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultgb_dgr.gif b/application/third_party/dompdf/www/test/images/png/resultgb_dgr.gif new file mode 100644 index 00000000..06413c53 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultgb_dgr.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultgb_no.gif b/application/third_party/dompdf/www/test/images/png/resultgb_no.gif new file mode 100644 index 00000000..a2453e42 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultgb_no.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/resultpb_no.gif b/application/third_party/dompdf/www/test/images/png/resultpb_no.gif new file mode 100644 index 00000000..72e61f8c Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/resultpb_no.gif differ diff --git a/application/third_party/dompdf/www/test/images/png/rgb16_t.png b/application/third_party/dompdf/www/test/images/png/rgb16_t.png new file mode 100644 index 00000000..37682e9b Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/rgb16_t.png differ diff --git a/application/third_party/dompdf/www/test/images/png/rgb16_t_bk.png b/application/third_party/dompdf/www/test/images/png/rgb16_t_bk.png new file mode 100644 index 00000000..0505b2f6 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/rgb16_t_bk.png differ diff --git a/application/third_party/dompdf/www/test/images/png/rgb8_t.png b/application/third_party/dompdf/www/test/images/png/rgb8_t.png new file mode 100644 index 00000000..3fd10c85 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/rgb8_t.png differ diff --git a/application/third_party/dompdf/www/test/images/png/rgb8_t_bk.png b/application/third_party/dompdf/www/test/images/png/rgb8_t_bk.png new file mode 100644 index 00000000..89ce912b Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/rgb8_t_bk.png differ diff --git a/application/third_party/dompdf/www/test/images/png/rgba16.png b/application/third_party/dompdf/www/test/images/png/rgba16.png new file mode 100644 index 00000000..8a10587c Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/rgba16.png differ diff --git a/application/third_party/dompdf/www/test/images/png/rgba16_bk.png b/application/third_party/dompdf/www/test/images/png/rgba16_bk.png new file mode 100644 index 00000000..05a6db1e Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/rgba16_bk.png differ diff --git a/application/third_party/dompdf/www/test/images/png/rgba8.png b/application/third_party/dompdf/www/test/images/png/rgba8.png new file mode 100644 index 00000000..495d8c32 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/rgba8.png differ diff --git a/application/third_party/dompdf/www/test/images/png/rgba8_bk.png b/application/third_party/dompdf/www/test/images/png/rgba8_bk.png new file mode 100644 index 00000000..10a1ee50 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/png/rgba8_bk.png differ diff --git a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-desc.gif b/application/third_party/dompdf/www/test/images/png/stripe.gif similarity index 60% rename from app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-desc.gif rename to application/third_party/dompdf/www/test/images/png/stripe.gif index f26b7c2f..e3fa3b33 100644 Binary files a/app/resources/appunto-auth/theme/appunto-auth/images/grid/hmenu-desc.gif and b/application/third_party/dompdf/www/test/images/png/stripe.gif differ diff --git a/application/third_party/dompdf/www/test/images/smiley.png b/application/third_party/dompdf/www/test/images/smiley.png new file mode 100644 index 00000000..f5d3a0a9 Binary files /dev/null and b/application/third_party/dompdf/www/test/images/smiley.png differ diff --git a/application/third_party/dompdf/www/test/images/what_ordered.gif b/application/third_party/dompdf/www/test/images/what_ordered.gif new file mode 100644 index 00000000..63de445a Binary files /dev/null and b/application/third_party/dompdf/www/test/images/what_ordered.gif differ diff --git a/application/third_party/dompdf/www/test/page_pages.html b/application/third_party/dompdf/www/test/page_pages.html new file mode 100644 index 00000000..a9f2fe02 --- /dev/null +++ b/application/third_party/dompdf/www/test/page_pages.html @@ -0,0 +1,201 @@ + + + + + + + + + +

    Lorem ipsum dolor sit amet

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.

    + +

    Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo +non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis +diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi +massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus +mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam +vel erat tempus purus molestie suscipit. Vestibulum odio lorem, +sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis +ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, +rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla +sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa +adipiscing lorem, bibendum luctus nisl tortor vitae leo.

    + +

    Etiam a mauris. Proin justo elit, accumsan sit amet, tempus et, +blandit id, tellus. Morbi varius, nisi id iaculis aliquam, lacus +ligula facilisis velit, ac pharetra ipsum augue a massa. Etiam rhoncus +commodo orci. Mauris ullamcorper sagittis turpis. Nullam magna libero, +sagittis sed, auctor faucibus, accumsan vitae, urna. Pellentesque +volutpat. Aliquam sapien ipsum, eleifend nec, imperdiet vitae, +consectetuer id, quam. Donec a urna. Suspendisse sit amet +velit. Curabitur quis nisi id dui viverra ornare. Sed condimentum enim +quis tortor. Ut condimentum, magna non tempus tincidunt, leo nibh +molestie tellus, vitae convallis dolor ante sed ante. Nunc et +metus. Phasellus ultricies. Fusce faucibus tortor sit amet mauris.

    + +

    Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque +volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit +amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed +felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, +eleifend in, porttitor in, malesuada non, neque. Etiam sed +augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer +adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, +nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem +malesuada facilisis. Vestibulum porta, metus sit amet egestas +interdum, urna justo euismod erat, id tristique urna leo quis +nibh. Morbi non erat.

    + +

    Cras fringilla, nulla id egestas elementum, augue nunc iaculis nibh, +ac adipiscing nibh justo id tortor. Donec vel orci a nisi ultricies +aliquet. Nunc urna quam, adipiscing molestie, vehicula non, +condimentum non, magna. Integer magna. Donec quam metus, pulvinar id, +suscipit eget, euismod ac, orci. Nulla facilisi. Nullam nec +mauris. Morbi in mi. Etiam urna lectus, pulvinar ac, sollicitudin eu, +euismod ac, lectus. Fusce elit. Sed ultricies odio ac felis.

    + +

    Cras iaculis. Nulla facilisi.

    +

    Cras iaculis. Nulla facilisi. Fusce vitae arcu. Integer lectus mauris, +ornare vel, accumsan eget, scelerisque vel, nunc. Maecenas justo urna, +volutpat vel, vehicula vel, ullamcorper nec, odio. Suspendisse laoreet +nisi sed erat. Cras convallis sollicitudin sapien. Phasellus ac erat +eu mi rutrum rhoncus. Morbi et velit. Morbi odio nisi, pharetra eget, +sollicitudin sed, aliquam at, nisl. Quisque euismod diam in +sapien. Integer accumsan urna in risus.

    + +

    Proin sit amet nisl. Phasellus dui ipsum, laoreet a, pulvinar id, +fringilla ut, libero. In hac habitasse platea dictumst. Maecenas mi +magna, cursus sed, rutrum eget, molestie nec, dui. Suspendisse +lacus. Vivamus nibh urna, accumsan sit amet, gravida sed, convallis a, +leo. Cras sollicitudin orci sit amet eros. Pellentesque eu odio et +velit tempor dignissim. Morbi vehicula malesuada enim. Pellentesque +tincidunt, tellus ac fringilla tempor, justo libero interdum nunc, eu +sollicitudin tortor augue nec tellus. Nullam eget leo quis tellus +gravida faucibus. Nam gravida. Curabitur rhoncus egestas +nunc. Curabitur mollis, nisi sed suscipit gravida, enim felis interdum +justo, vel accumsan magna nunc ut libero. Ut fermentum. Fusce luctus, +est sit amet feugiat lobortis, nisl eros bibendum libero, ut suscipit +felis ligula in massa. Proin congue elit et nisi. Cras ac nisl. Nunc +ullamcorper neque vel diam.

    + +

    Ut pellentesque arcu ac lectus.

    +

    Sed ac lorem. Ut pellentesque arcu ac lectus. Cum sociis natoque +penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Pellentesque ultrices metus sollicitudin pede. Donec fermentum +est a velit fringilla mollis. Duis ligula. Fusce viverra laoreet +odio. Suspendisse sit amet ligula. Maecenas nunc velit, sagittis eu, +bibendum eu, placerat at, nibh. Praesent ut erat eget nisi gravida +imperdiet. Quisque vitae sapien. Ut eros.

    + +

    Donec eros ligula, dignissim vel, ultricies id, mattis in, massa. Duis +lobortis dui nec orci. Sed ullamcorper metus non massa. Aliquam eget +mauris ac nulla elementum posuere. Sed porta, augue vitae rhoncus +aliquet, felis quam eleifend est, vitae rutrum metus arcu vel +lorem. Proin laoreet, mauris sit amet aliquet eleifend, nisl sem +molestie nisi, eu varius eros ligula non erat. Integer ac +sem. Suspendisse lectus. Aliquam erat volutpat. Fusce sit amet leo +faucibus erat molestie ultrices. Maecenas lacinia lectus eget +dui. Etiam porta porttitor ante. Phasellus sit amet lacus adipiscing +enim mollis iaculis. Fusce congue, nulla a commodo aliquam, erat dui +fermentum dui, pellentesque faucibus orci enim at mauris. Pellentesque +a diam porta magna tempor posuere. Donec lorem.

    + +

    Sed viverra aliquam turpis. Aliquam lacus. Duis id massa. Nullam +ante. Suspendisse condimentum. Donec adipiscing, felis vel semper +sollicitudin, lacus justo pretium est, sed blandit pede risus eu +ante. Praesent ante nulla, fringilla id, ultrices et, feugiat a, +metus. Proin ac velit a metus suscipit fermentum. Integer aliquet. Sed +sapien nulla, placerat at, rutrum at, condimentum quis, libero. In +accumsan, tellus nec tincidunt malesuada, pede arcu commodo ipsum, ac +mattis tortor urna vitae enim. Aenean nonummy, mauris eget commodo +bibendum, augue sem ultrices nunc, eget rhoncus metus erat placerat +lectus. Aliquam mollis lectus in justo. Vivamus iaculis lacus sit amet +ligula. Etiam consectetuer convallis diam. Curabitur sollicitudin, +felis eu vehicula scelerisque, nisl urna aliquam orci, sit amet +laoreet mi turpis id ligula. Donec at enim non nulla adipiscing +dapibus. Aenean nisl.

    + +

    Ut in lacus nec enim volutpat pellentesque. Integer euismod. In odio +eros, malesuada in, mattis vel, tempor nec, sem. In libero tellus, +varius vitae, bibendum in, elementum quis, nisl. Duis tortor. Etiam at +justo. Pellentesque facilisis mauris non nunc. Praesent eros mi, +dapibus eget, placerat ac, lobortis quis, sem. Nulla rhoncus +turpis. Nulla vitae mi. Proin id massa. Nunc eros.

    + +

    Aliquam molestie pulvinar ligula.

    +

    Vestibulum dui risus, varius ut, semper et, consequat ultrices, +felis. Pellentesque iaculis urna in velit. Ut pharetra. Nunc +fringilla, nisi vitae fringilla placerat, enim justo semper erat, +mollis feugiat leo neque eu sem. Vestibulum orci urna, suscipit a, +accumsan nec, fringilla in, risus. Nullam ante. Nullam nec +eros. Nullam varius. Nulla facilisi. In auctor libero in +metus. Aliquam porttitor congue eros. Nulla facilisi. Mauris euismod +turpis ut felis. Ut nunc nisl, cursus quis, eleifend at, viverra +bibendum, lacus. Donec consequat lacus eu sapien. Fusce pulvinar +lectus quis nunc. In hac habitasse platea dictumst.

    + +

    Aliquam molestie pulvinar ligula. Maecenas imperdiet, urna eget +ultrices adipiscing, nibh ante elementum neque, id molestie massa quam +ut nunc. Nullam porta. Phasellus a magna in sem volutpat +viverra. Quisque aliquet nunc ac turpis. Mauris dolor enim, viverra +rutrum, placerat et, laoreet et, justo. In id nulla. Donec +erat. Phasellus nec mi sed velit mollis cursus. Vestibulum +tincidunt. Praesent dui libero, facilisis eu, vulputate eget, aliquet +nec, ipsum. Pellentesque in nisl in mauris pretium euismod.

    + + diff --git a/application/third_party/dompdf/www/test/quirks_center_table.html b/application/third_party/dompdf/www/test/quirks_center_table.html new file mode 100644 index 00000000..d0a45366 --- /dev/null +++ b/application/third_party/dompdf/www/test/quirks_center_table.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + +
    ab
    cd
    + + + diff --git a/application/third_party/dompdf/www/test/quirks_font_tag.html b/application/third_party/dompdf/www/test/quirks_font_tag.html new file mode 100644 index 00000000..6b0812f7 --- /dev/null +++ b/application/third_party/dompdf/www/test/quirks_font_tag.html @@ -0,0 +1,70 @@ + + + + + + + +

    Font tags with absolute size

    + +size=1 +size=2 +size=3 +size=4 +size=5 +size=6 +size=7 + +

    Span tags with absolute CSS size

    + +size=1 +size=2 +size=3 +size=4 +size=5 +size=6 +size=7 + +

    Font tags with relative size

    + +size=-4 +size=-3 +size=-2 +size=-1 +size=+1 +size=+2 +size=+3 +size=+4 + +

    Span tags with relative CSS size

    + +size=-4 +size=-3 +size=-2 +size=-1 +size=+1 +size=+2 +size=+3 +size=+4 + +

    Nested font tags

    + +size=2 + size=4 + size=2 + size=4 + size=2 + size=4 + size=2 + size=4 + + + + + + + + + + + diff --git a/application/third_party/dompdf/www/test/quirks_html_attributes.html b/application/third_party/dompdf/www/test/quirks_html_attributes.html new file mode 100644 index 00000000..efb6b264 --- /dev/null +++ b/application/third_party/dompdf/www/test/quirks_html_attributes.html @@ -0,0 +1,55 @@ + + + + + + +
    + +Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet +doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit +amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt +ut laoreet dolore magna aliquam erat volutpat.
    +Ut wisi enim ad minim veniam, +quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex +ea commodo consequat. + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper + suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem + vel eum iriure dolor in hendrerit in vulputate velit esse molestie + consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et + accumsan et iusto odio dignissim qui blandit praesent luptatum zzril + delenit augue duis dolore te feugait nulla facilisi.table testLorem ipsum dolor sit amet, consetetur sadipscing elitr, + sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua.Duis autem vel eum iriure dolor in hendrerit in + vulputate velit esse molestie consequat, vel illum dolore eu feugiat + nulla facilisis at vero eros et accumsan et iusto odio dignissim qui + blandit praesent luptatum zzril delenit augue duis dolore te feugait + nulla facilisi.
    table testNam liber tempor cum soluta nobis eleifend option congue nihil + imperdiet doming id quod mazim placerat facer possim assum.
    + Lorem ipsum dolor sit amet.
    table testtable test
    table testtable testtable testtable test
    + + + diff --git a/application/third_party/dompdf/www/test/script_javascript.html b/application/third_party/dompdf/www/test/script_javascript.html new file mode 100644 index 00000000..84efb467 --- /dev/null +++ b/application/third_party/dompdf/www/test/script_javascript.html @@ -0,0 +1,24 @@ + + + + Javascript test + + + + +This page will be printed automatically + +

    A title

    + + + + + diff --git a/application/third_party/dompdf/www/test/script_php.php b/application/third_party/dompdf/www/test/script_php.php new file mode 100644 index 00000000..ad75b6ed --- /dev/null +++ b/application/third_party/dompdf/www/test/script_php.php @@ -0,0 +1,28 @@ + + + + + + + + + +Here's some dynamically generated text and some random circles...

    "; +?> + + +Current PHP version: " . phpversion() . ". "; +echo "Today is " . strftime("%A") . " the " . strftime("%e").date("S").strftime(" of %B, %Y %T") . "

    "; + +?> + diff --git a/application/views/AddPOLineItem.php b/application/views/AddPOLineItem.php new file mode 100644 index 00000000..1f19c7ad --- /dev/null +++ b/application/views/AddPOLineItem.php @@ -0,0 +1,145 @@ + + +
    + +
    +

    + Add Purchase order Line Item +

    +
    + +
    + +
    + +
    + +
    +
    +

    Enter PO Line Item

    +
    + + +
    +
    +
    +
    + +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + + + +
    +
    +
    + load->helper('form'); + $error = $this->session->flashdata('error'); + if($error) + { + ?> +
    + + session->flashdata('error'); ?> +
    + + session->flashdata('success'); + if($success) + { + ?> +
    + + session->flashdata('success'); ?> +
    + + +
    +
    + ', '
    '); ?> +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/application/views/EditPurchaseOrder.php b/application/views/EditPurchaseOrder.php new file mode 100644 index 00000000..8f1d6f17 --- /dev/null +++ b/application/views/EditPurchaseOrder.php @@ -0,0 +1,456 @@ +PONO; + $POType = $PO->POType; + $PODate = $PO->PODate; + $SupplierName = $PO->SupplierName; + $SpecialOrder = $PO->SpecialOrder; + $Username = $PO->usrName; + $RequesterEmail =$PO->RequesterEmail; + $RequesterPh = $PO->RequesterPh; + $RequestedDate = $PO->RequestedDate; + $BudgetManager= $PO->BudgetManager; + $BudgetManagerDepartment = $PO->BudgetManagerDepartment; + $PurchasingCategory = $PO->PurchasingCategory; + $PurchasingJustification = $PO->PurchasingJustification; + $OrderValue = $PO->OrderValue; + $DiscountType= $PO->DiscountType; + $DiscountValue= $PO->DiscountValue; + $PackagingType = $PO->PackagingType; + $PackagingValue= $PO->PackagingValue; + $ExciseDuty= $PO->ExciseDuty; + $Vat = $PO->Vat; + $Freight = $PO->Freight; + $Address = $PO->Address; + $BasicValue = $PO->basicvalue; + $AfterDiscount = $PO->AfterDiscount; + $AfterPackaging = $PO->AfterPackaging; + $AferExciseduty = $PO->AfterExciseduty; + $txtAfterVat = $PO->AfterVat; + } +} + + +?> +
    + +
    +
    +

    Purchase Order -

    +
    + +
    + +
    + +
    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + +
    + +
    + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    + + + +
    +
    + +
    +
    + +
    + +
    Purchase Order Line Item :
    +
    +
    + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Product DescriptionUOMQuantityUnit PriceProduct Amount
    materialName?>UOM ?>Quantity ?>UnitPrice ?>ProductPrice ?>
    +
    + +
    + +
    +
     
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    + +
    +
     
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    + +
    +
     
    +
    +
    + +
    +
    + +
    + +
    +
     
    +
    +
    + +
    +
    + +
    + +
    +
     
    +
    +
    + +
    +
    + +
    + +
    +
     
    +
    +
    + +
    +
    + +
    + +
    +
     
    +
    +
    + +
    +
    + +
    + +
    +
     
    +
    +
    + +
    +
    + +
    + +
    +
     
    +
    +
    + +
    +
    +
    +
    + + + + + +
    +
    + load->helper('form'); + $error = $this->session->flashdata('error'); + if($error) + { + ?> +
    + + session->flashdata('error'); ?> +
    + + session->flashdata('success'); + if($success) + { + ?> +
    + + session->flashdata('success'); ?> +
    + + +
    +
    + ', '
    '); ?> +
    +
    +
    +
    +
    +
    + + +
    + + \ No newline at end of file diff --git a/application/views/POlist.php b/application/views/POlist.php index c5f90e6f..bc1116aa 100644 --- a/application/views/POlist.php +++ b/application/views/POlist.php @@ -1,9 +1,10 @@
    -
    -

    PO ListAdd, Edit, Delete

    -
    +

    + Purchase Order + +

    @@ -17,7 +18,7 @@
    -

    PO List

    +

    Purchase Order

    @@ -30,21 +31,21 @@
    - - - - - - - - - - - - - - - +
    PONOPO TypePO DateSupplierIDSpecialOrderRoleRequesterEmailRequesterPhRequesterDateBudgetManagerBudgetManagerDepartmentPurchasingCategory
    + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + +
    PO NOPO TypePO DateSupplier NameBudget ManagerBudget Manager DepartmentEdit
    PONO ?>POType ?>PODate ?>SupplierID ?>SpecialOrder ?>UserID ?>RequesterEmail ?>RequesterPh ?>RequestedDate ?>BudgetManager ?>BudgetManagerDepartment ?>PurchasingCategory ?>
    PONO ?>POType ?>PODate ?>SupplierID ?>BudgetManager ?>BudgetManagerDepartment ?>     @@ -92,7 +93,7 @@ e.preventDefault(); var link = jQuery(this).get(0).href; var value = link.substring(link.lastIndexOf('/') + 1); - jQuery("#searchList").attr("action", baseURL + "userListing/" + value); + jQuery("#searchList").attr("action", baseURL + "purchaseorderListing/" + value); jQuery("#searchList").submit(); }); }); diff --git a/application/views/ViewPurchaseOrder.php b/application/views/ViewPurchaseOrder.php new file mode 100644 index 00000000..e69de29b diff --git a/application/views/addNew.php b/application/views/addNew.php index e2ed8f81..e8662662 100644 --- a/application/views/addNew.php +++ b/application/views/addNew.php @@ -2,23 +2,27 @@

    - User Management - Add / Edit User +
    User Management
    +

    +
    - +
    + Back +
    +
    -
    +
    -

    Enter User Details

    +

    Enter User Details

    @@ -57,7 +61,7 @@
    - +
    @@ -82,7 +86,7 @@
    - -
    - + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/addRawMaterial.php b/application/views/addRawMaterial.php new file mode 100644 index 00000000..4131cb33 --- /dev/null +++ b/application/views/addRawMaterial.php @@ -0,0 +1,132 @@ +
    + +
    +

    +
    Add Raw Material
    + +

    + +
    + +
    +
    + Back +
    +
    +
    + +
    + + + + +
    +
    +

    Enter Raw Material Details

    +
    + + +
    +
    +
    + + + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + + +
    +
    + + +
    +
    +
    +
    + load->helper('form'); + $error = $this->session->flashdata('error'); + if($error) + { + ?> +
    + + session->flashdata('error'); ?> +
    + + session->flashdata('success'); + if($success) + { + ?> +
    + + session->flashdata('success'); ?> +
    + + +
    +
    + ', '
    '); ?> +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/Not working Asset code/addasset.php b/application/views/addasset.php similarity index 54% rename from Not working Asset code/addasset.php rename to application/views/addasset.php index 2b03530b..4ba22cf0 100644 --- a/Not working Asset code/addasset.php +++ b/application/views/addasset.php @@ -2,31 +2,33 @@

    - Purchase Order - +
    Asset Details
    +

    - +
    + Back +
    +
    -
    +
    -

    Asset Details

    +

    Add Asset Details

    -
    +
    -
    + +
    - - + +
    -
    -
    + +
    +
    +
    + + +
    +
    + +
    +
    @@ -55,19 +67,37 @@ echo "Today is " . date("Y/m/d") ?>
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    - - + - +
    +
    + +
    + + max= value="" class="form-control" placeholder="" /> +
    +
    +
    - - + + max= value="" class="form-control" placeholder="" /> + +
    +
    +
    +
    + +
    - - + + max= value="" class="form-control" placeholder="" />
    -
    - -
    - -
    +
    - - + + max= value="" class="form-control" placeholder="" />
    - -
    -
    - - -
    -
    - - - -
    -
    - - -
    -
    -
    -
    - - max= value="" class="form-control" placeholder="" /> -
    -
    - -
    -
    - - -
    - -
    -
    -
    - - -
    -
    -
    -
    - - -
    - -
    -
    - diff --git a/application/views/addcost.php b/application/views/addcost.php index f2eb97f9..9cd17188 100644 --- a/application/views/addcost.php +++ b/application/views/addcost.php @@ -2,27 +2,32 @@

    - Cost List - Add / Edit SupplierDetails +
    Cost List
    +

    +
    +
    + Back +
    +
    -
    +
    -

    Enter Cost Details

    +

    Add Cost Details

    -
    +
    - diff --git a/application/views/addemployee.php b/application/views/addemployee.php new file mode 100644 index 00000000..65299da5 --- /dev/null +++ b/application/views/addemployee.php @@ -0,0 +1,202 @@ +
    + +
    +

    +
    EMPLOYEE DETAILS
    + +

    + +
    + +
    +
    + Back +
    +
    +
    + +
    + + + + +
    +
    +

    Enter Employee Details

    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + + + + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    +
    + load->helper('form'); + $error = $this->session->flashdata('error'); + if($error) + { + ?> +
    + + session->flashdata('error'); ?> +
    + + session->flashdata('success'); + if($success) + { + ?> +
    + + session->flashdata('success'); ?> +
    + + +
    +
    + ', '
    '); ?> +
    +
    +
    +
    +
    + +
    + \ No newline at end of file diff --git a/application/views/addsupplier.php b/application/views/addsupplier.php index 7bfda86c..4c3e2382 100644 --- a/application/views/addsupplier.php +++ b/application/views/addsupplier.php @@ -2,32 +2,36 @@

    - Supplier List - Add / Edit SupplierDetails +
    SUPPLIER LIST
    +

    +
    - +
    + Back +
    +
    -
    +
    -

    Enter Supplier Details

    +

    Add Supplier Details

    -
    +
    - +
    @@ -35,21 +39,21 @@
    - +
    - - + +
    - - + +
    @@ -58,28 +62,28 @@
    - +
    - +
    -
    +
    - +
    - diff --git a/application/views/assetListing.php b/application/views/assetListing.php new file mode 100644 index 00000000..54c72cd8 --- /dev/null +++ b/application/views/assetListing.php @@ -0,0 +1,101 @@ +
    + +
    +

    +
    ASSET LIST
    + +

    +
    +
    +
    +
    +
    + AddNew +
    +
    +
    +
    +
    +
    +
    +

    Asset List

    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Asset CodeAsset NameDescriptionDepartmentLocationAsset OwnerSupplier NameDate Of PurchaseSupport FromSupport ToCreate DateEdit
    Asset_Code ?>Asset_Name ?>Description ?>Department ?>Location ?>AssetOwner ?>SupplierName ?>DateOfPurchase ?>SupportFrom ?>SupportTo ?>CreatedDate ?> +     +     + +
    + +
    + +
    +
    +
    +
    +
    + + diff --git a/application/views/costListing.php b/application/views/costListing.php index 7733f667..d6918ca4 100644 --- a/application/views/costListing.php +++ b/application/views/costListing.php @@ -2,15 +2,15 @@

    - Cost List - Add, Edit, Delete +
    COST LIST
    +

    @@ -18,7 +18,7 @@
    -

    Cost List

    +

    Cost List

    @@ -33,10 +33,11 @@
    - - + + - + + @@ -56,7 +57,9 @@ PONO; + $POType = $PO->POType; + $PODate = $PO->PODate; + $SupplierName = $PO->SupplierName; + $SpecialOrder = $PO->SpecialOrder; + $Username = $PO->name; + $RequesterEmail =$PO->RequesterEmail; + $RequesterPh = $PO->RequesterPh; + $RequestedDate = $PO->RequestedDate; + $BudgetManager= $PO->BudgetManager; + $BudgetManagerDepartment = $PO->BudgetManagerDepartment; + $PurchasingCategory = $PO->PurchasingCategory; + $PurchasingJustification = $PO->PurchasingJustification; + $OrderValue = $PO->OrderValue; + $DiscountType= $PO->DiscountType; + $DiscountValue= $PO->DiscountValue; + $PackagingType = $PO->PackagingType; + $PackagingValue= $PO->PackagingValue; + $ExciseDuty= $PO->ExciseDuty; + $Vat = $PO->Vat; + $Freight = $PO->Freight; + $Address = $PO->Address; + } +} + + +?> + +
    + +
    +

    +

    Siddharth Industries


    + Survey NO: 168/1C3,
    + Pennalur Pet Road, + Goonipalyam village,
    + Uthukottai Taluk, + Tiruvallur Dist,
    + Tamilnadu,Pin code : 602026.
    + Email: customersupport@sidharthindustries.com + +
    + +
    +
    +

    Purchase Order -

    +
    +
    +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    Purchase Order Line Item :
    +
    +
    CostCenterIDCostNameCost Center IDCost Name DescriptionCreateDateCreate DateAction     - +     + +
    + + + + + + + + + + + + + + + + + + ProductPrice; + } + } + ?> + + +
    Product DescriptionUOMQuantityUnit PriceProduct Amount
    materialName?>UOM ?>Quantity ?>UnitPrice ?>ProductPrice ?>
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + -- + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + -- + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + diff --git a/application/views/editOld.php b/application/views/editOld.php index 74c89f12..51c39e42 100644 --- a/application/views/editOld.php +++ b/application/views/editOld.php @@ -5,7 +5,7 @@ $name = ''; $email = ''; $mobile = ''; $roleId = ''; - +$isDeleted = ''; if(!empty($userInfo)) { foreach ($userInfo as $uf) @@ -15,6 +15,7 @@ if(!empty($userInfo)) $email = $uf->email; $mobile = $uf->mobile; $roleId = $uf->roleId; + $isDeleted = $uf->isDeleted; } } @@ -25,23 +26,27 @@ if(!empty($userInfo))

    - User Management - Add / Edit User +
    User Management
    +

    +
    - +
    + Back +
    +
    -
    +
    -

    Enter User Details

    +

    View User Details

    @@ -104,11 +109,14 @@ if(!empty($userInfo))
    + + +
    - diff --git a/application/views/editOldPO.php b/application/views/editOldPO.php index 330d4a22..41f5fd92 100644 --- a/application/views/editOldPO.php +++ b/application/views/editOldPO.php @@ -39,23 +39,26 @@ if(!empty($POInfo))

    - Purchase Order - Add / Edit User +
    Purchase Order
    +

    - +
    + Back +
    +
    -
    +
    -

    Enter PO Details

    +

    Edit Purchase Order Details

    @@ -63,7 +66,7 @@ if(!empty($POInfo))
    -
    +
    @@ -249,7 +252,8 @@ if(!empty($POInfo))
    -
    +
    +
    diff --git a/application/views/editOldRawmaterial.php b/application/views/editOldRawmaterial.php new file mode 100644 index 00000000..d7305bfe --- /dev/null +++ b/application/views/editOldRawmaterial.php @@ -0,0 +1,149 @@ +MaterialCode; + $MaterialName = $uf->MaterialName; + $MaterialType = $uf->MaterialType; + $SupplierID = $uf->SupplierID; + $CreatedDate = $uf->CreatedDate; + + } +} + + +?> + +
    + +
    +

    +
    RAW MATERIAL DETAILS
    + +

    +
    + +
    +
    + Back +
    +
    +
    + +
    + + + + +
    +
    +

    Edit Raw Material Details

    +
    + + +
    +
    +
    +
    +
    + + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + + +
    +
    + + +
    +
    +
    +
    + load->helper('form'); + $error = $this->session->flashdata('error'); + if($error) + { + ?> +
    + + session->flashdata('error'); ?> +
    + + session->flashdata('success'); + if($success) + { + ?> +
    + + session->flashdata('success'); ?> +
    + + +
    +
    + ', '
    '); ?> +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/application/views/editOldasset.php b/application/views/editOldasset.php new file mode 100644 index 00000000..3c3ed101 --- /dev/null +++ b/application/views/editOldasset.php @@ -0,0 +1,211 @@ +Asset_Code; + $Asset_Name = $uf->Asset_Name; + $Description = $uf->Description; + $Department = $uf->Department; + $Location = $uf->Location; + $AssetOwner = $uf->AssetOwner; + $SupplierName = $uf->SupplierName; + $DateOfPurchase = $uf->DateOfPurchase; + $DateOfCommission = $uf->DateOfCommission; + $SupportVendor = $uf->SupportVendor; + $SupportFrom = $uf->SupportFrom; + $SupportTo = $uf->SupportTo; + + } +} + + +?> + +
    + +
    +

    +
    Asset Details
    + +

    +
    + +
    +
    + Back +
    +
    +
    + +
    + + + + +
    +
    +

    Edit Asset Details

    +
    + + +
    +
    +
    +
    +
    +
    + + + + +
    +
    + +
    + +
    +
    +
    + + +
    +
    + +
    + + +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + +
    +
    +
    + +
    + + max= value="" class="form-control" placeholder="" /> +
    +
    + +
    +
    + + max= value="" class="form-control" placeholder="" /> + +
    +
    +
    +
    + + +
    +
    +
    +
    + + max= value="" class="form-control" placeholder="" /> +
    +
    +
    +
    + + max= value="" class="form-control" placeholder="" /> +
    +
    +
    +
    + + +
    +
    +
    +
    + load->helper('form'); + $error = $this->session->flashdata('error'); + if($error) + { + ?> +
    + + session->flashdata('error'); ?> +
    + + session->flashdata('success'); + if($success) + { + ?> +
    + + session->flashdata('success'); ?> +
    + + +
    +
    + ', '
    '); ?> +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/application/views/editOldcost.php b/application/views/editOldcost.php index 9a810382..1fa2956e 100644 --- a/application/views/editOldcost.php +++ b/application/views/editOldcost.php @@ -1,5 +1,7 @@ CostName; + $CostCentreID = $uf->CostCentreID; + $CostName = $uf->CostName; $Description = $uf->Description; } @@ -20,52 +23,58 @@ if(!empty($Cost))

    - Cost Center - Add / Edit Cost +
    Cost Center
    +

    - +
    + Back +
    +
    -
    +
    -

    Enter Cost Details

    +

    Edit Cost Details

    -
    +
    - - + + + +
    - +
    +
    - +
    - +
    diff --git a/application/views/editOldemployee.php b/application/views/editOldemployee.php new file mode 100644 index 00000000..eac0f87e --- /dev/null +++ b/application/views/editOldemployee.php @@ -0,0 +1,245 @@ +EmpID; + $FirstName = $uf->FirstName; + $LastName = $uf->LastName; + $DateofBirth = $uf->DateofBirth; + $ContactNumber = $uf->ContactNumber; + $EmailId = $uf->EmailId; + $DateofJoining = $uf->DateofJoining; + $Role = $uf->Role; + $Address1 = $uf->Address1; + $Address2 = $uf->Address2; + $Place = $uf->Place; + $City = $uf->City; + $State = $uf->State; + $Pin = $uf->Pin; + $DepartmentName = $uf->DepartmentName; + $User_Comments = $uf->User_Comments; + } +} + + +?> + +
    + +
    +

    +
    Employee details
    + + +

    + +
    + +
    +
    + Back +
    +
    +
    + +
    + + + + +
    +
    +

    Enter Employee Details

    +
    + + +
    +
    +
    +
    +
    + + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + + + + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    + + +
    + +
    +
    +
    + load->helper('form'); + $error = $this->session->flashdata('error'); + if($error) + { + ?> +
    + + session->flashdata('error'); ?> +
    + + session->flashdata('success'); + if($success) + { + ?> +
    + + session->flashdata('success'); ?> +
    + + +
    +
    + ', '
    '); ?> +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/application/views/editOldsupplier.php b/application/views/editOldsupplier.php index 4db17a41..a4945b7a 100644 --- a/application/views/editOldsupplier.php +++ b/application/views/editOldsupplier.php @@ -13,51 +13,62 @@ if(!empty($supplier)) { foreach ($supplier as $uf) { - $SupplierID = $uf->userId; - $SupplierName = $uf->name; - $Address = $uf->email; - $ContactNumber = $uf->mobile; - $AlternateContactNumber = $uf->roleId; - $EmailAddress = $uf->roleId; - $TIN = $uf->roleId; - $PAN = $uf->roleId; + $SupplierID = $uf->SupplierID; + $SupplierName = $uf->SupplierName; + $Address = $uf->Address; + $ContactNumber = $uf->ContactNumber; + $AlternateContactNumber = $uf->AlternateContactNumber; + $EmailAddress = $uf->EmailAddress; + $TIN = $uf->TIN; + $PAN = $uf->PAN; } } ?> +

    - Supplier Details - Add / Edit list +
    Supplier Details
    +

    - +
    + Back +
    +
    -
    +
    -

    Enter Supplier Details

    +

    Edit Supplier Details

    -
    +
    - + + +
    @@ -71,14 +82,16 @@ if(!empty($supplier))
    - - + +
    - - + +
    @@ -87,7 +100,7 @@ if(!empty($supplier))
    - +
    @@ -106,9 +119,9 @@ if(!empty($supplier))
    - diff --git a/application/views/employeeListing.php b/application/views/employeeListing.php new file mode 100644 index 00000000..4476f11f --- /dev/null +++ b/application/views/employeeListing.php @@ -0,0 +1,111 @@ +
    + +
    +

    +
    EMPLOYEE LIST
    + +

    +
    +
    +
    +
    +
    + AddNew +
    +
    +
    +
    +
    +
    +
    +

    Employee List

    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EmpIDFirst NameLast NameDate of BirthContact NumberEmail IdDate of JoiningRoleAddress1Address2PlaceCityStatePinDepartmentNameUser_CommentsEdit
    EmpID ?>FirstName ?>LastName ?>DateofBirth ?>ContactNumber ?>EmailId ?>DateofJoining ?>role ?>Address1 ?>Address2 ?>Place ?>City ?>State ?>Pin ?>DepartmentName ?>User_Comments ?> +     +     + +
    + +
    + +
    +
    +
    +
    +
    + + diff --git a/application/views/includes/footer.php b/application/views/includes/footer.php index b1f985b7..a6334683 100644 --- a/application/views/includes/footer.php +++ b/application/views/includes/footer.php @@ -2,9 +2,9 @@
    - Copyright © 2014-2015 Siddharth. All rights reserved. + Copyright © 2016-2017 Siddharth Industries. All rights reserved.
    @@ -25,5 +25,78 @@ y.addClass('active'); y.parent().addClass('active'); + + \ No newline at end of file diff --git a/application/views/includes/header.php b/application/views/includes/header.php index b2780422..634807aa 100644 --- a/application/views/includes/header.php +++ b/application/views/includes/header.php @@ -26,11 +26,12 @@ + + + - - - + @@ -41,6 +42,19 @@ + + + + + + + + + + + + + @@ -55,7 +69,10 @@ - + + + + @@ -67,7 +84,7 @@ SI - Siddharth IndustriesAS + Siddharth Industries